[tracker-miners/wip/carlosg/progress-and-status] WIP: libtracker-miner: Notify about activity/progress




commit adf31c82e7ef27b74e337d44f5b7cc0995724772
Author: Carlos Garnacho <carlosg gnome org>
Date:   Fri Feb 12 12:58:21 2021 +0100

    WIP: libtracker-miner: Notify about activity/progress
    
    Progress is reported in a "detailed" per-index-root fashion. The
    control daemon is in charge of handling those signals, and
    communicate progress back to every individual IndexLocation
    requestor.

 .../org.freedesktop.Tracker3.Miner.xml             |  4 +
 src/libtracker-miner/tracker-miner-fs.c            | 88 +++++++++++++++++++---
 src/libtracker-miner/tracker-miner-object.c        | 11 +++
 src/libtracker-miner/tracker-miner-proxy.c         | 19 +++++
 .../org.freedesktop.Tracker3.Miner.Files.Index.xml | 12 +++
 5 files changed, 125 insertions(+), 9 deletions(-)
---
diff --git a/src/libtracker-miner/org.freedesktop.Tracker3.Miner.xml 
b/src/libtracker-miner/org.freedesktop.Tracker3.Miner.xml
index 6fe09c846..1ebb7e002 100644
--- a/src/libtracker-miner/org.freedesktop.Tracker3.Miner.xml
+++ b/src/libtracker-miner/org.freedesktop.Tracker3.Miner.xml
@@ -52,5 +52,9 @@
       <arg type="d" name="progress" />
       <arg type="i" name="remaining_time" />
     </signal>
+    <signal name="DetailedProgress">
+      <arg type="s" name="detail" />
+      <arg type="d" name="progress" />
+    </signal>
   </interface>
 </node>
diff --git a/src/libtracker-miner/tracker-miner-fs.c b/src/libtracker-miner/tracker-miner-fs.c
index a7260ec2e..50c110261 100644
--- a/src/libtracker-miner/tracker-miner-fs.c
+++ b/src/libtracker-miner/tracker-miner-fs.c
@@ -106,6 +106,11 @@ typedef struct {
        TrackerTask *task;
 } UpdateProcessingTaskContext;
 
+typedef struct {
+       guint processed;
+       guint finished;
+} RootStats;
+
 struct _TrackerMinerFSPrivate {
        TrackerPriorityQueue *items;
 
@@ -151,6 +156,8 @@ struct _TrackerMinerFSPrivate {
        /*
         * Statistics
         */
+       GHashTable *root_stats;
+       GHashTable *changed_roots;
 
        /* How many we found during crawling and how many were black
         * listed (ignored). Reset to 0 when processing stops. */
@@ -455,6 +462,8 @@ tracker_miner_fs_init (TrackerMinerFS *object)
                                         (GEqualFunc) g_file_equal,
                                         g_object_unref,
                                         g_free);
+       priv->root_stats = g_hash_table_new_full (NULL, NULL, NULL, g_free);
+       priv->changed_roots = g_hash_table_new (NULL, NULL);
 }
 
 static gboolean
@@ -731,6 +740,8 @@ fs_finalize (GObject *object)
        g_timer_destroy (priv->extraction_timer);
 
        g_clear_pointer (&priv->urn_lru, tracker_lru_unref);
+       g_clear_pointer (&priv->root_stats, g_hash_table_unref);
+       g_clear_pointer (&priv->changed_roots, g_hash_table_unref);
 
        if (priv->item_queues_handler_id) {
                g_source_remove (priv->item_queues_handler_id);
@@ -1011,6 +1022,33 @@ log_stats (TrackerMinerFS *fs)
 #endif
 }
 
