atomically write lxmf message files to prevent reading of partial files from other processes during the write
This commit is contained in:
parent
29c79177a6
commit
7f0e2627d1
1 changed files with 14 additions and 3 deletions
|
|
@ -672,15 +672,26 @@ class LXMessage:
|
||||||
def write_to_directory(self, directory_path):
|
def write_to_directory(self, directory_path):
|
||||||
file_name = RNS.hexrep(self.hash, delimit=False)
|
file_name = RNS.hexrep(self.hash, delimit=False)
|
||||||
file_path = directory_path+"/"+file_name
|
file_path = directory_path+"/"+file_name
|
||||||
|
tmp_path = file_path+".tmp."+str(os.getpid())
|
||||||
|
|
||||||
try:
|
try:
|
||||||
file = open(file_path, "wb")
|
with open(tmp_path, "wb") as file:
|
||||||
file.write(self.packed_container())
|
file.write(self.packed_container())
|
||||||
file.close()
|
file.flush()
|
||||||
|
try:
|
||||||
|
os.fsync(file.fileno())
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
os.replace(tmp_path, file_path)
|
||||||
|
|
||||||
return file_path
|
return file_path
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
try:
|
||||||
|
if os.path.exists(tmp_path):
|
||||||
|
os.unlink(tmp_path)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
RNS.log("Error while writing LXMF message to file \""+str(file_path)+"\". The contained exception was: "+str(e), RNS.LOG_ERROR)
|
RNS.log("Error while writing LXMF message to file \""+str(file_path)+"\". The contained exception was: "+str(e), RNS.LOG_ERROR)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue