proc.c 49.2 KB
Newer Older
1 2
/*-------------------------------------------------------------------------
 *
3
 * proc.c
4
 *	  routines to manage per-process shared memory data structure
5
 *
6
 * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
B
Add:  
Bruce Momjian 已提交
7
 * Portions Copyright (c) 1994, Regents of the University of California
8 9 10
 *
 *
 * IDENTIFICATION
11
 *	  $PostgreSQL: pgsql/src/backend/storage/lmgr/proc.c,v 1.215 2010/02/08 04:33:54 tgl Exp $
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/walsender.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/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 88


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

V
Vadim B. Mikheev 已提交
95

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

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

	return size;
}

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

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

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

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

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

182
	ProcGlobal->spins_per_delay = DEFAULT_SPINS_PER_DELAY;
183

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

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

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

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

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

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

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

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

262 263
	set_spins_per_delay(procglobal->spins_per_delay);

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

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

291 292
	/*
	 * Now that we have a PGPROC, mark ourselves as an active postmaster
293
	 * child; this is so that the postmaster can detect it if we exit without
294 295
	 * cleaning up.  (XXX autovac launcher currently doesn't participate in
	 * this; it probably should.)
296
	 */
297
	if (IsUnderPostmaster && !IsAutoVacuumLauncherProcess())
298 299 300 301 302 303
	{
		if (am_walsender)
			MarkPostmasterChildWalSender();
		else
			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
	 * We might be reusing a semaphore that belonged to a failed process. So
B
Bruce Momjian 已提交
335
	 * be careful and reinitialize its value here.	(This is not strictly
336
	 * necessary anymore, but seems like a good idea for cleanliness.)
337
	 */
338
	PGSemaphoreReset(&MyProc->sem);
339

340
	/*
341
	 * Arrange to clean up at backend exit.
342
	 */
343
	on_shmem_exit(ProcKill, 0);
344 345

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

352 353 354 355
/*
 * InitProcessPhase2 -- make MyProc visible in the shared ProcArray.
 *
 * This is separate from InitProcess because we can't acquire LWLocks until
356 357
 * we've created a PGPROC, but in the EXEC_BACKEND case ProcArrayAdd won't
 * work until after we've done CreateSharedMemoryAndSemaphores.
358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374
 */
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);
}

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

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

	if (MyProc != NULL)
409
		elog(ERROR, "you already exist");
410

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

	set_spins_per_delay(ProcGlobal->spins_per_delay);

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

437
	/* Mark auxiliary proc as in use by me */
438
	/* use volatile pointer to prevent code rearrangement */
439
	((volatile PGPROC *) auxproc)->pid = MyProcPid;
440

441
	MyProc = auxproc;
442 443 444

	SpinLockRelease(ProcStructLock);

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

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

	/*
	 * Arrange to clean up at process exit.
	 */
477
	on_shmem_exit(AuxiliaryProcKill, Int32GetDatum(proctype));
478 479
}

480 481 482 483 484 485 486 487 488 489 490 491 492 493
/*
 * 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;
494
	procglobal->startupBufferPinWaitBufId = 0;
495 496 497 498

	SpinLockRelease(ProcStructLock);
}

499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530
/*
 * 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)
{
	int bufid;

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

	bufid = procglobal->startupBufferPinWaitBufId;

	return bufid;
}

531 532 533 534 535 536 537 538 539
/*
 * 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 已提交
540

541 542 543 544 545
	/* use volatile pointer to prevent code rearrangement */
	volatile PROC_HDR *procglobal = ProcGlobal;

	SpinLockAcquire(ProcStructLock);

546
	proc = procglobal->freeProcs;
547

548
	while (n > 0 && proc != NULL)
549
	{
550
		proc = (PGPROC *) proc->links.next;
551 552 553 554 555 556 557 558
		n--;
	}

	SpinLockRelease(ProcStructLock);

	return (n <= 0);
}

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

571
	/* Nothing to do if we weren't waiting for a lock */
