[tracker/tracker-store-queue] Sorting of the queue



commit d540caa4807ce086fd97b520185c87e87564e918
Author: Philip Van Hoof <philip codeminded be>
Date:   Fri May 22 11:57:18 2009 +0200

    Sorting of the queue
    
    The updates, statement_insert, statement_delete and queries follow
    natural order in priority group. The batch_update, batch_statement_insert
    and batch_commit follow natural order in non-prioritized group.
    
    Sample order:
    
    query
    delete_statement
    query
    update
    insert_statement
    batch_update
    batch_update
    batch_insert_statement
    batch_update
    batch_commit
---
 .../evolution/tracker-evolution-registrar.c        |    4 +-
 src/plugins/kmail/tracker-kmail-registrar.c        |    4 +-
 src/tracker-store/tracker-store-queue.c            |   82 ++++++++------------
 3 files changed, 37 insertions(+), 53 deletions(-)

diff --git a/src/plugins/evolution/tracker-evolution-registrar.c b/src/plugins/evolution/tracker-evolution-registrar.c
index 40188f7..6574c44 100644
--- a/src/plugins/evolution/tracker-evolution-registrar.c
+++ b/src/plugins/evolution/tracker-evolution-registrar.c
@@ -292,8 +292,8 @@ data_insert_statement (TrackerEvolutionRegistrar *self,
 {
 	tracker_store_queue_batch_insert_statement (subject, predicate, object, 
 	                                            insert_callback, 
-						    g_object_ref (self), 
-						    (GDestroyNotify) g_object_unref);
+	                                            g_object_ref (self), 
+	                                            (GDestroyNotify) g_object_unref);
 }
 
 static void
diff --git a/src/plugins/kmail/tracker-kmail-registrar.c b/src/plugins/kmail/tracker-kmail-registrar.c
index 9143558..84d2d4a 100644
--- a/src/plugins/kmail/tracker-kmail-registrar.c
+++ b/src/plugins/kmail/tracker-kmail-registrar.c
@@ -177,8 +177,8 @@ data_insert_statement (TrackerKMailRegistrar *self,
 {
 	tracker_store_queue_batch_insert_statement (subject, predicate, object, 
 	                                            insert_callback, 
-						    g_object_ref (self), 
-						    (GDestroyNotify) g_object_unref);
+	                                            g_object_ref (self), 
+	                                            (GDestroyNotify) g_object_unref);
 }
 
 static void
