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:
Joey Hess 2015-12-16 13:52:43 -04:00
parent 1a051f4300
commit 622da992f8
Failed to extract signature

View file

@ -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