proc.c 51.5 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
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 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;
R
Robert Haas 已提交
161
	uint32		TotalProcs = MaxBackends + NUM_AUXILIARY_PROCS;
162

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

168 169 170
	/*
	 * Initialize the data structures.
	 */
R
Robert Haas 已提交
171
	ProcGlobal->spins_per_delay = DEFAULT_SPINS_PER_DELAY;
172 173
	ProcGlobal->freeProcs = NULL;
	ProcGlobal->autovacFreeProcs = NULL;
174

175
	/*
R
Robert Haas 已提交
176 177 178
	 * Create and initialize all the PGPROC structures we'll need (except for
	 * those used for 2PC, which are embedded within a GlobalTransactionData
	 * struct).
179
	 *
R
Robert Haas 已提交
180 181 182 183
	 * There are three separate consumers of PGPROC structures: (1) normal
	 * backends, (2) autovacuum workers and the autovacuum launcher, and (3)
	 * auxiliary processes.  Each PGPROC structure is dedicated to exactly
	 * one of these purposes, and they do not move between groups.
184
	 */
R
Robert Haas 已提交
185
	procs = (PGPROC *) ShmemAlloc(TotalProcs * sizeof(PGPROC));
186 187
	ProcGlobal->allProcs = procs;
	ProcGlobal->allProcCount = TotalProcs;
188 189 190 191
	if (!procs)
		ereport(FATAL,
				(errcode(ERRCODE_OUT_OF_MEMORY),
				 errmsg("out of shared memory")));
R
Robert Haas 已提交
192 193
	MemSet(procs, 0, TotalProcs * sizeof(PGPROC));
	for (i = 0; i < TotalProcs; i++)
194
	{
R
Robert Haas 已提交
195
		/* Common initialization for all PGPROCs, regardless of type. */
196
		PGSemaphoreCreate(&(procs[i].sem));
197
		procs[i].backendLock = LWLockAssign();
198
		InitSharedLatch(&procs[i].waitLatch);
R
Robert Haas 已提交
199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218

		/*
		 * Newly created PGPROCs for normal backends or for autovacuum must
		 * be queued up on the appropriate free list.  Because there can only
		 * ever be a small, fixed number of auxiliary processes, no free
		 * list is used in that case; InitAuxiliaryProcess() instead uses a
		 * linear search.
		 */
		if (i < MaxConnections)
		{
			/* PGPROC for normal backend, add to freeProcs list */
			procs[i].links.next = (SHM_QUEUE *) ProcGlobal->freeProcs;
			ProcGlobal->freeProcs = &procs[i];
		}
		else if (i < MaxBackends)
		{
			/* PGPROC for AV launcher/worker, add to autovacFreeProcs list */
			procs[i].links.next = (SHM_QUEUE *) ProcGlobal->autovacFreeProcs;
			ProcGlobal->autovacFreeProcs = &procs[i];
		}
219 220
	}

221
	/*
R
Robert Haas 已提交
222 223
	 * Save a pointer to the block of PGPROC structures reserved for
	 * auxiliary proceses.
224
	 */
R
Robert Haas 已提交
225
	AuxiliaryProcs = &procs[MaxBackends];
226 227 228 229

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

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

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

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

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

261 262
	set_spins_per_delay(procglobal->spins_per_delay);

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

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

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

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

327 328 329 330 331 332 333
	/* 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);

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

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

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

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

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

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

	if (MyProc != NULL)
411
		elog(ERROR, "you already exist");
412

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

	set_spins_per_delay(ProcGlobal->spins_per_delay);

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

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

443
	MyProc = auxproc;
444 445 446

	SpinLockRelease(ProcStructLock);

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

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

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

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

	SpinLockRelease(ProcStructLock);
}

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

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

	bufid = procglobal->startupBufferPinWaitBufId;

	return bufid;
}

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

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

	SpinLockAcquire(ProcStructLock);

548
	proc = procglobal->freeProcs;
549

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

	SpinLockRelease(ProcStructLock);

	return (n <= 0);
}

561 562 563 564 565 566 567 568 569
bool
IsWaitingForLock(void)
{
	if (lockAwaited == NULL)
		return false;

	return true;
}

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

582
	/* Nothing to do if we weren't waiting for a lock */
