[tracker/tracker-store-queue] Sorting of the queue
- From: Philip Van Hoof <pvanhoof src gnome org>
- To: svn-commits-list gnome org
- Subject: [tracker/tracker-store-queue] Sorting of the queue
- Date: Fri, 22 May 2009 06:00:07 -0400 (EDT)
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]