572
	if (lockAwaited == NULL)
573
		return;
574

575
	/* Turn off the deadlock timer, if it's still running (see ProcSleep) */
576
	disable_sig_alarm(false);
577 578

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

582
	if (MyProc->links.next != NULL)
583 584
	{
		/* We could not have been granted the lock yet */
585
		RemoveFromWaitQueue(MyProc, lockAwaited->hashcode);
586 587 588 589 590
	}
	else
	{
		/*
		 * Somebody kicked us off the lock queue already.  Perhaps they
B
Bruce Momjian 已提交
591 592 593
		 * 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.
594
		 */
595 596
		if (MyProc->waitStatus == STATUS_OK)
			GrantAwaitedLock();
597 598
	}

599
	lockAwaited = NULL;
600

601
	LWLockRelease(partitionLock);
H
Hiroshi Inoue 已提交
602

603
	/*
604
	 * We used to do PGSemaphoreReset() here to ensure that our proc's wait
B
Bruce Momjian 已提交
605 606 607 608 609 610
	 * 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.
611
	 */
H
Hiroshi Inoue 已提交
612
}
613

614

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


642 643 644 645 646 647 648
/*
 * RemoveProcFromArray() -- Remove this process from the shared ProcArray.
 */
static void
RemoveProcFromArray(int code, Datum arg)
{
	Assert(MyProc != NULL);
649
	ProcArrayRemove(MyProc, InvalidTransactionId);
650 651
}

652 653
/*
 * ProcKill() -- Destroy the per-proc data structure for
654
 *		this process. Release any of its held LW locks.
655 656
 */
static void
657
ProcKill(int code, Datum arg)
658
{
659 660 661
	/* use volatile pointer to prevent code rearrangement */
	volatile PROC_HDR *procglobal = ProcGlobal;

662
	Assert(MyProc != NULL);
663

664
	/*
B
Bruce Momjian 已提交
665 666
	 * 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
667
	 * facility by releasing our PGPROC ...
668
	 */
669
	LWLockReleaseAll();
670

671
	SpinLockAcquire(ProcStructLock);
672

673 674
	/* Return PGPROC structure (and semaphore) to appropriate freelist */
	if (IsAnyAutoVacuumProcess())
675
	{
676 677
		MyProc->links.next = (SHM_QUEUE *) procglobal->autovacFreeProcs;
		procglobal->autovacFreeProcs = MyProc;
678 679 680
	}
	else
	{
681 682
		MyProc->links.next = (SHM_QUEUE *) procglobal->freeProcs;
		procglobal->freeProcs = MyProc;
683
	}
684

J
Jan Wieck 已提交
685
	/* PGPROC struct isn't mine anymore */
686
	MyProc = NULL;
687

688 689 690
	/* Update shared estimate of spins_per_delay */
	procglobal->spins_per_delay = update_spins_per_delay(procglobal->spins_per_delay);

691
	SpinLockRelease(ProcStructLock);
692

693 694 695
	/*
	 * This process is no longer present in shared memory in any meaningful
	 * way, so tell the postmaster we've cleaned up acceptably well.
696
	 * (XXX autovac launcher should be included here someday)
697
	 */
698
	if (IsUnderPostmaster && !IsAutoVacuumLauncherProcess())
699 700
		MarkPostmasterChildInactive();

701 702
	/* wake autovac launcher if needed -- see comments in FreeWorkerInfo */
	if (AutovacuumLauncherPid != 0)
703
		kill(AutovacuumLauncherPid, SIGUSR2);
704 705 706
}

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

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

719
	auxproc = &AuxiliaryProcs[proctype];
J
Jan Wieck 已提交
720

721
	Assert(MyProc == auxproc);
722

723
	/* Release any LW locks I am holding (see notes above) */
724 725
	LWLockReleaseAll();

726 727
	SpinLockAcquire(ProcStructLock);

728
	/* Mark auxiliary proc no longer in use */