diff --git a/src/tracker-store/tracker-store-queue.c b/src/tracker-store/tracker-store-queue.c
index 54673f9..0030dcc 100644
--- a/src/tracker-store/tracker-store-queue.c
+++ b/src/tracker-store/tracker-store-queue.c
@@ -34,7 +34,8 @@ typedef struct {
 	gboolean  have_handler;
 	gboolean  final;
 	gboolean  in_batch;
-	GQueue   *queue;
+	GQueue   *batch_queue;
+	GQueue   *single_queue;
 } TrackerStoreQueuePrivate;
 
 typedef enum {
@@ -48,7 +49,7 @@ typedef enum {
 typedef struct {
 	TrackerStoreQueueTaskType  type;
 	union {
-	  gchar                     *query;
+	  gchar                   *query;
 	  struct {
 		gchar             *subject;
 		gchar             *predicate;
@@ -56,7 +57,6 @@ typedef struct {
 	  } statement;
 	} data;
 	gpointer                   user_data;
-	gboolean                   in_batch;
 	GDestroyNotify             destroy;
 	union {
 		TrackerStoreQueueSparqlUpdateCallback update_callback;
@@ -73,7 +73,8 @@ private_free (gpointer data)
 {
 	TrackerStoreQueuePrivate *private = data;
 
-	g_queue_free (private->queue);
+	g_queue_free (private->batch_queue);
+	g_queue_free (private->single_queue);
 	g_free (private);
 }
 
@@ -97,15 +98,30 @@ queue_idle_handler (gpointer user_data)
 	TrackerStoreQueueTask    *task;
 	GError                   *error = NULL;
 	TrackerDBResultSet       *result_set;
+	gboolean                  in_batch = FALSE;
 
-	task = g_queue_pop_head (private->queue);
+	/* The tasks on single_queue always get priority over the batch_queue */
+
+	task = g_queue_pop_head (private->single_queue);
+
+	/* If no more single_queue task, we start processing the batch_queue */
+
+	if (!task) {
+		task = g_queue_pop_head (private->batch_queue);
+		in_batch = TRUE;
+	}
+
+	/* If neither, we stop the handler */
 
 	if (!task) {
 		return FALSE;
 	}
 
-	if (task->in_batch && !private->in_batch) {
+	/* Implicit transaction start */
+
+	if (in_batch && !private->in_batch) {
 		tracker_data_begin_transaction ();
+		private->in_batch = TRUE;
 	}
 
 	switch (task->type) {
@@ -122,6 +138,8 @@ queue_idle_handler (gpointer user_data)
 
 		case TRACKER_STORE_QUEUE_TASK_TYPE_COMMIT:
 
+			/* Explicit transaction commit */
+
 			tracker_data_commit_transaction ();
 			private->in_batch = FALSE;
 
@@ -195,7 +213,8 @@ tracker_store_queue_init (void)
 	private = g_new0 (TrackerStoreQueuePrivate, 1);
 
 	private->final = FALSE;
-	private->queue = g_queue_new ();
+	private->single_queue = g_queue_new ();
+	private->batch_queue = g_queue_new ();
 
 	g_static_private_set (&private_key,
 	                      private,
@@ -233,31 +252,6 @@ start_handler (TrackerStoreQueuePrivate *private)
 	                 queue_idle_destroy);
 }
 
-
-static gint 
-queue_sorter (gconstpointer a,
-              gconstpointer b,
-              gpointer user_data)
-{
-	/**
-	 * This should probably be implemented like this:
-	 *
-	 * o. A batch_commit gets precedence over all, it must always come in
-	 *    front of anything else
-	 * o. A query goes in front of anything else except a batch_commit
-	 * o. A update goes underneat a query
-	 * o. A batch_update goes underneat an update
-	 *
-	 * Right now we just return TRUE. Meaning that the newest one always 
-	 * precedes all others (I think). It basically means that it's not
-	 * implemented and that this is ...
-	 * */
-
-	/* TODO */
-
-	return TRUE;
-}
-
 void
 tracker_store_queue_batch_commit (TrackerStoreQueueCommitCallback callback, 
                                   gpointer user_data,
@@ -273,11 +267,9 @@ tracker_store_queue_batch_commit (TrackerStoreQueueCommitCallback callback,
 	task->type = TRACKER_STORE_QUEUE_TASK_TYPE_COMMIT;
 	task->user_data = user_data;
 	task->callback.commit_callback = callback;
-	task->in_batch = TRUE;
 	task->destroy = destroy;
 
-	g_queue_insert_sorted (private->queue, task,
-	                       queue_sorter, NULL);
+	g_queue_push_tail (private->batch_queue, task);
 
 	if (!private->have_handler) {
 		start_handler (private);
@@ -302,11 +294,9 @@ tracker_store_queue_batch_sparql_update (const gchar *sparql,
 	task->data.query = g_strdup (sparql);
 	task->user_data = user_data;
 	task->callback.update_callback = callback;
-	task->in_batch = TRUE;
 	task->destroy = destroy;
 
-	g_queue_insert_sorted (private->queue, task,
-	                       queue_sorter, NULL);
+	g_queue_push_tail (private->batch_queue, task);
 
 	if (!private->have_handler) {
 		start_handler (private);
@@ -332,8 +322,7 @@ tracker_store_queue_sparql_update (const gchar *sparql,
 	task->callback.update_callback = callback;
 	task->destroy = destroy;
 
-	g_queue_insert_sorted (private->queue, task,
-	                       queue_sorter, NULL);
+	g_queue_push_tail (private->single_queue, task);
 
 	if (!private->have_handler) {
 		start_handler (private);
@@ -359,8 +348,7 @@ tracker_store_queue_sparql_query (const gchar *sparql,
 	task->callback.query_callback = callback;
 	task->destroy = destroy;
 
-	g_queue_insert_sorted (private->queue, task,
-	                       queue_sorter, NULL);
+	g_queue_push_tail (private->single_queue, task);
 
 	if (!private->have_handler) {
 		start_handler (private);
@@ -388,11 +376,9 @@ tracker_store_queue_batch_insert_statement (const gchar   *subject,
 	task->data.statement.object = g_strdup (object);
 	task->user_data = user_data;
 	task->callback.update_callback = callback;
-	task->in_batch = TRUE;
 	task->destroy = destroy;
 
-	g_queue_insert_sorted (private->queue, task,
-	                       queue_sorter, NULL);
+	g_queue_push_tail (private->batch_queue, task);
 
 	if (!private->have_handler) {
 		start_handler (private);
@@ -423,8 +409,7 @@ tracker_store_queue_insert_statement (const gchar   *subject,
 	task->callback.update_callback = callback;
 	task->destroy = destroy;
 
-	g_queue_insert_sorted (private->queue, task,
-	                       queue_sorter, NULL);
+	g_queue_push_tail (private->single_queue, task);
 
 	if (!private->have_handler) {
 		start_handler (private);
@@ -454,8 +439,7 @@ tracker_store_queue_delete_statement (const gchar   *subject,
 	task->callback.update_callback = callback;
 	task->destroy = destroy;
 
-	g_queue_insert_sorted (private->queue, task,
-	                       queue_sorter, NULL);
+	g_queue_push_tail (private->single_queue, task);
 
 	if (!private->have_handler) {
 		start_handler (private);



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