proc.c 51.4 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 "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 */
B
Bruce Momjian 已提交
53
int			DeadlockTimeout = 1000;
54
int			StatementTimeout = 0;
55
bool		log_lock_waits = false;
M
 
Marc G. Fournier 已提交
56

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

/*
J
Jan Wieck 已提交
61
 * This spinlock protects the freelist of recycled PGPROC structures.
62
 * We cannot use an LWLock because the LWLock manager depends on already
J
Jan Wieck 已提交
63
 * having a PGPROC and a wait semaphore!  But these structures are touched
64 65
 * relatively infrequently (only at backend startup or shutdown) and not for
 * 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 74
/* If we are waiting for a lock, this points to the associated LOCALLOCK */
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 79
static volatile bool statement_timeout_active = false;
static volatile bool deadlock_timeout_active = false;
80
static volatile DeadLockState deadlock_state = DS_NOT_YET_CHECKED;
81
volatile bool cancel_from_timeout = false;
B
Bruce Momjian 已提交
82

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

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

V
Vadim B. Mikheev 已提交
97

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

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

	return size;
}

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

133 134
/*
 * InitProcGlobal -
135 136
 *	  Initialize the global process table during postmaster or standalone
 *	  backend startup.
137
 *
138
 *	  We also create all the per-process semaphores we will need to support
139 140 141 142 143 144 145
 *	  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
146 147
 *	  MaxConnections or autovacuum_max_workers higher than his kernel will
 *	  support, he'll find out sooner rather than later.
148 149 150 151
 *
 *	  Another reason for creating semaphores here is that the semaphore
 *	  implementation typically requires us to create semaphores in the
 *	  postmaster, not in backends.
152 153
 *
 * Note: this is NOT called by individual backends under a postmaster,
154
 * not even in the EXEC_BACKEND case.  The ProcGlobal and AuxiliaryProcs
155
 * pointers must be propagated specially for EXEC_BACKEND operation.
156 157
 */
void
158
InitProcGlobal(void)
159
{
160 161 162
	PGPROC	   *procs;
	int			i;
	bool		found;
163

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

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

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

184
	ProcGlobal->spins_per_delay = DEFAULT_SPINS_PER_DELAY;
185

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

203 204 205 206 207 208
	/*
	 * 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));
209 210 211 212
	if (!procs)
		ereport(FATAL,
				(errcode(ERRCODE_OUT_OF_MEMORY),
				 errmsg("out of shared memory")));
213 214
	MemSet(procs, 0, (autovacuum_max_workers + 1) * sizeof(PGPROC));
	for (i = 0; i < autovacuum_max_workers + 1; i++)
215 216
	{
		PGSemaphoreCreate(&(procs[i].sem));
217 218
		procs[i].links.next = (SHM_QUEUE *) ProcGlobal->autovacFreeProcs;
		ProcGlobal->autovacFreeProcs = &procs[i];
219
		InitSharedLatch(&procs[i].waitLatch);
220 221
	}

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

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

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

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

	if (MyProc != NULL)
256
		elog(ERROR, "you already exist");
257

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

267 268
	set_spins_per_delay(procglobal->spins_per_delay);

269
	if (IsAnyAutoVacuumProcess())
270
		MyProc = procglobal->autovacFreeProcs;
271
	else
272
		MyProc = procglobal->freeProcs;
273

274
	if (MyProc != NULL)
275
	{
276
		if (IsAnyAutoVacuumProcess())
277
			procglobal->autovacFreeProcs = (PGPROC *) MyProc->links.next;
278
		else
279
			procglobal->freeProcs = (PGPROC *) MyProc->links.next;
280
		SpinLockRelease(ProcStructLock);
281 282 283 284
	}
	else
	{
		/*
B
Bruce Momjian 已提交
285 286
		 * 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
287 288
		 * error message.  XXX do we need to give a different failure message
		 * in the autovacuum case?
289
		 */
290
		SpinLockRelease(ProcStructLock);
291 292 293
		ereport(FATAL,
				(errcode(ERRCODE_TOO_MANY_CONNECTIONS),
				 errmsg("sorry, too many clients already")));
294
	}
295

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

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

333 334 335 336 337 338 339
	/* Initialise for sync rep */
	MyProc->waitLSN.xlogid = 0;
	MyProc->waitLSN.xrecoff = 0;
	MyProc->syncRepState = SYNC_REP_NOT_WAITING;
	SHMQueueElemInit(&(MyProc->syncRepLinks));
	OwnLatch((Latch *) &MyProc->waitLatch);

340
	/*
341
	 * We might be reusing a semaphore that belonged to a failed process. So
B
Bruce Momjian 已提交
342
	 * be careful and reinitialize its value here.	(This is not strictly
343
	 * necessary anymore, but seems like a good idea for cleanliness.)
344
	 */
345
	PGSemaphoreReset(&MyProc->sem);
346

347
	/*
348
	 * Arrange to clean up at backend exit.
349
	 */
350
	on_shmem_exit(ProcKill, 0);
351 352

	/*
B
Bruce Momjian 已提交
353 354
	 * Now that we have a PGPROC, we could try to acquire locks, so initialize
	 * the deadlock checker.
355 356
	 */
	InitDeadLockChecking();
357 358
}

359 360 361 362
/*
 * InitProcessPhase2 -- make MyProc visible in the shared ProcArray.
 *
 * This is separate from InitProcess because we can't acquire LWLocks until
363 364
 * we've created a PGPROC, but in the EXEC_BACKEND case ProcArrayAdd won't
 * work until after we've done CreateSharedMemoryAndSemaphores.
365 366 367 368 369 370 371 372 373 374 375 376 377 378
 */
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.
	 */
379
	on_shmem_exit(SyncRepCleanupAtProcExit, 0);
380 381 382
	on_shmem_exit(RemoveProcFromArray, 0);
}

