[PATCH 06/17] new: Defer updating directory mtimes until the end.
authorAustin Clements <amdragon@MIT.EDU>
Sat, 11 Jun 2011 20:04:32 +0000 (16:04 +2000)
committerW. Trevor King <wking@tremily.us>
Fri, 7 Nov 2014 17:38:35 +0000 (09:38 -0800)
04/83eb28cd35e1f10a0ce9cd1c905a20d4e7ed56 [new file with mode: 0644]

diff --git a/04/83eb28cd35e1f10a0ce9cd1c905a20d4e7ed56 b/04/83eb28cd35e1f10a0ce9cd1c905a20d4e7ed56
new file mode 100644 (file)
index 0000000..4129dfa
--- /dev/null
@@ -0,0 +1,164 @@
+Return-Path: <amthrax@drake.mit.edu>\r
+X-Original-To: notmuch@notmuchmail.org\r
+Delivered-To: notmuch@notmuchmail.org\r
+Received: from localhost (localhost [127.0.0.1])\r
+       by olra.theworths.org (Postfix) with ESMTP id 34C74429E35\r
+       for <notmuch@notmuchmail.org>; Sat, 11 Jun 2011 13:06:06 -0700 (PDT)\r
+X-Virus-Scanned: Debian amavisd-new at olra.theworths.org\r
+X-Spam-Flag: NO\r
+X-Spam-Score: -0.7\r
+X-Spam-Level: \r
+X-Spam-Status: No, score=-0.7 tagged_above=-999 required=5\r
+       tests=[RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled\r
+Received: from olra.theworths.org ([127.0.0.1])\r
+       by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024)\r
+       with ESMTP id sbvJFx2la6Vm for <notmuch@notmuchmail.org>;\r
+       Sat, 11 Jun 2011 13:06:05 -0700 (PDT)\r
+Received: from dmz-mailsec-scanner-5.mit.edu (DMZ-MAILSEC-SCANNER-5.MIT.EDU\r
+       [18.7.68.34])\r
+       by olra.theworths.org (Postfix) with ESMTP id 4BC0A429E34\r
+       for <notmuch@notmuchmail.org>; Sat, 11 Jun 2011 13:06:05 -0700 (PDT)\r
+X-AuditID: 12074422-b7b0eae000007f48-aa-4df3cab18636\r
+Received: from mailhub-auth-2.mit.edu ( [18.7.62.36])\r
+       by dmz-mailsec-scanner-5.mit.edu (Symantec Messaging Gateway) with SMTP\r
+       id AA.F8.32584.1BAC3FD4; Sat, 11 Jun 2011 16:06:09 -0400 (EDT)\r
+Received: from outgoing.mit.edu (OUTGOING-AUTH.MIT.EDU [18.7.22.103])\r
+       by mailhub-auth-2.mit.edu (8.13.8/8.9.2) with ESMTP id p5BK64eb030810; \r
+       Sat, 11 Jun 2011 16:06:04 -0400\r
+Received: from drake.mit.edu\r
+       (209-6-116-242.c3-0.arl-ubr1.sbo-arl.ma.cable.rcn.com\r
+       [209.6.116.242]) (authenticated bits=0)\r
+       (User authenticated as amdragon@ATHENA.MIT.EDU)\r
+       by outgoing.mit.edu (8.13.6/8.12.4) with ESMTP id p5BK63En005922\r
+       (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT);\r
+       Sat, 11 Jun 2011 16:06:04 -0400 (EDT)\r
+Received: from amthrax by drake.mit.edu with local (Exim 4.76)\r
+       (envelope-from <amthrax@drake.mit.edu>)\r
+       id 1QVURX-0000I5-Ag; Sat, 11 Jun 2011 16:06:03 -0400\r
+From: Austin Clements <amdragon@MIT.EDU>\r
+To: notmuch@notmuchmail.org\r
+Subject: [PATCH 06/17] new: Defer updating directory mtimes until the end.\r
+Date: Sat, 11 Jun 2011 16:04:32 -0400\r
+Message-Id: <1307822683-848-7-git-send-email-amdragon@mit.edu>\r
+X-Mailer: git-send-email 1.7.5.1\r
+In-Reply-To: <1307822683-848-1-git-send-email-amdragon@mit.edu>\r
+References: <87ei34rnc5.fsf@yoom.home.cworth.org>\r
+       <1307822683-848-1-git-send-email-amdragon@mit.edu>\r
+X-Brightmail-Tracker:\r
+ H4sIAAAAAAAAA+NgFtrHIsWRmVeSWpSXmKPExsUixG6norvx1GdfgxPr9Syu35zJ7MDo8WzV\r
+       LeYAxigum5TUnMyy1CJ9uwSujJb3AgXnxSp23PvG1MD4V7CLkZNDQsBE4uqmvcwQtpjEhXvr\r
+       2boYuTiEBPYxSvxbPIsVwtnAKDHh/0WozH0miTXXG5kgnPmMEpt/f2IH6WcT0JDYtn85I4gt\r
+       IiAtsfPubKB2Dg5mATWJP10qIGFhAS+JrgUTwEpYBFQlVm74B7aaV8BO4tKNdawQZyhIXLky\r
+       jwXE5hSwl5h38CqYLSSQJrHk1m72CYz8CxgZVjHKpuRW6eYmZuYUpybrFicn5uWlFuma6uVm\r
+       luilppRuYgQHjYvSDsafB5UOMQpwMCrx8Cqu/ewrxJpYVlyZe4hRkoNJSZRX5wRQiC8pP6Uy\r
+       I7E4I76oNCe1+BCjBAezkgjv+vZPvkK8KYmVValF+TApaQ4WJXHeOZLqvkIC6YklqdmpqQWp\r
+       RTBZGQ4OJQleSWB0CAkWpaanVqRl5pQgpJk4OEGG8wANP3oSqIa3uCAxtzgzHSJ/ilGX4/GG\r
+       TYcYhVjy8vNSpcR574MUCYAUZZTmwc2BRfsrRnGgt4R5f4BU8QATBdykV0BLmICWCJSCLSlJ\r
+       REhJNTDW8TP9+XRCh23V0Tmd9jkWb9dp1LUsSj/5XyCVhcvsxEPVrRy6aUFifpO//fr2oW+Z\r
+       VvcDPrW/+194h+VsKFHz/MaSxc4X/XdKq5z6I9vpq3ik9+wrn8gifnHy/hOJvK+4e7LUD12J\r
+       njHv0vu3d/aIiHsfWLzm+2Uv3hCHvLDYYLZ/Qhc4hGSVWIozEg21mIuKEwG5ULlt0QIAAA==\r
+Cc: Austin Clements <amdragon@mit.edu>\r
+X-BeenThere: notmuch@notmuchmail.org\r
+X-Mailman-Version: 2.1.13\r
+Precedence: list\r
+List-Id: "Use and development of the notmuch mail system."\r
+       <notmuch.notmuchmail.org>\r
+List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,\r
+       <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
+List-Archive: <http://notmuchmail.org/pipermail/notmuch>\r
+List-Post: <mailto:notmuch@notmuchmail.org>\r
+List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
+List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,\r
+       <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
+X-List-Received-Date: Sat, 11 Jun 2011 20:06:06 -0000\r
+\r
+Previously, if notmuch new were interrupted between updating the\r
+directory mtime and handling removals from that directory, a\r
+subsequent notmuch new would not handle those removals until something\r
+else changed in that directory.  This defers recording the updated\r
+mtime until after removals are handled to eliminate this problem.\r
+---\r
+ notmuch-new.c |   23 +++++++++++++++++------\r
+ 1 files changed, 17 insertions(+), 6 deletions(-)\r
+\r
+diff --git a/notmuch-new.c b/notmuch-new.c\r
+index 6859594..b76b608 100644\r
+--- a/notmuch-new.c\r
++++ b/notmuch-new.c\r
+@@ -24,6 +24,7 @@\r
\r
+ typedef struct _filename_node {\r
+     char *filename;\r
++    time_t mtime;\r
+     struct _filename_node *next;\r
+ } _filename_node_t;\r
\r
+@@ -46,6 +47,7 @@ typedef struct {\r
\r
+     _filename_list_t *removed_files;\r
+     _filename_list_t *removed_directories;\r
++    _filename_list_t *directory_mtimes;\r
\r
+     notmuch_bool_t synchronize_flags;\r
+     _filename_list_t *message_ids_to_sync;\r
+@@ -86,7 +88,7 @@ _filename_list_create (const void *ctx)\r
+     return list;\r
+ }\r
\r
+-static void\r
++static _filename_node_t *\r
+ _filename_list_add (_filename_list_t *list,\r
+                   const char *filename)\r
+ {\r
+@@ -99,6 +101,8 @@ _filename_list_add (_filename_list_t *list,\r
\r
+     *(list->tail) = node;\r
+     list->tail = &node->next;\r
++\r
++    return node;\r
+ }\r
\r
+ static void\r
+@@ -509,11 +513,7 @@ add_files_recursive (notmuch_database_t *notmuch,\r
+       notmuch_filenames_move_to_next (db_subdirs);\r
+     }\r
\r
+-    if (! interrupted) {\r
+-      status = notmuch_directory_set_mtime (directory, fs_mtime);\r
+-      if (status && ret == NOTMUCH_STATUS_SUCCESS)\r
+-          ret = status;\r
+-    }\r
++    _filename_list_add (state->directory_mtimes, path)->mtime = fs_mtime;\r
\r
+   DONE:\r
+     if (next)\r
+@@ -829,6 +829,7 @@ notmuch_new_command (void *ctx, int argc, char *argv[])\r
\r
+     add_files_state.removed_files = _filename_list_create (ctx);\r
+     add_files_state.removed_directories = _filename_list_create (ctx);\r
++    add_files_state.directory_mtimes = _filename_list_create (ctx);\r
\r
+     if (! debugger_is_active () && add_files_state.output_is_a_tty\r
+       && ! add_files_state.verbose) {\r
+@@ -867,8 +868,18 @@ notmuch_new_command (void *ctx, int argc, char *argv[])\r
+       }\r
+     }\r
\r
++    for (f = add_files_state.directory_mtimes->head; f && !interrupted; f = f->next) {\r
++      notmuch_directory_t *directory;\r
++      directory = notmuch_database_get_directory (notmuch, f->filename);\r
++      if (directory) {\r
++          notmuch_directory_set_mtime (directory, f->mtime);\r
++          notmuch_directory_destroy (directory);\r
++      }\r
++    }\r
++\r
+     talloc_free (add_files_state.removed_files);\r
+     talloc_free (add_files_state.removed_directories);\r
++    talloc_free (add_files_state.directory_mtimes);\r
\r
+     /* Now that removals are done (hence the database is aware of all\r
+      * renames), we can synchronize maildir_flags to tags for all\r
+-- \r
+1.7.5.1\r
+\r