diff options
| author | Jan Tuomi <jan@jantuomi.fi> | 2025-01-18 09:48:55 +0200 |
|---|---|---|
| committer | Jan Tuomi <jan@jantuomi.fi> | 2025-01-18 09:48:55 +0200 |
| commit | be9caff6b158a762418815ff2cbaf521b6727029 (patch) | |
| tree | f7c63a549bc4331b0fe6598417e687e58abf0d41 /log_db/src/lock.rs | |
| parent | 46942daf0292d2cce4cf5b46b0831ef4ffed0526 (diff) | |
Make lock manager stricter
Diffstat (limited to 'log_db/src/lock.rs')
| -rw-r--r-- | log_db/src/lock.rs | 25 |
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(()) |
