Commit 1da0b54d by rfkelly0

RemoteFileBuffer: try harder to avoid unnecessary flushes

parent 123ca5bd
...@@ -71,20 +71,21 @@ class RemoteFileBuffer(object): ...@@ -71,20 +71,21 @@ 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 rfile is not None: if "r" in mode or "+" in mode:
if hasattr(rfile,"read"): if rfile is not None:
data = rfile.read(1024*256) if hasattr(rfile,"read"):
while data:
self.file.write(data)
data = rfile.read(1024*256) data = rfile.read(1024*256)
else: while data:
self.file.write(str(rfile)) self.file.write(data)
if "a" not in mode: data = rfile.read(1024*256)
self.file.seek(0) else:
self.file.write(str(rfile))
if "a" not in mode:
self.file.seek(0)
def __del__(self): def __del__(self):
if not self.closed: if not self.closed:
...@@ -99,7 +100,8 @@ class RemoteFileBuffer(object): ...@@ -99,7 +100,8 @@ class RemoteFileBuffer(object):
def call_with_lock(*args,**kwds): def call_with_lock(*args,**kwds):
self._lock.acquire() self._lock.acquire()
try: try:
self._flushed = False if "write" in name:
self._flushed = False
return a(*args,**kwds) return a(*args,**kwds)
finally: finally:
self._lock.release() self._lock.release()
...@@ -130,22 +132,27 @@ class RemoteFileBuffer(object): ...@@ -130,22 +132,27 @@ 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:
pos = self.file.tell() if not self._flushed:
self.file.seek(0) pos = self.file.tell()
self.fs.setcontents(self.path,self.file) self.file.seek(0)
self.file.seek(pos) self.file.seek(0)
self._flushed = True self.fs.setcontents(self.path,self.file)
self.file.seek(pos)
self._flushed = True
finally: finally:
self._lock.release() self._lock.release()
def close(self): def close(self):
self._lock.acquire() self._lock.acquire()
try: try:
self.closed = True if not self.closed:
if "w" in self.mode or "a" in self.mode or "+" in self.mode: self.closed = True
self.file.seek(0) if "w" in self.mode or "a" in self.mode or "+" in self.mode:
self.fs.setcontents(self.path,self.file) if not self._flushed:
self.file.close() self.file.seek(0)
self.file.seek(0)
self.fs.setcontents(self.path,self.file)
self.file.close()
finally: finally:
self._lock.release() self._lock.release()
......
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