583
	if (lockAwaited == NULL)
584
		return;
585

586
	/* Turn off the deadlock timer, if it's still running (see ProcSleep) */
587
	disable_sig_alarm(false);
588 589

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

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

610
	lockAwaited = NULL;
611

612
	LWLockRelease(partitionLock);
H
Hiroshi Inoue 已提交
613

614
	/*
615
	 * We used to do PGSemaphoreReset() here to ensure that our proc's wait
B
Bruce Momjian 已提交
616 617 618 619 620 621
	 * 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.
622
	 */
H
Hiroshi Inoue 已提交
623
}
624

625

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

	/* Release transaction level advisory locks */
	LockReleaseAll(USER_LOCKMETHOD, false);
651 652 653
}


654 655 656 657 658 659 660
/*
 * RemoveProcFromArray() -- Remove this process from the shared ProcArray.
 */
static void
RemoveProcFromArray(int code, Datum arg)
{
	Assert(MyProc != NULL);
661
	ProcArrayRemove(MyProc, InvalidTransactionId);
662 663
}

664 665
/*
 * ProcKill() -- Destroy the per-proc data structure for
666
 *		this process. Release any of its held LW locks.
667 668
 */
static void
669
ProcKill(int code, Datum arg)
670
{
671 672 673
	/* use volatile pointer to prevent code rearrangement */
	volatile PROC_HDR *procglobal = ProcGlobal;

674
	Assert(MyProc != NULL);
675

676
	/*
B
Bruce Momjian 已提交
677 678
	 * 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
679
	 * facility by releasing our PGPROC ...
680
	 */
681
	LWLockReleaseAll();
682

683
	SpinLockAcquire(ProcStructLock);
684

685 686
	/* Return PGPROC structure (and semaphore) to appropriate freelist */
	if (IsAnyAutoVacuumProcess())
687
	{
688 689
		MyProc->links.next = (SHM_QUEUE *) procglobal->autovacFreeProcs;
		procglobal->autovacFreeProcs = MyProc;
690 691 692
	}
	else
	{
693 694
		MyProc->links.next = (SHM_QUEUE *) procglobal->freeProcs;
		procglobal->freeProcs = MyProc;
695
	}
696

J
Jan Wieck 已提交
697
	/* PGPROC struct isn't mine anymore */
698
	MyProc = NULL;
699

700 701 702
	/* Update shared estimate of spins_per_delay */
	procglobal->spins_per_delay = update_spins_per_delay(procglobal->spins_per_delay);

703
	SpinLockRelease(ProcStructLock);
704

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

713 714
	/* wake autovac launcher if needed -- see comments in FreeWorkerInfo */
	if (AutovacuumLauncherPid != 0)
715
		kill(AutovacuumLauncherPid, SIGUSR2);
716 717 718
}

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

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

731
	auxproc = &AuxiliaryProcs[proctype];
J
Jan Wieck 已提交
732

733
	Assert(MyProc == auxproc);
734

735
	/* Release any LW locks I am holding (see notes above) */
736 737
	LWLockReleaseAll();

738 739
	SpinLockAcquire(ProcStructLock);

740
	/* Mark auxiliary proc no longer in use */
741 742
	MyProc->pid = 0;

J
Jan Wieck 已提交
743
	/* PGPROC struct isn't mine anymore */
744
	MyProc = NULL;
745 746 747 748 749

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

	SpinLockRelease(ProcStructLock);
750 751
}

752

753 754
/*
 * ProcQueue package: routines for putting processes to sleep
755
 *		and  waking them up
756 757 758 759 760
 */

/*
 * ProcQueueAlloc -- alloc/attach to a shared memory process queue
 *
761 762
 * Returns: a pointer to the queue
 * Side Effects: Initializes the queue if it wasn't there before
763
 */
764
#ifdef NOT_USED
765
PROC_QUEUE *
766
ProcQueueAlloc(const char *name)
767
{
768
	PROC_QUEUE *queue;
769
	bool		found;
770

771 772 773
	queue = (PROC_QUEUE *)
		ShmemInitStruct(name, sizeof(PROC_QUEUE), &found);

774 775
	if (!found)
		ProcQueueInit(queue);
776

777
	return queue;
778
}
779
#endif
780 781 782 783 784

/*
 * ProcQueueInit -- initialize a shared memory process queue
 */
void
785
ProcQueueInit(PROC_QUEUE *queue)
786
{
787 788
	SHMQueueInit(&(queue->links));
	queue->size = 0;
789 790 791 792
}


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

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

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

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

900
	/*
B
Bruce Momjian 已提交
901
	 * Insert self into queue, ahead of the given proc (or at tail of queue).
902
	 */
903
	SHMQueueInsertBefore(&(proc->links), &(MyProc->links));
B
Bruce Momjian 已提交
904
	waitQueue->size++;
905

906
	lock->waitMask |= LOCKBIT_ON(lockmode);
907

J
Jan Wieck 已提交
908
	/* Set up wait information in PGPROC object, too */
909
	MyProc->waitLock = lock;
910
	MyProc->waitProcLock = proclock;
911 912
	MyProc->waitLockMode = lockmode;

913
	MyProc->waitStatus = STATUS_WAITING;
914 915

	/*
B
Bruce Momjian 已提交
916 917 918
	 * 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.
919 920 921
	 */
	if (early_deadlock)
	{
922
		RemoveFromWaitQueue(MyProc, hashcode);
923 924
		return STATUS_ERROR;
	}
925

926
	/* mark that we are waiting for a lock */
927
	lockAwaited = locallock;
928

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

939 940 941
	/* Reset deadlock_state before enabling the signal handler */
	deadlock_state = DS_NOT_YET_CHECKED;

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

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

975 976
		/*
		 * waitStatus could change from STATUS_WAITING to something else
B
Bruce Momjian 已提交
977
		 * asynchronously.	Read it just once per loop to prevent surprising
978 979 980 981
		 * behavior (such as missing log messages).
		 */
		myWaitStatus = MyProc->waitStatus;

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

			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 已提交
1000
				int			pid = autovac->pid;
1001

P
Peter Eisentraut 已提交
1002
				elog(DEBUG2, "sending cancel to blocking autovacuum PID %d",
1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023
					 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;
		}

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

			if (myWaitStatus == STATUS_WAITING)
				ereport(LOG,
						(errmsg("process %d still waiting for %s on %s after %ld.%03d ms",
B
Bruce Momjian 已提交
1066
							  MyProcPid, modename, buf.data, msecs, usecs)));
1067 1068
			else if (myWaitStatus == STATUS_OK)
				ereport(LOG,
B
Bruce Momjian 已提交
1069 1070
					(errmsg("process %d acquired %s on %s after %ld.%03d ms",
							MyProcPid, modename, buf.data, msecs, usecs)));
1071 1072 1073
			else
			{
				Assert(myWaitStatus == STATUS_ERROR);
B
Bruce Momjian 已提交
1074

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

			/*
B
Bruce Momjian 已提交
1090 1091
			 * At this point we might still need to wait for the lock. Reset
			 * state so we don't print the above messages again.
1092 1093 1094 1095
			 */
			deadlock_state = DS_NO_DEADLOCK;

			pfree(buf.data);
1096
		}
1097
	} while (myWaitStatus == STATUS_WAITING);
1098

