69 |
69 |
return _ReadNumericFile(constants.JOB_QUEUE_VERSION_FILE)
|
70 |
70 |
|
71 |
71 |
|
72 |
|
def InitAndVerifyQueue(exclusive):
|
|
72 |
def InitAndVerifyQueue(must_lock):
|
73 |
73 |
"""Open and lock job queue.
|
74 |
74 |
|
75 |
75 |
If necessary, the queue is automatically initialized.
|
76 |
76 |
|
77 |
|
@type exclusive: bool
|
78 |
|
@param exclusive: Whether to lock the queue in exclusive mode. Shared
|
79 |
|
mode otherwise.
|
|
77 |
@type must_lock: bool
|
|
78 |
@param must_lock: Whether an exclusive lock must be held.
|
80 |
79 |
@rtype: utils.FileLock
|
81 |
80 |
@return: Lock object for the queue. This can be used to change the
|
82 |
81 |
locking mode.
|
... | ... | |
93 |
92 |
# Lock queue
|
94 |
93 |
queue_lock = utils.FileLock(constants.JOB_QUEUE_LOCK_FILE)
|
95 |
94 |
try:
|
96 |
|
# Determine locking function and call it
|
97 |
|
if exclusive:
|
98 |
|
fn = queue_lock.Exclusive
|
|
95 |
# The queue needs to be locked in exclusive mode to write to the serial and
|
|
96 |
# version files.
|
|
97 |
if must_lock:
|
|
98 |
queue_lock.Exclusive(blocking=True)
|
|
99 |
holding_lock = True
|
99 |
100 |
else:
|
100 |
|
fn = queue_lock.Shared
|
101 |
|
|
102 |
|
fn(blocking=False)
|
103 |
|
|
104 |
|
# Verify version
|
105 |
|
version = ReadVersion()
|
106 |
|
if version is None:
|
107 |
|
# Write new version file
|
108 |
|
utils.WriteFile(constants.JOB_QUEUE_VERSION_FILE,
|
109 |
|
data="%s\n" % constants.JOB_QUEUE_VERSION)
|
110 |
|
|
111 |
|
# Read again
|
|
101 |
try:
|
|
102 |
queue_lock.Exclusive(blocking=False)
|
|
103 |
holding_lock = True
|
|
104 |
except errors.LockError:
|
|
105 |
# Ignore errors and assume the process keeping the lock checked
|
|
106 |
# everything.
|
|
107 |
holding_lock = False
|
|
108 |
|
|
109 |
if holding_lock:
|
|
110 |
# Verify version
|
112 |
111 |
version = ReadVersion()
|
|
112 |
if version is None:
|
|
113 |
# Write new version file
|
|
114 |
utils.WriteFile(constants.JOB_QUEUE_VERSION_FILE,
|
|
115 |
data="%s\n" % constants.JOB_QUEUE_VERSION)
|
113 |
116 |
|
114 |
|
if version != constants.JOB_QUEUE_VERSION:
|
115 |
|
raise errors.JobQueueError("Found job queue version %s, expected %s",
|
116 |
|
version, constants.JOB_QUEUE_VERSION)
|
|
117 |
# Read again
|
|
118 |
version = ReadVersion()
|
117 |
119 |
|
118 |
|
serial = ReadSerial()
|
119 |
|
if serial is None:
|
120 |
|
# Write new serial file
|
121 |
|
utils.WriteFile(constants.JOB_QUEUE_SERIAL_FILE,
|
122 |
|
data="%s\n" % 0)
|
|
120 |
if version != constants.JOB_QUEUE_VERSION:
|
|
121 |
raise errors.JobQueueError("Found job queue version %s, expected %s",
|
|
122 |
version, constants.JOB_QUEUE_VERSION)
|
123 |
123 |
|
124 |
|
# Read again
|
125 |
124 |
serial = ReadSerial()
|
|
125 |
if serial is None:
|
|
126 |
# Write new serial file
|
|
127 |
utils.WriteFile(constants.JOB_QUEUE_SERIAL_FILE,
|
|
128 |
data="%s\n" % 0)
|
|
129 |
|
|
130 |
# Read again
|
|
131 |
serial = ReadSerial()
|
126 |
132 |
|
127 |
|
if serial is None:
|
128 |
|
# There must be a serious problem
|
129 |
|
raise errors.JobQueueError("Can't read/parse the job queue serial file")
|
|
133 |
if serial is None:
|
|
134 |
# There must be a serious problem
|
|
135 |
raise errors.JobQueueError("Can't read/parse the job queue serial file")
|
130 |
136 |
|
131 |
137 |
except:
|
132 |
138 |
queue_lock.Close()
|