OSDN Git Service

ca7a19e4f4cc80d06817ca2df8dec0f2d25ccb1c
[pg-rex/syncrep.git] / src / backend / storage / lmgr / proc.c
1 /*-------------------------------------------------------------------------
2  *
3  * proc.c
4  *        routines to manage per-process shared memory data structure
5  *
6  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
7  * Portions Copyright (c) 1994, Regents of the University of California
8  *
9  *
10  * IDENTIFICATION
11  *        $PostgreSQL: pgsql/src/backend/storage/lmgr/proc.c,v 1.211 2010/01/02 16:57:52 momjian Exp $
12  *
13  *-------------------------------------------------------------------------
14  */
15 /*
16  * Interface (a):
17  *              ProcSleep(), ProcWakeup(),
18  *              ProcQueueAlloc() -- create a shm queue for sleeping processes
19  *              ProcQueueInit() -- create a queue without allocing memory
20  *
21  * Waiting for a lock causes the backend to be put to sleep.  Whoever releases
22  * the lock wakes the process up again (and gives it an error code so it knows
23  * whether it was awoken on an error condition).
24  *
25  * Interface (b):
26  *
27  * ProcReleaseLocks -- frees the locks associated with current transaction
28  *
29  * ProcKill -- destroys the shared memory state (and locks)
30  * associated with the process.
31  */
32 #include "postgres.h"
33
34 #include <signal.h>
35 #include <unistd.h>
36 #include <sys/time.h>
37
38 #include "access/transam.h"
39 #include "access/xact.h"
40 #include "miscadmin.h"
41 #include "postmaster/autovacuum.h"
42 #include "storage/ipc.h"
43 #include "storage/lmgr.h"
44 #include "storage/pmsignal.h"
45 #include "storage/proc.h"
46 #include "storage/procarray.h"
47 #include "storage/spin.h"
48
49
50 /* GUC variables */
51 int                     DeadlockTimeout = 1000;
52 int                     StatementTimeout = 0;
53 bool            log_lock_waits = false;
54
55 /* Pointer to this process's PGPROC struct, if any */
56 PGPROC     *MyProc = NULL;
57
58 /*
59  * This spinlock protects the freelist of recycled PGPROC structures.
60  * We cannot use an LWLock because the LWLock manager depends on already
61  * having a PGPROC and a wait semaphore!  But these structures are touched
62  * relatively infrequently (only at backend startup or shutdown) and not for
63  * very long, so a spinlock is okay.
64  */
65 NON_EXEC_STATIC slock_t *ProcStructLock = NULL;
66
67 /* Pointers to shared-memory structures */
68 NON_EXEC_STATIC PROC_HDR *ProcGlobal = NULL;
69 NON_EXEC_STATIC PGPROC *AuxiliaryProcs = NULL;
70
71 /* If we are waiting for a lock, this points to the associated LOCALLOCK */
72 static LOCALLOCK *lockAwaited = NULL;
73
74 /* Mark these volatile because they can be changed by signal handler */
75 static volatile bool statement_timeout_active = false;
76 static volatile bool deadlock_timeout_active = false;
77 static volatile DeadLockState deadlock_state = DS_NOT_YET_CHECKED;
78 volatile bool cancel_from_timeout = false;
79
80 /* timeout_start_time is set when log_lock_waits is true */
81 static TimestampTz timeout_start_time;
82
83 /* statement_fin_time is valid only if statement_timeout_active is true */
84 static TimestampTz statement_fin_time;
85
86
87 static void RemoveProcFromArray(int code, Datum arg);
88 static void ProcKill(int code, Datum arg);
89 static void AuxiliaryProcKill(int code, Datum arg);
90 static bool CheckStatementTimeout(void);
91
92
93 /*
94  * Report shared-memory space needed by InitProcGlobal.
95  */
96 Size
97 ProcGlobalShmemSize(void)
98 {
99         Size            size = 0;
100
101         /* ProcGlobal */
102         size = add_size(size, sizeof(PROC_HDR));
103         /* AuxiliaryProcs */
104         size = add_size(size, mul_size(NUM_AUXILIARY_PROCS, sizeof(PGPROC)));
105         /* MyProcs, including autovacuum workers and launcher */
106         size = add_size(size, mul_size(MaxBackends, sizeof(PGPROC)));
107         /* ProcStructLock */
108         size = add_size(size, sizeof(slock_t));
109
110         return size;
111 }
112
113 /*
114  * Report number of semaphores needed by InitProcGlobal.
115  */
116 int
117 ProcGlobalSemas(void)
118 {
119         /*
120          * We need a sema per backend (including autovacuum), plus one for each
121          * auxiliary process.
122          */
123         return MaxBackends + NUM_AUXILIARY_PROCS;
124 }
125
126 /*
127  * InitProcGlobal -
128  *        Initialize the global process table during postmaster or standalone
129  *        backend startup.
130  *
131  *        We also create all the per-process semaphores we will need to support
132  *        the requested number of backends.  We used to allocate semaphores
133  *        only when backends were actually started up, but that is bad because
134  *        it lets Postgres fail under load --- a lot of Unix systems are
135  *        (mis)configured with small limits on the number of semaphores, and
136  *        running out when trying to start another backend is a common failure.
137  *        So, now we grab enough semaphores to support the desired max number
138  *        of backends immediately at initialization --- if the sysadmin has set
139  *        MaxConnections or autovacuum_max_workers higher than his kernel will
140  *        support, he'll find out sooner rather than later.
141  *
142  *        Another reason for creating semaphores here is that the semaphore
143  *        implementation typically requires us to create semaphores in the
144  *        postmaster, not in backends.
145  *
146  * Note: this is NOT called by individual backends under a postmaster,
147  * not even in the EXEC_BACKEND case.  The ProcGlobal and AuxiliaryProcs
148  * pointers must be propagated specially for EXEC_BACKEND operation.
149  */
150 void
151 InitProcGlobal(void)
152 {
153         PGPROC     *procs;
154         int                     i;
155         bool            found;
156
157         /* Create the ProcGlobal shared structure */
158         ProcGlobal = (PROC_HDR *)
159                 ShmemInitStruct("Proc Header", sizeof(PROC_HDR), &found);
160         Assert(!found);
161
162         /*
163          * Create the PGPROC structures for auxiliary (bgwriter) processes, too.
164          * These do not get linked into the freeProcs list.
165          */
166         AuxiliaryProcs = (PGPROC *)
167                 ShmemInitStruct("AuxiliaryProcs", NUM_AUXILIARY_PROCS * sizeof(PGPROC),
168                                                 &found);
169         Assert(!found);
170
171         /*
172          * Initialize the data structures.
173          */
174         ProcGlobal->freeProcs = NULL;
175         ProcGlobal->autovacFreeProcs = NULL;
176
177         ProcGlobal->spins_per_delay = DEFAULT_SPINS_PER_DELAY;
178
179         /*
180          * Pre-create the PGPROC structures and create a semaphore for each.
181          */
182         procs = (PGPROC *) ShmemAlloc((MaxConnections) * sizeof(PGPROC));
183         if (!procs)
184                 ereport(FATAL,
185                                 (errcode(ERRCODE_OUT_OF_MEMORY),
186                                  errmsg("out of shared memory")));
187         MemSet(procs, 0, MaxConnections * sizeof(PGPROC));
188         for (i = 0; i < MaxConnections; i++)
189         {
190                 PGSemaphoreCreate(&(procs[i].sem));
191                 procs[i].links.next = (SHM_QUEUE *) ProcGlobal->freeProcs;
192                 ProcGlobal->freeProcs = &procs[i];
193         }
194
195         /*
196          * Likewise for the PGPROCs reserved for autovacuum.
197          *
198          * Note: the "+1" here accounts for the autovac launcher
199          */
200         procs = (PGPROC *) ShmemAlloc((autovacuum_max_workers + 1) * sizeof(PGPROC));
201         if (!procs)
202                 ereport(FATAL,
203                                 (errcode(ERRCODE_OUT_OF_MEMORY),
204                                  errmsg("out of shared memory")));
205         MemSet(procs, 0, (autovacuum_max_workers + 1) * sizeof(PGPROC));
206         for (i = 0; i < autovacuum_max_workers + 1; i++)
207         {
208                 PGSemaphoreCreate(&(procs[i].sem));
209                 procs[i].links.next = (SHM_QUEUE *) ProcGlobal->autovacFreeProcs;
210                 ProcGlobal->autovacFreeProcs = &procs[i];
211         }
212
213         /*
214          * And auxiliary procs.
215          */
216         MemSet(AuxiliaryProcs, 0, NUM_AUXILIARY_PROCS * sizeof(PGPROC));
217         for (i = 0; i < NUM_AUXILIARY_PROCS; i++)
218         {
219                 AuxiliaryProcs[i].pid = 0;              /* marks auxiliary proc as not in use */
220                 PGSemaphoreCreate(&(AuxiliaryProcs[i].sem));
221         }
222
223         /* Create ProcStructLock spinlock, too */
224         ProcStructLock = (slock_t *) ShmemAlloc(sizeof(slock_t));
225         SpinLockInit(ProcStructLock);
226 }
227
228 /*
229  * InitProcess -- initialize a per-process data structure for this backend
230  */
231 void
232 InitProcess(void)
233 {
234         /* use volatile pointer to prevent code rearrangement */
235         volatile PROC_HDR *procglobal = ProcGlobal;
236         int                     i;
237
238         /*
239          * ProcGlobal should be set up already (if we are a backend, we inherit
240          * this by fork() or EXEC_BACKEND mechanism from the postmaster).
241          */
242         if (procglobal == NULL)
243                 elog(PANIC, "proc header uninitialized");
244
245         if (MyProc != NULL)
246                 elog(ERROR, "you already exist");
247
248         /*
249          * Try to get a proc struct from the free list.  If this fails, we must be
250          * out of PGPROC structures (not to mention semaphores).
251          *
252          * While we are holding the ProcStructLock, also copy the current shared
253          * estimate of spins_per_delay to local storage.
254          */
255         SpinLockAcquire(ProcStructLock);
256
257         set_spins_per_delay(procglobal->spins_per_delay);
258
259         if (IsAnyAutoVacuumProcess())
260                 MyProc = procglobal->autovacFreeProcs;
261         else
262                 MyProc = procglobal->freeProcs;
263
264         if (MyProc != NULL)
265         {
266                 if (IsAnyAutoVacuumProcess())
267                         procglobal->autovacFreeProcs = (PGPROC *) MyProc->links.next;
268                 else
269                         procglobal->freeProcs = (PGPROC *) MyProc->links.next;
270                 SpinLockRelease(ProcStructLock);
271         }
272         else
273         {
274                 /*
275                  * If we reach here, all the PGPROCs are in use.  This is one of the
276                  * possible places to detect "too many backends", so give the standard
277                  * error message.  XXX do we need to give a different failure message
278                  * in the autovacuum case?
279                  */
280                 SpinLockRelease(ProcStructLock);
281                 ereport(FATAL,
282                                 (errcode(ERRCODE_TOO_MANY_CONNECTIONS),
283                                  errmsg("sorry, too many clients already")));
284         }
285
286         /*
287          * Now that we have a PGPROC, mark ourselves as an active postmaster
288          * child; this is so that the postmaster can detect it if we exit without
289          * cleaning up.  (XXX autovac launcher currently doesn't participate in
290          * this; it probably should.)
291          */
292         if (IsUnderPostmaster && !IsAutoVacuumLauncherProcess())
293                 MarkPostmasterChildActive();
294
295         /*
296          * Initialize all fields of MyProc, except for the semaphore which was
297          * prepared for us by InitProcGlobal.
298          */
299         SHMQueueElemInit(&(MyProc->links));
300         MyProc->waitStatus = STATUS_OK;
301         MyProc->lxid = InvalidLocalTransactionId;
302         MyProc->xid = InvalidTransactionId;
303         MyProc->xmin = InvalidTransactionId;
304         MyProc->pid = MyProcPid;
305         /* backendId, databaseId and roleId will be filled in later */
306         MyProc->backendId = InvalidBackendId;
307         MyProc->databaseId = InvalidOid;
308         MyProc->roleId = InvalidOid;
309         MyProc->inCommit = false;
310         MyProc->vacuumFlags = 0;
311         /* NB -- autovac launcher intentionally does not set IS_AUTOVACUUM */
312         if (IsAutoVacuumWorkerProcess())
313                 MyProc->vacuumFlags |= PROC_IS_AUTOVACUUM;
314         MyProc->lwWaiting = false;
315         MyProc->lwExclusive = false;
316         MyProc->lwWaitLink = NULL;
317         MyProc->waitLock = NULL;
318         MyProc->waitProcLock = NULL;
319         for (i = 0; i < NUM_LOCK_PARTITIONS; i++)
320                 SHMQueueInit(&(MyProc->myProcLocks[i]));
321         MyProc->recoveryConflictMode = 0;
322
323         /*
324          * We might be reusing a semaphore that belonged to a failed process. So
325          * be careful and reinitialize its value here.  (This is not strictly
326          * necessary anymore, but seems like a good idea for cleanliness.)
327          */
328         PGSemaphoreReset(&MyProc->sem);
329
330         /*
331          * Arrange to clean up at backend exit.
332          */
333         on_shmem_exit(ProcKill, 0);
334
335         /*
336          * Now that we have a PGPROC, we could try to acquire locks, so initialize
337          * the deadlock checker.
338          */
339         InitDeadLockChecking();
340 }
341
342 /*
343  * InitProcessPhase2 -- make MyProc visible in the shared ProcArray.
344  *
345  * This is separate from InitProcess because we can't acquire LWLocks until
346  * we've created a PGPROC, but in the EXEC_BACKEND case ProcArrayAdd won't
347  * work until after we've done CreateSharedMemoryAndSemaphores.
348  */
349 void
350 InitProcessPhase2(void)
351 {
352         Assert(MyProc != NULL);
353
354         /*
355          * Add our PGPROC to the PGPROC array in shared memory.
356          */
357         ProcArrayAdd(MyProc);
358
359         /*
360          * Arrange to clean that up at backend exit.
361          */
362         on_shmem_exit(RemoveProcFromArray, 0);
363 }
364
365 /*
366  * InitAuxiliaryProcess -- create a per-auxiliary-process data structure
367  *
368  * This is called by bgwriter and similar processes so that they will have a
369  * MyProc value that's real enough to let them wait for LWLocks.  The PGPROC
370  * and sema that are assigned are one of the extra ones created during
371  * InitProcGlobal.
372  *
373  * Auxiliary processes are presently not expected to wait for real (lockmgr)
374  * locks, so we need not set up the deadlock checker.  They are never added
375  * to the ProcArray or the sinval messaging mechanism, either.  They also
376  * don't get a VXID assigned, since this is only useful when we actually
377  * hold lockmgr locks.
378  *
379  * Startup process however uses locks but never waits for them in the
380  * normal backend sense. Startup process also takes part in sinval messaging
381  * as a sendOnly process, so never reads messages from sinval queue. So
382  * Startup process does have a VXID and does show up in pg_locks.
383  */
384 void
385 InitAuxiliaryProcess(void)
386 {
387         PGPROC     *auxproc;
388         int                     proctype;
389         int                     i;
390
391         /*
392          * ProcGlobal should be set up already (if we are a backend, we inherit
393          * this by fork() or EXEC_BACKEND mechanism from the postmaster).
394          */
395         if (ProcGlobal == NULL || AuxiliaryProcs == NULL)
396                 elog(PANIC, "proc header uninitialized");
397
398         if (MyProc != NULL)
399                 elog(ERROR, "you already exist");
400
401         /*
402          * We use the ProcStructLock to protect assignment and releasing of
403          * AuxiliaryProcs entries.
404          *
405          * While we are holding the ProcStructLock, also copy the current shared
406          * estimate of spins_per_delay to local storage.
407          */
408         SpinLockAcquire(ProcStructLock);
409
410         set_spins_per_delay(ProcGlobal->spins_per_delay);
411
412         /*
413          * Find a free auxproc ... *big* trouble if there isn't one ...
414          */
415         for (proctype = 0; proctype < NUM_AUXILIARY_PROCS; proctype++)
416         {
417                 auxproc = &AuxiliaryProcs[proctype];
418                 if (auxproc->pid == 0)
419                         break;
420         }
421         if (proctype >= NUM_AUXILIARY_PROCS)
422         {
423                 SpinLockRelease(ProcStructLock);
424                 elog(FATAL, "all AuxiliaryProcs are in use");
425         }
426
427         /* Mark auxiliary proc as in use by me */
428         /* use volatile pointer to prevent code rearrangement */
429         ((volatile PGPROC *) auxproc)->pid = MyProcPid;
430
431         MyProc = auxproc;
432
433         SpinLockRelease(ProcStructLock);
434
435         /*
436          * Initialize all fields of MyProc, except for the semaphore which was
437          * prepared for us by InitProcGlobal.
438          */
439         SHMQueueElemInit(&(MyProc->links));
440         MyProc->waitStatus = STATUS_OK;
441         MyProc->lxid = InvalidLocalTransactionId;
442         MyProc->xid = InvalidTransactionId;
443         MyProc->xmin = InvalidTransactionId;
444         MyProc->backendId = InvalidBackendId;
445         MyProc->databaseId = InvalidOid;
446         MyProc->roleId = InvalidOid;
447         MyProc->inCommit = false;
448         MyProc->vacuumFlags = 0;
449         MyProc->lwWaiting = false;
450         MyProc->lwExclusive = false;
451         MyProc->lwWaitLink = NULL;
452         MyProc->waitLock = NULL;
453         MyProc->waitProcLock = NULL;
454         for (i = 0; i < NUM_LOCK_PARTITIONS; i++)
455                 SHMQueueInit(&(MyProc->myProcLocks[i]));
456
457         /*
458          * We might be reusing a semaphore that belonged to a failed process. So
459          * be careful and reinitialize its value here.  (This is not strictly
460          * necessary anymore, but seems like a good idea for cleanliness.)
461          */
462         PGSemaphoreReset(&MyProc->sem);
463
464         /*
465          * Arrange to clean up at process exit.
466          */
467         on_shmem_exit(AuxiliaryProcKill, Int32GetDatum(proctype));
468 }
469
470 /*
471  * Record the PID and PGPROC structures for the Startup process, for use in
472  * ProcSendSignal().  See comments there for further explanation.
473  */
474 void
475 PublishStartupProcessInformation(void)
476 {
477         /* use volatile pointer to prevent code rearrangement */
478         volatile PROC_HDR *procglobal = ProcGlobal;
479
480         SpinLockAcquire(ProcStructLock);
481
482         procglobal->startupProc = MyProc;
483         procglobal->startupProcPid = MyProcPid;
484
485         SpinLockRelease(ProcStructLock);
486 }
487
488 /*
489  * Check whether there are at least N free PGPROC objects.
490  *
491  * Note: this is designed on the assumption that N will generally be small.
492  */
493 bool
494 HaveNFreeProcs(int n)
495 {
496         PGPROC     *proc;
497
498         /* use volatile pointer to prevent code rearrangement */
499         volatile PROC_HDR *procglobal = ProcGlobal;
500
501         SpinLockAcquire(ProcStructLock);
502
503         proc = procglobal->freeProcs;
504
505         while (n > 0 && proc != NULL)
506         {
507                 proc = (PGPROC *) proc->links.next;
508                 n--;
509         }
510
511         SpinLockRelease(ProcStructLock);
512
513         return (n <= 0);
514 }
515
516 /*
517  * Cancel any pending wait for lock, when aborting a transaction.
518  *
519  * (Normally, this would only happen if we accept a cancel/die
520  * interrupt while waiting; but an ereport(ERROR) while waiting is
521  * within the realm of possibility, too.)
522  */
523 void
524 LockWaitCancel(void)
525 {
526         LWLockId        partitionLock;
527
528         /* Nothing to do if we weren't waiting for a lock */
529         if (lockAwaited == NULL)
530                 return;
531
532         /* Turn off the deadlock timer, if it's still running (see ProcSleep) */
533         disable_sig_alarm(false);
534
535         /* Unlink myself from the wait queue, if on it (might not be anymore!) */
536         partitionLock = LockHashPartitionLock(lockAwaited->hashcode);
537         LWLockAcquire(partitionLock, LW_EXCLUSIVE);
538
539         if (MyProc->links.next != NULL)
540         {
541                 /* We could not have been granted the lock yet */
542                 RemoveFromWaitQueue(MyProc, lockAwaited->hashcode);
543         }
544         else
545         {
546                 /*
547                  * Somebody kicked us off the lock queue already.  Perhaps they
548                  * granted us the lock, or perhaps they detected a deadlock. If they
549                  * did grant us the lock, we'd better remember it in our local lock
550                  * table.
551                  */
552                 if (MyProc->waitStatus == STATUS_OK)
553                         GrantAwaitedLock();
554         }
555
556         lockAwaited = NULL;
557
558         LWLockRelease(partitionLock);
559
560         /*
561          * We used to do PGSemaphoreReset() here to ensure that our proc's wait
562          * semaphore is reset to zero.  This prevented a leftover wakeup signal
563          * from remaining in the semaphore if someone else had granted us the lock
564          * we wanted before we were able to remove ourselves from the wait-list.
565          * However, now that ProcSleep loops until waitStatus changes, a leftover
566          * wakeup signal isn't harmful, and it seems not worth expending cycles to
567          * get rid of a signal that most likely isn't there.
568          */
569 }
570
571
572 /*
573  * ProcReleaseLocks() -- release locks associated with current transaction
574  *                      at main transaction commit or abort
575  *
576  * At main transaction commit, we release all locks except session locks.
577  * At main transaction abort, we release all locks including session locks;
578  * this lets us clean up after a VACUUM FULL failure.
579  *
580  * At subtransaction commit, we don't release any locks (so this func is not
581  * needed at all); we will defer the releasing to the parent transaction.
582  * At subtransaction abort, we release all locks held by the subtransaction;
583  * this is implemented by retail releasing of the locks under control of
584  * the ResourceOwner mechanism.
585  *
586  * Note that user locks are not released in any case.
587  */
588 void
589 ProcReleaseLocks(bool isCommit)
590 {
591         if (!MyProc)
592                 return;
593         /* If waiting, get off wait queue (should only be needed after error) */
594         LockWaitCancel();
595         /* Release locks */
596         LockReleaseAll(DEFAULT_LOCKMETHOD, !isCommit);
597 }
598
599
600 /*
601  * RemoveProcFromArray() -- Remove this process from the shared ProcArray.
602  */
603 static void
604 RemoveProcFromArray(int code, Datum arg)
605 {
606         Assert(MyProc != NULL);
607         ProcArrayRemove(MyProc, InvalidTransactionId);
608 }
609
610 /*
611  * ProcKill() -- Destroy the per-proc data structure for
612  *              this process. Release any of its held LW locks.
613  */
614 static void
615 ProcKill(int code, Datum arg)
616 {
617         /* use volatile pointer to prevent code rearrangement */
618         volatile PROC_HDR *procglobal = ProcGlobal;
619
620         Assert(MyProc != NULL);
621
622         /*
623          * Release any LW locks I am holding.  There really shouldn't be any, but
624          * it's cheap to check again before we cut the knees off the LWLock
625          * facility by releasing our PGPROC ...
626          */
627         LWLockReleaseAll();
628
629         SpinLockAcquire(ProcStructLock);
630
631         /* Return PGPROC structure (and semaphore) to appropriate freelist */
632         if (IsAnyAutoVacuumProcess())
633         {
634                 MyProc->links.next = (SHM_QUEUE *) procglobal->autovacFreeProcs;
635                 procglobal->autovacFreeProcs = MyProc;
636         }
637         else
638         {
639                 MyProc->links.next = (SHM_QUEUE *) procglobal->freeProcs;
640                 procglobal->freeProcs = MyProc;
641         }
642
643         /* PGPROC struct isn't mine anymore */
644         MyProc = NULL;
645
646         /* Update shared estimate of spins_per_delay */
647         procglobal->spins_per_delay = update_spins_per_delay(procglobal->spins_per_delay);
648
649         SpinLockRelease(ProcStructLock);
650
651         /*
652          * This process is no longer present in shared memory in any meaningful
653          * way, so tell the postmaster we've cleaned up acceptably well.
654          * (XXX autovac launcher should be included here someday)
655          */
656         if (IsUnderPostmaster && !IsAutoVacuumLauncherProcess())
657                 MarkPostmasterChildInactive();
658
659         /* wake autovac launcher if needed -- see comments in FreeWorkerInfo */
660         if (AutovacuumLauncherPid != 0)
661                 kill(AutovacuumLauncherPid, SIGUSR2);
662 }
663
664 /*
665  * AuxiliaryProcKill() -- Cut-down version of ProcKill for auxiliary
666  *              processes (bgwriter, etc).      The PGPROC and sema are not released, only
667  *              marked as not-in-use.
668  */
669 static void
670 AuxiliaryProcKill(int code, Datum arg)
671 {
672         int                     proctype = DatumGetInt32(arg);
673         PGPROC     *auxproc;
674
675         Assert(proctype >= 0 && proctype < NUM_AUXILIARY_PROCS);
676
677         auxproc = &AuxiliaryProcs[proctype];
678
679         Assert(MyProc == auxproc);
680
681         /* Release any LW locks I am holding (see notes above) */
682         LWLockReleaseAll();
683
684         SpinLockAcquire(ProcStructLock);
685
686         /* Mark auxiliary proc no longer in use */
687         MyProc->pid = 0;
688
689         /* PGPROC struct isn't mine anymore */
690         MyProc = NULL;
691
692         /* Update shared estimate of spins_per_delay */
693         ProcGlobal->spins_per_delay = update_spins_per_delay(ProcGlobal->spins_per_delay);
694
695         SpinLockRelease(ProcStructLock);
696 }
697
698
699 /*
700  * ProcQueue package: routines for putting processes to sleep
701  *              and  waking them up
702  */
703
704 /*
705  * ProcQueueAlloc -- alloc/attach to a shared memory process queue
706  *
707  * Returns: a pointer to the queue or NULL
708  * Side Effects: Initializes the queue if we allocated one
709  */
710 #ifdef NOT_USED
711 PROC_QUEUE *
712 ProcQueueAlloc(char *name)
713 {
714         bool            found;
715         PROC_QUEUE *queue = (PROC_QUEUE *)
716         ShmemInitStruct(name, sizeof(PROC_QUEUE), &found);
717
718         if (!queue)
719                 return NULL;
720         if (!found)
721                 ProcQueueInit(queue);
722         return queue;
723 }
724 #endif
725
726 /*
727  * ProcQueueInit -- initialize a shared memory process queue
728  */
729 void
730 ProcQueueInit(PROC_QUEUE *queue)
731 {
732         SHMQueueInit(&(queue->links));
733         queue->size = 0;
734 }
735
736
737 /*
738  * ProcSleep -- put a process to sleep on the specified lock
739  *
740  * Caller must have set MyProc->heldLocks to reflect locks already held
741  * on the lockable object by this process (under all XIDs).
742  *
743  * The lock table's partition lock must be held at entry, and will be held
744  * at exit.
745  *
746  * Result: STATUS_OK if we acquired the lock, STATUS_ERROR if not (deadlock).
747  *
748  * ASSUME: that no one will fiddle with the queue until after
749  *              we release the partition lock.
750  *
751  * NOTES: The process queue is now a priority queue for locking.
752  *
753  * P() on the semaphore should put us to sleep.  The process
754  * semaphore is normally zero, so when we try to acquire it, we sleep.
755  */
756 int
757 ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable)
758 {
759         LOCKMODE        lockmode = locallock->tag.mode;
760         LOCK       *lock = locallock->lock;
761         PROCLOCK   *proclock = locallock->proclock;
762         uint32          hashcode = locallock->hashcode;
763         LWLockId        partitionLock = LockHashPartitionLock(hashcode);
764         PROC_QUEUE *waitQueue = &(lock->waitProcs);
765         LOCKMASK        myHeldLocks = MyProc->heldLocks;
766         bool            early_deadlock = false;
767         bool            allow_autovacuum_cancel = true;
768         int                     myWaitStatus;
769         PGPROC     *proc;
770         int                     i;
771
772         /*
773          * Determine where to add myself in the wait queue.
774          *
775          * Normally I should go at the end of the queue.  However, if I already
776          * hold locks that conflict with the request of any previous waiter, put
777          * myself in the queue just in front of the first such waiter. This is not
778          * a necessary step, since deadlock detection would move me to before that
779          * waiter anyway; but it's relatively cheap to detect such a conflict
780          * immediately, and avoid delaying till deadlock timeout.
781          *
782          * Special case: if I find I should go in front of some waiter, check to
783          * see if I conflict with already-held locks or the requests before that
784          * waiter.      If not, then just grant myself the requested lock immediately.
785          * This is the same as the test for immediate grant in LockAcquire, except
786          * we are only considering the part of the wait queue before my insertion
787          * point.
788          */
789         if (myHeldLocks != 0)
790         {
791                 LOCKMASK        aheadRequests = 0;
792
793                 proc = (PGPROC *) waitQueue->links.next;
794                 for (i = 0; i < waitQueue->size; i++)
795                 {
796                         /* Must he wait for me? */
797                         if (lockMethodTable->conflictTab[proc->waitLockMode] & myHeldLocks)
798                         {
799                                 /* Must I wait for him ? */
800                                 if (lockMethodTable->conflictTab[lockmode] & proc->heldLocks)
801                                 {
802                                         /*
803                                          * Yes, so we have a deadlock.  Easiest way to clean up
804                                          * correctly is to call RemoveFromWaitQueue(), but we
805                                          * can't do that until we are *on* the wait queue. So, set
806                                          * a flag to check below, and break out of loop.  Also,
807                                          * record deadlock info for later message.
808                                          */
809                                         RememberSimpleDeadLock(MyProc, lockmode, lock, proc);
810                                         early_deadlock = true;
811                                         break;
812                                 }
813                                 /* I must go before this waiter.  Check special case. */
814                                 if ((lockMethodTable->conflictTab[lockmode] & aheadRequests) == 0 &&
815                                         LockCheckConflicts(lockMethodTable,
816                                                                            lockmode,
817                                                                            lock,
818                                                                            proclock,
819                                                                            MyProc) == STATUS_OK)
820                                 {
821                                         /* Skip the wait and just grant myself the lock. */
822                                         GrantLock(lock, proclock, lockmode);
823                                         GrantAwaitedLock();
824                                         return STATUS_OK;
825                                 }
826                                 /* Break out of loop to put myself before him */
827                                 break;
828                         }
829                         /* Nope, so advance to next waiter */
830                         aheadRequests |= LOCKBIT_ON(proc->waitLockMode);
831                         proc = (PGPROC *) proc->links.next;
832                 }
833
834                 /*
835                  * If we fall out of loop normally, proc points to waitQueue head, so
836                  * we will insert at tail of queue as desired.
837                  */
838         }
839         else
840         {
841                 /* I hold no locks, so I can't push in front of anyone. */
842                 proc = (PGPROC *) &(waitQueue->links);
843         }
844
845         /*
846          * Insert self into queue, ahead of the given proc (or at tail of queue).
847          */
848         SHMQueueInsertBefore(&(proc->links), &(MyProc->links));
849         waitQueue->size++;
850
851         lock->waitMask |= LOCKBIT_ON(lockmode);
852
853         /* Set up wait information in PGPROC object, too */
854         MyProc->waitLock = lock;
855         MyProc->waitProcLock = proclock;
856         MyProc->waitLockMode = lockmode;
857
858         MyProc->waitStatus = STATUS_WAITING;
859
860         /*
861          * If we detected deadlock, give up without waiting.  This must agree with
862          * CheckDeadLock's recovery code, except that we shouldn't release the
863          * semaphore since we haven't tried to lock it yet.
864          */
865         if (early_deadlock)
866         {
867                 RemoveFromWaitQueue(MyProc, hashcode);
868                 return STATUS_ERROR;
869         }
870
871         /* mark that we are waiting for a lock */
872         lockAwaited = locallock;
873
874         /*
875          * Release the lock table's partition lock.
876          *
877          * NOTE: this may also cause us to exit critical-section state, possibly
878          * allowing a cancel/die interrupt to be accepted. This is OK because we
879          * have recorded the fact that we are waiting for a lock, and so
880          * LockWaitCancel will clean up if cancel/die happens.
881          */
882         LWLockRelease(partitionLock);
883
884         /* Reset deadlock_state before enabling the signal handler */
885         deadlock_state = DS_NOT_YET_CHECKED;
886
887         /*
888          * Set timer so we can wake up after awhile and check for a deadlock. If a
889          * deadlock is detected, the handler releases the process's semaphore and
890          * sets MyProc->waitStatus = STATUS_ERROR, allowing us to know that we
891          * must report failure rather than success.
892          *
893          * By delaying the check until we've waited for a bit, we can avoid
894          * running the rather expensive deadlock-check code in most cases.
895          */
896         if (!enable_sig_alarm(DeadlockTimeout, false))
897                 elog(FATAL, "could not set timer for process wakeup");
898
899         /*
900          * If someone wakes us between LWLockRelease and PGSemaphoreLock,
901          * PGSemaphoreLock will not block.      The wakeup is "saved" by the semaphore
902          * implementation.      While this is normally good, there are cases where a
903          * saved wakeup might be leftover from a previous operation (for example,
904          * we aborted ProcWaitForSignal just before someone did ProcSendSignal).
905          * So, loop to wait again if the waitStatus shows we haven't been granted
906          * nor denied the lock yet.
907          *
908          * We pass interruptOK = true, which eliminates a window in which
909          * cancel/die interrupts would be held off undesirably.  This is a promise
910          * that we don't mind losing control to a cancel/die interrupt here.  We
911          * don't, because we have no shared-state-change work to do after being
912          * granted the lock (the grantor did it all).  We do have to worry about
913          * updating the locallock table, but if we lose control to an error,
914          * LockWaitCancel will fix that up.
915          */
916         do
917         {
918                 PGSemaphoreLock(&MyProc->sem, true);
919
920                 /*
921                  * waitStatus could change from STATUS_WAITING to something else
922                  * asynchronously.      Read it just once per loop to prevent surprising
923                  * behavior (such as missing log messages).
924                  */
925                 myWaitStatus = MyProc->waitStatus;
926
927                 /*
928                  * If we are not deadlocked, but are waiting on an autovacuum-induced
929                  * task, send a signal to interrupt it.
930                  */
931                 if (deadlock_state == DS_BLOCKED_BY_AUTOVACUUM && allow_autovacuum_cancel)
932                 {
933                         PGPROC     *autovac = GetBlockingAutoVacuumPgproc();
934
935                         LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE);
936
937                         /*
938                          * Only do it if the worker is not working to protect against Xid
939                          * wraparound.
940                          */
941                         if ((autovac != NULL) &&
942                                 (autovac->vacuumFlags & PROC_IS_AUTOVACUUM) &&
943                                 !(autovac->vacuumFlags & PROC_VACUUM_FOR_WRAPAROUND))
944                         {
945                                 int                     pid = autovac->pid;
946
947                                 elog(DEBUG2, "sending cancel to blocking autovacuum pid = %d",
948                                          pid);
949
950                                 /* don't hold the lock across the kill() syscall */
951                                 LWLockRelease(ProcArrayLock);
952
953                                 /* send the autovacuum worker Back to Old Kent Road */
954                                 if (kill(pid, SIGINT) < 0)
955                                 {
956                                         /* Just a warning to allow multiple callers */
957                                         ereport(WARNING,
958                                                         (errmsg("could not send signal to process %d: %m",
959                                                                         pid)));
960                                 }
961                         }
962                         else
963                                 LWLockRelease(ProcArrayLock);
964
965                         /* prevent signal from being resent more than once */
966                         allow_autovacuum_cancel = false;
967                 }
968
969                 /*
970                  * If awoken after the deadlock check interrupt has run, and
971                  * log_lock_waits is on, then report about the wait.
972                  */
973                 if (log_lock_waits && deadlock_state != DS_NOT_YET_CHECKED)
974                 {
975                         StringInfoData buf;
976                         const char *modename;
977                         long            secs;
978                         int                     usecs;
979                         long            msecs;
980
981                         initStringInfo(&buf);
982                         DescribeLockTag(&buf, &locallock->tag.lock);
983                         modename = GetLockmodeName(locallock->tag.lock.locktag_lockmethodid,
984                                                                            lockmode);
985                         TimestampDifference(timeout_start_time, GetCurrentTimestamp(),
986                                                                 &secs, &usecs);
987                         msecs = secs * 1000 + usecs / 1000;
988                         usecs = usecs % 1000;
989
990                         if (deadlock_state == DS_SOFT_DEADLOCK)
991                                 ereport(LOG,
992                                                 (errmsg("process %d avoided deadlock for %s on %s by rearranging queue order after %ld.%03d ms",
993                                                           MyProcPid, modename, buf.data, msecs, usecs)));
994                         else if (deadlock_state == DS_HARD_DEADLOCK)
995                         {
996                                 /*
997                                  * This message is a bit redundant with the error that will be
998                                  * reported subsequently, but in some cases the error report
999                                  * might not make it to the log (eg, if it's caught by an
1000                                  * exception handler), and we want to ensure all long-wait
1001                                  * events get logged.
1002                                  */
1003                                 ereport(LOG,
1004                                                 (errmsg("process %d detected deadlock while waiting for %s on %s after %ld.%03d ms",
1005                                                           MyProcPid, modename, buf.data, msecs, usecs)));
1006                         }
1007
1008                         if (myWaitStatus == STATUS_WAITING)
1009                                 ereport(LOG,
1010                                                 (errmsg("process %d still waiting for %s on %s after %ld.%03d ms",
1011                                                           MyProcPid, modename, buf.data, msecs, usecs)));
1012                         else if (myWaitStatus == STATUS_OK)
1013                                 ereport(LOG,
1014                                         (errmsg("process %d acquired %s on %s after %ld.%03d ms",
1015                                                         MyProcPid, modename, buf.data, msecs, usecs)));
1016                         else
1017                         {
1018                                 Assert(myWaitStatus == STATUS_ERROR);
1019
1020                                 /*
1021                                  * Currently, the deadlock checker always kicks its own
1022                                  * process, which means that we'll only see STATUS_ERROR when
1023                                  * deadlock_state == DS_HARD_DEADLOCK, and there's no need to
1024                                  * print redundant messages.  But for completeness and
1025                                  * future-proofing, print a message if it looks like someone
1026                                  * else kicked us off the lock.
1027                                  */
1028                                 if (deadlock_state != DS_HARD_DEADLOCK)
1029                                         ereport(LOG,
1030                                                         (errmsg("process %d failed to acquire %s on %s after %ld.%03d ms",
1031                                                           MyProcPid, modename, buf.data, msecs, usecs)));
1032                         }
1033
1034                         /*
1035                          * At this point we might still need to wait for the lock. Reset
1036                          * state so we don't print the above messages again.
1037                          */
1038                         deadlock_state = DS_NO_DEADLOCK;
1039
1040                         pfree(buf.data);
1041                 }
1042         } while (myWaitStatus == STATUS_WAITING);
1043
1044         /*
1045          * Disable the timer, if it's still running
1046          */
1047         if (!disable_sig_alarm(false))
1048                 elog(FATAL, "could not disable timer for process wakeup");
1049
1050         /*
1051          * Re-acquire the lock table's partition lock.  We have to do this to hold
1052          * off cancel/die interrupts before we can mess with lockAwaited (else we
1053          * might have a missed or duplicated locallock update).
1054          */
1055         LWLockAcquire(partitionLock, LW_EXCLUSIVE);
1056
1057         /*
1058          * We no longer want LockWaitCancel to do anything.
1059          */
1060         lockAwaited = NULL;
1061
1062         /*
1063          * If we got the lock, be sure to remember it in the locallock table.
1064          */
1065         if (MyProc->waitStatus == STATUS_OK)
1066                 GrantAwaitedLock();
1067
1068         /*
1069          * We don't have to do anything else, because the awaker did all the
1070          * necessary update of the lock table and MyProc.
1071          */
1072         return MyProc->waitStatus;
1073 }
1074
1075
1076 /*
1077  * ProcWakeup -- wake up a process by releasing its private semaphore.
1078  *
1079  *       Also remove the process from the wait queue and set its links invalid.
1080  *       RETURN: the next process in the wait queue.
1081  *
1082  * The appropriate lock partition lock must be held by caller.
1083  *
1084  * XXX: presently, this code is only used for the "success" case, and only
1085  * works correctly for that case.  To clean up in failure case, would need
1086  * to twiddle the lock's request counts too --- see RemoveFromWaitQueue.
1087  * Hence, in practice the waitStatus parameter must be STATUS_OK.
1088  */
1089 PGPROC *
1090 ProcWakeup(PGPROC *proc, int waitStatus)
1091 {
1092         PGPROC     *retProc;
1093
1094         /* Proc should be sleeping ... */
1095         if (proc->links.prev == NULL ||
1096                 proc->links.next == NULL)
1097                 return NULL;
1098         Assert(proc->waitStatus == STATUS_WAITING);
1099
1100         /* Save next process before we zap the list link */
1101         retProc = (PGPROC *) proc->links.next;
1102
1103         /* Remove process from wait queue */
1104         SHMQueueDelete(&(proc->links));
1105         (proc->waitLock->waitProcs.size)--;
1106
1107         /* Clean up process' state and pass it the ok/fail signal */
1108         proc->waitLock = NULL;
1109         proc->waitProcLock = NULL;
1110         proc->waitStatus = waitStatus;
1111
1112         /* And awaken it */
1113         PGSemaphoreUnlock(&proc->sem);
1114
1115         return retProc;
1116 }
1117
1118 /*
1119  * ProcLockWakeup -- routine for waking up processes when a lock is
1120  *              released (or a prior waiter is aborted).  Scan all waiters
1121  *              for lock, waken any that are no longer blocked.
1122  *
1123  * The appropriate lock partition lock must be held by caller.
1124  */
1125 void
1126 ProcLockWakeup(LockMethod lockMethodTable, LOCK *lock)
1127 {
1128         PROC_QUEUE *waitQueue = &(lock->waitProcs);
1129         int                     queue_size = waitQueue->size;
1130         PGPROC     *proc;
1131         LOCKMASK        aheadRequests = 0;
1132
1133         Assert(queue_size >= 0);
1134
1135         if (queue_size == 0)
1136                 return;
1137
1138         proc = (PGPROC *) waitQueue->links.next;
1139
1140         while (queue_size-- > 0)
1141         {
1142                 LOCKMODE        lockmode = proc->waitLockMode;
1143
1144                 /*
1145                  * Waken if (a) doesn't conflict with requests of earlier waiters, and
1146                  * (b) doesn't conflict with already-held locks.
1147                  */
1148                 if ((lockMethodTable->conflictTab[lockmode] & aheadRequests) == 0 &&
1149                         LockCheckConflicts(lockMethodTable,
1150                                                            lockmode,
1151                                                            lock,
1152                                                            proc->waitProcLock,
1153                                                            proc) == STATUS_OK)
1154                 {
1155                         /* OK to waken */
1156                         GrantLock(lock, proc->waitProcLock, lockmode);
1157                         proc = ProcWakeup(proc, STATUS_OK);
1158
1159                         /*
1160                          * ProcWakeup removes proc from the lock's waiting process queue
1161                          * and returns the next proc in chain; don't use proc's next-link,
1162                          * because it's been cleared.
1163                          */
1164                 }
1165                 else
1166                 {
1167                         /*
1168                          * Cannot wake this guy. Remember his request for later checks.
1169                          */
1170                         aheadRequests |= LOCKBIT_ON(lockmode);
1171                         proc = (PGPROC *) proc->links.next;
1172                 }
1173         }
1174
1175         Assert(waitQueue->size >= 0);
1176 }
1177
1178 /*
1179  * CheckDeadLock
1180  *
1181  * We only get to this routine if we got SIGALRM after DeadlockTimeout
1182  * while waiting for a lock to be released by some other process.  Look
1183  * to see if there's a deadlock; if not, just return and continue waiting.
1184  * (But signal ProcSleep to log a message, if log_lock_waits is true.)
1185  * If we have a real deadlock, remove ourselves from the lock's wait queue
1186  * and signal an error to ProcSleep.
1187  *
1188  * NB: this is run inside a signal handler, so be very wary about what is done
1189  * here or in called routines.
1190  */
1191 static void
1192 CheckDeadLock(void)
1193 {
1194         int                     i;
1195
1196         /*
1197          * Acquire exclusive lock on the entire shared lock data structures. Must
1198          * grab LWLocks in partition-number order to avoid LWLock deadlock.
1199          *
1200          * Note that the deadlock check interrupt had better not be enabled
1201          * anywhere that this process itself holds lock partition locks, else this
1202          * will wait forever.  Also note that LWLockAcquire creates a critical
1203          * section, so that this routine cannot be interrupted by cancel/die
1204          * interrupts.
1205          */
1206         for (i = 0; i < NUM_LOCK_PARTITIONS; i++)
1207                 LWLockAcquire(FirstLockMgrLock + i, LW_EXCLUSIVE);
1208
1209         /*
1210          * Check to see if we've been awoken by anyone in the interim.
1211          *
1212          * If we have, we can return and resume our transaction -- happy day.
1213          * Before we are awoken the process releasing the lock grants it to us so
1214          * we know that we don't have to wait anymore.
1215          *
1216          * We check by looking to see if we've been unlinked from the wait queue.
1217          * This is quicker than checking our semaphore's state, since no kernel
1218          * call is needed, and it is safe because we hold the lock partition lock.
1219          */
1220         if (MyProc->links.prev == NULL ||
1221                 MyProc->links.next == NULL)
1222                 goto check_done;
1223
1224 #ifdef LOCK_DEBUG
1225         if (Debug_deadlocks)
1226                 DumpAllLocks();
1227 #endif
1228
1229         /* Run the deadlock check, and set deadlock_state for use by ProcSleep */
1230         deadlock_state = DeadLockCheck(MyProc);
1231
1232         if (deadlock_state == DS_HARD_DEADLOCK)
1233         {
1234                 /*
1235                  * Oops.  We have a deadlock.
1236                  *
1237                  * Get this process out of wait state. (Note: we could do this more
1238                  * efficiently by relying on lockAwaited, but use this coding to
1239                  * preserve the flexibility to kill some other transaction than the
1240                  * one detecting the deadlock.)
1241                  *
1242                  * RemoveFromWaitQueue sets MyProc->waitStatus to STATUS_ERROR, so
1243                  * ProcSleep will report an error after we return from the signal
1244                  * handler.
1245                  */
1246                 Assert(MyProc->waitLock != NULL);
1247                 RemoveFromWaitQueue(MyProc, LockTagHashCode(&(MyProc->waitLock->tag)));
1248
1249                 /*
1250                  * Unlock my semaphore so that the interrupted ProcSleep() call can
1251                  * finish.
1252                  */
1253                 PGSemaphoreUnlock(&MyProc->sem);
1254
1255                 /*
1256                  * We're done here.  Transaction abort caused by the error that
1257                  * ProcSleep will raise will cause any other locks we hold to be
1258                  * released, thus allowing other processes to wake up; we don't need
1259                  * to do that here.  NOTE: an exception is that releasing locks we
1260                  * hold doesn't consider the possibility of waiters that were blocked
1261                  * behind us on the lock we just failed to get, and might now be
1262                  * wakable because we're not in front of them anymore.  However,
1263                  * RemoveFromWaitQueue took care of waking up any such processes.
1264                  */
1265         }
1266         else if (log_lock_waits || deadlock_state == DS_BLOCKED_BY_AUTOVACUUM)
1267         {
1268                 /*
1269                  * Unlock my semaphore so that the interrupted ProcSleep() call can
1270                  * print the log message (we daren't do it here because we are inside
1271                  * a signal handler).  It will then sleep again until someone releases
1272                  * the lock.
1273                  *
1274                  * If blocked by autovacuum, this wakeup will enable ProcSleep to send
1275                  * the cancelling signal to the autovacuum worker.
1276                  */
1277                 PGSemaphoreUnlock(&MyProc->sem);
1278         }
1279
1280         /*
1281          * And release locks.  We do this in reverse order for two reasons: (1)
1282          * Anyone else who needs more than one of the locks will be trying to lock
1283          * them in increasing order; we don't want to release the other process
1284          * until it can get all the locks it needs. (2) This avoids O(N^2)
1285          * behavior inside LWLockRelease.
1286          */
1287 check_done:
1288         for (i = NUM_LOCK_PARTITIONS; --i >= 0;)
1289                 LWLockRelease(FirstLockMgrLock + i);
1290 }
1291
1292
1293 /*
1294  * ProcWaitForSignal - wait for a signal from another backend.
1295  *
1296  * This can share the semaphore normally used for waiting for locks,
1297  * since a backend could never be waiting for a lock and a signal at
1298  * the same time.  As with locks, it's OK if the signal arrives just
1299  * before we actually reach the waiting state.  Also as with locks,
1300  * it's necessary that the caller be robust against bogus wakeups:
1301  * always check that the desired state has occurred, and wait again
1302  * if not.      This copes with possible "leftover" wakeups.
1303  */
1304 void
1305 ProcWaitForSignal(void)
1306 {
1307         PGSemaphoreLock(&MyProc->sem, true);
1308 }
1309
1310 /*
1311  * ProcSendSignal - send a signal to a backend identified by PID
1312  */
1313 void
1314 ProcSendSignal(int pid)
1315 {
1316         PGPROC     *proc = NULL;
1317
1318         if (RecoveryInProgress())
1319         {
1320                 /* use volatile pointer to prevent code rearrangement */
1321                 volatile PROC_HDR *procglobal = ProcGlobal;
1322
1323                 SpinLockAcquire(ProcStructLock);
1324
1325                 /*
1326                  * Check to see whether it is the Startup process we wish to signal.
1327                  * This call is made by the buffer manager when it wishes to wake
1328                  * up a process that has been waiting for a pin in so it can obtain a
1329                  * cleanup lock using LockBufferForCleanup(). Startup is not a normal
1330                  * backend, so BackendPidGetProc() will not return any pid at all.
1331                  * So we remember the information for this special case.
1332                  */
1333                 if (pid == procglobal->startupProcPid)
1334                         proc = procglobal->startupProc;
1335
1336                 SpinLockRelease(ProcStructLock);
1337         }
1338
1339         if (proc == NULL)
1340                 proc = BackendPidGetProc(pid);
1341
1342         if (proc != NULL)
1343                 PGSemaphoreUnlock(&proc->sem);
1344 }
1345
1346
1347 /*****************************************************************************
1348  * SIGALRM interrupt support
1349  *
1350  * Maybe these should be in pqsignal.c?
1351  *****************************************************************************/
1352
1353 /*
1354  * Enable the SIGALRM interrupt to fire after the specified delay
1355  *
1356  * Delay is given in milliseconds.      Caller should be sure a SIGALRM
1357  * signal handler is installed before this is called.
1358  *
1359  * This code properly handles nesting of deadlock timeout alarms within
1360  * statement timeout alarms.
1361  *
1362  * Returns TRUE if okay, FALSE on failure.
1363  */
1364 bool
1365 enable_sig_alarm(int delayms, bool is_statement_timeout)
1366 {
1367         TimestampTz fin_time;
1368         struct itimerval timeval;
1369
1370         if (is_statement_timeout)
1371         {
1372                 /*
1373                  * Begin statement-level timeout
1374                  *
1375                  * Note that we compute statement_fin_time with reference to the
1376                  * statement_timestamp, but apply the specified delay without any
1377                  * correction; that is, we ignore whatever time has elapsed since
1378                  * statement_timestamp was set.  In the normal case only a small
1379                  * interval will have elapsed and so this doesn't matter, but there
1380                  * are corner cases (involving multi-statement query strings with
1381                  * embedded COMMIT or ROLLBACK) where we might re-initialize the
1382                  * statement timeout long after initial receipt of the message. In
1383                  * such cases the enforcement of the statement timeout will be a bit
1384                  * inconsistent.  This annoyance is judged not worth the cost of
1385                  * performing an additional gettimeofday() here.
1386                  */
1387                 Assert(!deadlock_timeout_active);
1388                 fin_time = GetCurrentStatementStartTimestamp();
1389                 fin_time = TimestampTzPlusMilliseconds(fin_time, delayms);
1390                 statement_fin_time = fin_time;
1391                 cancel_from_timeout = false;
1392                 statement_timeout_active = true;
1393         }
1394         else if (statement_timeout_active)
1395         {
1396                 /*
1397                  * Begin deadlock timeout with statement-level timeout active
1398                  *
1399                  * Here, we want to interrupt at the closer of the two timeout times.
1400                  * If fin_time >= statement_fin_time then we need not touch the
1401                  * existing timer setting; else set up to interrupt at the deadlock
1402                  * timeout time.
1403                  *
1404                  * NOTE: in this case it is possible that this routine will be
1405                  * interrupted by the previously-set timer alarm.  This is okay
1406                  * because the signal handler will do only what it should do according
1407                  * to the state variables.      The deadlock checker may get run earlier
1408                  * than normal, but that does no harm.
1409                  */
1410                 timeout_start_time = GetCurrentTimestamp();
1411                 fin_time = TimestampTzPlusMilliseconds(timeout_start_time, delayms);
1412                 deadlock_timeout_active = true;
1413                 if (fin_time >= statement_fin_time)
1414                         return true;
1415         }
1416         else
1417         {
1418                 /* Begin deadlock timeout with no statement-level timeout */
1419                 deadlock_timeout_active = true;
1420                 /* GetCurrentTimestamp can be expensive, so only do it if we must */
1421                 if (log_lock_waits)
1422                         timeout_start_time = GetCurrentTimestamp();
1423         }
1424
1425         /* If we reach here, okay to set the timer interrupt */
1426         MemSet(&timeval, 0, sizeof(struct itimerval));
1427         timeval.it_value.tv_sec = delayms / 1000;
1428         timeval.it_value.tv_usec = (delayms % 1000) * 1000;
1429         if (setitimer(ITIMER_REAL, &timeval, NULL))
1430                 return false;
1431         return true;
1432 }
1433
1434 /*
1435  * Cancel the SIGALRM timer, either for a deadlock timeout or a statement
1436  * timeout.  If a deadlock timeout is canceled, any active statement timeout
1437  * remains in force.
1438  *
1439  * Returns TRUE if okay, FALSE on failure.
1440  */
1441 bool
1442 disable_sig_alarm(bool is_statement_timeout)
1443 {
1444         /*
1445          * Always disable the interrupt if it is active; this avoids being
1446          * interrupted by the signal handler and thereby possibly getting
1447          * confused.
1448          *
1449          * We will re-enable the interrupt if necessary in CheckStatementTimeout.
1450          */
1451         if (statement_timeout_active || deadlock_timeout_active)
1452         {
1453                 struct itimerval timeval;
1454
1455                 MemSet(&timeval, 0, sizeof(struct itimerval));
1456                 if (setitimer(ITIMER_REAL, &timeval, NULL))
1457                 {
1458                         statement_timeout_active = false;
1459                         cancel_from_timeout = false;
1460                         deadlock_timeout_active = false;
1461                         return false;
1462                 }
1463         }
1464
1465         /* Always cancel deadlock timeout, in case this is error cleanup */
1466         deadlock_timeout_active = false;
1467
1468         /* Cancel or reschedule statement timeout */
1469         if (is_statement_timeout)
1470         {
1471                 statement_timeout_active = false;
1472                 cancel_from_timeout = false;
1473         }
1474         else if (statement_timeout_active)
1475         {
1476                 if (!CheckStatementTimeout())
1477                         return false;
1478         }
1479         return true;
1480 }
1481
1482
1483 /*
1484  * Check for statement timeout.  If the timeout time has come,
1485  * trigger a query-cancel interrupt; if not, reschedule the SIGALRM
1486  * interrupt to occur at the right time.
1487  *
1488  * Returns true if okay, false if failed to set the interrupt.
1489  */
1490 static bool
1491 CheckStatementTimeout(void)
1492 {
1493         TimestampTz now;
1494
1495         if (!statement_timeout_active)
1496                 return true;                    /* do nothing if not active */
1497
1498         now = GetCurrentTimestamp();
1499
1500         if (now >= statement_fin_time)
1501         {
1502                 /* Time to die */
1503                 statement_timeout_active = false;
1504                 cancel_from_timeout = true;
1505 #ifdef HAVE_SETSID
1506                 /* try to signal whole process group */
1507                 kill(-MyProcPid, SIGINT);
1508 #endif
1509                 kill(MyProcPid, SIGINT);
1510         }
1511         else
1512         {
1513                 /* Not time yet, so (re)schedule the interrupt */
1514                 long            secs;
1515                 int                     usecs;
1516                 struct itimerval timeval;
1517
1518                 TimestampDifference(now, statement_fin_time,
1519                                                         &secs, &usecs);
1520
1521                 /*
1522                  * It's possible that the difference is less than a microsecond;
1523                  * ensure we don't cancel, rather than set, the interrupt.
1524                  */
1525                 if (secs == 0 && usecs == 0)
1526                         usecs = 1;
1527                 MemSet(&timeval, 0, sizeof(struct itimerval));
1528                 timeval.it_value.tv_sec = secs;
1529                 timeval.it_value.tv_usec = usecs;
1530                 if (setitimer(ITIMER_REAL, &timeval, NULL))
1531                         return false;
1532         }
1533
1534         return true;
1535 }
1536
1537
1538 /*
1539  * Signal handler for SIGALRM
1540  *
1541  * Process deadlock check and/or statement timeout check, as needed.
1542  * To avoid various edge cases, we must be careful to do nothing
1543  * when there is nothing to be done.  We also need to be able to
1544  * reschedule the timer interrupt if called before end of statement.
1545  */
1546 void
1547 handle_sig_alarm(SIGNAL_ARGS)
1548 {
1549         int                     save_errno = errno;
1550
1551         if (deadlock_timeout_active)
1552         {
1553                 deadlock_timeout_active = false;
1554                 CheckDeadLock();
1555         }
1556
1557         if (statement_timeout_active)
1558                 (void) CheckStatementTimeout();
1559
1560         errno = save_errno;
1561 }