Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
pymongo>=2.6
pymongo>=4.1.1
pytest
14 changes: 8 additions & 6 deletions src/mongolock.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ def lock(self, key, owner, timeout=None, expire=None):
"""
expire = datetime.utcnow() + timedelta(seconds=expire) if expire else None
try:
self.collection.insert({
self.collection.insert_one({
'_id': key,
'locked': True,
'owner': owner,
Expand All @@ -89,9 +89,9 @@ def release(self, key, owner):
`owner` - name of application/component/whatever which held a lock
Raises `MongoLockException` if no such a lock.
"""
status = self.collection.find_and_modify(
status = self.collection.find_one_and_update(
{'_id': key, 'owner': owner},
{'locked': False, 'owner': None, 'created': None, 'expire': None}
{'$set': {'locked': False, 'owner': None, 'created': None, 'expire': None}}
)

def get_lock_info(self, key):
Expand All @@ -116,25 +116,27 @@ def touch(self, key, owner, expire=None):
if not expire:
raise MongoLockException(u'Can\'t touch lock without expire for {0}: {1}'.format(key, owner))
expire = datetime.utcnow() + timedelta(seconds=expire)
self.collection.update(
self.collection.update_one(
{'_id': key, 'owner': owner},
{'$set': {'expire': expire}}
)

def _try_get_lock(self, key, owner, expire):
dtnow = datetime.utcnow()
result = self.collection.update(
result = self.collection.update_one(
{
'$or': [
{'_id': key, 'locked': False},
{'_id': key, 'expire': {'$lt': dtnow}},
]
},
{
'$set': {
'locked': True,
'owner': owner,
'created': dtnow,
'expire': expire
}
}
)
return True if result['n'] == 1 else False
return True if result.modified_count == 1 else False
6 changes: 3 additions & 3 deletions src/test_mongolock.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

@pytest.fixture()
def lock():
connection[db_name][col_name].remove()
connection[db_name][col_name].drop()
return MongoLock(client=connection, db=db_name, collection=col_name)


Expand Down Expand Up @@ -97,7 +97,7 @@ def touch_expired_not_specified(lock):


def test_create_lock_by_collection():
connection[db_name][col_name].remove()
connection[db_name][col_name].drop()
collection = connection[db_name][col_name]
assert MongoLock(collection=collection).lock('key', 'owner')

Expand All @@ -110,7 +110,7 @@ def test_create_lock_by_collection():
])
def test_is_locked(lock, locked, expire, is_locked):
if locked is not None:
connection[db_name][col_name].insert({
connection[db_name][col_name].insert_one({
'_id': 'key',
'locked': locked,
'owner': 'owner',
Expand Down