proc.c 51.0 KB
Newer Older
1 2
/*-------------------------------------------------------------------------
 *
3
 * proc.c
4
 *	  routines to manage per-process shared memory data structure
5
 *
B
Bruce Momjian 已提交
6
 * Portions Copyright (c) 1996-2011, PostgreSQL Global Development Group
B
Add:  
Bruce Momjian 已提交
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 19
 *		ProcQueueAlloc() -- create a shm queue for sleeping processes
 *		ProcQueueInit() -- create a queue without allocing memory
20
 *
21 22
 * Waiting for a lock causes the backend to be put to sleep.  Whoever releases
 * the lock wakes the process up again (and gives it an error code so it knows
23 24 25 26
 * whether it was awoken on an error condition).
 *
 * Interface (b):
 *
27 28
 * ProcReleaseLocks -- frees the locks associated with current transaction
 *
29
 * ProcKill -- destroys the shared memory state (and locks)
30
 * associated with the process.
31
 */
32 33
#include "postgres.h"

34
#include <signal.h>
35 36
#include <unistd.h>
#include <sys/time.h>
M
Marc G. Fournier 已提交
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/procsignal.h"
48
#include "storage/spin.h"
49

50

51
/* GUC variables */
B
Bruce Momjian 已提交
52
int			DeadlockTimeout = 1000;
53
int			StatementTimeout = 0;
54
bool		log_lock_waits = false;
M
 
Marc G. Fournier 已提交
55

56
/* Pointer to this process's PGPROC struct, if any */
J
Jan Wieck 已提交
57
PGPROC	   *MyProc = NULL;
58 59

/*
J
Jan Wieck 已提交
60
 * This spinlock protects the freelist of recycled PGPROC structures.
61
 * We cannot use an LWLock because the LWLock manager depends on already
J
Jan Wieck 已提交
62
 * having a PGPROC and a wait semaphore!  But these structures are touched
63 64
 * relatively infrequently (only at backend startup or shutdown) and not for
 * very long, so a spinlock is okay.
65
 */
66
NON_EXEC_STATIC slock_t *ProcStructLock = NULL;
67

68
/* Pointers to shared-memory structures */
69
NON_EXEC_STATIC PROC_HDR *ProcGlobal = NULL;
70
NON_EXEC_STATIC PGPROC *AuxiliaryProcs = NULL;
71

72 73
/* If we are waiting for a lock, this points to the associated LOCALLOCK */
static LOCALLOCK *lockAwaited = NULL;
74

75
/* Mark these volatile because they can be changed by signal handler */
76
static volatile bool standby_timeout_active = false;
77 78
static volatile bool statement_timeout_active = false;
static volatile bool deadlock_timeout_active = false;
79
static volatile DeadLockState deadlock_state = DS_NOT_YET_CHECKED;
80
volatile bool cancel_from_timeout = false;
B
Bruce Momjian 已提交
81

82 83 84
/* timeout_start_time is set when log_lock_waits is true */
static TimestampTz timeout_start_time;

85
/* statement_fin_time is valid only if statement_timeout_active is true */
86
static TimestampTz statement_fin_time;
87
static TimestampTz statement_fin_time2; /* valid only in recovery */
88 89


90
static void RemoveProcFromArray(int code, Datum arg);
91
static void ProcKill(int code, Datum arg);
92
static void AuxiliaryProcKill(int code, Datum arg);
93
static bool CheckStatementTimeout(void);
94
static bool CheckStandbyTimeout(void);
95

V
Vadim B. Mikheev 已提交
96

97 98 99
/*
 * Report shared-memory space needed by InitProcGlobal.
 */
100
Size
101
ProcGlobalShmemSize(void)
102
{
103 104 105 106
	Size		size = 0;

	/* ProcGlobal */
	size = add_size(size, sizeof(PROC_HDR));
107 108
	/* AuxiliaryProcs */
	size = add_size(size, mul_size(NUM_AUXILIARY_PROCS, sizeof(PGPROC)));
109
	/* MyProcs, including autovacuum workers and launcher */
110 111 112
	size = add_size(size, mul_size(MaxBackends, sizeof(PGPROC)));
	/* ProcStructLock */
	size = add_size(size, sizeof(slock_t));
113 114
	/* startupBufferPinWaitBufId */
	size = add_size(size, sizeof(NBuffers));
115 116 117 118

	return size;
}

119 120 121 122
/*
 * Report number of semaphores needed by InitProcGlobal.
 */
int
123
ProcGlobalSemas(void)
124
{
125 126 127 128
	/*
	 * We need a sema per backend (including autovacuum), plus one for each
	 * auxiliary process.
	 */
129
	return MaxBackends + NUM_AUXILIARY_PROCS;
130 131
}

132 133
/*
 * InitProcGlobal -
134 135
 *	  Initialize the global process table during postmaster or standalone
 *	  backend startup.
136
 *
137
 *	  We also create all the per-process semaphores we will need to support
138 139 140 141 142 143 144
 *	  the requested number of backends.  We used to allocate semaphores
 *	  only when backends were actually started up, but that is bad because
 *	  it lets Postgres fail under load --- a lot of Unix systems are
 *	  (mis)configured with small limits on the number of semaphores, and
 *	  running out when trying to start another backend is a common failure.
 *	  So, now we grab enough semaphores to support the desired max number
 *	  of backends immediately at initialization --- if the sysadmin has set
145 146
 *	  MaxConnections or autovacuum_max_workers higher than his kernel will
 *	  support, he'll find out sooner rather than later.
147 148 149 150
 *
 *	  Another reason for creating semaphores here is that the semaphore
 *	  implementation typically requires us to create semaphores in the
 *	  postmaster, not in backends.
151 152
 *
 * Note: this is NOT called by individual backends under a postmaster,
153
 * not even in the EXEC_BACKEND case.  The ProcGlobal and AuxiliaryProcs
154
 * pointers must be propagated specially for EXEC_BACKEND operation.
155 156
 */
void
157
InitProcGlobal(void)
158
{
159 160 161
	PGPROC	   *procs;
	int			i;
	bool		found;
162

163
	/* Create the ProcGlobal shared structure */
164
	ProcGlobal = (PROC_HDR *)
165 166
		ShmemInitStruct("Proc Header", sizeof(PROC_HDR), &found);
	Assert(!found);
167

168
	/*
169 170
	 * Create the PGPROC structures for auxiliary (bgwriter) processes, too.
	 * These do not get linked into the freeProcs list.
171
	 */
172 173
	AuxiliaryProcs = (PGPROC *)
		ShmemInitStruct("AuxiliaryProcs", NUM_AUXILIARY_PROCS * sizeof(PGPROC),
174 175
						&found);
	Assert(!found);
176

177 178 179
	/*
	 * Initialize the data structures.
	 */
180 181
	ProcGlobal->freeProcs = NULL;
	ProcGlobal->autovacFreeProcs = NULL;
182

183
	ProcGlobal->spins_per_delay = DEFAULT_SPINS_PER_DELAY;
184

185 186 187
	/*
	 * Pre-create the PGPROC structures and create a semaphore for each.
	 */
188
	procs = (PGPROC *) ShmemAlloc((MaxConnections) * sizeof(PGPROC));
189 190 191 192
	if (!procs)
		ereport(FATAL,
				(errcode(ERRCODE_OUT_OF_MEMORY),
				 errmsg("out of shared memory")));
193 194
	MemSet(procs, 0, MaxConnections * sizeof(PGPROC));
	for (i = 0; i < MaxConnections; i++)
195 196
	{
		PGSemaphoreCreate(&(procs[i].sem));
197 198
		procs[i].links.next = (SHM_QUEUE *) ProcGlobal->freeProcs;
		ProcGlobal->freeProcs = &procs[i];
199
	}
200

201 202 203 204 205 206
	/*
	 * Likewise for the PGPROCs reserved for autovacuum.
	 *
	 * Note: the "+1" here accounts for the autovac launcher
	 */
	procs = (PGPROC *) ShmemAlloc((autovacuum_max_workers + 1) * sizeof(PGPROC));
207 208 209 210
	if (!procs)
		ereport(FATAL,
				(errcode(ERRCODE_OUT_OF_MEMORY),
				 errmsg("out of shared memory")));
211 212
	MemSet(procs, 0, (autovacuum_max_workers + 1) * sizeof(PGPROC));
	for (i = 0; i < autovacuum_max_workers + 1; i++)
213 214
	{
		PGSemaphoreCreate(&(procs[i].sem));
215 216
		procs[i].links.next = (SHM_QUEUE *) ProcGlobal->autovacFreeProcs;
		ProcGlobal->autovacFreeProcs = &procs[i];
217 218
	}

219 220 221
	/*
	 * And auxiliary procs.
	 */
222 223
	MemSet(AuxiliaryProcs, 0, NUM_AUXILIARY_PROCS * sizeof(PGPROC));
	for (i = 0; i < NUM_AUXILIARY_PROCS; i++)
224
	{
B
Bruce Momjian 已提交
225
		AuxiliaryProcs[i].pid = 0;		/* marks auxiliary proc as not in use */
226
		PGSemaphoreCreate(&(AuxiliaryProcs[i].sem));
227
	}
228 229 230 231

	/* Create ProcStructLock spinlock, too */
	ProcStructLock = (slock_t *) ShmemAlloc(sizeof(slock_t));
	SpinLockInit(ProcStructLock);
232 233
}

234
/*
235
 * InitProcess -- initialize a per-process data structure for this backend
236 237
 */
void
238
InitProcess(void)
239
{
240 241
	/* use volatile pointer to prevent code rearrangement */
	volatile PROC_HDR *procglobal = ProcGlobal;
242
	int			i;
243 244

	/*
245 246
	 * ProcGlobal should be set up already (if we are a backend, we inherit
	 * this by fork() or EXEC_BACKEND mechanism from the postmaster).
247
	 */
248
	if (procglobal == NULL)
249
		elog(PANIC, "proc header uninitialized");
250 251

	if (MyProc != NULL)
252
		elog(ERROR, "you already exist");
253

254
	/*
B
Bruce Momjian 已提交
255 256
	 * Try to get a proc struct from the free list.  If this fails, we must be
	 * out of PGPROC structures (not to mention semaphores).
257
	 *
B
Bruce Momjian 已提交
258 259
	 * While we are holding the ProcStructLock, also copy the current shared
	 * estimate of spins_per_delay to local storage.
260
	 */
261
	SpinLockAcquire(ProcStructLock);
262

263 264
	set_spins_per_delay(procglobal->spins_per_delay);

265
	if (IsAnyAutoVacuumProcess())
266
		MyProc = procglobal->autovacFreeProcs;
267
	else
268
		MyProc = procglobal->freeProcs;
269

270
	if (MyProc != NULL)
271
	{
272
		if (IsAnyAutoVacuumProcess())
273
			procglobal->autovacFreeProcs = (PGPROC *) MyProc->links.next;
274
		else
275
			procglobal->freeProcs = (PGPROC *) MyProc->links.next;
276
		SpinLockRelease(ProcStructLock);
277 278 279 280
	}
	else
	{
		/*
B
Bruce Momjian 已提交
281 282
		 * If we reach here, all the PGPROCs are in use.  This is one of the
		 * possible places to detect "too many backends", so give the standard
283 284
		 * error message.  XXX do we need to give a different failure message
		 * in the autovacuum case?
285
		 */
286
		SpinLockRelease(ProcStructLock);
287 288 289
		ereport(FATAL,
				(errcode(ERRCODE_TOO_MANY_CONNECTIONS),
				 errmsg("sorry, too many clients already")));
290
	}
291

292 293
	/*
	 * Now that we have a PGPROC, mark ourselves as an active postmaster
294
	 * child; this is so that the postmaster can detect it if we exit without
295 296
	 * cleaning up.  (XXX autovac launcher currently doesn't participate in
	 * this; it probably should.)
297
	 */
298
	if (IsUnderPostmaster && !IsAutoVacuumLauncherProcess())
299
		MarkPostmasterChildActive();
300

301
	/*
B
Bruce Momjian 已提交
302 303
	 * Initialize all fields of MyProc, except for the semaphore which was
	 * prepared for us by InitProcGlobal.
304
	 */
305
	SHMQueueElemInit(&(MyProc->links));
306
	MyProc->waitStatus = STATUS_OK;
307
	MyProc->lxid = InvalidLocalTransactionId;
308
	MyProc->xid = InvalidTransactionId;
309
	MyProc->xmin = InvalidTransactionId;
310
	MyProc->pid = MyProcPid;
311 312
	/* backendId, databaseId and roleId will be filled in later */
	MyProc->backendId = InvalidBackendId;
313
	MyProc->databaseId = InvalidOid;
314
	MyProc->roleId = InvalidOid;
315
	MyProc->inCommit = false;
316
	MyProc->vacuumFlags = 0;
317
	/* NB -- autovac launcher intentionally does not set IS_AUTOVACUUM */
318 319
	if (IsAutoVacuumWorkerProcess())
		MyProc->vacuumFlags |= PROC_IS_AUTOVACUUM;
320 321 322
	MyProc->lwWaiting = false;
	MyProc->lwExclusive = false;
	MyProc->lwWaitLink = NULL;
323
	MyProc->waitLock = NULL;
324
	MyProc->waitProcLock = NULL;
325 326
	for (i = 0; i < NUM_LOCK_PARTITIONS; i++)
		SHMQueueInit(&(MyProc->myProcLocks[i]));
327
	MyProc->recoveryConflictPending = false;
328

329
	/*
330
	 * We might be reusing a semaphore that belonged to a failed process. So
B
Bruce Momjian 已提交
331
	 * be careful and reinitialize its value here.	(This is not strictly
332
	 * necessary anymore, but seems like a good idea for cleanliness.)
333
	 */
334
	PGSemaphoreReset(&MyProc->sem);
335

336
	/*
337
	 * Arrange to clean up at backend exit.
338
	 */
339
	on_shmem_exit(ProcKill, 0);
340 341

	/*
B
Bruce Momjian 已提交
342 343
	 * Now that we have a PGPROC, we could try to acquire locks, so initialize
	 * the deadlock checker.
344 345
	 */
	InitDeadLockChecking();
346 347
}

348 349 350 351
/*
 * InitProcessPhase2 -- make MyProc visible in the shared ProcArray.
 *
 * This is separate from InitProcess because we can't acquire LWLocks until
352 353
 * we've created a PGPROC, but in the EXEC_BACKEND case ProcArrayAdd won't
 * work until after we've done CreateSharedMemoryAndSemaphores.
354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370
 */
void
InitProcessPhase2(void)
{
	Assert(MyProc != NULL);

	/*
	 * Add our PGPROC to the PGPROC array in shared memory.
	 */
	ProcArrayAdd(MyProc);

	/*
	 * Arrange to clean that up at backend exit.
	 */
	on_shmem_exit(RemoveProcFromArray, 0);
}

371
/*
372
 * InitAuxiliaryProcess -- create a per-auxiliary-process data structure
373
 *
374 375
 * This is called by bgwriter and similar processes so that they will have a
 * MyProc value that's real enough to let them wait for LWLocks.  The PGPROC
376
 * and sema that are assigned are one of the extra ones created during
377
 * InitProcGlobal.
378
 *
379
 * Auxiliary processes are presently not expected to wait for real (lockmgr)
380
 * locks, so we need not set up the deadlock checker.  They are never added
B
Bruce Momjian 已提交
381
 * to the ProcArray or the sinval messaging mechanism, either.	They also
382 383
 * don't get a VXID assigned, since this is only useful when we actually
 * hold lockmgr locks.
384 385 386 387 388
 *
 * Startup process however uses locks but never waits for them in the
 * normal backend sense. Startup process also takes part in sinval messaging
 * as a sendOnly process, so never reads messages from sinval queue. So
 * Startup process does have a VXID and does show up in pg_locks.
389 390
 */
void
391
InitAuxiliaryProcess(void)
392
{
393
	PGPROC	   *auxproc;
394
	int			proctype;
395
	int			i;
J
Jan Wieck 已提交
396

397
	/*
398 399
	 * ProcGlobal should be set up already (if we are a backend, we inherit
	 * this by fork() or EXEC_BACKEND mechanism from the postmaster).
400
	 */
401
	if (ProcGlobal == NULL || AuxiliaryProcs == NULL)
402
		elog(PANIC, "proc header uninitialized");
403 404

	if (MyProc != NULL)
405
		elog(ERROR, "you already exist");
406

407
	/*
408
	 * We use the ProcStructLock to protect assignment and releasing of
409
	 * AuxiliaryProcs entries.
410
	 *
B
Bruce Momjian 已提交
411 412
	 * While we are holding the ProcStructLock, also copy the current shared
	 * estimate of spins_per_delay to local storage.
413 414 415 416 417
	 */
	SpinLockAcquire(ProcStructLock);

	set_spins_per_delay(ProcGlobal->spins_per_delay);

418
	/*
419
	 * Find a free auxproc ... *big* trouble if there isn't one ...
420
	 */
421
	for (proctype = 0; proctype < NUM_AUXILIARY_PROCS; proctype++)
422
	{
423 424
		auxproc = &AuxiliaryProcs[proctype];
		if (auxproc->pid == 0)
425 426
			break;
	}
427
	if (proctype >= NUM_AUXILIARY_PROCS)
428 429
	{
		SpinLockRelease(ProcStructLock);
430
		elog(FATAL, "all AuxiliaryProcs are in use");
431
	}
432

433
	/* Mark auxiliary proc as in use by me */
434
	/* use volatile pointer to prevent code rearrangement */
435
	((volatile PGPROC *) auxproc)->pid = MyProcPid;
436

437
	MyProc = auxproc;
438 439 440

	SpinLockRelease(ProcStructLock);

441
	/*
442 443
	 * Initialize all fields of MyProc, except for the semaphore which was
	 * prepared for us by InitProcGlobal.
444 445
	 */
	SHMQueueElemInit(&(MyProc->links));
446
	MyProc->waitStatus = STATUS_OK;
447
	MyProc->lxid = InvalidLocalTransactionId;
448 449
	MyProc->xid = InvalidTransactionId;
	MyProc->xmin = InvalidTransactionId;
450
	MyProc->backendId = InvalidBackendId;
451
	MyProc->databaseId = InvalidOid;
452
	MyProc->roleId = InvalidOid;
453
	MyProc->inCommit = false;
454
	MyProc->vacuumFlags = 0;
455 456 457 458
	MyProc->lwWaiting = false;
	MyProc->lwExclusive = false;
	MyProc->lwWaitLink = NULL;
	MyProc->waitLock = NULL;
459
	MyProc->waitProcLock = NULL;
460 461
	for (i = 0; i < NUM_LOCK_PARTITIONS; i++)
		SHMQueueInit(&(MyProc->myProcLocks[i]));
462 463

	/*
B
Bruce Momjian 已提交
464
	 * We might be reusing a semaphore that belonged to a failed process. So
B
Bruce Momjian 已提交
465
	 * be careful and reinitialize its value here.	(This is not strictly
466
	 * necessary anymore, but seems like a good idea for cleanliness.)
467
	 */
468
	PGSemaphoreReset(&MyProc->sem);
469 470 471 472

	/*
	 * Arrange to clean up at process exit.
	 */
473
	on_shmem_exit(AuxiliaryProcKill, Int32GetDatum(proctype));
474 475
}

476 477 478 479 480 481 482 483 484 485 486 487 488 489
/*
 * Record the PID and PGPROC structures for the Startup process, for use in
 * ProcSendSignal().  See comments there for further explanation.
 */
void
PublishStartupProcessInformation(void)
{
	/* use volatile pointer to prevent code rearrangement */
	volatile PROC_HDR *procglobal = ProcGlobal;

	SpinLockAcquire(ProcStructLock);

	procglobal->startupProc = MyProc;
	procglobal->startupProcPid = MyProcPid;
490
	procglobal->startupBufferPinWaitBufId = 0;
491 492 493 494

	SpinLockRelease(ProcStructLock);
}

495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516
/*
 * Used from bufgr to share the value of the buffer that Startup waits on,
 * or to reset the value to "not waiting" (-1). This allows processing
 * of recovery conflicts for buffer pins. Set is made before backends look
 * at this value, so locking not required, especially since the set is
 * an atomic integer set operation.
 */
void
SetStartupBufferPinWaitBufId(int bufid)
{
	/* use volatile pointer to prevent code rearrangement */
	volatile PROC_HDR *procglobal = ProcGlobal;

	procglobal->startupBufferPinWaitBufId = bufid;
}

/*
 * Used by backends when they receive a request to check for buffer pin waits.
 */
int
GetStartupBufferPinWaitBufId(void)
{
B
Bruce Momjian 已提交
517
	int			bufid;
518 519 520 521 522 523 524 525 526

	/* use volatile pointer to prevent code rearrangement */
	volatile PROC_HDR *procglobal = ProcGlobal;

	bufid = procglobal->startupBufferPinWaitBufId;

	return bufid;
}

527 528 529 530 531 532 533 534 535
/*
 * Check whether there are at least N free PGPROC objects.
 *
 * Note: this is designed on the assumption that N will generally be small.
 */
bool
HaveNFreeProcs(int n)
{
	PGPROC	   *proc;
B
Bruce Momjian 已提交
536

537 538 539 540 541
	/* use volatile pointer to prevent code rearrangement */
	volatile PROC_HDR *procglobal = ProcGlobal;

	SpinLockAcquire(ProcStructLock);

542
	proc = procglobal->freeProcs;
543

544
	while (n > 0 && proc != NULL)
545
	{
546
		proc = (PGPROC *) proc->links.next;
547 548 549 550 551 552 553 554
		n--;
	}

	SpinLockRelease(ProcStructLock);

	return (n <= 0);
}

555 556 557 558 559 560 561 562 563
bool
IsWaitingForLock(void)
{
	if (lockAwaited == NULL)
		return false;

	return true;
}

564 565 566 567
/*
 * Cancel any pending wait for lock, when aborting a transaction.
 *
 * (Normally, this would only happen if we accept a cancel/die
568
 * interrupt while waiting; but an ereport(ERROR) while waiting is
569 570
 * within the realm of possibility, too.)
 */
571
void
572 573
LockWaitCancel(void)
{
574 575
	LWLockId	partitionLock;

576
	/* Nothing to do if we weren't waiting for a lock */
577
	if (lockAwaited == NULL)
578
		return;
579

580
	/* Turn off the deadlock timer, if it's still running (see ProcSleep) */
581
	disable_sig_alarm(false);
582 583

	/* Unlink myself from the wait queue, if on it (might not be anymore!) */
584
	partitionLock = LockHashPartitionLock(lockAwaited->hashcode);
585
	LWLockAcquire(partitionLock, LW_EXCLUSIVE);
586

587
	if (MyProc->links.next != NULL)
588 589
	{
		/* We could not have been granted the lock yet */
590
		RemoveFromWaitQueue(MyProc, lockAwaited->hashcode);
591 592 593 594 595
	}
	else
	{
		/*
		 * Somebody kicked us off the lock queue already.  Perhaps they
B
Bruce Momjian 已提交
596 597 598
		 * granted us the lock, or perhaps they detected a deadlock. If they
		 * did grant us the lock, we'd better remember it in our local lock
		 * table.
599
		 */
600 601
		if (MyProc->waitStatus == STATUS_OK)
			GrantAwaitedLock();
602 603
	}

604
	lockAwaited = NULL;
605

606
	LWLockRelease(partitionLock);
H
Hiroshi Inoue 已提交
607

608
	/*
609
	 * We used to do PGSemaphoreReset() here to ensure that our proc's wait
B
Bruce Momjian 已提交
610 611 612 613 614 615
	 * semaphore is reset to zero.	This prevented a leftover wakeup signal
	 * from remaining in the semaphore if someone else had granted us the lock
	 * we wanted before we were able to remove ourselves from the wait-list.
	 * However, now that ProcSleep loops until waitStatus changes, a leftover
	 * wakeup signal isn't harmful, and it seems not worth expending cycles to
	 * get rid of a signal that most likely isn't there.
616
	 */
H
Hiroshi Inoue 已提交
617
}
618

619

620
/*
621
 * ProcReleaseLocks() -- release locks associated with current transaction
622
 *			at main transaction commit or abort
623 624
 *
 * At main transaction commit, we release all locks except session locks.
625
 * At main transaction abort, we release all locks including session locks.
626 627
 *
 * At subtransaction commit, we don't release any locks (so this func is not
628
 * needed at all); we will defer the releasing to the parent transaction.
629
 * At subtransaction abort, we release all locks held by the subtransaction;
630 631
 * this is implemented by retail releasing of the locks under control of
 * the ResourceOwner mechanism.
632 633
 */
void
634
ProcReleaseLocks(bool isCommit)
635
{
636 637
	if (!MyProc)
		return;
638 639 640
	/* If waiting, get off wait queue (should only be needed after error) */
	LockWaitCancel();
	/* Release locks */
641
	LockReleaseAll(DEFAULT_LOCKMETHOD, !isCommit);
642 643 644

	/* Release transaction level advisory locks */
	LockReleaseAll(USER_LOCKMETHOD, false);
645 646 647
}


648 649 650 651 652 653 654
/*
 * RemoveProcFromArray() -- Remove this process from the shared ProcArray.
 */
static void
RemoveProcFromArray(int code, Datum arg)
{
	Assert(MyProc != NULL);
655
	ProcArrayRemove(MyProc, InvalidTransactionId);
656 657
}

658 659
/*
 * ProcKill() -- Destroy the per-proc data structure for
660
 *		this process. Release any of its held LW locks.
661 662
 */
static void
663
ProcKill(int code, Datum arg)
664
{
665 666 667
	/* use volatile pointer to prevent code rearrangement */
	volatile PROC_HDR *procglobal = ProcGlobal;

668
	Assert(MyProc != NULL);
669

670
	/*
B
Bruce Momjian 已提交
671 672
	 * Release any LW locks I am holding.  There really shouldn't be any, but
	 * it's cheap to check again before we cut the knees off the LWLock
673
	 * facility by releasing our PGPROC ...
674
	 */
675
	LWLockReleaseAll();
676

677
	SpinLockAcquire(ProcStructLock);
678

679 680
	/* Return PGPROC structure (and semaphore) to appropriate freelist */
	if (IsAnyAutoVacuumProcess())
681
	{
682 683
		MyProc->links.next = (SHM_QUEUE *) procglobal->autovacFreeProcs;
		procglobal->autovacFreeProcs = MyProc;
684 685 686
	}
	else
	{
687 688
		MyProc->links.next = (SHM_QUEUE *) procglobal->freeProcs;
		procglobal->freeProcs = MyProc;
689
	}
690

J
Jan Wieck 已提交
691
	/* PGPROC struct isn't mine anymore */
692
	MyProc = NULL;
693

694 695 696
	/* Update shared estimate of spins_per_delay */
	procglobal->spins_per_delay = update_spins_per_delay(procglobal->spins_per_delay);

697
	SpinLockRelease(ProcStructLock);
698

699 700
	/*
	 * This process is no longer present in shared memory in any meaningful
B
Bruce Momjian 已提交
701 702
	 * way, so tell the postmaster we've cleaned up acceptably well. (XXX
	 * autovac launcher should be included here someday)
703
	 */
704
	if (IsUnderPostmaster && !IsAutoVacuumLauncherProcess())
705 706
		MarkPostmasterChildInactive();

707 708
	/* wake autovac launcher if needed -- see comments in FreeWorkerInfo */
	if (AutovacuumLauncherPid != 0)
709
		kill(AutovacuumLauncherPid, SIGUSR2);
710 711 712
}

/*
713 714 715
 * AuxiliaryProcKill() -- Cut-down version of ProcKill for auxiliary
 *		processes (bgwriter, etc).	The PGPROC and sema are not released, only
 *		marked as not-in-use.
716 717
 */
static void
718
AuxiliaryProcKill(int code, Datum arg)
719
{
B
Bruce Momjian 已提交
720
	int			proctype = DatumGetInt32(arg);
721
	PGPROC	   *auxproc;
J
Jan Wieck 已提交
722

723
	Assert(proctype >= 0 && proctype < NUM_AUXILIARY_PROCS);
J
Jan Wieck 已提交
724

725
	auxproc = &AuxiliaryProcs[proctype];
J
Jan Wieck 已提交
726

727
	Assert(MyProc == auxproc);
728

729
	/* Release any LW locks I am holding (see notes above) */
730 731
	LWLockReleaseAll();

732 733
	SpinLockAcquire(ProcStructLock);

734
	/* Mark auxiliary proc no longer in use */
735 736
	MyProc->pid = 0;

J
Jan Wieck 已提交
737
	/* PGPROC struct isn't mine anymore */
738
	MyProc = NULL;
739 740 741 742 743

	/* Update shared estimate of spins_per_delay */
	ProcGlobal->spins_per_delay = update_spins_per_delay(ProcGlobal->spins_per_delay);

	SpinLockRelease(ProcStructLock);
744 745
}

746

747 748
/*
 * ProcQueue package: routines for putting processes to sleep
749
 *		and  waking them up
750 751 752 753 754
 */

/*
 * ProcQueueAlloc -- alloc/attach to a shared memory process queue
 *
755 756
 * Returns: a pointer to the queue
 * Side Effects: Initializes the queue if it wasn't there before
757
 */
758
#ifdef NOT_USED
759
PROC_QUEUE *
760
ProcQueueAlloc(const char *name)
761
{
762
	PROC_QUEUE *queue;
763
	bool		found;
764

765 766 767
	queue = (PROC_QUEUE *)
		ShmemInitStruct(name, sizeof(PROC_QUEUE), &found);

768 769
	if (!found)
		ProcQueueInit(queue);
770

771
	return queue;
772
}
773
#endif
774 775 776 777 778

/*
 * ProcQueueInit -- initialize a shared memory process queue
 */
void
779
ProcQueueInit(PROC_QUEUE *queue)
780
{
781 782
	SHMQueueInit(&(queue->links));
	queue->size = 0;
783 784 785 786
}


/*
787
 * ProcSleep -- put a process to sleep on the specified lock
788
 *
789 790
 * Caller must have set MyProc->heldLocks to reflect locks already held
 * on the lockable object by this process (under all XIDs).
791
 *
792
 * The lock table's partition lock must be held at entry, and will be held
793
 * at exit.
794
 *
795
 * Result: STATUS_OK if we acquired the lock, STATUS_ERROR if not (deadlock).
796
 *
797
 * ASSUME: that no one will fiddle with the queue until after
798
 *		we release the partition lock.
799 800
 *
 * NOTES: The process queue is now a priority queue for locking.
801 802 803
 *
 * P() on the semaphore should put us to sleep.  The process
 * semaphore is normally zero, so when we try to acquire it, we sleep.
804 805
 */