729 730
	MyProc->pid = 0;

J
Jan Wieck 已提交
731
	/* PGPROC struct isn't mine anymore */
732
	MyProc = NULL;
733 734 735 736 737

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

	SpinLockRelease(ProcStructLock);
738 739
}

740

741 742
/*
 * ProcQueue package: routines for putting processes to sleep
743
 *		and  waking them up
744 745 746 747 748 749 750 751
 */

/*
 * ProcQueueAlloc -- alloc/attach to a shared memory process queue
 *
 * Returns: a pointer to the queue or NULL
 * Side Effects: Initializes the queue if we allocated one
 */
752
#ifdef NOT_USED
753
PROC_QUEUE *
754 755
ProcQueueAlloc(char *name)
{
756 757
	bool		found;
	PROC_QUEUE *queue = (PROC_QUEUE *)
B
Bruce Momjian 已提交
758
	ShmemInitStruct(name, sizeof(PROC_QUEUE), &found);
759 760

	if (!queue)
761
		return NULL;
762 763
	if (!found)
		ProcQueueInit(queue);
764
	return queue;
765
}
766
#endif
767 768 769 770 771

/*
 * ProcQueueInit -- initialize a shared memory process queue
 */
void
772
ProcQueueInit(PROC_QUEUE *queue)
773
{
774 775
	SHMQueueInit(&(queue->links));
	queue->size = 0;
776 777 778 779
}


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

814
	/*
815 816
	 * Determine where to add myself in the wait queue.
	 *
817 818 819 820
	 * 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 已提交
821 822
	 * waiter anyway; but it's relatively cheap to detect such a conflict
	 * immediately, and avoid delaying till deadlock timeout.
823
	 *
824 825
	 * 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 已提交
826 827 828 829
	 * 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.
830 831
	 */
	if (myHeldLocks != 0)