1099
	/*
1100
	 * Disable the timer, if it's still running
B
Bruce Momjian 已提交
1101
	 */
1102
	if (!disable_sig_alarm(false))
1103
		elog(FATAL, "could not disable timer for process wakeup");
B
Bruce Momjian 已提交
1104

1105
	/*
B
Bruce Momjian 已提交
1106 1107 1108
	 * 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).
1109
	 */
1110
	LWLockAcquire(partitionLock, LW_EXCLUSIVE);
1111 1112 1113

	/*
	 * We no longer want LockWaitCancel to do anything.
1114
	 */
1115
	lockAwaited = NULL;
1116

1117
	/*
1118
	 * If we got the lock, be sure to remember it in the locallock table.
1119
	 */
1120
	if (MyProc->waitStatus == STATUS_OK)
1121
		GrantAwaitedLock();
1122

1123 1124 1125 1126
	/*
	 * We don't have to do anything else, because the awaker did all the
	 * necessary update of the lock table and MyProc.
	 */
1127
	return MyProc->waitStatus;
1128 1129 1130 1131 1132 1133
}


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

1149
	/* Proc should be sleeping ... */
1150 1151
	if (proc->links.prev == NULL ||
		proc->links.next == NULL)
1152
		return NULL;
1153
	Assert(proc->waitStatus == STATUS_WAITING);
1154

1155
	/* Save next process before we zap the list link */
1156
	retProc = (PGPROC *) proc->links.next;
1157

1158
	/* Remove process from wait queue */
1159
	SHMQueueDelete(&(proc->links));
1160
	(proc->waitLock->waitProcs.size)--;
1161

1162 1163
	/* Clean up process' state and pass it the ok/fail signal */
	proc->waitLock = NULL;
1164
	proc->waitProcLock = NULL;
1165
	proc->waitStatus = waitStatus;
1166

1167
	/* And awaken it */
1168
	PGSemaphoreUnlock(&proc->sem);
1169 1170

	return retProc;
1171 1172 1173 1174
}

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

1188
	Assert(queue_size >= 0);
1189

1190 1191
	if (queue_size == 0)
		return;
1192

1193
	proc = (PGPROC *) waitQueue->links.next;
1194

1195 1196
	while (queue_size-- > 0)
	{
B
Bruce Momjian 已提交
1197
		LOCKMODE	lockmode = proc->waitLockMode;
M
 
Marc G. Fournier 已提交
1198 1199

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

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

	Assert(waitQueue->size >= 0);
1231 1232
}

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

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

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

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

1304 1305 1306 1307 1308
		/*
		 * Unlock my semaphore so that the interrupted ProcSleep() call can
		 * finish.
		 */
		PGSemaphoreUnlock(&MyProc->sem);
1309

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

	/*
B
Bruce Momjian 已提交
1336 1337 1338 1339 1340
	 * 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.
1341
	 */
1342
check_done:
B
Bruce Momjian 已提交
1343
	for (i = NUM_LOCK_PARTITIONS; --i >= 0;)
1344
		LWLockRelease(FirstLockMgrLock + i);
1345 1346 1347
}


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

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

		SpinLockRelease(ProcStructLock);
	}

	if (proc == NULL)
		proc = BackendPidGetProc(pid);
1396 1397

	if (proc != NULL)
1398
		PGSemaphoreUnlock(&proc->sem);
1399 1400 1401
}


1402 1403 1404 1405 1406 1407 1408 1409 1410
/*****************************************************************************
 * SIGALRM interrupt support
 *
 * Maybe these should be in pqsignal.c?
 *****************************************************************************/

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

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

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

1510
		MemSet(&timeval, 0, sizeof(struct itimerval));
1511
		if (setitimer(ITIMER_REAL, &timeval, NULL))
1512
		{
1513 1514 1515
			statement_timeout_active = false;
			cancel_from_timeout = false;
			deadlock_timeout_active = false;
1516 1517
			return false;
		}
