advisory.patch

text/plain

Filename: advisory.patch
Type: text/plain
Part: 0
Message: Transaction-scope advisory locks

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: context
File+
src/backend/storage/lmgr/lock.c 1 0
src/backend/storage/lmgr/proc.c 1 0
src/backend/utils/adt/lockfuncs.c 16 0
src/include/catalog/pg_proc.h 24 0
*** a/src/backend/storage/lmgr/lock.c
--- b/src/backend/storage/lmgr/lock.c
***************
*** 130,136 **** static const LockMethodData default_lockmethod = {
  
  static const LockMethodData user_lockmethod = {
  	AccessExclusiveLock,		/* highest valid lock mode number */
! 	false,
  	LockConflicts,
  	lock_mode_names,
  #ifdef LOCK_DEBUG
--- 130,136 ----
  
  static const LockMethodData user_lockmethod = {
  	AccessExclusiveLock,		/* highest valid lock mode number */
! 	true,
  	LockConflicts,
  	lock_mode_names,
  #ifdef LOCK_DEBUG
*** a/src/backend/storage/lmgr/proc.c
--- b/src/backend/storage/lmgr/proc.c
***************
*** 629,636 **** LockWaitCancel(void)
   * At subtransaction abort, we release all locks held by the subtransaction;
   * this is implemented by retail releasing of the locks under control of
   * the ResourceOwner mechanism.
-  *
-  * Note that user locks are not released in any case.
   */
  void
  ProcReleaseLocks(bool isCommit)
--- 629,634 ----
***************
*** 641,646 **** ProcReleaseLocks(bool isCommit)
--- 639,645 ----
  	LockWaitCancel();
  	/* Release locks */
  	LockReleaseAll(DEFAULT_LOCKMETHOD, !isCommit);
+ 	LockReleaseAll(USER_LOCKMETHOD, false);
  }
  
  
*** a/src/backend/utils/adt/lockfuncs.c
--- b/src/backend/utils/adt/lockfuncs.c
***************
*** 333,343 **** Datum
  pg_advisory_lock_int8(PG_FUNCTION_ARGS)
  {
  	int64		key = PG_GETARG_INT64(0);
  	LOCKTAG		tag;
  
  	SET_LOCKTAG_INT64(tag, key);
  
! 	(void) LockAcquire(&tag, ExclusiveLock, true, false);
  
  	PG_RETURN_VOID();
  }
--- 333,344 ----
  pg_advisory_lock_int8(PG_FUNCTION_ARGS)
  {
  	int64		key = PG_GETARG_INT64(0);
+ 	bool		session = PG_GETARG_BOOL(1);
  	LOCKTAG		tag;
  
  	SET_LOCKTAG_INT64(tag, key);
  
! 	(void) LockAcquire(&tag, ExclusiveLock, session, false);
  
  	PG_RETURN_VOID();
  }
***************
*** 349,359 **** Datum
  pg_advisory_lock_shared_int8(PG_FUNCTION_ARGS)
  {
  	int64		key = PG_GETARG_INT64(0);
  	LOCKTAG		tag;
  
  	SET_LOCKTAG_INT64(tag, key);
  
! 	(void) LockAcquire(&tag, ShareLock, true, false);
  
  	PG_RETURN_VOID();
  }
--- 350,361 ----
  pg_advisory_lock_shared_int8(PG_FUNCTION_ARGS)
  {
  	int64		key = PG_GETARG_INT64(0);
+ 	bool		session = PG_GETARG_BOOL(1);
  	LOCKTAG		tag;
  
  	SET_LOCKTAG_INT64(tag, key);
  
! 	(void) LockAcquire(&tag, ShareLock, session, false);
  
  	PG_RETURN_VOID();
  }
***************
*** 367,378 **** Datum
  pg_try_advisory_lock_int8(PG_FUNCTION_ARGS)
  {
  	int64		key = PG_GETARG_INT64(0);
  	LOCKTAG		tag;
  	LockAcquireResult res;
  
  	SET_LOCKTAG_INT64(tag, key);
  
! 	res = LockAcquire(&tag, ExclusiveLock, true, true);
  
  	PG_RETURN_BOOL(res != LOCKACQUIRE_NOT_AVAIL);
  }
--- 369,381 ----
  pg_try_advisory_lock_int8(PG_FUNCTION_ARGS)
  {
  	int64		key = PG_GETARG_INT64(0);
+ 	bool		session = PG_GETARG_BOOL(1);
  	LOCKTAG		tag;
  	LockAcquireResult res;
  
  	SET_LOCKTAG_INT64(tag, key);
  
! 	res = LockAcquire(&tag, ExclusiveLock, session, true);
  
  	PG_RETURN_BOOL(res != LOCKACQUIRE_NOT_AVAIL);
  }
***************
*** 386,397 **** Datum
  pg_try_advisory_lock_shared_int8(PG_FUNCTION_ARGS)
  {
  	int64		key = PG_GETARG_INT64(0);
  	LOCKTAG		tag;
  	LockAcquireResult res;
  
  	SET_LOCKTAG_INT64(tag, key);
  
! 	res = LockAcquire(&tag, ShareLock, true, true);
  
  	PG_RETURN_BOOL(res != LOCKACQUIRE_NOT_AVAIL);
  }
--- 389,401 ----
  pg_try_advisory_lock_shared_int8(PG_FUNCTION_ARGS)
  {
  	int64		key = PG_GETARG_INT64(0);
+ 	bool		session = PG_GETARG_BOOL(1);
  	LOCKTAG		tag;
  	LockAcquireResult res;
  
  	SET_LOCKTAG_INT64(tag, key);
  
! 	res = LockAcquire(&tag, ShareLock, session, true);
  
  	PG_RETURN_BOOL(res != LOCKACQUIRE_NOT_AVAIL);
  }
***************
*** 442,452 **** pg_advisory_lock_int4(PG_FUNCTION_ARGS)
  {
  	int32		key1 = PG_GETARG_INT32(0);
  	int32		key2 = PG_GETARG_INT32(1);
  	LOCKTAG		tag;
  
  	SET_LOCKTAG_INT32(tag, key1, key2);
  
! 	(void) LockAcquire(&tag, ExclusiveLock, true, false);
  
  	PG_RETURN_VOID();
  }
--- 446,457 ----
  {
  	int32		key1 = PG_GETARG_INT32(0);
  	int32		key2 = PG_GETARG_INT32(1);
+ 	bool		session = PG_GETARG_BOOL(2);
  	LOCKTAG		tag;
  
  	SET_LOCKTAG_INT32(tag, key1, key2);
  
! 	(void) LockAcquire(&tag, ExclusiveLock, session, false);
  
  	PG_RETURN_VOID();
  }
***************
*** 459,469 **** pg_advisory_lock_shared_int4(PG_FUNCTION_ARGS)
  {
  	int32		key1 = PG_GETARG_INT32(0);
  	int32		key2 = PG_GETARG_INT32(1);
  	LOCKTAG		tag;
  
  	SET_LOCKTAG_INT32(tag, key1, key2);
  
! 	(void) LockAcquire(&tag, ShareLock, true, false);
  
  	PG_RETURN_VOID();
  }
--- 464,475 ----
  {
  	int32		key1 = PG_GETARG_INT32(0);
  	int32		key2 = PG_GETARG_INT32(1);
+ 	bool		session = PG_GETARG_BOOL(2);
  	LOCKTAG		tag;
  
  	SET_LOCKTAG_INT32(tag, key1, key2);
  
! 	(void) LockAcquire(&tag, ShareLock, session, false);
  
  	PG_RETURN_VOID();
  }
***************
*** 478,489 **** pg_try_advisory_lock_int4(PG_FUNCTION_ARGS)
  {
  	int32		key1 = PG_GETARG_INT32(0);
  	int32		key2 = PG_GETARG_INT32(1);
  	LOCKTAG		tag;
  	LockAcquireResult res;
  
  	SET_LOCKTAG_INT32(tag, key1, key2);
  
! 	res = LockAcquire(&tag, ExclusiveLock, true, true);
  
  	PG_RETURN_BOOL(res != LOCKACQUIRE_NOT_AVAIL);
  }
--- 484,496 ----
  {
  	int32		key1 = PG_GETARG_INT32(0);
  	int32		key2 = PG_GETARG_INT32(1);
+ 	bool		session = PG_GETARG_BOOL(2);
  	LOCKTAG		tag;
  	LockAcquireResult res;
  
  	SET_LOCKTAG_INT32(tag, key1, key2);
  
! 	res = LockAcquire(&tag, ExclusiveLock, session, true);
  
  	PG_RETURN_BOOL(res != LOCKACQUIRE_NOT_AVAIL);
  }
***************
*** 498,509 **** pg_try_advisory_lock_shared_int4(PG_FUNCTION_ARGS)
  {
  	int32		key1 = PG_GETARG_INT32(0);
  	int32		key2 = PG_GETARG_INT32(1);
  	LOCKTAG		tag;
  	LockAcquireResult res;
  
  	SET_LOCKTAG_INT32(tag, key1, key2);
  
! 	res = LockAcquire(&tag, ShareLock, true, true);
  
  	PG_RETURN_BOOL(res != LOCKACQUIRE_NOT_AVAIL);
  }
--- 505,517 ----
  {
  	int32		key1 = PG_GETARG_INT32(0);
  	int32		key2 = PG_GETARG_INT32(1);
+ 	bool		session = PG_GETARG_BOOL(2);
  	LOCKTAG		tag;
  	LockAcquireResult res;
  
  	SET_LOCKTAG_INT32(tag, key1, key2);
  
! 	res = LockAcquire(&tag, ShareLock, session, true);
  
  	PG_RETURN_BOOL(res != LOCKACQUIRE_NOT_AVAIL);
  }
*** a/src/include/catalog/pg_proc.h
--- b/src/include/catalog/pg_proc.h
***************
*** 4373,4397 **** DATA(insert OID = 2749 (  arraycontained	   PGNSP PGUID 12 1 0 0 f f f t f i 2 0
  DESCR("is contained by");
  
  /* userlock replacements */
! DATA(insert OID = 2880 (  pg_advisory_lock				PGNSP PGUID 12 1 0 0 f f f t f v 1 0 2278 "20" _null_ _null_ _null_ _null_ pg_advisory_lock_int8 _null_ _null_ _null_ ));
  DESCR("obtain exclusive advisory lock");
! DATA(insert OID = 2881 (  pg_advisory_lock_shared		PGNSP PGUID 12 1 0 0 f f f t f v 1 0 2278 "20" _null_ _null_ _null_ _null_ pg_advisory_lock_shared_int8 _null_ _null_ _null_ ));
  DESCR("obtain shared advisory lock");
! DATA(insert OID = 2882 (  pg_try_advisory_lock			PGNSP PGUID 12 1 0 0 f f f t f v 1 0 16 "20" _null_ _null_ _null_ _null_ pg_try_advisory_lock_int8 _null_ _null_ _null_ ));
  DESCR("obtain exclusive advisory lock if available");
! DATA(insert OID = 2883 (  pg_try_advisory_lock_shared	PGNSP PGUID 12 1 0 0 f f f t f v 1 0 16 "20" _null_ _null_ _null_ _null_ pg_try_advisory_lock_shared_int8 _null_ _null_ _null_ ));
  DESCR("obtain shared advisory lock if available");
  DATA(insert OID = 2884 (  pg_advisory_unlock			PGNSP PGUID 12 1 0 0 f f f t f v 1 0 16 "20" _null_ _null_ _null_ _null_ pg_advisory_unlock_int8 _null_ _null_ _null_ ));
  DESCR("release exclusive advisory lock");
  DATA(insert OID = 2885 (  pg_advisory_unlock_shared		PGNSP PGUID 12 1 0 0 f f f t f v 1 0 16 "20" _null_ _null_ _null_ _null_ pg_advisory_unlock_shared_int8 _null_ _null_ _null_ ));
  DESCR("release shared advisory lock");
! DATA(insert OID = 2886 (  pg_advisory_lock				PGNSP PGUID 12 1 0 0 f f f t f v 2 0 2278 "23 23" _null_ _null_ _null_ _null_ pg_advisory_lock_int4 _null_ _null_ _null_ ));
  DESCR("obtain exclusive advisory lock");
! DATA(insert OID = 2887 (  pg_advisory_lock_shared		PGNSP PGUID 12 1 0 0 f f f t f v 2 0 2278 "23 23" _null_ _null_ _null_ _null_ pg_advisory_lock_shared_int4 _null_ _null_ _null_ ));
  DESCR("obtain shared advisory lock");
! DATA(insert OID = 2888 (  pg_try_advisory_lock			PGNSP PGUID 12 1 0 0 f f f t f v 2 0 16 "23 23" _null_ _null_ _null_ _null_ pg_try_advisory_lock_int4 _null_ _null_ _null_ ));
  DESCR("obtain exclusive advisory lock if available");
! DATA(insert OID = 2889 (  pg_try_advisory_lock_shared	PGNSP PGUID 12 1 0 0 f f f t f v 2 0 16 "23 23" _null_ _null_ _null_ _null_ pg_try_advisory_lock_shared_int4 _null_ _null_ _null_ ));
  DESCR("obtain shared advisory lock if available");
  DATA(insert OID = 2890 (  pg_advisory_unlock			PGNSP PGUID 12 1 0 0 f f f t f v 2 0 16 "23 23" _null_ _null_ _null_ _null_ pg_advisory_unlock_int4 _null_ _null_ _null_ ));
  DESCR("release exclusive advisory lock");
--- 4373,4413 ----
  DESCR("is contained by");
  
  /* userlock replacements */
! DATA(insert OID = 2880 (  pg_advisory_lock				PGNSP PGUID 14 1 0 0 f f f t f v 1 0 2278 "20" _null_ _null_ _null_ _null_ "select pg_advisory_lock($1, true)" _null_ _null_ _null_ ));
  DESCR("obtain exclusive advisory lock");
! DATA(insert OID = 3065 (  pg_advisory_lock				PGNSP PGUID 12 1 0 0 f f f t f v 2 0 2278 "20 16" _null_ _null_ _null_ _null_ pg_advisory_lock_int8 _null_ _null_ _null_ ));
! DESCR("obtain exclusive advisory lock");
! DATA(insert OID = 2881 (  pg_advisory_lock_shared		PGNSP PGUID 14 1 0 0 f f f t f v 1 0 2278 "20" _null_ _null_ _null_ _null_ "select pg_advisory_lock_shared($1, true)" _null_ _null_ _null_ ));
! DESCR("obtain shared advisory lock");
! DATA(insert OID = 3066 (  pg_advisory_lock_shared		PGNSP PGUID 12 1 0 0 f f f t f v 2 0 2278 "20 16" _null_ _null_ _null_ _null_ pg_advisory_lock_shared_int8 _null_ _null_ _null_ ));
  DESCR("obtain shared advisory lock");
! DATA(insert OID = 2882 (  pg_try_advisory_lock			PGNSP PGUID 14 1 0 0 f f f t f v 1 0 16 "20" _null_ _null_ _null_ _null_ "select pg_try_advisory_lock($1, true)" _null_ _null_ _null_ ));
  DESCR("obtain exclusive advisory lock if available");
! DATA(insert OID = 3067 (  pg_try_advisory_lock			PGNSP PGUID 12 1 0 0 f f f t f v 2 0 16 "20 16" _null_ _null_ _null_ _null_ pg_try_advisory_lock_int8 _null_ _null_ _null_ ));
! DESCR("obtain exclusive advisory lock if available");
! DATA(insert OID = 2883 (  pg_try_advisory_lock_shared	PGNSP PGUID 14 1 0 0 f f f t f v 1 0 16 "20" _null_ _null_ _null_ _null_ "select pg_try_advisory_lock_shared($1, true)" _null_ _null_ _null_ ));
! DESCR("obtain shared advisory lock if available");
! DATA(insert OID = 3068 (  pg_try_advisory_lock_shared	PGNSP PGUID 12 1 0 0 f f f t f v 2 0 16 "20 16" _null_ _null_ _null_ _null_ pg_try_advisory_lock_shared_int8 _null_ _null_ _null_ ));
  DESCR("obtain shared advisory lock if available");
  DATA(insert OID = 2884 (  pg_advisory_unlock			PGNSP PGUID 12 1 0 0 f f f t f v 1 0 16 "20" _null_ _null_ _null_ _null_ pg_advisory_unlock_int8 _null_ _null_ _null_ ));
  DESCR("release exclusive advisory lock");
  DATA(insert OID = 2885 (  pg_advisory_unlock_shared		PGNSP PGUID 12 1 0 0 f f f t f v 1 0 16 "20" _null_ _null_ _null_ _null_ pg_advisory_unlock_shared_int8 _null_ _null_ _null_ ));
  DESCR("release shared advisory lock");
! DATA(insert OID = 2886 (  pg_advisory_lock				PGNSP PGUID 14 1 0 0 f f f t f v 2 0 2278 "23 23" _null_ _null_ _null_ _null_ "select pg_advisory_lock($1, $2, true)" _null_ _null_ _null_ ));
  DESCR("obtain exclusive advisory lock");
! DATA(insert OID = 3069 (  pg_advisory_lock				PGNSP PGUID 12 1 0 0 f f f t f v 3 0 2278 "23 23 16" _null_ _null_ _null_ _null_ pg_advisory_lock_int4 _null_ _null_ _null_ ));
! DESCR("obtain exclusive advisory lock");
! DATA(insert OID = 2887 (  pg_advisory_lock_shared		PGNSP PGUID 14 1 0 0 f f f t f v 2 0 2278 "23 23" _null_ _null_ _null_ _null_ "select pg_advisory_lock_shared($1, $2, true)" _null_ _null_ _null_ ));
! DESCR("obtain shared advisory lock");
! DATA(insert OID = 3070 (  pg_advisory_lock_shared		PGNSP PGUID 12 1 0 0 f f f t f v 3 0 2278 "23 23 16" _null_ _null_ _null_ _null_ pg_advisory_lock_shared_int4 _null_ _null_ _null_ ));
  DESCR("obtain shared advisory lock");
! DATA(insert OID = 2888 (  pg_try_advisory_lock			PGNSP PGUID 14 1 0 0 f f f t f v 2 0 16 "23 23" _null_ _null_ _null_ _null_ "select pg_try_advisory_lock($1, $2, true)" _null_ _null_ _null_ ));
  DESCR("obtain exclusive advisory lock if available");
! DATA(insert OID = 3071 (  pg_try_advisory_lock			PGNSP PGUID 12 1 0 0 f f f t f v 3 0 16 "23 23 16" _null_ _null_ _null_ _null_ pg_try_advisory_lock_int4 _null_ _null_ _null_ ));
! DESCR("obtain exclusive advisory lock if available");
! DATA(insert OID = 2889 (  pg_try_advisory_lock_shared	PGNSP PGUID 14 1 0 0 f f f t f v 2 0 16 "23 23" _null_ _null_ _null_ _null_ "select pg_try_advisory_lock_shared($1, $2, true)" _null_ _null_ _null_ ));
! DESCR("obtain shared advisory lock if available");
! DATA(insert OID = 3072 (  pg_try_advisory_lock_shared	PGNSP PGUID 12 1 0 0 f f f t f v 3 0 16 "23 23 16" _null_ _null_ _null_ _null_ pg_try_advisory_lock_shared_int4 _null_ _null_ _null_ ));
  DESCR("obtain shared advisory lock if available");
  DATA(insert OID = 2890 (  pg_advisory_unlock			PGNSP PGUID 12 1 0 0 f f f t f v 2 0 16 "23 23" _null_ _null_ _null_ _null_ pg_advisory_unlock_int4 _null_ _null_ _null_ ));
  DESCR("release exclusive advisory lock");