V
Vadim B. Mikheev 已提交
832
	{
833
		LOCKMASK	aheadRequests = 0;
834

835
		proc = (PGPROC *) waitQueue->links.next;
836
		for (i = 0; i < waitQueue->size; i++)
V
Vadim B. Mikheev 已提交
837
		{
838
			/* Must he wait for me? */
B
Bruce Momjian 已提交
839
			if (lockMethodTable->conflictTab[proc->waitLockMode] & myHeldLocks)
V
Vadim B. Mikheev 已提交
840
			{
841
				/* Must I wait for him ? */
B
Bruce Momjian 已提交
842
				if (lockMethodTable->conflictTab[lockmode] & proc->heldLocks)
843
				{
844
					/*
B
Bruce Momjian 已提交
845 846 847 848 849
					 * 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.
850
					 */
851
					RememberSimpleDeadLock(MyProc, lockmode, lock, proc);
852 853
					early_deadlock = true;
					break;
854
				}
855
				/* I must go before this waiter.  Check special case. */
B
Bruce Momjian 已提交
856
				if ((lockMethodTable->conflictTab[lockmode] & aheadRequests) == 0 &&
857 858 859
					LockCheckConflicts(lockMethodTable,
									   lockmode,
									   lock,
860
									   proclock,
861
									   MyProc) == STATUS_OK)
862
				{
863
					/* Skip the wait and just grant myself the lock. */
864
					GrantLock(lock, proclock, lockmode);
865
					GrantAwaitedLock();
866
					return STATUS_OK;
867 868
				}
				/* Break out of loop to put myself before him */
V
Vadim B. Mikheev 已提交
869
				break;
870
			}
871
			/* Nope, so advance to next waiter */
872
			aheadRequests |= LOCKBIT_ON(proc->waitLockMode);
873
			proc = (PGPROC *) proc->links.next;
V
Vadim B. Mikheev 已提交
874
		}
B
Bruce Momjian 已提交
875

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

887
	/*
B
Bruce Momjian 已提交
888
	 * Insert self into queue, ahead of the given proc (or at tail of queue).
889
	 */
890
	SHMQueueInsertBefore(&(proc->links), &(MyProc->links));
B
Bruce Momjian 已提交
891
	waitQueue->size++;
892

893
	lock->waitMask |= LOCKBIT_ON(lockmode);
894

J
Jan Wieck 已提交
895
	/* Set up wait information in PGPROC object, too */
896
	MyProc->waitLock = lock;
897
	MyProc->waitProcLock = proclock;
898 899
	MyProc->waitLockMode = lockmode;

900
	MyProc->waitStatus = STATUS_WAITING;
901 902

	/*
B
Bruce Momjian 已提交
903 904 905
	 * 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.
906 907 908
	 */
	if (early_deadlock)
	{
909
		RemoveFromWaitQueue(MyProc, hashcode);
910 911
		return STATUS_ERROR;
	}
912

913
	/* mark that we are waiting for a lock */
914
	lockAwaited = locallock;
915

916
	/*
917
	 * Release the lock table's partition lock.
918
	 *
919
	 * NOTE: this may also cause us to exit critical-section state, possibly
B
Bruce Momjian 已提交
920 921
	 * 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
922
	 * LockWaitCancel will clean up if cancel/die happens.
923
	 */
924
	LWLockRelease(partitionLock);
925

926 927 928
	/* Reset deadlock_state before enabling the signal handler */
	deadlock_state = DS_NOT_YET_CHECKED;

929
	/*
B
Bruce Momjian 已提交
930 931 932 933
	 * 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.
934
	 *
935 936
	 * By delaying the check until we've waited for a bit, we can avoid
	 * running the rather expensive deadlock-check code in most cases.
937
	 */
938
	if (!enable_sig_alarm(DeadlockTimeout, false))
939
		elog(FATAL, "could not set timer for process wakeup");
940

941
	/*
942
	 * If someone wakes us between LWLockRelease and PGSemaphoreLock,
B
Bruce Momjian 已提交
943
	 * PGSemaphoreLock will not block.	The wakeup is "saved" by the semaphore
B
Bruce Momjian 已提交
944 945 946 947 948
	 * 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.
949
	 *
950 951 952 953 954 955 956
	 * 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.
957
	 */
B
Bruce Momjian 已提交
958 959
	do
	{
960
		PGSemaphoreLock(&MyProc->sem, true);
961

962 963
		/*
		 * waitStatus could change from STATUS_WAITING to something else
B
Bruce Momjian 已提交
964
		 * asynchronously.	Read it just once per loop to prevent surprising
965 966 967 968
		 * behavior (such as missing log messages).
		 */
		myWaitStatus = MyProc->waitStatus;

969 970
		/*
		 * If we are not deadlocked, but are waiting on an autovacuum-induced
B
Bruce Momjian 已提交
971
		 * task, send a signal to interrupt it.
972 973 974
		 */
		if (deadlock_state == DS_BLOCKED_BY_AUTOVACUUM && allow_autovacuum_cancel)
		{
B
Bruce Momjian 已提交
975
			PGPROC	   *autovac = GetBlockingAutoVacuumPgproc();
976 977 978 979 980 981 982 983 984 985 986

			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 已提交
987
				int			pid = autovac->pid;
988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010

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

1011 1012 1013 1014
		/*
		 * If awoken after the deadlock check interrupt has run, and
		 * log_lock_waits is on, then report about the wait.
		 */
1015
		if (log_lock_waits && deadlock_state != DS_NOT_YET_CHECKED)
1016
		{
1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034
			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 已提交
1035
							  MyProcPid, modename, buf.data, msecs, usecs)));
1036
			else if (deadlock_state == DS_HARD_DEADLOCK)
1037
			{
1038
				/*
B
Bruce Momjian 已提交
1039 1040 1041 1042
				 * 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
1043 1044 1045 1046
				 * events get logged.
				 */
				ereport(LOG,
						(errmsg("process %d detected deadlock while waiting for %s on %s after %ld.%03d ms",
B
Bruce Momjian 已提交
1047
							  MyProcPid, modename, buf.data, msecs, usecs)));
1048
			}
1049 1050 1051 1052

			if (myWaitStatus == STATUS_WAITING)
				ereport(LOG,
						(errmsg("process %d still waiting for %s on %s after %ld.%03d ms",
B
Bruce Momjian 已提交
1053
							  MyProcPid, modename, buf.data, msecs, usecs)));
1054 1055
			else if (myWaitStatus == STATUS_OK)
				ereport(LOG,
B
Bruce Momjian 已提交
1056 1057
					(errmsg("process %d acquired %s on %s after %ld.%03d ms",
							MyProcPid, modename, buf.data, msecs, usecs)));
1058 1059 1060
			else
			{
				Assert(myWaitStatus == STATUS_ERROR);
B
Bruce Momjian 已提交
1061

1062 1063
				/*
				 * Currently, the deadlock checker always kicks its own
B
Bruce Momjian 已提交
1064 1065 1066 1067 1068
				 * 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.
1069 1070 1071 1072
				 */
				if (deadlock_state != DS_HARD_DEADLOCK)
					ereport(LOG,
							(errmsg("process %d failed to acquire %s on %s after %ld.%03d ms",
B
Bruce Momjian 已提交
1073
							  MyProcPid, modename, buf.data, msecs, usecs)));
1074 1075 1076
			}

			/*
B
Bruce Momjian 已提交
1077 1078
			 * At this point we might still need to wait for the lock. Reset
			 * state so we don't print the above messages again.
1079 1080 1081 1082
			 */
			deadlock_state = DS_NO_DEADLOCK;

			pfree(buf.data);
1083
		}
