[tracker/urho-sync] Experiment for journal synchronization mode
- From: Philip Van Hoof <pvanhoof src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [tracker/urho-sync] Experiment for journal synchronization mode
- Date: Fri, 31 Jul 2009 15:42:28 +0000 (UTC)
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]