[tracker/writeback-refactor-rebase] libtracker-miner: Cancel writeback when the file is deleted/moved



commit 85d982a3e5e8931a01d70324890d6638edc7e7d5
Author: Carlos Garnacho <carlos lanedo com>
Date:   Tue Jul 26 15:25:02 2011 +0200

    libtracker-miner: Cancel writeback when the file is deleted/moved
    
    In these situations, writeback is no longer reliable, and prone to
    leave an unwanted copy of the file, so cancel writeback if the file
    is being manipulated that way externally to tracker.

 src/libtracker-miner/tracker-miner-fs.c |   32 ++++++++++++++++++++++++++++++-
 1 files changed, 31 insertions(+), 1 deletions(-)
---
diff --git a/src/libtracker-miner/tracker-miner-fs.c b/src/libtracker-miner/tracker-miner-fs.c
index 29b2a97..0dc969f 100644
--- a/src/libtracker-miner/tracker-miner-fs.c
+++ b/src/libtracker-miner/tracker-miner-fs.c
@@ -3535,6 +3535,24 @@ remove_writeback_task (TrackerMinerFS *fs,
 	return FALSE;
 }
 
+static void
+cancel_writeback_task (TrackerMinerFS *fs,
+		       GFile          *file)
+{
+	TrackerTask *task;
+
+	task = tracker_task_pool_find (fs->priv->writeback_pool, file);
+
+	if (task) {
+		ItemWritebackData *data;
+
+		data = tracker_task_get_data (task);
+		g_cancellable_cancel (data->cancellable);
+		tracker_task_pool_remove (fs->priv->writeback_pool, task);
+		tracker_task_unref (task);
+	}
+}
+
 /* Checks previous created/updated/deleted/moved/writeback queues for
  * monitor events. Returns TRUE if the item should still
  * be added to the queue.
@@ -3555,7 +3573,7 @@ check_item_queues (TrackerMinerFS *fs,
 		return TRUE;
 	}
 
-	if (queue != QUEUE_WRITEBACK) {
+	if (queue == QUEUE_UPDATED) {
 		TrackerTask *task;
 
 		if (other_file) {
@@ -3598,6 +3616,11 @@ check_item_queues (TrackerMinerFS *fs,
 
 		return TRUE;
 	case QUEUE_DELETED:
+		if (tracker_task_pool_find (fs->priv->writeback_pool, file)) {
+			/* Cancel writeback operations on a deleted file */
+			cancel_writeback_task (fs, file);
+		}
+
 		/* Remove all previous updates */
 		if (tracker_priority_queue_foreach_remove (fs->priv->items_updated,
 		                                           (GEqualFunc) g_file_equal,
@@ -3619,6 +3642,13 @@ check_item_queues (TrackerMinerFS *fs,
 
 		return TRUE;
 	case QUEUE_MOVED:
+		if (tracker_task_pool_find (fs->priv->writeback_pool, file)) {
+			/* If the origin file is also being written back,
+			 * cancel it as this is an external operation.
+			 */
+			cancel_writeback_task (fs, file);
+		}
+
 		/* Kill any events on other_file (The dest one), since it will be rewritten anyway */
 		if (tracker_priority_queue_foreach_remove (fs->priv->items_created,
 		                                           (GEqualFunc) g_file_equal,



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