Commit 1da0b54d by rfkelly0

RemoteFileBuffer: try harder to avoid unnecessary flushes

parent 123ca5bd
...@@ -71,10 +71,11 @@ class RemoteFileBuffer(object): ...@@ -71,10 +71,11 @@ class RemoteFileBuffer(object):
self.mode = mode self.mode = mode
self.closed = False self.closed = False
self._flushed = False self._flushed = False
if hasattr(fs,"_lock"): if getattr(fs,"_lock",None) is not None:
self._lock = fs._lock.__class__() self._lock = fs._lock.__class__()
else: else:
self._lock = threading.RLock() self._lock = threading.RLock()
if "r" in mode or "+" in mode:
if rfile is not None: if rfile is not None:
if hasattr(rfile,"read"): if hasattr(rfile,"read"):
data = rfile.read(1024*256) data = rfile.read(1024*256)
...@@ -99,6 +100,7 @@ class RemoteFileBuffer(object): ...@@ -99,6 +100,7 @@ class RemoteFileBuffer(object):
def call_with_lock(*args,**kwds): def call_with_lock(*args,**kwds):
self._lock.acquire() self._lock.acquire()
try: try:
if "write" in name:
self._flushed = False self._flushed = False
return a(*args,**kwds) return a(*args,**kwds)
finally: finally:
...@@ -130,8 +132,10 @@ class RemoteFileBuffer(object): ...@@ -130,8 +132,10 @@ class RemoteFileBuffer(object):
try: try:
self.file.flush() self.file.flush()
if "w" in self.mode or "a" in self.mode or "+" in self.mode: if "w" in self.mode or "a" in self.mode or "+" in self.mode:
if not self._flushed:
pos = self.file.tell() pos = self.file.tell()
self.file.seek(0) self.file.seek(0)
self.file.seek(0)
self.fs.setcontents(self.path,self.file) self.fs.setcontents(self.path,self.file)
self.file.seek(pos) self.file.seek(pos)
self._flushed = True self._flushed = True
...@@ -141,8 +145,11 @@ class RemoteFileBuffer(object): ...@@ -141,8 +145,11 @@ class RemoteFileBuffer(object):
def close(self): def close(self):
self._lock.acquire() self._lock.acquire()
try: try:
if not self.closed:
self.closed = True self.closed = True
if "w" in self.mode or "a" in self.mode or "+" in self.mode: if "w" in self.mode or "a" in self.mode or "+" in self.mode:
if not self._flushed:
self.file.seek(0)
self.file.seek(0) self.file.seek(0)
self.fs.setcontents(self.path,self.file) self.fs.setcontents(self.path,self.file)
self.file.close() self.file.close()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment