From d01fb937615bc4bc91cac8aa543bcc7e8476f870 Mon Sep 17 00:00:00 2001 From: Jason Gunthorpe Date: Sat, 30 May 2020 20:32:19 -0300 Subject: 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 --- cloud_mdir_sync/maildir.py | 1 + cloud_mdir_sync/messages.py | 7 +++++++ 2 files changed, 8 insertions(+) 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 -- cgit v1.2.3