def write_lock_item(self, lockname, caller, waitms):
expire_ts = timestamp_millis() + waitms
logger.debug("Write_item: lockname=" + lockname + ", caller=" +
caller + ", Expire time is " + str(expire_ts))
try:
self.get_table().put_item(
Item={
'lockname': lockname,
'expire_ts': expire_ts,
'holder': caller
},
# TODO: adding Attr("holder").eq(caller) should make it re-entrant
ConditionExpression=Attr("holder").eq(NO_HOLDER) | Attr('lockname').not_exists()
)
except botocore.exceptions.ClientError as e:
if e.response['Error']['Code'] == 'ConditionalCheckFailedException':
logger.warn("Write_item: lockname=" + lockname +
", caller=" + caller + ", lock is being held")
return False
logger.debug("Write_item: lockname=" + lockname +
", caller=" + caller + ", lock is acquired")
return True
评论列表
文章目录