OSDN Git Service

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