1518 1519
	}

1520 1521 1522 1523
	/* Always cancel deadlock timeout, in case this is error cleanup */
	deadlock_timeout_active = false;

	/* Cancel or reschedule statement timeout */
1524
	if (is_statement_timeout)
1525
	{
1526
		statement_timeout_active = false;
1527 1528
		cancel_from_timeout = false;
	}
1529 1530 1531 1532 1533
	else if (statement_timeout_active)
	{
		if (!CheckStatementTimeout())
			return false;
	}
1534 1535 1536
	return true;
}

1537

1538
/*
1539 1540 1541
 * 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.
1542
 *
1543
 * Returns true if okay, false if failed to set the interrupt.
1544
 */
1545 1546
static bool
CheckStatementTimeout(void)
1547
{
1548
	TimestampTz now;
B
Bruce Momjian 已提交
1549

1550 1551 1552
	if (!statement_timeout_active)
		return true;			/* do nothing if not active */

1553
	now = GetCurrentTimestamp();
1554

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

1573 1574
		TimestampDifference(now, statement_fin_time,
							&secs, &usecs);
B
Bruce Momjian 已提交
1575

1576 1577 1578 1579 1580 1581
		/*
		 * 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;
1582
		MemSet(&timeval, 0, sizeof(struct itimerval));
1583 1584
		timeval.it_value.tv_sec = secs;
		timeval.it_value.tv_usec = usecs;
1585
		if (setitimer(ITIMER_REAL, &timeval, NULL))
1586 1587 1588
			return false;
	}

1589 1590
	return true;
}
1591 1592 1593


/*
1594
 * Signal handler for SIGALRM for normal user backends
1595 1596 1597 1598 1599
 *
 * 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.
1600 1601 1602 1603
 */
void
handle_sig_alarm(SIGNAL_ARGS)
{
1604 1605 1606
	int			save_errno = errno;

	if (deadlock_timeout_active)
1607
	{
1608
		deadlock_timeout_active = false;
1609 1610
		CheckDeadLock();
	}
1611 1612 1613 1614 1615

	if (statement_timeout_active)
		(void) CheckStatementTimeout();

	errno = save_errno;
1616
}
1617 1618 1619 1620 1621 1622 1623

/*
 * 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.
1624 1625 1626
 *
 * We set either deadlock_timeout_active or statement_timeout_active
 * or both. Interrupts are enabled if standby_timeout_active.
1627 1628
 */
bool
1629
enable_standby_sig_alarm(TimestampTz now, TimestampTz fin_time, bool deadlock_only)
1630
{
1631 1632
	TimestampTz deadlock_time = TimestampTzPlusMilliseconds(now,
															DeadlockTimeout);
1633

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

1663 1664 1665 1666 1667
	if (deadlock_timeout_active || statement_timeout_active)
	{
		long		secs;
		int			usecs;
		struct itimerval timeval;
B
Bruce Momjian 已提交
1668

1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679
		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;
	}
1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719

	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 已提交
1720
	bool		reschedule = false;
1721 1722 1723 1724 1725

	standby_timeout_active = false;

	now = GetCurrentTimestamp();

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

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

	if (reschedule)
1764 1765 1766 1767
	{
		long		secs;
		int			usecs;
		struct itimerval timeval;
B
Bruce Momjian 已提交
1768

1769 1770 1771 1772 1773 1774 1775 1776 1777
		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;
1778
		standby_timeout_active = true;
1779 1780 1781 1782 1783 1784 1785 1786
	}

	return true;
}

void
handle_standby_sig_alarm(SIGNAL_ARGS)
{
B
Bruce Momjian 已提交
1787
	int			save_errno = errno;
1788 1789 1790 1791 1792 1793

	if (standby_timeout_active)
		(void) CheckStandbyTimeout();

	errno = save_errno;
}