directory special remote: Made more efficient and robust.

Files are now written to a tmp directory in the remote, and once all
chunks are written, etc, it's moved into the final place atomically.

For now, checkpresent still checks every single chunk of a file, because
the old method could leave partially transferred files with some chunks
present and others not.
This commit is contained in:
Joey Hess 2012-11-19 13:18:23 -04:00
parent d3dfeeb3d9
commit 5f977cc725
5 changed files with 47 additions and 42 deletions

View file

@ -90,7 +90,7 @@ store r k _f p = metered (Just p) k $ \meterupdate ->
let url = davLocation baseurl k
f <- inRepo $ gitAnnexLocation k
liftIO $ withMeteredFile f meterupdate $
storeHelper r url user pass
storeHelper r k url user pass
storeEncrypted :: Remote -> (Cipher, Key) -> Key -> MeterUpdate -> Annex Bool
storeEncrypted r (cipher, enck) k p = metered (Just p) k $ \meterupdate ->
@ -98,12 +98,12 @@ storeEncrypted r (cipher, enck) k p = metered (Just p) k $ \meterupdate ->
let url = davLocation baseurl enck
f <- inRepo $ gitAnnexLocation k
liftIO $ encrypt cipher (streamMeteredFile f meterupdate) $
readBytes $ storeHelper r url user pass
readBytes $ storeHelper r enck url user pass
storeHelper :: Remote -> DavUrl -> DavUser -> DavPass -> L.ByteString -> IO Bool
storeHelper r urlbase user pass b = catchBoolIO $ do
storeHelper :: Remote -> Key -> DavUrl -> DavUser -> DavPass -> L.ByteString -> IO Bool
storeHelper r k urlbase user pass b = catchBoolIO $ do
davMkdir (urlParent urlbase) user pass
storeChunks urlbase chunksize storer recorder finalizer
storeChunks k undefined undefined chunksize storer recorder finalizer
where
chunksize = chunkSize $ config r
storer urls = storeChunked chunksize urls storehttp b