1084
	} while (myWaitStatus == STATUS_WAITING);
1085

1086
	/*
1087
	 * Disable the timer, if it's still running
B
Bruce Momjian 已提交
1088
	 */
1089
	if (!disable_sig_alarm(false))
1090
		elog(FATAL, "could not disable timer for process wakeup");
B
Bruce Momjian 已提交
1091

1092
	/*
B
Bruce Momjian 已提交
1093 1094 1095
	 * 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).
1096
	 */
1097
	LWLockAcquire(partitionLock, LW_EXCLUSIVE);
1098 1099 1100

	/*
	 * We no longer want LockWaitCancel to do anything.
1101
	 */
1102
	lockAwaited = NULL;
1103

1104
	/*
1105
	 * If we got the lock, be sure to remember it in the locallock table.
1106
	 */
1107
	if (MyProc->waitStatus == STATUS_OK)
1108
		GrantAwaitedLock();
1109

1110 1111 1112 1113
	/*
	 * We don't have to do anything else, because the awaker did all the
	 * necessary update of the lock table and MyProc.
	 */
1114
	return MyProc->waitStatus;
1115 1116 1117 1118 1119 1120
}


/*
 * ProcWakeup -- wake up a process by releasing its private semaphore.
 *
1121
 *	 Also remove the process from the wait queue and set its links invalid.
1122
 *	 RETURN: the next process in the wait queue.
1123
 *
1124 1125
 * The appropriate lock partition lock must be held by caller.
 *
1126 1127 1128
 * 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.
1129
 * Hence, in practice the waitStatus parameter must be STATUS_OK.
1130
 */
J
Jan Wieck 已提交
1131
PGPROC *
1132
ProcWakeup(PGPROC *proc, int waitStatus)
1133
{
J
Jan Wieck 已提交
1134
	PGPROC	   *retProc;
1135

1136
	/* Proc should be sleeping ... */
1137 1138
	if (proc->links.prev == NULL ||
		proc->links.next == NULL)
1139
		return NULL;
1140
	Assert(proc->waitStatus == STATUS_WAITING);
1141

1142
	/* Save next process before we zap the list link */
1143
	retProc = (PGPROC *) proc->links.next;
1144

1145
	/* Remove process from wait queue */
1146
	SHMQueueDelete(&(proc->links));
1147
	(proc->waitLock->waitProcs.size)--;
1148

1149 1150
	/* Clean up process' state and pass it the ok/fail signal */
	proc->waitLock = NULL;
1151
	proc->waitProcLock = NULL;
1152
	proc->waitStatus = waitStatus;
1153

1154
	/* And awaken it */
1155
	PGSemaphoreUnlock(&proc->sem);
1156 1157

	return retProc;
1158 1159 1160 1161
}

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