383
/*
384
 * InitAuxiliaryProcess -- create a per-auxiliary-process data structure
385
 *
386 387
 * 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
388
 * and sema that are assigned are one of the extra ones created during
389
 * InitProcGlobal.
390
 *
391
 * Auxiliary processes are presently not expected to wait for real (lockmgr)
392
 * locks, so we need not set up the deadlock checker.  They are never added
B
Bruce Momjian 已提交
393
 * to the ProcArray or the sinval messaging mechanism, either.	They also
394 395
 * don't get a VXID assigned, since this is only useful when we actually
 * hold lockmgr locks.
396 397 398 399 400
 *
 * 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.
401 402
 */
void
403
InitAuxiliaryProcess(void)
404
{
405
	PGPROC	   *auxproc;
406
	int			proctype;
407
	int			i;
J
Jan Wieck 已提交
408

409
	/*
410 411
	 * ProcGlobal should be set up already (if we are a backend, we inherit
	 * this by fork() or EXEC_BACKEND mechanism from the postmaster).
412
	 */
413
	if (ProcGlobal == NULL || AuxiliaryProcs == NULL)
414
		elog(PANIC, "proc header uninitialized");
415 416

	if (MyProc != NULL)
417
		elog(ERROR, "you already exist");
418

419
	/*
420
	 * We use the ProcStructLock to protect assignment and releasing of
421
	 * AuxiliaryProcs entries.
422
	 *
B
Bruce Momjian 已提交
423 424
	 * While we are holding the ProcStructLock, also copy the current shared
	 * estimate of spins_per_delay to local storage.
425 426 427 428 429
	 */
	SpinLockAcquire(ProcStructLock);

	set_spins_per_delay(ProcGlobal->spins_per_delay);

430
	/*
431
	 * Find a free auxproc ... *big* trouble if there isn't one ...
432
	 */
433
	for (proctype = 0; proctype < NUM_AUXILIARY_PROCS; proctype++)
434
	{
435 436
		auxproc = &AuxiliaryProcs[proctype];
		if (auxproc->pid == 0)
437 438
			break;
	}
439
	if (proctype >= NUM_AUXILIARY_PROCS)
440 441
	{
		SpinLockRelease(ProcStructLock);
442
		elog(FATAL, "all AuxiliaryProcs are in use");
443
	}
444

445
	/* Mark auxiliary proc as in use by me */
446
	/* use volatile pointer to prevent code rearrangement */
447
	((volatile PGPROC *) auxproc)->pid = MyProcPid;
448

449
	MyProc = auxproc;
450 451 452

	SpinLockRelease(ProcStructLock);

453
	/*
454 455
	 * Initialize all fields of MyProc, except for the semaphore which was
	 * prepared for us by InitProcGlobal.
456 457
	 */
	SHMQueueElemInit(&(MyProc->links));
458
	MyProc->waitStatus = STATUS_OK;
459
	MyProc->lxid = InvalidLocalTransactionId;
460 461
	MyProc->xid = InvalidTransactionId;
	MyProc->xmin = InvalidTransactionId;
462
	MyProc->backendId = InvalidBackendId;
463
	MyProc->databaseId = InvalidOid;
464
	MyProc->roleId = InvalidOid;
465
	MyProc->inCommit = false;
466
	MyProc->vacuumFlags = 0;
467 468 469 470
	MyProc->lwWaiting = false;
	MyProc->lwExclusive = false;
	MyProc->lwWaitLink = NULL;
	MyProc->waitLock = NULL;
471
	MyProc->waitProcLock = NULL;
472 473
	for (i = 0; i < NUM_LOCK_PARTITIONS; i++)
		SHMQueueInit(&(MyProc->myProcLocks[i]));
474 475

	/*
B
Bruce Momjian 已提交
476
	 * We might be reusing a semaphore that belonged to a failed process. So
B
Bruce Momjian 已提交
477
	 * be careful and reinitialize its value here.	(This is not strictly
478
	 * necessary anymore, but seems like a good idea for cleanliness.)
479
	 */
480
	PGSemaphoreReset(&MyProc->sem);
481 482 483 484

	/*
	 * Arrange to clean up at process exit.
	 */
485
	on_shmem_exit(AuxiliaryProcKill, Int32GetDatum(proctype));
486 487
}

488 489 490 491 492 493 494 495 496 497 498 499 500 501
/*
 * 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;
502
	procglobal->startupBufferPinWaitBufId = 0;
503 504 505 506

	SpinLockRelease(ProcStructLock);
}

507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528
/*
 * 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 已提交
529
	int			bufid;
530 531 532 533 534 535 536 537 538

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

	bufid = procglobal->startupBufferPinWaitBufId;

	return bufid;
}

539 540 541 542 543 544 545 546 547
/*
 * 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 已提交
548

549 550 551 552 553
	/* use volatile pointer to prevent code rearrangement */
	volatile PROC_HDR *procglobal = ProcGlobal;

	SpinLockAcquire(ProcStructLock);

554
	proc = procglobal->freeProcs;
555

556
	while (n > 0 && proc != NULL)
557
	{
558
		proc = (PGPROC *) proc->links.next;
559 560 561 562 563 564 565 566
		n--;
	}

	SpinLockRelease(ProcStructLock);

	return (n <= 0);
}

567 568 569 570 571 572 573 574 575
bool
IsWaitingForLock(void)
{
	if (lockAwaited == NULL)
		return false;

	return true;
}

576 577 578 579
/*
 * Cancel any pending wait for lock, when aborting a transaction.
 *
 * (Normally, this would only happen if we accept a cancel/die
580
 * interrupt while waiting; but an ereport(ERROR) while waiting is
581 582
 * within the realm of possibility, too.)
 */
583
void
584 585
LockWaitCancel(void)
{
586 587
	LWLockId	partitionLock;

588
	/* Nothing to do if we weren't waiting for a lock */
589
	if (lockAwaited == NULL)
590
		return;
591

592
	/* Turn off the deadlock timer, if it's still running (see ProcSleep) */
593
	disable_sig_alarm(false);
594 595

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

599
	if (MyProc->links.next != NULL)
600 601
	{
		/* We could not have been granted the lock yet */
602
		RemoveFromWaitQueue(MyProc, lockAwaited->hashcode);
603 604 605 606 607
	}
	else
	{
		/*
		 * Somebody kicked us off the lock queue already.  Perhaps they
B
Bruce Momjian 已提交
608 609 610
		 * 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.
611
		 */
612 613
		if (MyProc->waitStatus == STATUS_OK)
			GrantAwaitedLock();
614 615
	}

616
	lockAwaited = NULL;
617

618
	LWLockRelease(partitionLock);
H
Hiroshi Inoue 已提交
619

620
	/*
621
	 * We used to do PGSemaphoreReset() here to ensure that our proc's wait
B
Bruce Momjian 已提交
622 623 624 625 626 627
	 * 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.
628
	 */
H
Hiroshi Inoue 已提交
629
}
630

631

632
/*
633
 * ProcReleaseLocks() -- release locks associated with current transaction
634
 *			at main transaction commit or abort
635 636
 *
 * At main transaction commit, we release all locks except session locks.
637
 * At main transaction abort, we release all locks including session locks.
638 639
 *
 * At subtransaction commit, we don't release any locks (so this func is not
640
 * needed at all); we will defer the releasing to the parent transaction.
641
 * At subtransaction abort, we release all locks held by the subtransaction;
642 643
 * this is implemented by retail releasing of the locks under control of
 * the ResourceOwner mechanism.
644 645
 */
void
646
ProcReleaseLocks(bool isCommit)
647
{
648 649
	if (!MyProc)
		return;
650 651 652
	/* If waiting, get off wait queue (should only be needed after error) */
	LockWaitCancel();
	/* Release locks */
653
	LockReleaseAll(DEFAULT_LOCKMETHOD, !isCommit);
654 655 656

	/* Release transaction level advisory locks */
	LockReleaseAll(USER_LOCKMETHOD, false);
657 658 659
}


660 661 662 663 664 665 666
/*
 * RemoveProcFromArray() -- Remove this process from the shared ProcArray.
 */
static void
RemoveProcFromArray(int code, Datum arg)
{
	Assert(MyProc != NULL);
667
	ProcArrayRemove(MyProc, InvalidTransactionId);
668 669
}

670 671
/*
 * ProcKill() -- Destroy the per-proc data structure for
672
 *		this process. Release any of its held LW locks.
673 674
 */
static void
675
ProcKill(int code, Datum arg)
676
{
677 678 679
	/* use volatile pointer to prevent code rearrangement */
	volatile PROC_HDR *procglobal = ProcGlobal;

680
	Assert(MyProc != NULL);
681

682
	/*
B
Bruce Momjian 已提交
683 684
	 * 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
685
	 * facility by releasing our PGPROC ...
686
	 */
687
	LWLockReleaseAll();
688

689
	SpinLockAcquire(ProcStructLock);
690

691 692
	/* Return PGPROC structure (and semaphore) to appropriate freelist */
	if (IsAnyAutoVacuumProcess())
693
	{
694 695
		MyProc->links.next = (SHM_QUEUE *) procglobal->autovacFreeProcs;
		procglobal->autovacFreeProcs = MyProc;
696 697 698
	}
	else
	{
699 700
		MyProc->links.next = (SHM_QUEUE *) procglobal->freeProcs;
		procglobal->freeProcs = MyProc;
701
	}
702

J
Jan Wieck 已提交
703
	/* PGPROC struct isn't mine anymore */
704
	MyProc = NULL;
705

706 707 708
	/* Update shared estimate of spins_per_delay */
	procglobal->spins_per_delay = update_spins_per_delay(procglobal->spins_per_delay);

709
	SpinLockRelease(ProcStructLock);
710

711 712
	/*
	 * This process is no longer present in shared memory in any meaningful
B
Bruce Momjian 已提交
713 714
	 * way, so tell the postmaster we've cleaned up acceptably well. (XXX
	 * autovac launcher should be included here someday)
715
	 */
716
	if (IsUnderPostmaster && !IsAutoVacuumLauncherProcess())
717 718
		MarkPostmasterChildInactive();

719 720
	/* wake autovac launcher if needed -- see comments in FreeWorkerInfo */
	if (AutovacuumLauncherPid != 0)
721
		kill(AutovacuumLauncherPid, SIGUSR2);
722 723 724
}

/*
725 726 727
 * AuxiliaryProcKill() -- Cut-down version of ProcKill for auxiliary
 *		processes (bgwriter, etc).	The PGPROC and sema are not released, only
 *		marked as not-in-use.
728 729
 */
static void
730
AuxiliaryProcKill(int code, Datum arg)
731
{
B
Bruce Momjian 已提交
732
	int			proctype = DatumGetInt32(arg);
733
	PGPROC	   *auxproc;
J
Jan Wieck 已提交
734

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

737
	auxproc = &AuxiliaryProcs[proctype];
J
Jan Wieck 已提交
738

739
	Assert(MyProc == auxproc);
740

741
	/* Release any LW locks I am holding (see notes above) */
742 743
	LWLockReleaseAll();

744 745
	SpinLockAcquire(ProcStructLock);

746
	/* Mark auxiliary proc no longer in use */
747 748
	MyProc->pid = 0;

J
Jan Wieck 已提交
749
	/* PGPROC struct isn't mine anymore */
750
	MyProc = NULL;
751 752 753 754 755

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

	SpinLockRelease(ProcStructLock);
756 757
}

758

759 760
/*
 * ProcQueue package: routines for putting processes to sleep
761
 *		and  waking them up
762 763 764 765 766
 */

/*
 * ProcQueueAlloc -- alloc/attach to a shared memory process queue
 *
767 768
 * Returns: a pointer to the queue
 * Side Effects: Initializes the queue if it wasn't there before
769
 */
