diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index 8db5b2a9afe9ced61bcbbed13ae969d41c4b300f..74d90e6f8871b302b7e3c8762b0718843d6e8bbe 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -37,7 +37,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.537 2007/08/02 23:39:44 adunstan Exp $
+ *	  $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.538 2007/08/03 20:06:50 tgl Exp $
  *
  * NOTES
  *
@@ -130,7 +130,7 @@
  * children we have and send them appropriate signals when necessary.
  *
  * "Special" children such as the startup, bgwriter and autovacuum launcher
- * tasks are not in this list.  Autovacuum worker processes are on it.
+ * tasks are not in this list.  Autovacuum worker processes are in it.
  */
 typedef struct bkend
 {
@@ -2705,6 +2705,7 @@ BackendStartup(Port *port)
 	 */
 	bn->pid = pid;
 	bn->cancel_key = MyCancelKey;
+	bn->is_autovacuum = false;
 	DLAddHead(BackendList, DLNewElem(bn));
 #ifdef EXEC_BACKEND
 	ShmemBackendArrayAdd(bn);
@@ -3925,15 +3926,22 @@ StartAutovacuumWorker(void)
 	if (StartupPID != 0 || FatalError || Shutdown != NoShutdown)
 		return;
 
+	/*
+	 * Compute the cancel key that will be assigned to this session.
+	 * We probably don't need cancel keys for autovac workers, but we'd
+	 * better have something random in the field to prevent unfriendly
+	 * people from sending cancels to them.
+	 */
+	MyCancelKey = PostmasterRandom();
+
 	bn = (Backend *) malloc(sizeof(Backend));
 	if (bn)
 	{
 		bn->pid = StartAutoVacWorker();
-		bn->is_autovacuum = true;
-		/* we don't need a cancel key */
-
 		if (bn->pid > 0)
 		{
+			bn->cancel_key = MyCancelKey;
+			bn->is_autovacuum = true;
 			DLAddHead(BackendList, DLNewElem(bn));
 #ifdef EXEC_BACKEND
 			ShmemBackendArrayAdd(bn);
@@ -3949,7 +3957,9 @@ StartAutovacuumWorker(void)
 		free(bn);
 	}
 	else
-		elog(LOG, "out of memory");
+		ereport(LOG,
+				(errcode(ERRCODE_OUT_OF_MEMORY),
+				 errmsg("out of memory")));
 
 	/* report the failure to the launcher */
 	AutoVacWorkerFailed();