aboutsummaryrefslogtreecommitdiffstats
path: root/log_db/src/lock.rs
diff options
context:
space:
mode:
authorJan Tuomi <jan@jantuomi.fi>2025-01-18 09:48:55 +0200
committerJan Tuomi <jan@jantuomi.fi>2025-01-18 09:48:55 +0200
commitbe9caff6b158a762418815ff2cbaf521b6727029 (patch)
treef7c63a549bc4331b0fe6598417e687e58abf0d41 /log_db/src/lock.rs
parent46942daf0292d2cce4cf5b46b0831ef4ffed0526 (diff)
Make lock manager stricter
Diffstat (limited to 'log_db/src/lock.rs')
-rw-r--r--log_db/src/lock.rs25
1 files changed, 21 insertions, 4 deletions
diff --git a/log_db/src/lock.rs b/log_db/src/lock.rs
index 01961f9..adb2809 100644
--- a/log_db/src/lock.rs
+++ b/log_db/src/lock.rs
@@ -12,7 +12,6 @@ enum LockState {
NotLocked,
Shared,
Exclusive,
- ManualExclusive,
}
impl LockManager {
@@ -47,7 +46,13 @@ impl LockManager {
pub fn lock_shared(&mut self) -> DBResult<()> {
if self.state == LockState::Shared {
- return Ok(());
+ return Err(DBError::LockRequestError(
+ "Already holding a shared lock".to_owned(),
+ ));
+ } else if self.state == LockState::Exclusive {
+ return Err(DBError::LockRequestError(
+ "Cannot acquire shared lock while holding an exclusive lock".to_owned(),
+ ));
}
let mut timeout = 5;
@@ -74,8 +79,14 @@ impl LockManager {
}
pub fn lock_exclusive(&mut self) -> DBResult<()> {
- if self.state == LockState::Exclusive || self.state == LockState::ManualExclusive {
- return Ok(());
+ if self.state == LockState::Exclusive {
+ return Err(DBError::LockRequestError(
+ "Already holding an exclusive lock".to_owned(),
+ ));
+ } else if self.state == LockState::Shared {
+ return Err(DBError::LockRequestError(
+ "Cannot acquire exclusive lock while holding a shared lock".to_owned(),
+ ));
}
// Create a lock on the exclusive lock request file to signal to readers that they should wait
@@ -93,6 +104,12 @@ impl LockManager {
}
pub fn unlock(&mut self) -> DBResult<()> {
+ if self.state == LockState::NotLocked {
+ return Err(DBError::LockRequestError(
+ "Not holding any locks".to_owned(),
+ ));
+ }
+
self.lock_file.unlock()?;
self.state = LockState::NotLocked;
Ok(())