@@ -418,7 +418,7 @@ static void SendNegotiateProtocolVersion(List *unrecognized_protocol_options);
418418static void processCancelRequest (Port * port ,void * pkt );
419419static int initMasks (fd_set * rmask );
420420static void report_fork_failure_to_client (Port * port ,int errnum );
421- static CAC_state canAcceptConnections (void );
421+ static CAC_state canAcceptConnections (int backend_type );
422422static bool RandomCancelKey (int32 * cancel_key );
423423static void signal_child (pid_t pid ,int signal );
424424static bool SignalSomeChildren (int signal ,int targets );
@@ -2370,24 +2370,30 @@ processCancelRequest(Port *port, void *pkt)
23702370}
23712371
23722372/*
2373- * canAcceptConnections --- check to see if database state allows connections.
2373+ * canAcceptConnections --- check to see if database state allows connections
2374+ * of the specified type. backend_type can be BACKEND_TYPE_NORMAL,
2375+ * BACKEND_TYPE_AUTOVAC, or BACKEND_TYPE_BGWORKER. (Note that we don't yet
2376+ * know whether a NORMAL connection might turn into a walsender.)
23742377 */
23752378static CAC_state
2376- canAcceptConnections (void )
2379+ canAcceptConnections (int backend_type )
23772380{
23782381CAC_state result = CAC_OK ;
23792382
23802383/*
23812384 * Can't start backends when in startup/shutdown/inconsistent recovery
2382- * state.
2385+ * state. We treat autovac workers the same as user backends for this
2386+ * purpose. However, bgworkers are excluded from this test; we expect
2387+ * bgworker_should_start_now() decided whether the DB state allows them.
23832388 *
23842389 * In state PM_WAIT_BACKUP only superusers can connect (this must be
23852390 * allowed so that a superuser can end online backup mode); we return
23862391 * CAC_WAITBACKUP code to indicate that this must be checked later. Note
23872392 * that neither CAC_OK nor CAC_WAITBACKUP can safely be returned until we
23882393 * have checked for too many children.
23892394 */
2390- if (pmState != PM_RUN )
2395+ if (pmState != PM_RUN &&
2396+ backend_type != BACKEND_TYPE_BGWORKER )
23912397{
23922398if (pmState == PM_WAIT_BACKUP )
23932399result = CAC_WAITBACKUP ;/* allow superusers only */
@@ -2407,9 +2413,9 @@ canAcceptConnections(void)
24072413/*
24082414 * Don't start too many children.
24092415 *
2410- * We allow more connections than we can have backends here because some
2416+ * We allow more connectionshere than we can have backends because some
24112417 * might still be authenticating; they might fail auth, or some existing
2412- * backend might exit before the auth cycle is completed. The exact
2418+ * backend might exit before the auth cycle is completed. The exact
24132419 * MaxBackends limit is enforced when a new backend tries to join the
24142420 * shared-inval backend array.
24152421 *
@@ -4038,7 +4044,7 @@ BackendStartup(Port *port)
40384044bn -> cancel_key = MyCancelKey ;
40394045
40404046/* Pass down canAcceptConnections state */
4041- port -> canAcceptConnections = canAcceptConnections ();
4047+ port -> canAcceptConnections = canAcceptConnections (BACKEND_TYPE_NORMAL );
40424048bn -> dead_end = (port -> canAcceptConnections != CAC_OK &&
40434049port -> canAcceptConnections != CAC_WAITBACKUP );
40444050
@@ -5439,7 +5445,7 @@ StartAutovacuumWorker(void)
54395445 * we have to check to avoid race-condition problems during DB state
54405446 * changes.
54415447 */
5442- if (canAcceptConnections ()== CAC_OK )
5448+ if (canAcceptConnections (BACKEND_TYPE_AUTOVAC )== CAC_OK )
54435449{
54445450/*
54455451 * Compute the cancel key that will be assigned to this session. We
@@ -5684,12 +5690,13 @@ do_start_bgworker(RegisteredBgWorker *rw)
56845690
56855691/*
56865692 * Allocate and assign the Backend element. Note we must do this before
5687- * forking, so that we can handle out of memory properly.
5693+ * forking, so that we can handle failures (out of memory or child-process
5694+ * slots) cleanly.
56885695 *
56895696 * Treat failure as though the worker had crashed. That way, the
5690- * postmaster will wait a bit before attempting to start it again; ifit
5691- * tried again right away, most likelyit 'd finditself repeating the
5692- *out-of-memory or fork failure condition.
5697+ * postmaster will wait a bit before attempting to start it again; ifwe
5698+ * tried again right away, most likelywe 'd findourselves hitting the
5699+ *same resource-exhaustion condition.
56935700 */
56945701if (!assign_backendlist_entry (rw ))
56955702{
@@ -5815,6 +5822,19 @@ assign_backendlist_entry(RegisteredBgWorker *rw)
58155822{
58165823Backend * bn ;
58175824
5825+ /*
5826+ * Check that database state allows another connection. Currently the
5827+ * only possible failure is CAC_TOOMANY, so we just log an error message
5828+ * based on that rather than checking the error code precisely.
5829+ */
5830+ if (canAcceptConnections (BACKEND_TYPE_BGWORKER )!= CAC_OK )
5831+ {
5832+ ereport (LOG ,
5833+ (errcode (ERRCODE_CONFIGURATION_LIMIT_EXCEEDED ),
5834+ errmsg ("no slot available for new worker process" )));
5835+ return false;
5836+ }
5837+
58185838/*
58195839 * Compute the cancel key that will be assigned to this session. We
58205840 * probably don't need cancel keys for background workers, but we'd better