[p4] Race condition with p4 counters
Rick Macdonald
rickmacd at shaw.ca
Thu Apr 3 08:57:05 PDT 2008
Two years ago I submitted a suggestion to have an atomic
"get-next-value" for counters. They replied that they are considering it
for the future and added my name to the list of people who have asked
for this. As far as I can see, it has not been done.
In the shower this morning, I came up with this idea, which surely must
be done atomically within the Perforce server:
$ p4 job -o | sed -e 's/<enter description here>/Temporary job to get
next Job counter and increment it./' | p4 job -i
Job job000007 saved.
(parse the message above to get the job number)
$ p4 job -d job000007
I think this will work for me. I don't care about monotonically
increasing numbers for anything that I need these counters for
(including Jobs, because I'll use a different prefix anyway). It's three
p4 command executions, but we'd only do this a few times a day.
Has anybody found a better idea?
Here is an unsupported script that Perforce send me, but I think it
still suffers from a race condition. Am I wrong?
import os, time
# wait for foolock counter to be set to zero
# if it times out, just go ahead and grab the lock
timeout = 4
while int(os.popen('p4 counter foolock').read()) != 0 and
timeout>0:
print 'attempting to get lock...'
timeout = timeout - 1
time.sleep(1)
if timeout == 0: print 'breaking lock'
# grab lock
os.popen('p4 counter foolock 1')
if not int(os.popen('p4 counter foolock').read()) == 1:
raise 'unable to obtain lock!'
# get and increment foo counter
foo = int(os.popen('p4 counter foo').read()) + 1
os.popen('p4 counter foo %d' % foo)
if not int(os.popen('p4 counter foo').read()) == foo:
raise 'unable to set foo counter!'
# release lock
os.popen('p4 counter -d foolock')
if not int(os.popen('p4 counter foolock').read()) == 0:
raise 'unable to release lock!'
More information about the perforce-user
mailing list