770
#ifdef NOT_USED
771
PROC_QUEUE *
772
ProcQueueAlloc(const char *name)
773
{
774
	PROC_QUEUE *queue;
775
	bool		found;
776

777 778 779
	queue = (PROC_QUEUE *)
		ShmemInitStruct(name, sizeof(PROC_QUEUE), &found);

780 781
	if (!found)
		ProcQueueInit(queue);
782

783
	return queue;
784
}
785
#endif
786 787 788 789 790

/*
 * ProcQueueInit -- initialize a shared memory process queue
 */
void
791
ProcQueueInit(PROC_QUEUE *queue)
792
{
793 794
	SHMQueueInit(&(queue->links));
	queue->size = 0;
795 796 797 798
}


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

833
	/*
834 835
	 * Determine where to add myself in the wait queue.
	 *
836 837 838 839
	 * 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 已提交
840 841
	 * waiter anyway; but it's relatively cheap to detect such a conflict
	 * immediately, and avoid delaying till deadlock timeout.
842
	 *
843 844
	 * 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 已提交
845 846 847 848
	 * 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.
849 850
	 */
	if (myHeldLocks != 0)
V
Vadim B. Mikheev 已提交
851
	{
852
		LOCKMASK	aheadRequests = 0;
853

854
		proc = (PGPROC *) waitQueue->links.next;
855
		for (i = 0; i < waitQueue->size; i++)
V
Vadim B. Mikheev 已提交
856
		{
857
			/* Must he wait for me? */
B
Bruce Momjian 已提交
858
			if (lockMethodTable->conflictTab[proc->waitLockMode] & myHeldLocks)
V
Vadim B. Mikheev 已提交
859
			{
860
				/* Must I wait for him ? */
B
Bruce Momjian 已提交
861
				if (lockMethodTable->conflictTab[lockmode] & proc->heldLocks)
862
				{
863
					/*
B
Bruce Momjian 已提交
864 865 866 867 868
					 * 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.
869
					 */
870
					RememberSimpleDeadLock(MyProc, lockmode, lock, proc);
871 872
					early_deadlock = true;
					break;
873
				}
874
				/* I must go before this waiter.  Check special case. */
B
Bruce Momjian 已提交
875
				if ((lockMethodTable->conflictTab[lockmode] & aheadRequests) == 0 &&
876 877 878
					LockCheckConflicts(lockMethodTable,
									   lockmode,
									   lock,
879
									   proclock,
880
									   MyProc) == STATUS_OK)
881
				{
882
					/* Skip the wait and just grant myself the lock. */
883
					GrantLock(lock, proclock, lockmode);
884
					GrantAwaitedLock();
885
					return STATUS_OK;
886 887
				}
				/* Break out of loop to put myself before him */
V
Vadim B. Mikheev 已提交
888
				break;
889
			}
890
			/* Nope, so advance to next waiter */
891
			aheadRequests |= LOCKBIT_ON(proc->waitLockMode);
892
			proc = (PGPROC *) proc->links.next;
V
Vadim B. Mikheev 已提交
893
		}
B
Bruce Momjian 已提交
894

895
		/*
B
Bruce Momjian 已提交
896 897
		 * If we fall out of loop normally, proc points to waitQueue head, so
		 * we will insert at tail of queue as desired.
898
		 */
899 900 901 902
	}
	else
	{
		/* I hold no locks, so I can't push in front of anyone. */
J
Jan Wieck 已提交
903
		proc = (PGPROC *) &(waitQueue->links);
V
Vadim B. Mikheev 已提交
904
	}
905

906
	/*
B
Bruce Momjian 已提交
907
	 * Insert self into queue, ahead of the given proc (or at tail of queue).
908
	 */
909
	SHMQueueInsertBefore(&(proc->links), &(MyProc->links));
B
Bruce Momjian 已提交
910
	waitQueue->size++;
911

912
	lock->waitMask |= LOCKBIT_ON(lockmode);
913

J
Jan Wieck 已提交
914
	/* Set up wait information in PGPROC object, too */
915
	MyProc->waitLock = lock;
916
	MyProc->waitProcLock = proclock;
917 918
	MyProc->waitLockMode = lockmode;

919
	MyProc->waitStatus = STATUS_WAITING;
920 921

	/*
B
Bruce Momjian 已提交
922 923 924
	 * 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.
925 926 927
	 */
	if (early_deadlock)
	{
928
		RemoveFromWaitQueue(MyProc, hashcode);
929 930
		return STATUS_ERROR;
	}
931

932
	/* mark that we are waiting for a lock */
933
	lockAwaited = locallock;
934

935
	/*
936
	 * Release the lock table's partition lock.
937
	 *
938
	 * NOTE: this may also cause us to exit critical-section state, possibly
B
Bruce Momjian 已提交
939 940
	 * 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
941
	 * LockWaitCancel will clean up if cancel/die happens.
942
	 */
943
	LWLockRelease(partitionLock);
944

945 946 947
	/* Reset deadlock_state before enabling the signal handler */
	deadlock_state = DS_NOT_YET_CHECKED;

948
	/*
B
Bruce Momjian 已提交
949 950 951 952
	 * 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.
953
	 *
954 955
	 * By delaying the check until we've waited for a bit, we can avoid
	 * running the rather expensive deadlock-check code in most cases.
956
	 */
957
	if (!enable_sig_alarm(DeadlockTimeout, false))
958
		elog(FATAL, "could not set timer for process wakeup");
959

960
	/*
961
	 * If someone wakes us between LWLockRelease and PGSemaphoreLock,
B
Bruce Momjian 已提交
962
	 * PGSemaphoreLock will not block.	The wakeup is "saved" by the semaphore
B
Bruce Momjian 已提交
963 964 965 966 967
	 * 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.
968
	 *
969 970 971 972 973 974 975
	 * 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.
976
	 */
B
Bruce Momjian 已提交
977 978
	do
	{
979
		PGSemaphoreLock(&MyProc->sem, true);
980

981 982
		/*
		 * waitStatus could change from STATUS_WAITING to something else
B
Bruce Momjian 已提交
983
		 * asynchronously.	Read it just once per loop to prevent surprising
984 985 986 987
		 * behavior (such as missing log messages).
		 */
		myWaitStatus = MyProc->waitStatus;

988 989
		/*
		 * If we are not deadlocked, but are waiting on an autovacuum-induced
B
Bruce Momjian 已提交
990
		 * task, send a signal to interrupt it.
991 992 993
		 */
		if (deadlock_state == DS_BLOCKED_BY_AUTOVACUUM && allow_autovacuum_cancel)
		{
B
Bruce Momjian 已提交
994
			PGPROC	   *autovac = GetBlockingAutoVacuumPgproc();
995 996 997 998 999 1000 1001 1002 1003 1004 1005

			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 已提交
1006
				int			pid = autovac->pid;
1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029

				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;
		}

1030 1031 1032 1033
		/*
		 * If awoken after the deadlock check interrupt has run, and
		 * log_lock_waits is on, then report about the wait.
		 */
1034
		if (log_lock_waits && deadlock_state != DS_NOT_YET_CHECKED)
1035
		{
1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053
			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 已提交
1054
							  MyProcPid, modename, buf.data, msecs, usecs)));
1055
			else if (deadlock_state == DS_HARD_DEADLOCK)
1056
			{
1057
				/*
B
Bruce Momjian 已提交
1058 1059 1060 1061
				 * 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
1062 1063 1064 1065
				 * events get logged.
				 */
				ereport(LOG,
						(errmsg("process %d detected deadlock while waiting for %s on %s after %ld.%03d ms",
B
Bruce Momjian 已提交
1066
							  MyProcPid, modename, buf.data, msecs, usecs)));
1067
			}
1068 1069 1070 1071

			if (myWaitStatus == STATUS_WAITING)
				ereport(LOG,
						(errmsg("process %d still waiting for %s on %s after %ld.%03d ms",
B
Bruce Momjian 已提交
1072
							  MyProcPid, modename, buf.data, msecs, usecs)));
1073 1074
			else if (myWaitStatus == STATUS_OK)
				ereport(LOG,
B
Bruce Momjian 已提交
1075 1076
					(errmsg("process %d acquired %s on %s after %ld.%03d ms",
							MyProcPid, modename, buf.data, msecs, usecs)));
1077 1078 1079
			else
			{
				Assert(myWaitStatus == STATUS_ERROR);
B
Bruce Momjian 已提交
1080

1081 1082
				/*
				 * Currently, the deadlock checker always kicks its own
B
Bruce Momjian 已提交
1083 1084 1085 1086 1087
				 * 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.
1088 1089 1090 1091
				 */
				if (deadlock_state != DS_HARD_DEADLOCK)
					ereport(LOG,
							(errmsg("process %d failed to acquire %s on %s after %ld.%03d ms",
B
Bruce Momjian 已提交
1092
							  MyProcPid, modename, buf.data, msecs, usecs)));
1093 1094 1095
			}

			/*
B
Bruce Momjian 已提交
1096 1097
			 * At this point we might still need to wait for the lock. Reset
			 * state so we don't print the above messages again.
1098 1099 1100 1101
			 */
			deadlock_state = DS_NO_DEADLOCK;

			pfree(buf.data);
1102
		}
1103
	} while (myWaitStatus == STATUS_WAITING);
1104

1105
	/*
1106
	 * Disable the timer, if it's still running
B
Bruce Momjian 已提交
1107
	 */
1108
	if (!disable_sig_alarm(false))
1109
		elog(FATAL, "could not disable timer for process wakeup");
B
Bruce Momjian 已提交
1110

1111
	/*
B
Bruce Momjian 已提交
1112 1113 1114
	 * 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).
1115
	 */
1116
	LWLockAcquire(partitionLock, LW_EXCLUSIVE);
1117 1118 1119

	/*
	 * We no longer want LockWaitCancel to do anything.
1120
	 */
1121
	lockAwaited = NULL;
1122

1123
	/*
1124
	 * If we got the lock, be sure to remember it in the locallock table.
1125
	 */
1126
	if (MyProc->waitStatus == STATUS_OK)
1127
		GrantAwaitedLock();
1128

1129 1130 1131 1132
	/*
	 * We don't have to do anything else, because the awaker did all the
	 * necessary update of the lock table and MyProc.
	 */
1133
	return MyProc->waitStatus;
1134 1135 1136 1137 1138 1139
}


/*
 * ProcWakeup -- wake up a process by releasing its private semaphore.
 *
1140
 *	 Also remove the process from the wait queue and set its links invalid.
1141
 *	 RETURN: the next process in the wait queue.
1142
 *
1143 1144
 * The appropriate lock partition lock must be held by caller.
 *
1145 1146 1147
 * 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.
1148
 * Hence, in practice the waitStatus parameter must be STATUS_OK.
1149
 */
J
Jan Wieck 已提交
1150
PGPROC *
1151
ProcWakeup(PGPROC *proc, int waitStatus)
1152
{
J
Jan Wieck 已提交
1153
	PGPROC	   *retProc;
1154

1155
	/* Proc should be sleeping ... */
1156 1157
	if (proc->links.prev == NULL ||
		proc->links.next == NULL)
1158
		return NULL;
1159
	Assert(proc->waitStatus == STATUS_WAITING);
1160

1161
	/* Save next process before we zap the list link */
1162
	retProc = (PGPROC *) proc->links.next;
1163

1164
	/* Remove process from wait queue */
1165
	SHMQueueDelete(&(proc->links));
1166
	(proc->waitLock->waitProcs.size)--;
1167

1168 1169
	/* Clean up process' state and pass it the ok/fail signal */
	proc->waitLock = NULL;
1170
	proc->waitProcLock = NULL;
1171
	proc->waitStatus = waitStatus;
1172

1173
	/* And awaken it */
1174
	PGSemaphoreUnlock(&proc->sem);
1175 1176

	return retProc;
1177 1178 1179 1180
}