1175
	Assert(queue_size >= 0);
1176

1177 1178
	if (queue_size == 0)
		return;
1179

1180
	proc = (PGPROC *) waitQueue->links.next;
1181

1182 1183
	while (queue_size-- > 0)
	{
B
Bruce Momjian 已提交
1184
		LOCKMODE	lockmode = proc->waitLockMode;
M
 
Marc G. Fournier 已提交
1185 1186

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

1201
			/*
B
Bruce Momjian 已提交
1202 1203 1204
			 * 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.
1205
			 */
M
 
Marc G. Fournier 已提交
1206
		}
1207
		else
1208
		{
B
Bruce Momjian 已提交
1209
			/*
B
Bruce Momjian 已提交
1210
			 * Cannot wake this guy. Remember his request for later checks.
B
Bruce Momjian 已提交
1211
			 */
1212
			aheadRequests |= LOCKBIT_ON(lockmode);
1213
			proc = (PGPROC *) proc->links.next;
1214
		}
M
 
Marc G. Fournier 已提交
1215
	}
1216 1217

	Assert(waitQueue->size >= 0);
1218 1219
}

1220 1221 1222
/*
 * CheckDeadLock
 *
1223
 * We only get to this routine if we got SIGALRM after DeadlockTimeout
1224 1225
 * 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.
1226
 * (But signal ProcSleep to log a message, if log_lock_waits is true.)
1227 1228
 * If we have a real deadlock, remove ourselves from the lock's wait queue
 * and signal an error to ProcSleep.
1229 1230 1231
 *
 * NB: this is run inside a signal handler, so be very wary about what is done
 * here or in called routines.
1232
 */
1233
static void
1234
CheckDeadLock(void)
1235
{
1236 1237
	int			i;

1238
	/*
B
Bruce Momjian 已提交
1239 1240
	 * Acquire exclusive lock on the entire shared lock data structures. Must
	 * grab LWLocks in partition-number order to avoid LWLock deadlock.
1241 1242 1243 1244 1245 1246
	 *
	 * 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.
1247
	 */
1248 1249
	for (i = 0; i < NUM_LOCK_PARTITIONS; i++)
		LWLockAcquire(FirstLockMgrLock + i, LW_EXCLUSIVE);
1250

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

1274
	if (deadlock_state == DS_HARD_DEADLOCK)
B
Bruce Momjian 已提交
1275
	{
1276 1277 1278
		/*
		 * Oops.  We have a deadlock.
		 *
1279 1280 1281 1282
		 * 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.)
1283 1284
		 *
		 * RemoveFromWaitQueue sets MyProc->waitStatus to STATUS_ERROR, so
1285 1286
		 * ProcSleep will report an error after we return from the signal
		 * handler.
1287 1288 1289
		 */
		Assert(MyProc->waitLock != NULL);
		RemoveFromWaitQueue(MyProc, LockTagHashCode(&(MyProc->waitLock->tag)));
1290

1291 1292 1293 1294 1295
		/*
		 * Unlock my semaphore so that the interrupted ProcSleep() call can
		 * finish.
		 */
		PGSemaphoreUnlock(&MyProc->sem);
1296

1297
		/*
1298 1299 1300 1301 1302 1303 1304 1305
		 * 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.
1306 1307
		 */
	}
1308
	else if (log_lock_waits || deadlock_state == DS_BLOCKED_BY_AUTOVACUUM)
1309 1310 1311 1312
	{
		/*
		 * 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 已提交
1313 1314
		 * a signal handler).  It will then sleep again until someone releases
		 * the lock.
1315 1316 1317
		 *
		 * If blocked by autovacuum, this wakeup will enable ProcSleep to send
		 * the cancelling signal to the autovacuum worker.
1318 1319 1320
		 */
		PGSemaphoreUnlock(&MyProc->sem);
	}
1321 1322

	/*
B
Bruce Momjian 已提交
1323 1324 1325 1326 1327
	 * 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.
1328
	 */
1329
check_done:
B
Bruce Momjian 已提交
1330
	for (i = NUM_LOCK_PARTITIONS; --i >= 0;)
1331
		LWLockRelease(FirstLockMgrLock + i);
1332 1333 1334
}


