lfs: explicitly close the file handle for the blob being uploaded
authorMatt Harbison <matt_harbison@yahoo.com>
Tue, 21 Jan 2020 09:51:39 -0500
changeset 44139 2ad4e8aefcf4
parent 44138 5f841daf3b41
child 44140 b2408acaa4c9
lfs: explicitly close the file handle for the blob being uploaded The previous code relied on reading the blob fully to close it. The obvious problem is if an error occurs before that point. But there is also a problem when using workers where the data may need to be re-read, which can't happen once it is closed. This eliminates the surprising behavior before attempting to fix the worker problem. Differential Revision: https://phab.mercurial-scm.org/D7957
hgext/lfs/blobstore.py
--- a/hgext/lfs/blobstore.py	Tue Jan 21 09:40:40 2020 -0500
+++ b/hgext/lfs/blobstore.py	Tue Jan 21 09:51:39 2020 -0500
@@ -110,11 +110,12 @@
     def read(self, size):
         if self._fp is None:
             return b''
-        data = self._fp.read(size)
-        if not data:
+        return self._fp.read(size)
+
+    def close(self):
+        if self._fp is not None:
             self._fp.close()
             self._fp = None
-        return data
 
 
 class local(object):
@@ -539,6 +540,9 @@
             raise LfsRemoteError(
                 _(b'LFS error: %s') % _urlerrorreason(ex), hint=hint
             )
+        finally:
+            if request.data:
+                request.data.close()
 
     def _batch(self, pointers, localstore, action):
         if action not in [b'upload', b'download']: