[tracker-miners/sam/index-file-sync: 313/316] miners/fs: Remove all data added by IndexFileForProcess on shutdown



commit a3a76ffd73f794cc017c3d2b67d30b660176d6a6
Author: Sam Thursfield <sam afuera me uk>
Date:   Sun Mar 8 20:13:21 2020 +0100

    miners/fs: Remove all data added by IndexFileForProcess on shutdown
    
    The IndexFileForProcess method is intended for apps to trigger on-demand
    indexing of removable devices. The data remains in the store as long as
    the app is connected to D-Bus, then it's deleted.
    
    If the miner-fs shut down before the app, the data would remain in the
    store forever and would not be updated, until an app one day called
    IndexFileForProcess again for the same location.

 src/libtracker-miner/tracker-miner-fs.c           | 34 ++++++++++++++++------
 src/libtracker-miner/tracker-miner-fs.h           |  2 ++
 src/miners/fs/tracker-main.c                      | 35 ++++++++++++++++++++++-
 src/miners/fs/tracker-miner-files-index.c         |  8 ++++++
 src/miners/fs/tracker-miner-files-index.h         |  1 +
 src/miners/fs/tracker-miner-files-peer-listener.c | 24 ++++++++++++++++
 src/miners/fs/tracker-miner-files-peer-listener.h |  1 +
 7 files changed, 96 insertions(+), 9 deletions(-)
---
diff --git a/src/libtracker-miner/tracker-miner-fs.c b/src/libtracker-miner/tracker-miner-fs.c
index 9c7df6e98..c571a6447 100644
--- a/src/libtracker-miner/tracker-miner-fs.c
+++ b/src/libtracker-miner/tracker-miner-fs.c
@@ -802,19 +802,12 @@ fs_finalize (GObject *object)
                tracker_file_notifier_stop (priv->file_notifier);
        }
 
-       /* Cancel every pending task */
-       tracker_task_pool_foreach (priv->task_pool,
-                                  task_pool_cancel_foreach,
-                                  NULL);
-       g_object_unref (priv->task_pool);
+       tracker_miner_fs_cancel_all_tasks (TRACKER_MINER_FS (object));
 
        if (priv->sparql_buffer) {
                g_object_unref (priv->sparql_buffer);
        }
 
-       tracker_priority_queue_foreach (priv->items,
-                                       (GFunc) queue_event_free,
-                                       NULL);
        tracker_priority_queue_unref (priv->items);
 
        g_object_unref (priv->root);
@@ -2535,3 +2528,28 @@ tracker_miner_fs_get_file_bnode (TrackerMinerFS *fs,
 
        return NULL;
 }
+
+/**
+ * tracker_miner_fs_cancel_all_tasks:
+ * @fs: a #TrackerMinerFS
+ *
+ * Cancels all tasks which are in progress.
+ *
+ * Since: 3.0
+ **/
+void
+tracker_miner_fs_cancel_all_tasks (TrackerMinerFS *fs)
+{
+       TrackerMinerFSPrivate *priv;
+
+       priv = fs->priv;
+
+       /* Cancel every pending task */
+       tracker_task_pool_foreach (priv->task_pool,
+                                  task_pool_cancel_foreach,
+                                  NULL);
+
+       tracker_priority_queue_foreach (priv->items,
+                                      (GFunc) queue_event_free,
+                                      NULL);
+}
diff --git a/src/libtracker-miner/tracker-miner-fs.h b/src/libtracker-miner/tracker-miner-fs.h
index 2386f4b51..e0d89aeb7 100644
--- a/src/libtracker-miner/tracker-miner-fs.h
+++ b/src/libtracker-miner/tracker-miner-fs.h
@@ -159,6 +159,8 @@ gchar *               tracker_miner_fs_get_file_bnode        (TrackerMinerFS *fs
 /* Progress */
 gboolean              tracker_miner_fs_has_items_to_process  (TrackerMinerFS  *fs);
 
+void                  tracker_miner_fs_cancel_all_tasks       (TrackerMinerFS  *fs);
+
 G_END_DECLS
 
 #endif /* __LIBTRACKER_MINER_MINER_FS_H__ */
diff --git a/src/miners/fs/tracker-main.c b/src/miners/fs/tracker-main.c
index a01c85b55..99ade457e 100644
--- a/src/miners/fs/tracker-main.c
+++ b/src/miners/fs/tracker-main.c
@@ -812,6 +812,24 @@ setup_connection_and_endpoint (TrackerDomainOntology    *domain,
        return TRUE;
 }
 
+static gboolean
+quit_on_miner_finished_cb (TrackerMinerFiles *miner,
+                           gdouble time,
+                           guint directories_found,
+                           guint directories_ignored,
+                           guint files_found,
+                           guint files_ignored,
+                           gpointer user_data)
+{
+       GMainLoop *loop = user_data;
+
+       g_debug ("miner-fs finished processing removals");
+
+       g_main_loop_quit (loop);
+
+       return G_SOURCE_REMOVE;
+}
+
 int
 main (gint argc, gchar *argv[])
 {
@@ -828,6 +846,7 @@ main (gint argc, gchar *argv[])
        TrackerEndpointDBus *endpoint;
        TrackerDomainOntology *domain_ontology;
        gchar *domain_name, *dbus_name;
+       GMainLoop *shutdown_loop;
 
        main_loop = NULL;
 
@@ -1025,15 +1044,29 @@ main (gint argc, gchar *argv[])
 
        /* Go, go, go! */
        g_main_loop_run (main_loop);
+       g_main_loop_unref (main_loop);
 
        g_debug ("Shutdown started");
 
+       tracker_miner_fs_cancel_all_tasks (TRACKER_MINER_FS (miner_files));
+       tracker_miner_files_index_remove_temporary_data (miner_files_index);
+
+       shutdown_loop = g_main_loop_new (NULL, 0);
+
+       if (tracker_miner_fs_has_items_to_process (TRACKER_MINER_FS (miner_files))) {
+               g_debug ("Waiting for miner-fs to process removals.");
+               g_signal_connect (miner_files, "finished", G_CALLBACK (quit_on_miner_finished_cb), 
shutdown_loop);
+               g_main_loop_run (shutdown_loop);
+       } else {
+               g_debug ("No removals to process.");
+       }
+
        if (!dry_run && miners_timeout_id == 0 && !miner_needs_check (miner_files)) {
                tracker_miner_files_set_need_mtime_check (TRACKER_MINER_FILES (miner_files), FALSE);
                save_current_locale (domain_ontology);
        }
 
-       g_main_loop_unref (main_loop);
+       g_main_loop_unref (shutdown_loop);
        g_object_unref (config);
        g_object_unref (miner_files_index);
 
diff --git a/src/miners/fs/tracker-miner-files-index.c b/src/miners/fs/tracker-miner-files-index.c
index a6b940b8c..adc5e4a76 100644
--- a/src/miners/fs/tracker-miner-files-index.c
+++ b/src/miners/fs/tracker-miner-files-index.c
@@ -485,3 +485,11 @@ tracker_miner_files_index_new (TrackerMinerFiles *miner_files)
 
        return (TrackerMinerFilesIndex *) miner;
 }
+
+void
+tracker_miner_files_index_remove_temporary_data (TrackerMinerFilesIndex *miner_files)
+{
+       TrackerMinerFilesIndexPrivate *priv = TRACKER_MINER_FILES_INDEX_GET_PRIVATE (miner_files);
+
+       tracker_miner_files_peer_listener_remove_all (priv->peer_listener);
+}
diff --git a/src/miners/fs/tracker-miner-files-index.h b/src/miners/fs/tracker-miner-files-index.h
index 447d9e293..62b032659 100644
--- a/src/miners/fs/tracker-miner-files-index.h
+++ b/src/miners/fs/tracker-miner-files-index.h
@@ -46,6 +46,7 @@ struct TrackerMinerFilesIndexClass {
 
 GType                   tracker_miner_files_index_get_type (void);
 TrackerMinerFilesIndex *tracker_miner_files_index_new      (TrackerMinerFiles *miner_files);
+void                    tracker_miner_files_index_remove_temporary_data (TrackerMinerFilesIndex 
*miner_files);
 
 G_END_DECLS
 
diff --git a/src/miners/fs/tracker-miner-files-peer-listener.c 
b/src/miners/fs/tracker-miner-files-peer-listener.c
index 5301e1527..5efb50361 100644
--- a/src/miners/fs/tracker-miner-files-peer-listener.c
+++ b/src/miners/fs/tracker-miner-files-peer-listener.c
@@ -332,6 +332,30 @@ tracker_miner_files_peer_listener_add_watch (TrackerMinerFilesPeerListener *list
        file_peers_data_add_dbus_name (file_data, peer_data->dbus_name);
 }
 
+void
+tracker_miner_files_peer_listener_remove_all (TrackerMinerFilesPeerListener *listener)
+{
+       TrackerMinerFilesPeerListenerPrivate *priv;
+       GHashTableIter iter;
+       GFile *file;
+       FilePeersData *file_data;
+
+       g_return_if_fail (TRACKER_IS_MINER_FILES_PEER_LISTENER (listener));
+
+       priv = tracker_miner_files_peer_listener_get_instance_private (listener);
+
+       g_message ("Removing all data added with IndexFileForProcess");
+
+       g_hash_table_remove_all (priv->peer_files);
+
+       g_hash_table_iter_init (&iter, priv->file_peers);
+       while (g_hash_table_iter_next (&iter, (gpointer *)&file, (gpointer *)&file_data)) {
+               g_hash_table_iter_remove (&iter);
+
+               g_signal_emit (listener, signals[UNWATCH_FILE], 0, file);
+       }
+}
+
 void
 tracker_miner_files_peer_listener_remove_watch (TrackerMinerFilesPeerListener *listener,
                                                 const gchar                   *dbus_name,
diff --git a/src/miners/fs/tracker-miner-files-peer-listener.h 
b/src/miners/fs/tracker-miner-files-peer-listener.h
index 7a23d328d..4e7997d02 100644
--- a/src/miners/fs/tracker-miner-files-peer-listener.h
+++ b/src/miners/fs/tracker-miner-files-peer-listener.h
@@ -55,6 +55,7 @@ void     tracker_miner_files_peer_listener_remove_watch (TrackerMinerFilesPeerLi
                                                          const gchar                   *dbus_name,
                                                          GFile                         *file);
 
+void     tracker_miner_files_peer_listener_remove_all       (TrackerMinerFilesPeerListener *listener);
 void     tracker_miner_files_peer_listener_remove_dbus_name (TrackerMinerFilesPeerListener *listener,
                                                              const gchar                   *dbus_name);
 void     tracker_miner_files_peer_listener_remove_file      (TrackerMinerFilesPeerListener *listener,


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