Hi,
I often find myself wanting advisory locks that are automatically
released when the transaction ends, so here's a small patch trying to do
just that. I don't know much about the lock system so the patch is in
the state "it looks like this would work". Any comments on the
technical details are welcome. There's obviously a lot of documentation
and READMEs to change too, but I thought I'd see what people think about
the idea before going there.
So, thoughts?
Regards,
Marko Tiikkaja
*** 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");
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers