reorder database shutdown to be concurrency safe
If a DbHandle is in use by another thread, it could be queueing changes while shutdown is running. So, wait for the worker to finish before flushing the queue, so that any last-minute writes are included. Before this fix, they would be silently dropped. Of course, if the other thread continues to try to use a DbHandle once it's closed, it will block forever as the worker is no longer reading from the jobs MVar. So, that would crash with "thread blocked indefinitely in an MVar operation".
This commit is contained in:
parent
1a051f4300
commit
622da992f8
1 changed files with 1 additions and 1 deletions
|
@ -142,9 +142,9 @@ queryDb (DbHandle _ jobs _) a = do
|
|||
|
||||
closeDb :: DbHandle -> IO ()
|
||||
closeDb h@(DbHandle worker jobs _) = do
|
||||
flushQueueDb h
|
||||
putMVar jobs CloseJob
|
||||
wait worker
|
||||
flushQueueDb h
|
||||
|
||||
type Size = Int
|
||||
|
||||
|
|
Loading…
Reference in a new issue