1335 1336 1337 1338 1339 1340
/*
 * 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 已提交
1341
 * before we actually reach the waiting state.	Also as with locks,
1342 1343
 * 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 已提交
1344
 * if not.	This copes with possible "leftover" wakeups.
1345 1346 1347 1348
 */
void
ProcWaitForSignal(void)
{
1349
	PGSemaphoreLock(&MyProc->sem, true);
1350 1351 1352
}

/*
1353
 * ProcSendSignal - send a signal to a backend identified by PID
1354 1355
 */
void
1356
ProcSendSignal(int pid)
1357
{
1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382
	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.
		 * 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
		 * cleanup lock using LockBufferForCleanup(). Startup is not a normal
		 * backend, so BackendPidGetProc() will not return any pid at all.
		 * So we remember the information for this special case.
		 */
		if (pid == procglobal->startupProcPid)
			proc = procglobal->startupProc;

		SpinLockRelease(ProcStructLock);
	}

	if (proc == NULL)
		proc = BackendPidGetProc(pid);
1383 1384

	if (proc != NULL)
1385
		PGSemaphoreUnlock(&proc->sem);
1386 1387 1388
}


1389 1390 1391 1392 1393 1394 1395 1396 1397
/*****************************************************************************
 * SIGALRM interrupt support
 *
 * Maybe these should be in pqsignal.c?
 *****************************************************************************/

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

1412 1413
	if (is_statement_timeout)
	{
1414 1415 1416 1417 1418 1419 1420 1421 1422 1423
		/*
		 * 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 已提交
1424 1425 1426 1427
		 * 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.
1428
		 */
1429
		Assert(!deadlock_timeout_active);
1430 1431
		fin_time = GetCurrentStatementStartTimestamp();
		fin_time = TimestampTzPlusMilliseconds(fin_time, delayms);
1432
		statement_fin_time = fin_time;
1433
		cancel_from_timeout = false;
1434
		statement_timeout_active = true;
1435 1436 1437 1438 1439 1440
	}
	else if (statement_timeout_active)
	{
		/*
		 * Begin deadlock timeout with statement-level timeout active
		 *
1441 1442 1443 1444
		 * 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.
1445 1446 1447
		 *
		 * 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 已提交
1448 1449 1450
		 * 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.
1451
		 */
1452 1453
		timeout_start_time = GetCurrentTimestamp();
		fin_time = TimestampTzPlusMilliseconds(timeout_start_time, delayms);
1454
		deadlock_timeout_active = true;
1455
		if (fin_time >= statement_fin_time)
1456 1457 1458 1459 1460 1461
			return true;
	}
	else
	{
		/* Begin deadlock timeout with no statement-level timeout */
		deadlock_timeout_active = true;
1462 1463 1464
		/* GetCurrentTimestamp can be expensive, so only do it if we must */
		if (log_lock_waits)
			timeout_start_time = GetCurrentTimestamp();
1465
	}
1466

1467
	/* If we reach here, okay to set the timer interrupt */
1468
	MemSet(&timeval, 0, sizeof(struct itimerval));
1469 1470
	timeval.it_value.tv_sec = delayms / 1000;
	timeval.it_value.tv_usec = (delayms % 1000) * 1000;
