aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Gunthorpe <jgg@mellanox.com>2020-05-30 20:32:19 -0300
committerJason Gunthorpe <jgg@mellanox.com>2020-05-30 20:32:19 -0300
commitd01fb937615bc4bc91cac8aa543bcc7e8476f870 (patch)
treec4304c8c93d926f1a32cd226f60add4a99f9ee71
parentd695a2eadde2d0799b5c663690212ec022d61c1c (diff)
downloadcloud_mdir_sync-d01fb937615bc4bc91cac8aa543bcc7e8476f870.tar.gz
cloud_mdir_sync-d01fb937615bc4bc91cac8aa543bcc7e8476f870.tar.bz2
cloud_mdir_sync-d01fb937615bc4bc91cac8aa543bcc7e8476f870.zip
Keep the inode cache in sync when writing to the MailDir
MailDir writes cause the inode mtime and ctime to change which causes the cache to become invalid. Update the mtime and ctime information after changing it. Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
-rw-r--r--cloud_mdir_sync/maildir.py1
-rw-r--r--cloud_mdir_sync/messages.py7
2 files changed, 8 insertions, 0 deletions
diff --git a/cloud_mdir_sync/maildir.py b/cloud_mdir_sync/maildir.py
index c7f1be5..51497be 100644
--- a/cloud_mdir_sync/maildir.py
+++ b/cloud_mdir_sync/maildir.py
@@ -149,6 +149,7 @@ class MailDirMailbox(mailbox.Mailbox):
# delivered it.
if cloudmsg.received_time is not None:
os.utime(fn, (time.time(), cloudmsg.received_time.timestamp()))
+ self.msgdb.update_inode_cache(msg)
self.messages[msg.content_hash] = msg
def _set_flags(self, mymsg: messages.Message, cloudmsg: messages.Message):
diff --git a/cloud_mdir_sync/messages.py b/cloud_mdir_sync/messages.py
index d7044ae..73cbf80 100644
--- a/cloud_mdir_sync/messages.py
+++ b/cloud_mdir_sync/messages.py
@@ -281,6 +281,13 @@ class MessageDB(object):
self.alt_file_hashes[msg.content_hash].add(fn)
msg.fill_email_id()
+ def update_inode_cache(self, msg):
+ """After the message has been hardlinked or the times adjusted,
+ the inode cache needs to be updated with the new times"""
+ st = os.stat(msg.fn)
+ inode = (st.st_ino, st.st_size, st.st_mtime, st.st_ctime)
+ self.inode_hashes[inode] = msg.content_hash
+
def write_content(self, content_hash, dest_fn):
"""Make the filename dest_fn contain content_hash's content"""
assert content_hash in self.file_hashes