/*
 * ProcLockWakeup -- routine for waking up processes when a lock is
1181 1182
 *		released (or a prior waiter is aborted).  Scan all waiters
 *		for lock, waken any that are no longer blocked.
1183 1184
 *
 * The appropriate lock partition lock must be held by caller.
1185
 */
1186
void
1187
ProcLockWakeup(LockMethod lockMethodTable, LOCK *lock)
1188
{
1189 1190
	PROC_QUEUE *waitQueue = &(lock->waitProcs);
	int			queue_size = waitQueue->size;
J
Jan Wieck 已提交
1191
	PGPROC	   *proc;
1192
	LOCKMASK	aheadRequests = 0;
M
 
Marc G. Fournier 已提交
1193

1194
	Assert(queue_size >= 0);
1195

1196 1197
	if (queue_size == 0)
		return;
1198

1199
	proc = (PGPROC *) waitQueue->links.next;
1200

1201 1202
	while (queue_size-- > 0)
	{
B
Bruce Momjian 已提交
1203
		LOCKMODE	lockmode = proc->waitLockMode;
M
 
Marc G. Fournier 已提交
1204 1205

		/*
B
Bruce Momjian 已提交
1206 1207
		 * Waken if (a) doesn't conflict with requests of earlier waiters, and
		 * (b) doesn't conflict with already-held locks.
M
 
Marc G. Fournier 已提交
1208
		 */
B
Bruce Momjian 已提交
1209
		if ((lockMethodTable->conflictTab[lockmode] & aheadRequests) == 0 &&
1210 1211 1212
			LockCheckConflicts(lockMethodTable,
							   lockmode,
							   lock,
1213
							   proc->waitProcLock,
1214
							   proc) == STATUS_OK)
M
 
Marc G. Fournier 已提交
1215
		{
1216
			/* OK to waken */
1217
			GrantLock(lock, proc->waitProcLock, lockmode);
1218
			proc = ProcWakeup(proc, STATUS_OK);
B
Bruce Momjian 已提交
1219

1220
			/*
B
Bruce Momjian 已提交
1221 1222 1223
			 * 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.
1224
			 */
M
 
Marc G. Fournier 已提交
1225
		}
1226
		else
1227
		{
B
Bruce Momjian 已提交
1228
			/*
B
Bruce Momjian 已提交
1229
			 * Cannot wake this guy. Remember his request for later checks.
B
Bruce Momjian 已提交
1230
			 */
1231
			aheadRequests |= LOCKBIT_ON(lockmode);
1232
			proc = (PGPROC *) proc->links.next;
1233
		}
M
 
Marc G. Fournier 已提交
1234
	}
1235 1236

	Assert(waitQueue->size >= 0);
1237 1238
}

1239 1240 1241
/*
 * CheckDeadLock
 *
1242
 * We only get to this routine if we got SIGALRM after DeadlockTimeout
1243 1244
 * 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.
1245
 * (But signal ProcSleep to log a message, if log_lock_waits is true.)
1246 1247
 * If we have a real deadlock, remove ourselves from the lock's wait queue
 * and signal an error to ProcSleep.
1248 1249 1250
 *
 * NB: this is run inside a signal handler, so be very wary about what is done
 * here or in called routines.
1251
 */
1252
static void
1253
CheckDeadLock(void)
1254
{
1255 1256
	int			i;

1257
	/*
B
Bruce Momjian 已提交
1258 1259
	 * Acquire exclusive lock on the entire shared lock data structures. Must
	 * grab LWLocks in partition-number order to avoid LWLock deadlock.
1260 1261 1262 1263 1264 1265
	 *
	 * 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.
1266
	 */
1267 1268
	for (i = 0; i < NUM_LOCK_PARTITIONS; i++)
		LWLockAcquire(FirstLockMgrLock + i, LW_EXCLUSIVE);
1269

1270
	/*
1271 1272
	 * Check to see if we've been awoken by anyone in the interim.
	 *
1273
	 * If we have, we can return and resume our transaction -- happy day.
1274 1275
	 * Before we are awoken the process releasing the lock grants it to us so
	 * we know that we don't have to wait anymore.
1276
	 *
1277
	 * We check by looking to see if we've been unlinked from the wait queue.
B
Bruce Momjian 已提交
1278
	 * This is quicker than checking our semaphore's state, since no kernel
1279
	 * call is needed, and it is safe because we hold the lock partition lock.
1280
	 */
1281 1282
	if (MyProc->links.prev == NULL ||
		MyProc->links.next == NULL)
1283 1284 1285 1286 1287 1288 1289 1290 1291 1292
		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);

1293
	if (deadlock_state == DS_HARD_DEADLOCK)
B
Bruce Momjian 已提交
1294
	{
1295 1296 1297
		/*
		 * Oops.  We have a deadlock.
		 *
1298 1299 1300 1301
		 * 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.)
1302 1303
		 *
		 * RemoveFromWaitQueue sets MyProc->waitStatus to STATUS_ERROR, so
1304 1305
		 * ProcSleep will report an error after we return from the signal
		 * handler.
1306 1307 1308
		 */
		Assert(MyProc->waitLock != NULL);
		RemoveFromWaitQueue(MyProc, LockTagHashCode(&(MyProc->waitLock->tag)));
1309

1310 1311 1312 1313 1314
		/*
		 * Unlock my semaphore so that the interrupted ProcSleep() call can
		 * finish.
		 */
		PGSemaphoreUnlock(&MyProc->sem);
1315

1316
		/*
1317 1318 1319 1320 1321 1322 1323 1324
		 * 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.
1325 1326
		 */
	}
1327
	else if (log_lock_waits || deadlock_state == DS_BLOCKED_BY_AUTOVACUUM)
1328 1329 1330 1331
	{
		/*
		 * 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 已提交
1332 1333
		 * a signal handler).  It will then sleep again until someone releases
		 * the lock.
1334 1335 1336
		 *
		 * If blocked by autovacuum, this wakeup will enable ProcSleep to send
		 * the cancelling signal to the autovacuum worker.
1337 1338 1339
		 */
		PGSemaphoreUnlock(&MyProc->sem);
	}
1340 1341

	/*
B
Bruce Momjian 已提交
1342 1343 1344 1345 1346
	 * 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.
1347
	 */
1348
check_done:
B
Bruce Momjian 已提交
1349
	for (i = NUM_LOCK_PARTITIONS; --i >= 0;)
1350
		LWLockRelease(FirstLockMgrLock + i);
1351 1352 1353
}


1354 1355 1356 1357 1358 1359
/*
 * 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 已提交
1360
 * before we actually reach the waiting state.	Also as with locks,
1361 1362
 * 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 已提交
1363
 * if not.	This copes with possible "leftover" wakeups.
1364 1365 1366 1367
 */
void
ProcWaitForSignal(void)
{
1368
	PGSemaphoreLock(&MyProc->sem, true);
1369 1370 1371
}

/*
1372
 * ProcSendSignal - send a signal to a backend identified by PID
1373 1374
 */
void
1375
ProcSendSignal(int pid)
1376
{
1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387
	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 已提交
1388 1389
		 * 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
1390
		 * cleanup lock using LockBufferForCleanup(). Startup is not a normal
B
Bruce Momjian 已提交
1391 1392
		 * backend, so BackendPidGetProc() will not return any pid at all. So
		 * we remember the information for this special case.
1393 1394 1395 1396 1397 1398 1399 1400 1401
		 */
		if (pid == procglobal->startupProcPid)
			proc = procglobal->startupProc;

		SpinLockRelease(ProcStructLock);
	}

	if (proc == NULL)
		proc = BackendPidGetProc(pid);
1402 1403

	if (proc != NULL)
1404
		PGSemaphoreUnlock(&proc->sem);
1405 1406 1407
}


1408 1409 1410 1411 1412 1413 1414 1415 1416
/*****************************************************************************
 * SIGALRM interrupt support
 *
 * Maybe these should be in pqsignal.c?
 *****************************************************************************/

/*
 * Enable the SIGALRM interrupt to fire after the specified delay
 *
1417
 * Delay is given in milliseconds.	Caller should be sure a SIGALRM
1418 1419
 * signal handler is installed before this is called.
 *
1420 1421
 * This code properly handles nesting of deadlock timeout alarms within
 * statement timeout alarms.
1422
 *
1423 1424 1425
 * Returns TRUE if okay, FALSE on failure.
 */
bool
1426
enable_sig_alarm(int delayms, bool is_statement_timeout)
1427
{
1428
	TimestampTz fin_time;
1429
	struct itimerval timeval;
1430

1431 1432
	if (is_statement_timeout)
	{
1433 1434 1435 1436 1437 1438 1439 1440 1441 1442
		/*
		 * 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 已提交
1443 1444 1445 1446
		 * 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.
1447
		 */
1448
		Assert(!deadlock_timeout_active);
1449 1450
		fin_time = GetCurrentStatementStartTimestamp();
		fin_time = TimestampTzPlusMilliseconds(fin_time, delayms);
1451
		statement_fin_time = fin_time;
1452
		cancel_from_timeout = false;
1453
		statement_timeout_active = true;
1454 1455 1456 1457 1458 1459
	}
	else if (statement_timeout_active)
	{
		/*
		 * Begin deadlock timeout with statement-level timeout active
		 *
1460 1461 1462 1463
		 * 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.
1464 1465 1466
		 *
		 * 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 已提交
1467 1468 1469
		 * 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.
1470
		 */
1471 1472
		timeout_start_time = GetCurrentTimestamp();
		fin_time = TimestampTzPlusMilliseconds(timeout_start_time, delayms);
1473
		deadlock_timeout_active = true;
1474
		if (fin_time >= statement_fin_time)
1475 1476 1477 1478 1479 1480
			return true;
	}
	else
	{
		/* Begin deadlock timeout with no statement-level timeout */
		deadlock_timeout_active = true;
1481 1482 1483
		/* GetCurrentTimestamp can be expensive, so only do it if we must */
		if (log_lock_waits)
			timeout_start_time = GetCurrentTimestamp();
1484
	}
1485

1486
	/* If we reach here, okay to set the timer interrupt */
1487
	MemSet(&timeval, 0, sizeof(struct itimerval));
1488 1489
	timeval.it_value.tv_sec = delayms / 1000;
	timeval.it_value.tv_usec = (delayms % 1000) * 1000;
1490
	if (setitimer(ITIMER_REAL, &timeval, NULL))
1491
		return false;
1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512
	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)
1513
	{
1514
		struct itimerval timeval;
1515

1516
		MemSet(&timeval, 0, sizeof(struct itimerval));
1517
		if (setitimer(ITIMER_REAL, &timeval, NULL))
1518
		{
1519 1520 1521
			statement_timeout_active = false;
			cancel_from_timeout = false;
			deadlock_timeout_active = false;
1522 1523
			return false;
		}
1524 1525
	}

1526 1527 1528 1529
	/* Always cancel deadlock timeout, in case this is error cleanup */
	deadlock_timeout_active = false;

	/* Cancel or reschedule statement timeout */
1530
	if (is_statement_timeout)
1531
	{
1532
		statement_timeout_active = false;
1533 1534
		cancel_from_timeout = false;
	}
1535 1536 1537 1538 1539
	else if (statement_timeout_active)
	{
		if (!CheckStatementTimeout())
			return false;
	}
1540 1541 1542
	return true;
}

1543

1544
/*
1545 1546 1547
 * 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.
1548
 *
1549
 * Returns true if okay, false if failed to set the interrupt.
1550
 */