+static gboolean
+signal_changed_roots (TrackerMinerFS *fs)
+{
+       GHashTableIter iter;
+       gpointer key;
+
+       g_hash_table_iter_init (&iter, fs->priv->changed_roots);
+
+       while (g_hash_table_iter_next (&iter, &key, NULL)) {
+               GFile *root = key;
+               RootStats *stats;
+               gdouble progress;
+
+               stats = g_hash_table_lookup (fs->priv->root_stats, root);
+               if (!stats)
+                       continue;
+
+               progress = (gdouble) stats->finished / stats->processed;
+               g_signal_emit_by_name (fs, "detailed-progress",
+                                      g_file_peek_path (root), progress);
+               if (stats->finished == stats->processed)
+                       g_hash_table_remove (fs->priv->root_stats, root);
+       }
+
+       g_hash_table_remove_all (fs->priv->changed_roots);
+}
+
 static void
 process_stop (TrackerMinerFS *fs)
 {
@@ -1024,6 +1062,8 @@ process_stop (TrackerMinerFS *fs)
        fs->priv->timer_stopped = TRUE;
        fs->priv->extraction_timer_stopped = TRUE;
 
+       signal_changed_roots (fs);
+
        g_object_set (fs,
                      "progress", 1.0,
                      "status", "Idle",
@@ -1372,6 +1412,7 @@ miner_handle_next_item (TrackerMinerFS *fs)
 {
        GFile *file = NULL;
        GFile *source_file = NULL;
+       GFile *root;
        gint64 time_now;
        static gint64 time_last = 0;
        gboolean keep_processing = TRUE;
@@ -1379,6 +1420,7 @@ miner_handle_next_item (TrackerMinerFS *fs)
        gboolean is_dir = FALSE;
        TrackerMinerFSEventType type;
        GFileInfo *info = NULL;
+       RootStats *stats;
 
        if (tracker_task_pool_limit_reached (TRACKER_TASK_POOL (fs->priv->sparql_buffer))) {
                /* Task pool is full, give it a break */
@@ -1486,7 +1528,10 @@ miner_handle_next_item (TrackerMinerFS *fs)
 
                        g_free (str2);
                        g_free (str1);
+
                }
+
+               signal_changed_roots (fs);
        }
 
        if (file == NULL) {
@@ -1549,6 +1594,14 @@ miner_handle_next_item (TrackerMinerFS *fs)
                item_queue_handlers_set_up (fs);
        }
 
+       root = tracker_indexing_tree_get_root (fs->priv->indexing_tree,
+                                              file, NULL);
+       stats = g_hash_table_lookup (fs->priv->root_stats, root);
+       if (stats) {
+               g_hash_table_add (fs->priv->changed_roots, root);
+               stats->finished++;
+       }
+
        g_clear_object (&file);
        g_clear_object (&source_file);
        g_clear_object (&info);
@@ -1651,13 +1704,17 @@ item_queue_handlers_set_up (TrackerMinerFS *fs)
 }
 
 static gint
-miner_fs_get_queue_priority (TrackerMinerFS *fs,
-                             GFile          *file)
+miner_fs_get_queue_priority (TrackerMinerFS  *fs,
+                             GFile           *file,
+                             GFile          **root_out)
 {
        TrackerDirectoryFlags flags;
+       GFile *root;
 
-       tracker_indexing_tree_get_root (fs->priv->indexing_tree,
-                                       file, &flags);
+       root = tracker_indexing_tree_get_root (fs->priv->indexing_tree,
+                                              file, &flags);
+       if (root_out)
+               *root_out = root;
 
        return (flags & TRACKER_DIRECTORY_FLAG_PRIORITY) ?
                G_PRIORITY_HIGH : G_PRIORITY_DEFAULT;
@@ -1753,9 +1810,22 @@ file_notifier_file_created (TrackerFileNotifier  *notifier,
 {
        TrackerMinerFS *fs = user_data;
        QueueEvent *event;
+       gint priority;
+       RootStats *stats;
+       GFile *root;
 
        event = queue_event_new (TRACKER_MINER_FS_EVENT_CREATED, file, info);
-       miner_fs_queue_event (fs, event, miner_fs_get_queue_priority (fs, file));
+       priority = miner_fs_get_queue_priority (fs, file, &root);
+       miner_fs_queue_event (fs, event, priority);
+
+       stats = g_hash_table_lookup (fs->priv->root_stats, root);
+       if (!stats) {
+               stats = g_new0 (RootStats, 1);
+               g_hash_table_insert (fs->priv->root_stats, root, stats);
+       }
+
+       g_hash_table_add (fs->priv->changed_roots, root);
+       stats->processed++;
 }
 
 static void
@@ -1776,7 +1846,7 @@ file_notifier_file_deleted (TrackerFileNotifier  *notifier,
 
        event = queue_event_new (TRACKER_MINER_FS_EVENT_DELETED, file, NULL);
        event->is_dir = !!is_dir;
-       miner_fs_queue_event (fs, event, miner_fs_get_queue_priority (fs, file));
+       miner_fs_queue_event (fs, event, miner_fs_get_queue_priority (fs, file, NULL));
 }
 
 static void
@@ -1791,7 +1861,7 @@ file_notifier_file_updated (TrackerFileNotifier  *notifier,
 
        event = queue_event_new (TRACKER_MINER_FS_EVENT_UPDATED, file, info);
        event->attributes_update = attributes_only;
-       miner_fs_queue_event (fs, event, miner_fs_get_queue_priority (fs, file));
+       miner_fs_queue_event (fs, event, miner_fs_get_queue_priority (fs, file, NULL));
 }
 
 static void
@@ -1805,7 +1875,7 @@ file_notifier_file_moved (TrackerFileNotifier *notifier,
        QueueEvent *event;
 
        event = queue_event_moved_new (source, dest, is_dir);
-       miner_fs_queue_event (fs, event, miner_fs_get_queue_priority (fs, source));
+       miner_fs_queue_event (fs, event, miner_fs_get_queue_priority (fs, source, NULL));
 }
 
 static void
@@ -1981,7 +2051,7 @@ check_file_parents (TrackerMinerFS *fs,
 
        for (p = parents; p; p = p->next) {
                event = queue_event_new (TRACKER_MINER_FS_EVENT_UPDATED, p->data, NULL);
-               miner_fs_queue_event (fs, event, miner_fs_get_queue_priority (fs, p->data));
+               miner_fs_queue_event (fs, event, miner_fs_get_queue_priority (fs, p->data, NULL));
                g_object_unref (p->data);
        }
 
diff --git a/src/libtracker-miner/tracker-miner-object.c b/src/libtracker-miner/tracker-miner-object.c
index 733b54f2a..f35623ae1 100644
--- a/src/libtracker-miner/tracker-miner-object.c
+++ b/src/libtracker-miner/tracker-miner-object.c
@@ -84,6 +84,7 @@ enum {
        PAUSED,
        RESUMED,
        PROGRESS,
+       DETAILED_PROGRESS,
        LAST_SIGNAL
 };
 
@@ -231,6 +232,16 @@ tracker_miner_class_init (TrackerMinerClass *klass)
                              G_TYPE_DOUBLE,
                              G_TYPE_INT);
 
+       signals[DETAILED_PROGRESS] =
+               g_signal_new ("detailed-progress",
+                             G_OBJECT_CLASS_TYPE (object_class),
+                             G_SIGNAL_RUN_LAST, 0,
+                             NULL, NULL,
+                             NULL,
+                             G_TYPE_NONE, 2,
+                             G_TYPE_STRING,
+                             G_TYPE_DOUBLE);
+
        g_object_class_install_property (object_class,
                                         PROP_STATUS,
                                         g_param_spec_string ("status",
diff --git a/src/libtracker-miner/tracker-miner-proxy.c b/src/libtracker-miner/tracker-miner-proxy.c
index 556384f06..3b40cfe7c 100644
--- a/src/libtracker-miner/tracker-miner-proxy.c
+++ b/src/libtracker-miner/tracker-miner-proxy.c
@@ -115,6 +115,10 @@ static const gchar introspection_xml[] =
   "      <arg type='d' name='progress' />"
   "      <arg type='i' name='remaining_time' />"
   "    </signal>"
+  "    <signal name='DetailedProgress'>"
+  "      <arg type='s' name='detail' />"
+  "      <arg type='d' name='progress' />"
+  "    </signal>"
   "  </interface>"
   "</node>";
 
@@ -729,6 +733,19 @@ miner_progress_cb (TrackerMiner      *miner,
        emit_dbus_signal (proxy, "Progress", variant);
 }
 
+static void
+miner_detailed_progress_cb (TrackerMiner      *miner,
+                           const gchar       *detail,
+                           gdouble            progress,
+                           TrackerMinerProxy *proxy)
+{
+       GVariant *variant;
+
+       variant = g_variant_new ("(sd)", detail, progress);
+       /* variant reference is sunk here */
+       emit_dbus_signal (proxy, "DetailedProgress", variant);
+}
+
 static gboolean
 tracker_miner_proxy_initable_init (GInitable     *initable,
                                    GCancellable  *cancellable,
@@ -773,6 +790,8 @@ tracker_miner_proxy_initable_init (GInitable     *initable,
                          G_CALLBACK (miner_resumed_cb), proxy);
        g_signal_connect (priv->miner, "progress",
                          G_CALLBACK (miner_progress_cb), proxy);
+       g_signal_connect (priv->miner, "detailed-progress",
+                         G_CALLBACK (miner_detailed_progress_cb), proxy);
 
        return TRUE;
 }
diff --git a/src/tracker-control/org.freedesktop.Tracker3.Miner.Files.Index.xml 
b/src/tracker-control/org.freedesktop.Tracker3.Miner.Files.Index.xml
index e368f1e20..bf452cdaa 100644
--- a/src/tracker-control/org.freedesktop.Tracker3.Miner.Files.Index.xml
+++ b/src/tracker-control/org.freedesktop.Tracker3.Miner.Files.Index.xml
@@ -6,6 +6,18 @@
       <arg type='as' name='flags' direction='in'>"
         <doc:doc><doc:summary>Extension flags, no allowed values at the moment</doc:summary></doc:doc>
       </arg>
+      <arg type='o' name='handle' direction='out'>
+       <doc:doc><doc:summary>
+         Object path to the given handle, with the
+         org.freedesktop.Tracker3.Miner.Files.Location interface
+       </doc:summary></doc:doc>
+      </arg>
     </method>
+    <property type='b' name='active' access='read' />
+  </interface>
+
+  <interface name='org.freedesktop.Tracker3.Miner.Files.Location'>
+    <property type='d' name='progress' access='read' />
+    <method name='Close' />
   </interface>
 </node>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]