notmuch new: Print upgrade progress report as a percentage.
authorCarl Worth <cworth@cworth.org>
Sun, 10 Jan 2010 01:38:23 +0000 (17:38 -0800)
committerCarl Worth <cworth@cworth.org>
Sun, 10 Jan 2010 01:38:23 +0000 (17:38 -0800)
Previously we were printing a number of messages upgraded so far. The
original motivation for this was to accurately reflect the fact that
there are two passes, (so each message is processed twice and it's not
accurate to represent with a single count). But as it turns out, the
second pass takes zero time (relatively speaking) so we're still not
accounting for it.

If nothing else, the percentage-based reporting makes for a cleaner
API for the progress_notify function.

lib/database.cc
lib/notmuch.h
notmuch-new.c

index 19f960e2d621d378f2254d8a1ddd5dc8554eec15..cce7847860e5a963532936eb0f9f4fb84af2a5c4 100644 (file)
@@ -681,8 +681,7 @@ handle_sigalrm (unused (int signal))
 notmuch_status_t
 notmuch_database_upgrade (notmuch_database_t *notmuch,
                          void (*progress_notify) (void *closure,
-                                                  unsigned int count,
-                                                  unsigned int total),
+                                                  double progress),
                          void *closure)
 {
     Xapian::WritableDatabase *db;
@@ -691,6 +690,7 @@ notmuch_database_upgrade (notmuch_database_t *notmuch,
     notmuch_bool_t timer_is_active = FALSE;
     unsigned int version;
     notmuch_status_t status;
+    unsigned int count = 0, total = 0;
 
     status = _notmuch_database_ensure_writable (notmuch);
     if (status)
@@ -726,11 +726,11 @@ notmuch_database_upgrade (notmuch_database_t *notmuch,
      * notmuch_message_add_filename.
      */
     if (version < 1) {
-       unsigned int count = 0, total;
        notmuch_query_t *query = notmuch_query_create (notmuch, "");
        notmuch_messages_t *messages;
        notmuch_message_t *message;
        char *filename;
+       Xapian::TermIterator t, t_end;
 
        total = notmuch_query_count_messages (query);
 
@@ -739,7 +739,7 @@ notmuch_database_upgrade (notmuch_database_t *notmuch,
             notmuch_messages_advance (messages))
        {
            if (do_progress_notify) {
-               progress_notify (closure, count, total);
+               progress_notify (closure, (double) count / total);
                do_progress_notify = 0;
            }
 
@@ -758,13 +758,10 @@ notmuch_database_upgrade (notmuch_database_t *notmuch,
        }
 
        notmuch_query_destroy (query);
-    }
 
-    /* Also, before version 1 we stored directory timestamps in
-     * XTIMESTAMP documents instead of the current XDIRECTORY
-     * documents. So copy those as well. */
-    if (version < 1) {
-       Xapian::TermIterator t, t_end;
+       /* Also, before version 1 we stored directory timestamps in
+        * XTIMESTAMP documents instead of the current XDIRECTORY
+        * documents. So copy those as well. */
 
        t_end = notmuch->xapian_db->allterms_end ("XTIMESTAMP");
 
@@ -785,6 +782,11 @@ notmuch_database_upgrade (notmuch_database_t *notmuch,
                time_t mtime;
                notmuch_directory_t *directory;
 
+               if (do_progress_notify) {
+                   progress_notify (closure, (double) count / total);
+                   do_progress_notify = 0;
+               }
+
                document = find_document_for_doc_id (notmuch, *p);
                mtime = Xapian::sortable_unserialise (
                    document.get_value (NOTMUCH_VALUE_TIMESTAMP));
@@ -803,20 +805,17 @@ notmuch_database_upgrade (notmuch_database_t *notmuch,
     /* Now that the upgrade is complete we can remove the old data
      * and documents that are no longer needed. */
     if (version < 1) {
-       unsigned int count = 0, total;
        notmuch_query_t *query = notmuch_query_create (notmuch, "");
        notmuch_messages_t *messages;
        notmuch_message_t *message;
        char *filename;
 
-       total = notmuch_query_count_messages (query);
-
        for (messages = notmuch_query_search_messages (query);
             notmuch_messages_has_more (messages);
             notmuch_messages_advance (messages))
        {
            if (do_progress_notify) {
-               progress_notify (closure, count, total);
+               progress_notify (closure, (double) count / total);
                do_progress_notify = 0;
            }
 
@@ -830,8 +829,6 @@ notmuch_database_upgrade (notmuch_database_t *notmuch,
            talloc_free (filename);
 
            notmuch_message_destroy (message);
-
-           count++;
        }
 
        notmuch_query_destroy (query);
@@ -855,6 +852,11 @@ notmuch_database_upgrade (notmuch_database_t *notmuch,
                 p != p_end;
                 p++)
            {
+               if (do_progress_notify) {
+                   progress_notify (closure, (double) count / total);
+                   do_progress_notify = 0;
+               }
+
                db->delete_document (*p);
            }
        }
index d8508dfd682821bdeaed809e622a71db1635086f..15c9db40657d444006a2ec49e76c86503f528d06 100644 (file)
@@ -204,15 +204,14 @@ notmuch_database_needs_upgrade (notmuch_database_t *database);
  *
  * The optional progress_notify callback can be used by the caller to
  * provide progress indication to the user. If non-NULL it will be
- * called periodically with 'count' as the number of messages upgraded
- * so far and 'total' the overall number of messages that will be
- * converted.
+ * called periodically with 'progress' as a floating-point value in
+ * the range of [0.0 .. 1.0] indicating the progress made so far in
+ * the upgrade process.
  */
 notmuch_status_t
 notmuch_database_upgrade (notmuch_database_t *database,
                          void (*progress_notify) (void *closure,
-                                                  unsigned int count,
-                                                  unsigned int total),
+                                                  double progress),
                          void *closure);
 
 /* Retrieve a directory object from the database for 'path'.
index 55c3dc1d8d75c8873fb64308d2e72b5d63cb661e..b740ee2b8c29d0e09d65f19de92693f2bcb448b3 100644 (file)
@@ -618,22 +618,26 @@ count_files (const char *path, int *count)
 
 static void
 upgrade_print_progress (void *closure,
-                       unsigned int count,
-                       unsigned int total)
+                       double progress)
 {
     add_files_state_t *state = closure;
-    struct timeval tv_now;
-    double elapsed_overall, rate_overall, time_remaining;
 
-    gettimeofday (&tv_now, NULL);
+    printf ("Upgrading database: %.2f%% complete", progress * 100.0);
 
-    elapsed_overall = notmuch_time_elapsed (state->tv_start, tv_now);
-    rate_overall = count / elapsed_overall;
-    time_remaining = ((total - count) / rate_overall);
+    if (progress > 0) {
+       struct timeval tv_now;
+       double elapsed, time_remaining;
+
+       gettimeofday (&tv_now, NULL);
+
+       elapsed = notmuch_time_elapsed (state->tv_start, tv_now);
+       time_remaining = (elapsed / progress) * (1.0 - progress);
+       printf (" (");
+       notmuch_time_print_formatted_seconds (time_remaining);
+       printf (" remaining)");
+    }
 
-    printf ("Upgraded %d of %d messages (", count, total);
-    notmuch_time_print_formatted_seconds (time_remaining);
-    printf (" remaining).      \r");
+    printf (".      \r");
 
     fflush (stdout);
 }