[tracker-miners/wip/carlosg/progress-and-status] WIP: libtracker-miner: Notify about activity/progress
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker-miners/wip/carlosg/progress-and-status] WIP: libtracker-miner: Notify about activity/progress
- Date: Fri, 12 Feb 2021 12:01:41 +0000 (UTC)
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]