1471
	if (setitimer(ITIMER_REAL, &timeval, NULL))
1472
		return false;
1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493
	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)
1494
	{
1495
		struct itimerval timeval;
1496

1497
		MemSet(&timeval, 0, sizeof(struct itimerval));
1498
		if (setitimer(ITIMER_REAL, &timeval, NULL))
1499
		{
1500 1501 1502
			statement_timeout_active = false;
			cancel_from_timeout = false;
			deadlock_timeout_active = false;
1503 1504
			return false;
		}
1505 1506
	}

1507 1508 1509 1510
	/* Always cancel deadlock timeout, in case this is error cleanup */
	deadlock_timeout_active = false;

	/* Cancel or reschedule statement timeout */
1511
	if (is_statement_timeout)
1512
	{
1513
		statement_timeout_active = false;
1514 1515
		cancel_from_timeout = false;
	}
1516 1517 1518 1519 1520
	else if (statement_timeout_active)
	{
		if (!CheckStatementTimeout())
			return false;
	}
1521 1522 1523
	return true;
}

1524

1525
/*
1526 1527 1528
 * 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.
1529
 *
1530
 * Returns true if okay, false if failed to set the interrupt.
1531
 */
1532 1533
static bool
CheckStatementTimeout(void)
1534
{
1535
	TimestampTz now;
B
Bruce Momjian 已提交
1536

1537 1538 1539
	if (!statement_timeout_active)
		return true;			/* do nothing if not active */

1540
	now = GetCurrentTimestamp();
1541

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

1560 1561
		TimestampDifference(now, statement_fin_time,
							&secs, &usecs);
B
Bruce Momjian 已提交
1562

1563 1564 1565 1566 1567 1568
		/*
		 * 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;
1569
		MemSet(&timeval, 0, sizeof(struct itimerval));
1570 1571
		timeval.it_value.tv_sec = secs;
		timeval.it_value.tv_usec = usecs;
1572
		if (setitimer(ITIMER_REAL, &timeval, NULL))
1573 1574 1575
			return false;
	}

1576 1577
	return true;
}
1578 1579 1580


/*
1581
 * Signal handler for SIGALRM for normal user backends
1582 1583 1584 1585 1586
 *
 * 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.
1587 1588 1589 1590
 */
void
handle_sig_alarm(SIGNAL_ARGS)
{
1591 1592 1593
	int			save_errno = errno;

	if (deadlock_timeout_active)
1594
	{
1595
		deadlock_timeout_active = false;
1596 1597
		CheckDeadLock();
	}
1598 1599 1600 1601 1602

	if (statement_timeout_active)
		(void) CheckStatementTimeout();

	errno = save_errno;
1603
}
1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 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

/*
 * 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.
 */
bool
enable_standby_sig_alarm(long delay_s, int delay_us, TimestampTz fin_time)
{
	struct itimerval timeval;

	Assert(delay_s >= 0 && delay_us >= 0);

	statement_fin_time = fin_time;

	standby_timeout_active = true;

	MemSet(&timeval, 0, sizeof(struct itimerval));
	timeval.it_value.tv_sec = delay_s;
	timeval.it_value.tv_usec = delay_us;
	if (setitimer(ITIMER_REAL, &timeval, NULL))
		return false;
	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;

	standby_timeout_active = false;

	now = GetCurrentTimestamp();

	if (now >= statement_fin_time)
		SendRecoveryConflictWithBufferPin();
	else
	{
		/* Not time yet, so (re)schedule the interrupt */
		long		secs;
		int			usecs;
		struct itimerval timeval;

		TimestampDifference(now, statement_fin_time,
							&secs, &usecs);

		/*
		 * 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;

		standby_timeout_active = true;

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

	return true;
}

void
handle_standby_sig_alarm(SIGNAL_ARGS)
{
	int save_errno = errno;

	if (standby_timeout_active)
		(void) CheckStandbyTimeout();

	errno = save_errno;
}