Skip to content

Commit a18e48b

Browse files
committed
Merge branch 'fixup_filelock_tests' into picklable-shared-membucket---with-tests---test
2 parents aac36d5 + 2c8416c commit a18e48b

File tree

3 files changed

+37
-9
lines changed

3 files changed

+37
-9
lines changed

python/tests/bucket_tester.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from queue import Queue
1111
from typing import BinaryIO
1212
from unittest import TestCase
13+
import uuid
1314

1415
import pyarrow as pa
1516
import pyarrow.parquet as pq
@@ -87,7 +88,7 @@ def __init__(self, storage: IBucket, test_case: TestCase) -> None:
8788
self.storage = storage
8889
self.test_case = test_case
8990
# Next is a unique suffix to be used in the names of dirs and files, so they will be unique
90-
self.us = f"{iTSms.now() % 100_000_000:08d}"
91+
self.us = uuid.uuid4().hex
9192

9293
def cleanup(self) -> None:
9394
self.storage.remove_prefix(f"dir{self.us}")

python/tests/test_append_only_fs_bucket.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
from bucketbase import MemoryBucket
99
from bucketbase.fs_bucket import AppendOnlyFSBucket, FSBucket
10+
from bucketbase.named_lock_manager import FileLockManager
1011

1112

1213
class TestAppendOnlyFSBucket(unittest.TestCase):
@@ -44,7 +45,8 @@ def put_object(self2, name, content):
4445
# put object is expected to create a lock file before calling base_bucket.put_object, and remove it after
4546
bucket_in_test.put_object(object_name, content)
4647

47-
self.assertFalse(lock_file_path.exists())
48+
verifier_manager = FileLockManager(self.locks_path)
49+
self.assertTrue(verifier_manager.get_lock(object_name).acquire(timeout=0.1), "Lock should have been released after put_object")
4850
self.assertEqual(base_bucket_put_calls, [(object_name, content)])
4951

5052
def test_put_object_twice_raises_exception(self):
@@ -89,9 +91,12 @@ def test_lock_object_creates_lock_and_unlock_releases(self):
8991
# Check if the lock file was created
9092
lock_file_path = self.locks_path / (object_name.replace(bucket_in_test.SEP, FSBucket.TEMP_SEP) + ".lock")
9193
self.assertTrue(lock_file_path.exists())
94+
verifier_manager = FileLockManager(self.locks_path)
95+
with self.assertRaises(TimeoutError):
96+
verifier_manager.get_lock(object_name).acquire(timeout=0.1)
9297

9398
bucket_in_test._unlock_object(object_name)
94-
self.assertFalse(lock_file_path.exists())
99+
self.assertTrue(verifier_manager.get_lock(object_name).acquire(timeout=0.1), "Lock should have been released after _unlock_object")
95100

96101
def test_unlocking_unlocked_object_raises_assertion(self):
97102
bucket_in_test = AppendOnlyFSBucket(self.base_bucket, self.locks_path)
@@ -213,3 +218,7 @@ def thread2_func():
213218
t2.join()
214219
self.assertListEqual(results, ["thread1_done", "thread2_file_exists"])
215220
self.assertEqual(bucket_in_test.get_object(object_name), content1)
221+
222+
223+
if __name__ == "__main__":
224+
unittest.main()

python/tests/test_namedlock.py

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,16 +71,19 @@ def test_sanitizes_path_characters(self):
7171
lock1.acquire()
7272
lock2.acquire()
7373

74-
# Verify both lock files were created with sanitized names
75-
files = list(self.temp_dir.glob("*"))
76-
sanitized_names = [f.name for f in files]
74+
verifier_manager = FileLockManager(self.temp_dir)
75+
with self.assertRaises(TimeoutError):
76+
verifier_manager.get_lock(name1).acquire(timeout=0.1)
77+
with self.assertRaises(TimeoutError):
78+
verifier_manager.get_lock(name2).acquire(timeout=0.1)
7779

78-
self.assertIn("path#with#slashes.lock", sanitized_names)
79-
self.assertIn("path#with#slashes2.lock", sanitized_names)
8080
lock1.release()
8181
lock2.release()
8282

83-
self.assertEqual(0, len(list(self.temp_dir.glob("*"))))
83+
self.assertTrue(verifier_manager.get_lock(name1).acquire(timeout=0.1))
84+
verifier_manager.get_lock(name1).release()
85+
self.assertTrue(verifier_manager.get_lock(name2).acquire(timeout=0.1))
86+
verifier_manager.get_lock(name2).release()
8487

8588
def test_lock_directory_created(self):
8689
# Delete the directory to test creation
@@ -93,3 +96,18 @@ def test_lock_directory_created(self):
9396

9497
self.assertTrue(self.temp_dir.exists())
9598
self.assertTrue(self.temp_dir.is_dir())
99+
100+
def test_possibly_stale_lock_file_does_not_block_new_manager(self):
101+
name = "some_lock"
102+
lock1 = self.lock_manager.get_lock(name)
103+
lock1.acquire()
104+
lock1.release()
105+
106+
new_manager = FileLockManager(self.temp_dir)
107+
lock2 = new_manager.get_lock(name)
108+
self.assertTrue(lock2.acquire(timeout=0.1))
109+
lock2.release()
110+
111+
112+
if __name__ == "__main__":
113+
unittest.main()

0 commit comments

Comments
 (0)