[PATCH 15/17] new: Synchronize maildir flags eagerly.
authorAustin Clements <amdragon@MIT.EDU>
Sat, 11 Jun 2011 20:04:41 +0000 (16:04 +2000)
committerW. Trevor King <wking@tremily.us>
Fri, 7 Nov 2014 17:38:35 +0000 (09:38 -0800)
c7/5911952fd1e243fc7d95f74db3ee71dfd3353d [new file with mode: 0644]

diff --git a/c7/5911952fd1e243fc7d95f74db3ee71dfd3353d b/c7/5911952fd1e243fc7d95f74db3ee71dfd3353d
new file mode 100644 (file)
index 0000000..a79a7af
--- /dev/null
@@ -0,0 +1,175 @@
+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 84DD3429E2B\r
+       for <notmuch@notmuchmail.org>; Sat, 11 Jun 2011 13:07:27 -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 OnsD6EdvPy4E for <notmuch@notmuchmail.org>;\r
+       Sat, 11 Jun 2011 13:07:27 -0700 (PDT)\r
+Received: from dmz-mailsec-scanner-3.mit.edu (DMZ-MAILSEC-SCANNER-3.MIT.EDU\r
+       [18.9.25.14])\r
+       by olra.theworths.org (Postfix) with ESMTP id D6F46431FB6\r
+       for <notmuch@notmuchmail.org>; Sat, 11 Jun 2011 13:07:26 -0700 (PDT)\r
+X-AuditID: 1209190e-b7c39ae000000a8c-b9-4df3caedecc7\r
+Received: from mailhub-auth-2.mit.edu ( [18.7.62.36])\r
+       by dmz-mailsec-scanner-3.mit.edu (Symantec Messaging Gateway) with SMTP\r
+       id 09.7A.02700.DEAC3FD4; Sat, 11 Jun 2011 16:07: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 p5BK7QrI030878; \r
+       Sat, 11 Jun 2011 16:07:26 -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 p5BK7PAn006058\r
+       (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT);\r
+       Sat, 11 Jun 2011 16:07:26 -0400 (EDT)\r
+Received: from amthrax by drake.mit.edu with local (Exim 4.76)\r
+       (envelope-from <amthrax@drake.mit.edu>)\r
+       id 1QVUSr-0000Ie-69; Sat, 11 Jun 2011 16:07:25 -0400\r
+From: Austin Clements <amdragon@MIT.EDU>\r
+To: notmuch@notmuchmail.org\r
+Subject: [PATCH 15/17] new: Synchronize maildir flags eagerly.\r
+Date: Sat, 11 Jun 2011 16:04:41 -0400\r
+Message-Id: <1307822683-848-16-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+NgFtrPIsWRmVeSWpSXmKPExsUixG6novv21Gdfg4Y2MYvrN2cyOzB6PFt1\r
+       izmAMYrLJiU1J7MstUjfLoEr48zlc4wFb+QrPs+cwtTA+EKyi5GTQ0LAROJk8xwmCFtM4sK9\r
+       9WxdjFwcQgL7GCWmbpnGDOFsYJQ49nIqE4Rzn0libcd/KGc+o8TdfU3sIP1sAhoS2/YvZwSx\r
+       RQSkJXbenc3axcjBwSygJvGnSwUkLCxgJ/F7xXdWEJtFQFXi+ff3YK28AvYSV+Z/YYU4Q0Hi\r
+       ypV5LCA2J1B83sGrYLaQQJrEklu72Scw8i9gZFjFKJuSW6Wbm5iZU5yarFucnJiXl1qka6yX\r
+       m1mil5pSuokRFDacknw7GL8eVDrEKMDBqMTDq7f2s68Qa2JZcWXuIUZJDiYlUV6dE0AhvqT8\r
+       lMqMxOKM+KLSnNTiQ4wSHMxKIrzr2z/5CvGmJFZWpRblw6SkOViUxHlnSqr7CgmkJ5akZqem\r
+       FqQWwWRlODiUJHglgfEhJFiUmp5akZaZU4KQZuLgBBnOAzT86EmgGt7igsTc4sx0iPwpRl2O\r
+       xxs2HWIUYsnLz0uVEudVBxkkAFKUUZoHNwcW768YxYHeEub9ATKKB5gq4Ca9AlrCBLREoBRs\r
+       SUkiQkqqgVFpQeikjU+ZOhm2/WibJ5Oxstvjzc6Zd5XOzNI6+3LaorW7rVUPPj2zZ8nXN24Z\r
+       +ilnbfNecfPs3nztukXnXdfQ84lxSYbch5sSF9+dbhxY9vYEgzOv+PyWSr9p3mub9oS79ZxP\r
+       axZ49e10Dk+EG9+N9yvfx9hOnrYvPkbJ63/zmaW2x9Jutz1XYinOSDTUYi4qTgQAUrt5ZdIC        AAA=\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:07:27 -0000\r
+\r
+Because flag synchronization is stateless, it can be performed at any\r
+time as long as it's guaranteed to be performed after any change to a\r
+message's filename list.  Take advantage of this to synchronize tags\r
+immediately after a filename is added or removed.\r
+\r
+This does not yet make adding or removing a message atomic, but it is\r
+a big step toward atomicity because it reduces the window where the\r
+database tags are inconsistent from nearly the entire notmuch-new to\r
+just around when the message is added or removed.\r
+---\r
+ notmuch-new.c |   42 ++++++++----------------------------------\r
+ 1 files changed, 8 insertions(+), 34 deletions(-)\r
+\r
+diff --git a/notmuch-new.c b/notmuch-new.c\r
+index dc349f6..b24eb51 100644\r
+--- a/notmuch-new.c\r
++++ b/notmuch-new.c\r
+@@ -50,7 +50,6 @@ typedef struct {\r
+     _filename_list_t *directory_mtimes;\r
\r
+     notmuch_bool_t synchronize_flags;\r
+-    _filename_list_t *message_ids_to_sync;\r
+ } add_files_state_t;\r
\r
+ static volatile sig_atomic_t do_print_progress = 0;\r
+@@ -443,11 +442,8 @@ add_files_recursive (notmuch_database_t *notmuch,\r
+           break;\r
+       /* Non-fatal issues (go on to next file) */\r
+       case NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID:\r
+-          /* Defer sync of maildir flags until after old filenames\r
+-           * are removed in the case of a rename. */\r
+           if (state->synchronize_flags == TRUE)\r
+-              _filename_list_add (state->message_ids_to_sync,\r
+-                                  notmuch_message_get_message_id (message));\r
++              notmuch_message_maildir_flags_to_tags (message);\r
+           break;\r
+       case NOTMUCH_STATUS_FILE_NOT_EMAIL:\r
+           fprintf (stderr, "Note: Ignoring non-mail file: %s\n",\r
+@@ -703,11 +699,16 @@ remove_filename (notmuch_database_t *notmuch,\r
+                add_files_state_t *add_files_state)\r
+ {\r
+     notmuch_status_t status;\r
++    notmuch_message_t *message;\r
++    message = notmuch_database_find_message_by_filename (notmuch, path);\r
+     status = notmuch_database_remove_message (notmuch, path);\r
+-    if (status == NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID)\r
++    if (status == NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID) {\r
+       add_files_state->renamed_messages++;\r
+-    else\r
++      if (add_files_state->synchronize_flags == TRUE)\r
++          notmuch_message_maildir_flags_to_tags (message);\r
++    } else\r
+       add_files_state->removed_messages++;\r
++    notmuch_message_destroy (message);\r
+     return status;\r
+ }\r
\r
+@@ -782,7 +783,6 @@ notmuch_new_command (void *ctx, int argc, char *argv[])\r
\r
+     add_files_state.new_tags = notmuch_config_get_new_tags (config, &add_files_state.new_tags_length);\r
+     add_files_state.synchronize_flags = notmuch_config_get_maildir_synchronize_flags (config);\r
+-    add_files_state.message_ids_to_sync = _filename_list_create (ctx);\r
+     db_path = notmuch_config_get_database_path (config);\r
\r
+     dot_notmuch_path = talloc_asprintf (ctx, "%s/%s", db_path, ".notmuch");\r
+@@ -883,32 +883,6 @@ notmuch_new_command (void *ctx, int argc, char *argv[])\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
+-     * messages that had new filenames appear on this run. */\r
+-    gettimeofday (&tv_start, NULL);\r
+-    if (add_files_state.synchronize_flags) {\r
+-      _filename_node_t *node;\r
+-      notmuch_message_t *message;\r
+-      for (node = add_files_state.message_ids_to_sync->head, i = 0;\r
+-           node;\r
+-           node = node->next, i++)\r
+-      {\r
+-          message = notmuch_database_find_message (notmuch, node->filename);\r
+-          notmuch_message_maildir_flags_to_tags (message);\r
+-          notmuch_message_destroy (message);\r
+-          if (do_print_progress) {\r
+-              do_print_progress = 0;\r
+-              generic_print_progress (\r
+-                  "Synchronized tags for", "messages",\r
+-                  tv_start, i, add_files_state.message_ids_to_sync->count);\r
+-          }\r
+-      }\r
+-    }\r
+-\r
+-    talloc_free (add_files_state.message_ids_to_sync);\r
+-    add_files_state.message_ids_to_sync = NULL;\r
+-\r
+     if (timer_is_active)\r
+       stop_progress_printing_timer ();\r
\r
+-- \r
+1.7.5.1\r
+\r