int
806
ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable)
807
{
808 809 810
	LOCKMODE	lockmode = locallock->tag.mode;
	LOCK	   *lock = locallock->lock;
	PROCLOCK   *proclock = locallock->proclock;
811 812
	uint32		hashcode = locallock->hashcode;
	LWLockId	partitionLock = LockHashPartitionLock(hashcode);
813
	PROC_QUEUE *waitQueue = &(lock->waitProcs);
814
	LOCKMASK	myHeldLocks = MyProc->heldLocks;
815
	bool		early_deadlock = false;
B
Bruce Momjian 已提交
816
	bool		allow_autovacuum_cancel = true;
817
	int			myWaitStatus;
J
Jan Wieck 已提交
818
	PGPROC	   *proc;
819
	int			i;
820

821
	/*
822 823
	 * Determine where to add myself in the wait queue.
	 *
824 825 826 827
	 * Normally I should go at the end of the queue.  However, if I already
	 * hold locks that conflict with the request of any previous waiter, put
	 * myself in the queue just in front of the first such waiter. This is not
	 * a necessary step, since deadlock detection would move me to before that
B
Bruce Momjian 已提交
828 829
	 * waiter anyway; but it's relatively cheap to detect such a conflict
	 * immediately, and avoid delaying till deadlock timeout.
830
	 *
831 832
	 * Special case: if I find I should go in front of some waiter, check to
	 * see if I conflict with already-held locks or the requests before that
B
Bruce Momjian 已提交
833 834 835 836
	 * waiter.	If not, then just grant myself the requested lock immediately.
	 * This is the same as the test for immediate grant in LockAcquire, except
	 * we are only considering the part of the wait queue before my insertion
	 * point.
837 838
	 */
	if (myHeldLocks != 0)
V
Vadim B. Mikheev 已提交
839
	{
840
		LOCKMASK	aheadRequests = 0;
841

842
		proc = (PGPROC *) waitQueue->links.next;
843
		for (i = 0; i < waitQueue->size; i++)
V
Vadim B. Mikheev 已提交
844
		{
845
			/* Must he wait for me? */
B
Bruce Momjian 已提交
846
			if (lockMethodTable->conflictTab[proc->waitLockMode] & myHeldLocks)
V
Vadim B. Mikheev 已提交
847
			{
848
				/* Must I wait for him ? */
B
Bruce Momjian 已提交
849
				if (lockMethodTable->conflictTab[lockmode] & proc->heldLocks)
850
				{
851
					/*
B
Bruce Momjian 已提交
852 853 854 855 856
					 * Yes, so we have a deadlock.	Easiest way to clean up
					 * correctly is to call RemoveFromWaitQueue(), but we
					 * can't do that until we are *on* the wait queue. So, set
					 * a flag to check below, and break out of loop.  Also,
					 * record deadlock info for later message.
857
					 */
858
					RememberSimpleDeadLock(MyProc, lockmode, lock, proc);
859 860
					early_deadlock = true;
					break;
861
				}
862
				/* I must go before this waiter.  Check special case. */
B
Bruce Momjian 已提交
863
				if ((lockMethodTable->conflictTab[lockmode] & aheadRequests) == 0 &&
864 865 866
					LockCheckConflicts(lockMethodTable,
									   lockmode,
									   lock,
867
									   proclock,
868
									   MyProc) == STATUS_OK)
869
				{
870
					/* Skip the wait and just grant myself the lock. */
871
					GrantLock(lock, proclock, lockmode);
872
					GrantAwaitedLock();
873
					return STATUS_OK;
874 875
				}
				/* Break out of loop to put myself before him */
V
Vadim B. Mikheev 已提交
876
				break;
877
			}
878
			/* Nope, so advance to next waiter */
879
			aheadRequests |= LOCKBIT_ON(proc->waitLockMode);
880
			proc = (PGPROC *) proc->links.next;
V
Vadim B. Mikheev 已提交
881
		}
B
Bruce Momjian 已提交
882

883
		/*
B
Bruce Momjian 已提交
884 885
		 * If we fall out of loop normally, proc points to waitQueue head, so
		 * we will insert at tail of queue as desired.
886
		 */
887 888 889 890
	}
	else
	{
		/* I hold no locks, so I can't push in front of anyone. */
J
Jan Wieck 已提交
891
		proc = (PGPROC *) &(waitQueue->links);
V
Vadim B. Mikheev 已提交
892
	}
893

894
	/*
B
Bruce Momjian 已提交
895
	 * Insert self into queue, ahead of the given proc (or at tail of queue).
896
	 */
897
	SHMQueueInsertBefore(&(proc->links), &(MyProc->links));
B
Bruce Momjian 已提交
898
	waitQueue->size++;
899

900
	lock->waitMask |= LOCKBIT_ON(lockmode);
901

J
Jan Wieck 已提交
902
	/* Set up wait information in PGPROC object, too */
903
	MyProc->waitLock = lock;
904
	MyProc->waitProcLock = proclock;
905 906
	MyProc->waitLockMode = lockmode;

907
	MyProc->waitStatus = STATUS_WAITING;
908 909

	/*
B
Bruce Momjian 已提交
910 911 912
	 * If we detected deadlock, give up without waiting.  This must agree with
	 * CheckDeadLock's recovery code, except that we shouldn't release the
	 * semaphore since we haven't tried to lock it yet.
913 914 915
	 */
	if (early_deadlock)
	{
916
		RemoveFromWaitQueue(MyProc, hashcode);
917 918
		return STATUS_ERROR;
	}
919

920
	/* mark that we are waiting for a lock */
921
	lockAwaited = locallock;
922

923
	/*
924
	 * Release the lock table's partition lock.
925
	 *
926
	 * NOTE: this may also cause us to exit critical-section state, possibly
B
Bruce Momjian 已提交
927 928
	 * allowing a cancel/die interrupt to be accepted. This is OK because we
	 * have recorded the fact that we are waiting for a lock, and so
929
	 * LockWaitCancel will clean up if cancel/die happens.
930
	 */
931
	LWLockRelease(partitionLock);
932

933 934 935
	/* Reset deadlock_state before enabling the signal handler */
	deadlock_state = DS_NOT_YET_CHECKED;

936
	/*
B
Bruce Momjian 已提交
937 938 939 940
	 * Set timer so we can wake up after awhile and check for a deadlock. If a
	 * deadlock is detected, the handler releases the process's semaphore and
	 * sets MyProc->waitStatus = STATUS_ERROR, allowing us to know that we
	 * must report failure rather than success.
941
	 *
942 943
	 * By delaying the check until we've waited for a bit, we can avoid
	 * running the rather expensive deadlock-check code in most cases.
944
	 */
945
	if (!enable_sig_alarm(DeadlockTimeout, false))
946
		elog(FATAL, "could not set timer for process wakeup");
947

948
	/*
949
	 * If someone wakes us between LWLockRelease and PGSemaphoreLock,
B
Bruce Momjian 已提交
950
	 * PGSemaphoreLock will not block.	The wakeup is "saved" by the semaphore
B
Bruce Momjian 已提交
951 952 953 954 955
	 * implementation.	While this is normally good, there are cases where a
	 * saved wakeup might be leftover from a previous operation (for example,
	 * we aborted ProcWaitForSignal just before someone did ProcSendSignal).
	 * So, loop to wait again if the waitStatus shows we haven't been granted
	 * nor denied the lock yet.
956
	 *
957 958 959 960 961 962 963
	 * We pass interruptOK = true, which eliminates a window in which
	 * cancel/die interrupts would be held off undesirably.  This is a promise
	 * that we don't mind losing control to a cancel/die interrupt here.  We
	 * don't, because we have no shared-state-change work to do after being
	 * granted the lock (the grantor did it all).  We do have to worry about
	 * updating the locallock table, but if we lose control to an error,
	 * LockWaitCancel will fix that up.
964
	 */
B
Bruce Momjian 已提交
965 966
	do
	{
967
		PGSemaphoreLock(&MyProc->sem, true);
968

969 970
		/*
		 * waitStatus could change from STATUS_WAITING to something else
B
Bruce Momjian 已提交
971
		 * asynchronously.	Read it just once per loop to prevent surprising
972 973 974 975
		 * behavior (such as missing log messages).
		 */
		myWaitStatus = MyProc->waitStatus;

976 977
		/*
		 * If we are not deadlocked, but are waiting on an autovacuum-induced
B
Bruce Momjian 已提交
978
		 * task, send a signal to interrupt it.
979 980 981
		 */
		if (deadlock_state == DS_BLOCKED_BY_AUTOVACUUM && allow_autovacuum_cancel)
		{
B
Bruce Momjian 已提交
982
			PGPROC	   *autovac = GetBlockingAutoVacuumPgproc();
983 984 985 986 987 988 989 990 991 992 993

			LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE);

			/*
			 * Only do it if the worker is not working to protect against Xid
			 * wraparound.
			 */
			if ((autovac != NULL) &&
				(autovac->vacuumFlags & PROC_IS_AUTOVACUUM) &&
				!(autovac->vacuumFlags & PROC_VACUUM_FOR_WRAPAROUND))
			{
B
Bruce Momjian 已提交
994
				int			pid = autovac->pid;
995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017

				elog(DEBUG2, "sending cancel to blocking autovacuum pid = %d",
					 pid);

				/* don't hold the lock across the kill() syscall */
				LWLockRelease(ProcArrayLock);

				/* send the autovacuum worker Back to Old Kent Road */
				if (kill(pid, SIGINT) < 0)
				{
					/* Just a warning to allow multiple callers */
					ereport(WARNING,
							(errmsg("could not send signal to process %d: %m",
									pid)));
				}
			}
			else
				LWLockRelease(ProcArrayLock);

			/* prevent signal from being resent more than once */
			allow_autovacuum_cancel = false;
		}

1018 1019 1020 1021
		/*
		 * If awoken after the deadlock check interrupt has run, and
		 * log_lock_waits is on, then report about the wait.
		 */
1022
		if (log_lock_waits && deadlock_state != DS_NOT_YET_CHECKED)
1023
		{
1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041
			StringInfoData buf;
			const char *modename;
			long		secs;
			int			usecs;
			long		msecs;

			initStringInfo(&buf);
			DescribeLockTag(&buf, &locallock->tag.lock);
			modename = GetLockmodeName(locallock->tag.lock.locktag_lockmethodid,
									   lockmode);
			TimestampDifference(timeout_start_time, GetCurrentTimestamp(),
								&secs, &usecs);
			msecs = secs * 1000 + usecs / 1000;
			usecs = usecs % 1000;

			if (deadlock_state == DS_SOFT_DEADLOCK)
				ereport(LOG,
						(errmsg("process %d avoided deadlock for %s on %s by rearranging queue order after %ld.%03d ms",
B
Bruce Momjian 已提交
1042
							  MyProcPid, modename, buf.data, msecs, usecs)));
1043
			else if (deadlock_state == DS_HARD_DEADLOCK)
1044
			{
1045
				/*
B
Bruce Momjian 已提交
1046 1047 1048 1049
				 * This message is a bit redundant with the error that will be
				 * reported subsequently, but in some cases the error report
				 * might not make it to the log (eg, if it's caught by an
				 * exception handler), and we want to ensure all long-wait
1050 1051 1052 1053
				 * events get logged.
				 */
				ereport(LOG,
						(errmsg("process %d detected deadlock while waiting for %s on %s after %ld.%03d ms",
B
Bruce Momjian 已提交
1054
							  MyProcPid, modename, buf.data, msecs, usecs)));
1055
			}
1056 1057 1058 1059

			if (myWaitStatus == STATUS_WAITING)
				ereport(LOG,
						(errmsg("process %d still waiting for %s on %s after %ld.%03d ms",
B
Bruce Momjian 已提交
1060
							  MyProcPid, modename, buf.data, msecs, usecs)));
1061 1062
			else if (myWaitStatus == STATUS_OK)
				ereport(LOG,
B
Bruce Momjian 已提交
1063 1064
					(errmsg("process %d acquired %s on %s after %ld.%03d ms",
							MyProcPid, modename, buf.data, msecs, usecs)));
1065 1066 1067
			else
			{
				Assert(myWaitStatus == STATUS_ERROR);
B
Bruce Momjian 已提交
1068

1069 1070
				/*
				 * Currently, the deadlock checker always kicks its own
B
Bruce Momjian 已提交
1071 1072 1073 1074 1075
				 * process, which means that we'll only see STATUS_ERROR when
				 * deadlock_state == DS_HARD_DEADLOCK, and there's no need to
				 * print redundant messages.  But for completeness and
				 * future-proofing, print a message if it looks like someone
				 * else kicked us off the lock.
1076 1077 1078 1079
				 */
				if (deadlock_state != DS_HARD_DEADLOCK)
					ereport(LOG,
							(errmsg("process %d failed to acquire %s on %s after %ld.%03d ms",
B
Bruce Momjian 已提交
1080
							  MyProcPid, modename, buf.data, msecs, usecs)));
1081 1082 1083
			}

			/*
B
Bruce Momjian 已提交
1084 1085
			 * At this point we might still need to wait for the lock. Reset
			 * state so we don't print the above messages again.
1086 1087 1088 1089
			 */
			deadlock_state = DS_NO_DEADLOCK;

			pfree(buf.data);
1090
		}
1091
	} while (myWaitStatus == STATUS_WAITING);
1092

1093
	/*
1094
	 * Disable the timer, if it's still running
B
Bruce Momjian 已提交
1095
	 */
1096
	if (!disable_sig_alarm(false))
1097
		elog(FATAL, "could not disable timer for process wakeup");
B
Bruce Momjian 已提交
1098

1099
	/*
B
Bruce Momjian 已提交
1100 1101 1102
	 * Re-acquire the lock table's partition lock.  We have to do this to hold
	 * off cancel/die interrupts before we can mess with lockAwaited (else we
	 * might have a missed or duplicated locallock update).
1103
	 */
1104
	LWLockAcquire(partitionLock, LW_EXCLUSIVE);
1105 1106 1107

	/*
	 * We no longer want LockWaitCancel to do anything.
1108
	 */
1109
	lockAwaited = NULL;
1110

1111
	/*
1112
	 * If we got the lock, be sure to remember it in the locallock table.
1113
	 */
1114
	if (MyProc->waitStatus == STATUS_OK)
1115
		GrantAwaitedLock();
1116

1117 1118 1119 1120
	/*
	 * We don't have to do anything else, because the awaker did all the
	 * necessary update of the lock table and MyProc.
	 */
1121
	return MyProc->waitStatus;
1122 1123 1124 1125 1126 1127
}


/*
 * ProcWakeup -- wake up a process by releasing its private semaphore.
 *
1128
 *	 Also remove the process from the wait queue and set its links invalid.
1129
 *	 RETURN: the next process in the wait queue.
1130
 *
1131 1132
 * The appropriate lock partition lock must be held by caller.
 *
1133 1134 1135
 * XXX: presently, this code is only used for the "success" case, and only
 * works correctly for that case.  To clean up in failure case, would need
 * to twiddle the lock's request counts too --- see RemoveFromWaitQueue.
1136
 * Hence, in practice the waitStatus parameter must be STATUS_OK.
1137
 */
J
Jan Wieck 已提交
1138
PGPROC *
1139
ProcWakeup(PGPROC *proc, int waitStatus)
1140
{
J
Jan Wieck 已提交
1141
	PGPROC	   *retProc;
1142

1143
	/* Proc should be sleeping ... */
1144 1145
	if (proc->links.prev == NULL ||
		proc->links.next == NULL)
1146
		return NULL;
1147
	Assert(proc->waitStatus == STATUS_WAITING);
1148

1149
	/* Save next process before we zap the list link */
1150
	retProc = (PGPROC *) proc->links.next;
1151

1152
	/* Remove process from wait queue */
1153
	SHMQueueDelete(&(proc->links));
1154
	(proc->waitLock->waitProcs.size)--;
1155

1156 1157
	/* Clean up process' state and pass it the ok/fail signal */
	proc->waitLock = NULL;
1158
	proc->waitProcLock = NULL;
1159
	proc->waitStatus = waitStatus;
1160

1161
	/* And awaken it */
1162
	PGSemaphoreUnlock(&proc->sem);
1163 1164

	return retProc;
1165 1166 1167 1168
}

/*
 * ProcLockWakeup -- routine for waking up processes when a lock is
1169 1170
 *		released (or a prior waiter is aborted).  Scan all waiters
 *		for lock, waken any that are no longer blocked.
1171 1172
 *
 * The appropriate lock partition lock must be held by caller.
1173
 */
1174
void
1175
ProcLockWakeup(LockMethod lockMethodTable, LOCK *lock)
1176
{
1177 1178
	PROC_QUEUE *waitQueue = &(lock->waitProcs);
	int			queue_size = waitQueue->size;
J
Jan Wieck 已提交
1179
	PGPROC	   *proc;
1180
	LOCKMASK	aheadRequests = 0;
M
 
Marc G. Fournier 已提交
1181

1182
	Assert(queue_size >= 0);
1183

1184 1185
	if (queue_size == 0)
		return;
1186

1187
	proc = (PGPROC *) waitQueue->links.next;
1188

1189 1190
	while (queue_size-- > 0)
	{
B
Bruce Momjian 已提交
1191
		LOCKMODE	lockmode = proc->waitLockMode;
M
 
Marc G. Fournier 已提交
1192 1193

		/*
B
Bruce Momjian 已提交
1194 1195
		 * Waken if (a) doesn't conflict with requests of earlier waiters, and
		 * (b) doesn't conflict with already-held locks.
M
 
Marc G. Fournier 已提交
1196
		 */
B
Bruce Momjian 已提交
1197
		if ((lockMethodTable->conflictTab[lockmode] & aheadRequests) == 0 &&
1198 1199 1200
			LockCheckConflicts(lockMethodTable,
							   lockmode,
							   lock,
1201
							   proc->waitProcLock,
1202
							   proc) == STATUS_OK)
M
 
Marc G. Fournier 已提交
1203
		{
1204
			/* OK to waken */
1205
			GrantLock(lock, proc->waitProcLock, lockmode);
1206
			proc = ProcWakeup(proc, STATUS_OK);
B
Bruce Momjian 已提交
1207

1208
			/*
B
Bruce Momjian 已提交
1209 1210 1211
			 * ProcWakeup removes proc from the lock's waiting process queue
			 * and returns the next proc in chain; don't use proc's next-link,
			 * because it's been cleared.
1212
			 */
M
 
Marc G. Fournier 已提交
1213
		}
1214
		else
1215
		{
B
Bruce Momjian 已提交
1216
			/*
B
Bruce Momjian 已提交
1217
			 * Cannot wake this guy. Remember his request for later checks.
B
Bruce Momjian 已提交
1218
			 */
1219
			aheadRequests |= LOCKBIT_ON(lockmode);
1220
			proc = (PGPROC *) proc->links.next;
1221
		}
M
 
Marc G. Fournier 已提交
1222
	}
1223 1224

	Assert(waitQueue->size >= 0);
1225 1226
}

1227 1228 1229
/*
 * CheckDeadLock
 *
1230
 * We only get to this routine if we got SIGALRM after DeadlockTimeout
1231 1232
 * while waiting for a lock to be released by some other process.  Look
 * to see if there's a deadlock; if not, just return and continue waiting.
1233
 * (But signal ProcSleep to log a message, if log_lock_waits is true.)
1234 1235
 * If we have a real deadlock, remove ourselves from the lock's wait queue
 * and signal an error to ProcSleep.
1236 1237 1238
 *
 * NB: this is run inside a signal handler, so be very wary about what is done
 * here or in called routines.
1239
 */
1240
static void
1241
CheckDeadLock(void)
1242
{
1243 1244
	int			i;

1245
	/*
B
Bruce Momjian 已提交
1246 1247
	 * Acquire exclusive lock on the entire shared lock data structures. Must
	 * grab LWLocks in partition-number order to avoid LWLock deadlock.
1248 1249 1250 1251 1252 1253
	 *
	 * Note that the deadlock check interrupt had better not be enabled
	 * anywhere that this process itself holds lock partition locks, else this
	 * will wait forever.  Also note that LWLockAcquire creates a critical
	 * section, so that this routine cannot be interrupted by cancel/die
	 * interrupts.
1254
	 */
1255 1256
	for (i = 0; i < NUM_LOCK_PARTITIONS; i++)
		LWLockAcquire(FirstLockMgrLock + i, LW_EXCLUSIVE);
1257

1258
	/*
1259 1260
	 * Check to see if we've been awoken by anyone in the interim.
	 *
1261
	 * If we have, we can return and resume our transaction -- happy day.
1262 1263
	 * Before we are awoken the process releasing the lock grants it to us so
	 * we know that we don't have to wait anymore.
1264
	 *
1265
	 * We check by looking to see if we've been unlinked from the wait queue.
B
Bruce Momjian 已提交
1266
	 * This is quicker than checking our semaphore's state, since no kernel
1267
	 * call is needed, and it is safe because we hold the lock partition lock.
1268
	 */
1269 1270
	if (MyProc->links.prev == NULL ||
		MyProc->links.next == NULL)
1271 1272 1273 1274 1275 1276 1277 1278 1279 1280
		goto check_done;

#ifdef LOCK_DEBUG
	if (Debug_deadlocks)
		DumpAllLocks();
#endif

	/* Run the deadlock check, and set deadlock_state for use by ProcSleep */
	deadlock_state = DeadLockCheck(MyProc);

1281
	if (deadlock_state == DS_HARD_DEADLOCK)
B
Bruce Momjian 已提交
1282
	{
1283 1284 1285
		/*
		 * Oops.  We have a deadlock.
		 *
1286 1287 1288 1289
		 * Get this process out of wait state. (Note: we could do this more
		 * efficiently by relying on lockAwaited, but use this coding to
		 * preserve the flexibility to kill some other transaction than the
		 * one detecting the deadlock.)
1290 1291
		 *
		 * RemoveFromWaitQueue sets MyProc->waitStatus to STATUS_ERROR, so
1292 1293
		 * ProcSleep will report an error after we return from the signal
		 * handler.
1294 1295 1296
		 */
		Assert(MyProc->waitLock != NULL);
		RemoveFromWaitQueue(MyProc, LockTagHashCode(&(MyProc->waitLock->tag)));
1297

1298 1299 1300 1301 1302
		/*
		 * Unlock my semaphore so that the interrupted ProcSleep() call can
		 * finish.
		 */
		PGSemaphoreUnlock(&MyProc->sem);
1303

1304
		/*
1305 1306 1307 1308 1309 1310 1311 1312
		 * We're done here.  Transaction abort caused by the error that
		 * ProcSleep will raise will cause any other locks we hold to be
		 * released, thus allowing other processes to wake up; we don't need
		 * to do that here.  NOTE: an exception is that releasing locks we
		 * hold doesn't consider the possibility of waiters that were blocked
		 * behind us on the lock we just failed to get, and might now be
		 * wakable because we're not in front of them anymore.  However,
		 * RemoveFromWaitQueue took care of waking up any such processes.
1313 1314
		 */
	}
1315
	else if (log_lock_waits || deadlock_state == DS_BLOCKED_BY_AUTOVACUUM)
1316 1317 1318 1319
	{
		/*
		 * Unlock my semaphore so that the interrupted ProcSleep() call can
		 * print the log message (we daren't do it here because we are inside
B
Bruce Momjian 已提交
1320 1321
		 * a signal handler).  It will then sleep again until someone releases
		 * the lock.
1322 1323 1324
		 *
		 * If blocked by autovacuum, this wakeup will enable ProcSleep to send
		 * the cancelling signal to the autovacuum worker.
1325 1326 1327
		 */
		PGSemaphoreUnlock(&MyProc->sem);
	}
1328 1329

	/*
B
Bruce Momjian 已提交
1330 1331 1332 1333 1334
	 * And release locks.  We do this in reverse order for two reasons: (1)
	 * Anyone else who needs more than one of the locks will be trying to lock
	 * them in increasing order; we don't want to release the other process
	 * until it can get all the locks it needs. (2) This avoids O(N^2)
	 * behavior inside LWLockRelease.
1335
	 */
1336
check_done:
B
Bruce Momjian 已提交
1337
	for (i = NUM_LOCK_PARTITIONS; --i >= 0;)
1338
		LWLockRelease(FirstLockMgrLock + i);
1339 1340 1341
}


1342 1343 1344 1345 1346 1347
/*
 * ProcWaitForSignal - wait for a signal from another backend.
 *
 * This can share the semaphore normally used for waiting for locks,
 * since a backend could never be waiting for a lock and a signal at
 * the same time.  As with locks, it's OK if the signal arrives just
B
Bruce Momjian 已提交
1348
 * before we actually reach the waiting state.	Also as with locks,
1349 1350
 * it's necessary that the caller be robust against bogus wakeups:
 * always check that the desired state has occurred, and wait again
B
Bruce Momjian 已提交
1351
 * if not.	This copes with possible "leftover" wakeups.
1352 1353 1354 1355
 */
void
ProcWaitForSignal(void)
{
1356
	PGSemaphoreLock(&MyProc->sem, true);
1357 1358 1359
}

/*
1360
 * ProcSendSignal - send a signal to a backend identified by PID
1361 1362
 */
void
1363
ProcSendSignal(int pid)
1364
{
1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375
	PGPROC	   *proc = NULL;

	if (RecoveryInProgress())
	{
		/* use volatile pointer to prevent code rearrangement */
		volatile PROC_HDR *procglobal = ProcGlobal;

		SpinLockAcquire(ProcStructLock);

		/*
		 * Check to see whether it is the Startup process we wish to signal.
B
Bruce Momjian 已提交
1376 1377
		 * This call is made by the buffer manager when it wishes to wake up a
		 * process that has been waiting for a pin in so it can obtain a
1378
		 * cleanup lock using LockBufferForCleanup(). Startup is not a normal
B
Bruce Momjian 已提交
1379 1380
		 * backend, so BackendPidGetProc() will not return any pid at all. So
		 * we remember the information for this special case.
1381 1382 1383 1384 1385 1386 1387 1388 1389
		 */
		if (pid == procglobal->startupProcPid)
			proc = procglobal->startupProc;

		SpinLockRelease(ProcStructLock);
	}

	if (proc == NULL)
		proc = BackendPidGetProc(pid);
1390 1391

	if (proc != NULL)
1392
		PGSemaphoreUnlock(&proc->sem);
1393 1394 1395
}


1396 1397 1398 1399 1400 1401 1402 1403 1404
/*****************************************************************************
 * SIGALRM interrupt support
 *
 * Maybe these should be in pqsignal.c?
 *****************************************************************************/

/*
 * Enable the SIGALRM interrupt to fire after the specified delay
 *
1405
 * Delay is given in milliseconds.	Caller should be sure a SIGALRM
1406 1407
 * signal handler is installed before this is called.
 *
1408 1409
 * This code properly handles nesting of deadlock timeout alarms within
 * statement timeout alarms.
1410
 *
1411 1412 1413
 * Returns TRUE if okay, FALSE on failure.
 */
bool
1414
enable_sig_alarm(int delayms, bool is_statement_timeout)
1415
{
1416
	TimestampTz fin_time;
1417
	struct itimerval timeval;
1418

1419 1420
	if (is_statement_timeout)
	{
1421 1422 1423 1424 1425 1426 1427 1428 1429 1430
		/*
		 * Begin statement-level timeout
		 *
		 * Note that we compute statement_fin_time with reference to the
		 * statement_timestamp, but apply the specified delay without any
		 * correction; that is, we ignore whatever time has elapsed since
		 * statement_timestamp was set.  In the normal case only a small
		 * interval will have elapsed and so this doesn't matter, but there
		 * are corner cases (involving multi-statement query strings with
		 * embedded COMMIT or ROLLBACK) where we might re-initialize the
B
Bruce Momjian 已提交
1431 1432 1433 1434
		 * statement timeout long after initial receipt of the message. In
		 * such cases the enforcement of the statement timeout will be a bit
		 * inconsistent.  This annoyance is judged not worth the cost of
		 * performing an additional gettimeofday() here.
1435
		 */
1436
		Assert(!deadlock_timeout_active);
1437 1438
		fin_time = GetCurrentStatementStartTimestamp();
		fin_time = TimestampTzPlusMilliseconds(fin_time, delayms);
1439
		statement_fin_time = fin_time;
1440
		cancel_from_timeout = false;
1441
		statement_timeout_active = true;
1442 1443 1444 1445 1446 1447
	}
	else if (statement_timeout_active)
	{
		/*
		 * Begin deadlock timeout with statement-level timeout active
		 *
1448 1449 1450 1451
		 * Here, we want to interrupt at the closer of the two timeout times.
		 * If fin_time >= statement_fin_time then we need not touch the
		 * existing timer setting; else set up to interrupt at the deadlock
		 * timeout time.
1452 1453 1454
		 *
		 * NOTE: in this case it is possible that this routine will be
		 * interrupted by the previously-set timer alarm.  This is okay
B
Bruce Momjian 已提交
1455 1456 1457
		 * because the signal handler will do only what it should do according
		 * to the state variables.	The deadlock checker may get run earlier
		 * than normal, but that does no harm.
1458
		 */
1459 1460
		timeout_start_time = GetCurrentTimestamp();
		fin_time = TimestampTzPlusMilliseconds(timeout_start_time, delayms);
1461
		deadlock_timeout_active = true;
1462
		if (fin_time >= statement_fin_time)
1463 1464 1465 1466 1467 1468
			return true;
	}
	else
	{
		/* Begin deadlock timeout with no statement-level timeout */
		deadlock_timeout_active = true;
1469 1470 1471
		/* GetCurrentTimestamp can be expensive, so only do it if we must */
		if (log_lock_waits)
			timeout_start_time = GetCurrentTimestamp();
1472
	}
1473

1474
	/* If we reach here, okay to set the timer interrupt */
1475
	MemSet(&timeval, 0, sizeof(struct itimerval));
1476 1477
	timeval.it_value.tv_sec = delayms / 1000;
	timeval.it_value.tv_usec = (delayms % 1000) * 1000;
1478
	if (setitimer(ITIMER_REAL, &timeval, NULL))
1479
		return false;
1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500
	return true;
}

/*
 * Cancel the SIGALRM timer, either for a deadlock timeout or a statement
 * timeout.  If a deadlock timeout is canceled, any active statement timeout
 * remains in force.
 *
 * Returns TRUE if okay, FALSE on failure.
 */
bool
disable_sig_alarm(bool is_statement_timeout)
{
	/*
	 * Always disable the interrupt if it is active; this avoids being
	 * interrupted by the signal handler and thereby possibly getting
	 * confused.
	 *
	 * We will re-enable the interrupt if necessary in CheckStatementTimeout.
	 */
	if (statement_timeout_active || deadlock_timeout_active)
1501
	{
1502
		struct itimerval timeval;
1503

1504
		MemSet(&timeval, 0, sizeof(struct itimerval));
1505
		if (setitimer(ITIMER_REAL, &timeval, NULL))
1506
		{
1507 1508 1509
			statement_timeout_active = false;
			cancel_from_timeout = false;
			deadlock_timeout_active = false;
1510 1511
			return false;
		}
1512 1513
	}

1514 1515 1516 1517
	/* Always cancel deadlock timeout, in case this is error cleanup */
	deadlock_timeout_active = false;

	/* Cancel or reschedule statement timeout */
1518
	if (is_statement_timeout)
1519
	{
1520
		statement_timeout_active = false;
1521 1522
		cancel_from_timeout = false;
	}
1523 1524 1525 1526 1527
	else if (statement_timeout_active)
	{
		if (!CheckStatementTimeout())
			return false;
	}
1528 1529 1530
	return true;
}

1531

1532
/*
1533 1534 1535
 * Check for statement timeout.  If the timeout time has come,
 * trigger a query-cancel interrupt; if not, reschedule the SIGALRM
 * interrupt to occur at the right time.
1536
 *
1537
 * Returns true if okay, false if failed to set the interrupt.
1538
 */
1539 1540
static bool
CheckStatementTimeout(void)
1541
{
1542
	TimestampTz now;
B
Bruce Momjian 已提交
1543

1544 1545 1546
	if (!statement_timeout_active)
		return true;			/* do nothing if not active */

1547
	now = GetCurrentTimestamp();
1548

1549
	if (now >= statement_fin_time)
1550
	{
1551 1552
		/* Time to die */
		statement_timeout_active = false;
1553
		cancel_from_timeout = true;
1554 1555 1556 1557
#ifdef HAVE_SETSID
		/* try to signal whole process group */
		kill(-MyProcPid, SIGINT);
#endif
1558
		kill(MyProcPid, SIGINT);
1559 1560 1561 1562
	}
	else
	{
		/* Not time yet, so (re)schedule the interrupt */
1563 1564
		long		secs;
		int			usecs;
1565 1566
		struct itimerval timeval;

1567 1568
		TimestampDifference(now, statement_fin_time,
							&secs, &usecs);
B
Bruce Momjian 已提交
1569

1570 1571 1572 1573 1574 1575
		/*
		 * It's possible that the difference is less than a microsecond;
		 * ensure we don't cancel, rather than set, the interrupt.
		 */
		if (secs == 0 && usecs == 0)
			usecs = 1;
1576
		MemSet(&timeval, 0, sizeof(struct itimerval));
1577 1578
		timeval.it_value.tv_sec = secs;
		timeval.it_value.tv_usec = usecs;
1579
		if (setitimer(ITIMER_REAL, &timeval, NULL))
1580 1581 1582
			return false;
	}

1583 1584
	return true;
}
1585 1586 1587


/*
1588
 * Signal handler for SIGALRM for normal user backends
1589 1590 1591 1592 1593
 *
 * Process deadlock check and/or statement timeout check, as needed.
 * To avoid various edge cases, we must be careful to do nothing
 * when there is nothing to be done.  We also need to be able to
 * reschedule the timer interrupt if called before end of statement.
1594 1595 1596 1597
 */
void
handle_sig_alarm(SIGNAL_ARGS)
{
1598 1599 1600
	int			save_errno = errno;

	if (deadlock_timeout_active)
1601
	{
1602
		deadlock_timeout_active = false;
1603 1604
		CheckDeadLock();
	}
1605 1606 1607 1608 1609

	if (statement_timeout_active)
		(void) CheckStatementTimeout();

	errno = save_errno;
1610
}
1611 1612 1613 1614 1615 1616 1617

/*
 * Signal handler for SIGALRM in Startup process
 *
 * To avoid various edge cases, we must be careful to do nothing
 * when there is nothing to be done.  We also need to be able to
 * reschedule the timer interrupt if called before end of statement.
1618 1619 1620
 *
 * We set either deadlock_timeout_active or statement_timeout_active
 * or both. Interrupts are enabled if standby_timeout_active.
1621 1622
 */
bool
1623
enable_standby_sig_alarm(TimestampTz now, TimestampTz fin_time, bool deadlock_only)
1624
{
1625 1626
	TimestampTz deadlock_time = TimestampTzPlusMilliseconds(now,
															DeadlockTimeout);
1627

1628 1629 1630
	if (deadlock_only)
	{
		/*
1631
		 * Wake up at deadlock_time only, then wait forever
1632 1633 1634 1635 1636 1637 1638 1639
		 */
		statement_fin_time = deadlock_time;
		deadlock_timeout_active = true;
		statement_timeout_active = false;
	}
	else if (fin_time > deadlock_time)
	{
		/*
1640
		 * Wake up at deadlock_time, then again at fin_time
1641 1642 1643 1644 1645 1646 1647 1648 1649
		 */
		statement_fin_time = deadlock_time;
		statement_fin_time2 = fin_time;
		deadlock_timeout_active = true;
		statement_timeout_active = true;
	}
	else
	{
		/*
1650
		 * Wake only at fin_time because its fairly soon
1651 1652 1653 1654 1655
		 */
		statement_fin_time = fin_time;
		deadlock_timeout_active = false;
		statement_timeout_active = true;
	}
1656

1657 1658 1659 1660 1661
	if (deadlock_timeout_active || statement_timeout_active)
	{
		long		secs;
		int			usecs;
		struct itimerval timeval;
B
Bruce Momjian 已提交
1662

1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673
		TimestampDifference(now, statement_fin_time,
							&secs, &usecs);
		if (secs == 0 && usecs == 0)
			usecs = 1;
		MemSet(&timeval, 0, sizeof(struct itimerval));
		timeval.it_value.tv_sec = secs;
		timeval.it_value.tv_usec = usecs;
		if (setitimer(ITIMER_REAL, &timeval, NULL))
			return false;
		standby_timeout_active = true;
	}
1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713

	return true;
}

bool
disable_standby_sig_alarm(void)
{
	/*
	 * Always disable the interrupt if it is active; this avoids being
	 * interrupted by the signal handler and thereby possibly getting
	 * confused.
	 *
	 * We will re-enable the interrupt if necessary in CheckStandbyTimeout.
	 */
	if (standby_timeout_active)
	{
		struct itimerval timeval;

		MemSet(&timeval, 0, sizeof(struct itimerval));
		if (setitimer(ITIMER_REAL, &timeval, NULL))
		{
			standby_timeout_active = false;
			return false;
		}
	}

	standby_timeout_active = false;

	return true;
}

/*
 * CheckStandbyTimeout() runs unconditionally in the Startup process
 * SIGALRM handler. Timers will only be set when InHotStandby.
 * We simply ignore any signals unless the timer has been set.
 */
static bool
CheckStandbyTimeout(void)
{
	TimestampTz now;
B
Bruce Momjian 已提交
1714
	bool		reschedule = false;
1715 1716 1717 1718 1719

	standby_timeout_active = false;

	now = GetCurrentTimestamp();

1720
	/*
B
Bruce Momjian 已提交
1721 1722
	 * Reschedule the timer if its not time to wake yet, or if we have both
	 * timers set and the first one has just been reached.
1723
	 */
1724
	if (now >= statement_fin_time)
1725 1726 1727 1728
	{
		if (deadlock_timeout_active)
		{
			/*
1729
			 * We're still waiting when we reach deadlock timeout, so send out
B
Bruce Momjian 已提交
1730 1731
			 * a request to have other backends check themselves for deadlock.
			 * Then continue waiting until statement_fin_time, if that's set.
1732 1733 1734 1735 1736
			 */
			SendRecoveryConflictWithBufferPin(PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK);
			deadlock_timeout_active = false;

			/*
1737
			 * Begin second waiting period if required.
1738 1739 1740 1741 1742 1743 1744 1745 1746 1747
			 */
			if (statement_timeout_active)
			{
				reschedule = true;
				statement_fin_time = statement_fin_time2;
			}
		}
		else
		{
			/*
1748 1749
			 * We've now reached statement_fin_time, so ask all conflicts to
			 * leave, so we can press ahead with applying changes in recovery.
1750 1751 1752 1753
			 */
			SendRecoveryConflictWithBufferPin(PROCSIG_RECOVERY_CONFLICT_BUFFERPIN);
		}
	}
1754
	else
1755 1756 1757
		reschedule = true;

	if (reschedule)
1758 1759 1760 1761
	{
		long		secs;
		int			usecs;
		struct itimerval timeval;
B
Bruce Momjian 已提交
1762

1763 1764 1765 1766 1767 1768 1769 1770 1771
		TimestampDifference(now, statement_fin_time,
							&secs, &usecs);
		if (secs == 0 && usecs == 0)
			usecs = 1;
		MemSet(&timeval, 0, sizeof(struct itimerval));
		timeval.it_value.tv_sec = secs;
		timeval.it_value.tv_usec = usecs;
		if (setitimer(ITIMER_REAL, &timeval, NULL))
			return false;
1772
		standby_timeout_active = true;
1773 1774 1775 1776 1777 1778 1779 1780
	}

	return true;
}

void
handle_standby_sig_alarm(SIGNAL_ARGS)
{
B
Bruce Momjian 已提交
1781
	int			save_errno = errno;
1782 1783 1784 1785 1786 1787

	if (standby_timeout_active)
		(void) CheckStandbyTimeout();

	errno = save_errno;
}