1551 1552
static bool
CheckStatementTimeout(void)
1553
{
1554
	TimestampTz now;
B
Bruce Momjian 已提交
1555

1556 1557 1558
	if (!statement_timeout_active)
		return true;			/* do nothing if not active */

1559
	now = GetCurrentTimestamp();
1560

1561
	if (now >= statement_fin_time)
1562
	{
1563 1564
		/* Time to die */
		statement_timeout_active = false;
1565
		cancel_from_timeout = true;
1566 1567 1568 1569
#ifdef HAVE_SETSID
		/* try to signal whole process group */
		kill(-MyProcPid, SIGINT);
#endif
1570
		kill(MyProcPid, SIGINT);
1571 1572 1573 1574
	}
	else
	{
		/* Not time yet, so (re)schedule the interrupt */
1575 1576
		long		secs;
		int			usecs;
1577 1578
		struct itimerval timeval;

1579 1580
		TimestampDifference(now, statement_fin_time,
							&secs, &usecs);
B
Bruce Momjian 已提交
1581

1582 1583 1584 1585 1586 1587
		/*
		 * 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;
1588
		MemSet(&timeval, 0, sizeof(struct itimerval));
1589 1590
		timeval.it_value.tv_sec = secs;
		timeval.it_value.tv_usec = usecs;
1591
		if (setitimer(ITIMER_REAL, &timeval, NULL))
1592 1593 1594
			return false;
	}

1595 1596
	return true;
}
1597 1598 1599


/*
1600
 * Signal handler for SIGALRM for normal user backends
1601 1602 1603 1604 1605
 *
 * 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.
1606 1607 1608 1609
 */
void
handle_sig_alarm(SIGNAL_ARGS)
{
1610 1611 1612
	int			save_errno = errno;

	if (deadlock_timeout_active)
1613
	{
1614
		deadlock_timeout_active = false;
1615 1616
		CheckDeadLock();
	}
1617 1618 1619 1620 1621

	if (statement_timeout_active)
		(void) CheckStatementTimeout();

	errno = save_errno;
1622
}
1623 1624 1625 1626 1627 1628 1629

/*
 * 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.
1630 1631 1632
 *
 * We set either deadlock_timeout_active or statement_timeout_active
 * or both. Interrupts are enabled if standby_timeout_active.
1633 1634
 */
bool
1635
enable_standby_sig_alarm(TimestampTz now, TimestampTz fin_time, bool deadlock_only)
1636
{
1637 1638
	TimestampTz deadlock_time = TimestampTzPlusMilliseconds(now,
															DeadlockTimeout);
1639

1640 1641 1642
	if (deadlock_only)
	{
		/*
1643
		 * Wake up at deadlock_time only, then wait forever
1644 1645 1646 1647 1648 1649 1650 1651
		 */
		statement_fin_time = deadlock_time;
		deadlock_timeout_active = true;
		statement_timeout_active = false;
	}
	else if (fin_time > deadlock_time)
	{
		/*
1652
		 * Wake up at deadlock_time, then again at fin_time
1653 1654 1655 1656 1657 1658 1659 1660 1661
		 */
		statement_fin_time = deadlock_time;
		statement_fin_time2 = fin_time;
		deadlock_timeout_active = true;
		statement_timeout_active = true;
	}
	else
	{
		/*
1662
		 * Wake only at fin_time because its fairly soon
1663 1664 1665 1666 1667
		 */
		statement_fin_time = fin_time;
		deadlock_timeout_active = false;
		statement_timeout_active = true;
	}
1668

1669 1670 1671 1672 1673
	if (deadlock_timeout_active || statement_timeout_active)
	{
		long		secs;
		int			usecs;
		struct itimerval timeval;
B
Bruce Momjian 已提交
1674

1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685
		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;
	}
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 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725

	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 已提交
1726
	bool		reschedule = false;
1727 1728 1729 1730 1731

	standby_timeout_active = false;

	now = GetCurrentTimestamp();

1732
	/*
B
Bruce Momjian 已提交
1733 1734
	 * 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.
1735
	 */
1736
	if (now >= statement_fin_time)
1737 1738 1739 1740
	{
		if (deadlock_timeout_active)
		{
			/*
1741
			 * We're still waiting when we reach deadlock timeout, so send out
B
Bruce Momjian 已提交
1742 1743
			 * a request to have other backends check themselves for deadlock.
			 * Then continue waiting until statement_fin_time, if that's set.
1744 1745 1746 1747 1748
			 */
			SendRecoveryConflictWithBufferPin(PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK);
			deadlock_timeout_active = false;

			/*
1749
			 * Begin second waiting period if required.
1750 1751 1752 1753 1754 1755 1756 1757 1758 1759
			 */
			if (statement_timeout_active)
			{
				reschedule = true;
				statement_fin_time = statement_fin_time2;
			}
		}
		else
		{
			/*
1760 1761
			 * We've now reached statement_fin_time, so ask all conflicts to
			 * leave, so we can press ahead with applying changes in recovery.
1762 1763 1764 1765
			 */
			SendRecoveryConflictWithBufferPin(PROCSIG_RECOVERY_CONFLICT_BUFFERPIN);
		}
	}
1766
	else
1767 1768 1769
		reschedule = true;

	if (reschedule)
1770 1771 1772 1773
	{
		long		secs;
		int			usecs;
		struct itimerval timeval;
B
Bruce Momjian 已提交
1774

1775 1776 1777 1778 1779 1780 1781 1782 1783
		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;
1784
		standby_timeout_active = true;
1785 1786 1787 1788 1789 1790 1791 1792
	}

	return true;
}

void
handle_standby_sig_alarm(SIGNAL_ARGS)
{
B
Bruce Momjian 已提交
1793
	int			save_errno = errno;
1794 1795 1796 1797 1798 1799

	if (standby_timeout_active)
		(void) CheckStandbyTimeout();

	errno = save_errno;
}