[tracker/urho-sync] Experiment for journal synchronization mode



commit 9bcfa4e19b7042c7c315eecb9fb7d7939050bf36
Author: Philip Van Hoof <philip codeminded be>
Date:   Fri Jul 31 17:41:43 2009 +0200

    Experiment for journal synchronization mode

 src/libtracker-db/Makefile.am     |    6 ++-
 src/tracker-store/tracker-store.c |   67 +++++++++++++++++++++++++++++++++++-
 2 files changed, 69 insertions(+), 4 deletions(-)
---
diff --git a/src/libtracker-db/Makefile.am b/src/libtracker-db/Makefile.am
index 01cc131..65fffa9 100644
--- a/src/libtracker-db/Makefile.am
+++ b/src/libtracker-db/Makefile.am
@@ -19,13 +19,15 @@ libtracker_db_la_SOURCES = 						\
 	tracker-db-dbus.c						\
 	tracker-db-interface.c						\
 	tracker-db-interface-sqlite.c					\
-	tracker-db-manager.c
+	tracker-db-manager.c						\
+	tracker-db-backup.c
 
 noinst_HEADERS =							\
 	tracker-db-dbus.h						\
 	tracker-db-interface.h						\
 	tracker-db-interface-sqlite.h					\
-	tracker-db-manager.h 
+	tracker-db-manager.h 						\
+	tracker-db-backup.h
 
 libtracker_db_la_LDFLAGS =						\
 	-version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
diff --git a/src/tracker-store/tracker-store.c b/src/tracker-store/tracker-store.c
index 90e50a4..d6c974d 100644
--- a/src/tracker-store/tracker-store.c
+++ b/src/tracker-store/tracker-store.c
@@ -22,8 +22,12 @@
 
 #include "config.h"
 
+#include <unistd.h>
+#include <sys/types.h>
+
 #include <libtracker-common/tracker-dbus.h>
 #include <libtracker-db/tracker-db-dbus.h>
+#include <libtracker-db/tracker-db-backup.h>
 
 #include <libtracker-data/tracker-data-update.h>
 #include <libtracker-data/tracker-data-query.h>
@@ -34,11 +38,11 @@
 #define TRACKER_STORE_TRANSACTION_MAX	4000
 
 typedef struct {
-	gboolean  have_handler;
+	gboolean  have_handler, have_sync_handler;
 	gboolean  batch_mode;
 	guint     batch_count;
 	GQueue   *queue;
-	guint     handler;
+	guint     handler, sync_handler;
 } TrackerStorePrivate;
 
 typedef enum {
@@ -66,6 +70,7 @@ typedef struct {
 } TrackerStoreTask;
 
 static GStaticPrivate private_key = G_STATIC_PRIVATE_INIT;
+static FILE *journal = NULL;
 
 static void
 private_free (gpointer data)
@@ -174,6 +179,13 @@ queue_idle_handler (gpointer user_data)
 		begin_batch (private);
 
 		tracker_data_update_sparql (task->data.query, &error);
+
+		if (journal) {
+			write (fileno (journal), task->data.query, strlen (task->data.query));
+			write (fileno (journal), "\n", 1);
+			fsync (fileno (journal));
+		}
+
 		if (!error) {
 			private->batch_count++;
 			if (private->batch_count >= TRACKER_STORE_TRANSACTION_MAX) {
@@ -243,6 +255,22 @@ queue_idle_handler (gpointer user_data)
 }
 
 static void
+on_backup_done (GError *error, gpointer user_data)
+{
+	if (!error) {
+		ftruncate(fileno (journal), 0);
+	}
+}
+
+static gboolean
+sync_idle_handler (gpointer user_data)
+{
+	tracker_db_backup_save (on_backup_done, NULL, NULL);
+
+	return TRUE;
+}
+
+static void
 queue_idle_destroy (gpointer user_data)
 {
 	TrackerStorePrivate *private = user_data;
@@ -250,6 +278,17 @@ queue_idle_destroy (gpointer user_data)
 	private->have_handler = FALSE;
 }
 
+
+static void
+sync_idle_destroy (gpointer user_data)
+{
+	TrackerStorePrivate *private = user_data;
+
+	fclose (journal);
+
+	private->have_sync_handler = FALSE;
+}
+
 void
 tracker_store_init (void)
 {
@@ -262,6 +301,17 @@ tracker_store_init (void)
 	g_static_private_set (&private_key,
 	                      private,
 	                      private_free);
+
+	journal = fopen ("/tmp/journal.sparql.txt", "w");
+
+	if (journal) {
+		private->sync_handler = g_timeout_add_seconds_full (G_PRIORITY_LOW,
+		                                                    60,
+		                                                    sync_idle_handler,
+		                                                    private,
+		                                                    sync_idle_destroy);
+	}
+
 }
 
 void
@@ -277,6 +327,11 @@ tracker_store_shutdown (void)
 		private->have_handler = FALSE;
 	}
 
+	if (private->have_sync_handler) {
+		g_source_remove (private->sync_handler);
+		private->have_sync_handler = FALSE;
+	}
+
 	g_static_private_set (&private_key, NULL, NULL);
 }
 
@@ -391,6 +446,14 @@ tracker_store_sparql_update (const gchar *sparql,
 	}
 
 	tracker_data_update_sparql (sparql, error);
+
+	if (journal) {
+		write (fileno (journal), sparql, strlen (sparql));
+		write (fileno (journal), "\n", 1);
+
+		fsync (fileno (journal));
+	}
+
 }
 
 TrackerDBResultSet*



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