advisory locks: documentation hint and feature request

Started by Marc Maminover 18 years ago2 messagesdocsgeneral
Jump to latest
#1Marc Mamin
M.Mamin@intershop.de
docsgeneral

Hello,

I have defined some functions to manage advisory locks in a more
restrictive way than the default usage.

here my requirements:

- a session cannot stack write locks
- a session cannot aquire a shared lock if it already holds the write
locks
- there is a maximum allowed shared locks (per lock id).

As I coun't find a way to count all current share locks for a given key
I also added the restriction that a given session can not get more than
one instance of a given shared lock.
This is a "strange" restriction for share locks, but this fits to our
lock usage.

doing this, I missed an information in the documentation that would be
useful to add:

pg_locks columns definition
---------------------------

current definition:

objid : OID of the object within its system catalog,
or NULL if the object is not a general database object

to add: "For advisory locks it is used to distinguish the two key
spaces (one int8 or two int4 keys)

Table 9-56. Advisory Lock Functions (8.3 Beta)
-----------------------------------
current: (note that these two key spaces do not overlap)

to add: "; The two key spaces are separated on the column objid in the
pg_locks view"

Moreover I missed some function that would allow a cleaner
implementation of my features
(reducing the need to query the pg_locks view)

For example:

--current shared lock count (owned / all)
pg_advisory_lock_shared_count_my(key bigint)
pg_advisory_lock_shared_count_all(key bigint)

--enforce exclusive locks so that they cannot be stacked
pg_try_advisory_lock_single(key bigint)

--enforce shared locks so that they cannot be acquired if the current
session already holds the exclusive lock
I guess this should be the dafault behaviour for
pg_advisory_lock_shared (..) and pg_try_advisory_lock_shared (...)

--and possibly define a max number of allowed shared locks (over all
sessions)
pg_[try_]advisory_lock_shared_max(key bigint, max_count int)

regards,

Marc Mamin

#2Bruce Momjian
bruce@momjian.us
In reply to: Marc Mamin (#1)
docsgeneral
Re: [GENERAL] advisory locks: documentation hint and feature request

Marc Mamin wrote:

doing this, I missed an information in the documentation that would be
useful to add:

pg_locks columns definition
---------------------------

current definition:

objid : OID of the object within its system catalog,
or NULL if the object is not a general database object

to add: "For advisory locks it is used to distinguish the two key
spaces (one int8 or two int4 keys)

Table 9-56. Advisory Lock Functions (8.3 Beta)
-----------------------------------
current: (note that these two key spaces do not overlap)

to add: "; The two key spaces are separated on the column objid in the
pg_locks view"

I have added your suggested changes to the docs with the attached patch.
Thanks.

Moreover I missed some function that would allow a cleaner
implementation of my features
(reducing the need to query the pg_locks view)

For example:

--current shared lock count (owned / all)
pg_advisory_lock_shared_count_my(key bigint)
pg_advisory_lock_shared_count_all(key bigint)

--enforce exclusive locks so that they cannot be stacked
pg_try_advisory_lock_single(key bigint)

Sorry, I am afraid they would not have general-enough usefulness.

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://postgres.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

Attachments:

/rtmp/difftext/x-diffDownload+8-8