summaryrefslogtreecommitdiff
path: root/src/trackerd
diff options
context:
space:
mode:
authorCarlos Garnacho <carlos@imendio.com>2009-03-06 15:16:15 +0000
committerCarlos Garnacho <carlosg@src.gnome.org>2009-03-06 15:16:15 +0000
commitd65482ae462a14b7e3d5450f698c4207f95a0ea4 (patch)
tree1b0f71795ed24fa26737ded59e29ef8b1c3a314c /src/trackerd
parentb3983c626c6d21aa9fd7fb45cd6e72d77a7f9a05 (diff)
downloadtracker-d65482ae462a14b7e3d5450f698c4207f95a0ea4.tar.gz
Clean up deleted elements from dbs/index on tracker-indexer idle time.
2009-03-06 Carlos Garnacho <carlos@imendio.com> Clean up deleted elements from dbs/index on tracker-indexer idle time. This is the equivalent to dud hits removal, which trackerd can't perform since it opens the index files as readonly. Now services are just marked as disabled on deletion. So the indexer cleans them up slowly, after all elements have been processed, and before it shuts down. * data/db/sqlite-service.sql: Create the new table for deleted elements. * data/db/sqlite-stored-procs.sql: Add stored procedures for disabling services and dealing with the DeletedServices table. * src/libtracker-data/tracker-data-query.[ch] (tracker_data_query_metadata_fields): Do not have service ID as a string argument. (tracker_data_query_first_removed_service): New function to retrieve a deleted file. * src/trackerd/tracker-metadata.c (tracker_metadata_get): Adapt to API change in tracker-data-query.[ch] * src/libtracker-data/tracker-data-search.c (tracker_data_search_text): Remove code to clean up dud hits. * src/libtracker-data/tracker-data-update.[ch] (tracker_data_update_disable_service): Add function to disable a service. (tracker_data_update_delete_service): Also remove the service from the DeletedServices table. * src/libtracker-db/tracker-db-index.[ch] (tracker_db_index_finalize): Ensure the index is opened before flushing. (tracker_db_index_remove_dud_hits): Removed. * src/tracker-indexer/tracker-indexer.[ch] (cleanup_task_func) (cleanup_task_start) (cleanup_task_stop) (state_check): Add "cleanup" state (check_started): Also ensure the cleanup task is stopped. (check_finished): Launch the cleanup task from here. (item_remove): Renamed to item_mark_for_removal(). No longer delete things from the databases, just mark them as disabled. Queue children to be removed in the file queue. (item_erase): Added, actually delete the item from databases and index. (item_move): Erase immediately in case the dest path already exists. (tracker_indexer_get_running) (tracker_indexer_get_stoppable): Separate these a bit since the indexer now also must be paused during cleanup. * src/tracker-indexer/tracker-main.c (quit_timeout_cb): Use tracker_indexer_get_stoppable() to get to know whether the indexer should be stopped. * src/trackerd/tracker-dbus.c (indexer_name_owner_changed) (initialize_indexer_presence) (dbus_register_names): Listen for changes in the tracker-indexer presence... (dbus_request_new_cb): ... in order to pause it here if necessary, since now it should always be paused. svn path=/trunk/; revision=3026
Diffstat (limited to 'src/trackerd')
-rw-r--r--src/trackerd/tracker-dbus.c59
-rw-r--r--src/trackerd/tracker-metadata.c15
2 files changed, 58 insertions, 16 deletions
diff --git a/src/trackerd/tracker-dbus.c b/src/trackerd/tracker-dbus.c
index 4f954e27f..3866fbba6 100644
--- a/src/trackerd/tracker-dbus.c
+++ b/src/trackerd/tracker-dbus.c
@@ -53,11 +53,16 @@
#define INDEXER_PAUSE_TIME_FOR_REQUESTS 5 /* seconds */
+#define TRACKER_INDEXER_SERVICE "org.freedesktop.Tracker.Indexer"
+#define TRACKER_INDEXER_PATH "/org/freedesktop/Tracker/Indexer"
+#define TRACKER_INDEXER_INTERFACE "org.freedesktop.Tracker.Indexer"
+
static DBusGConnection *connection;
static DBusGProxy *gproxy;
static DBusGProxy *proxy_for_indexer;
static GSList *objects;
static guint indexer_resume_timeout_id;
+static gboolean indexer_available;
static gboolean
dbus_register_service (DBusGProxy *proxy,
@@ -108,10 +113,34 @@ dbus_register_object (DBusGConnection *lconnection,
}
static void
-dbus_name_owner_changed (gpointer data,
- GClosure *closure)
+indexer_name_owner_changed (DBusGProxy *proxy,
+ const char *name,
+ const char *prev_owner,
+ const char *new_owner,
+ TrackerXesam *self)
+{
+ if (strcmp (name, TRACKER_INDEXER_SERVICE) == 0) {
+ if (!new_owner || !*new_owner) {
+ g_debug ("Indexer no longer present");
+ indexer_available = FALSE;
+ } else {
+ g_debug ("Indexer has become present");
+ indexer_available = TRUE;
+ }
+ }
+}
+
+static void
+initialize_indexer_presence (DBusGProxy *proxy)
{
- g_object_unref (data);
+ gchar *owner;
+
+ if (org_freedesktop_DBus_get_name_owner (gproxy, TRACKER_INDEXER_SERVICE, &owner, NULL)) {
+ indexer_available = (owner != NULL);
+ g_free (owner);
+ } else {
+ indexer_available = FALSE;
+ }
}
static gboolean
@@ -146,6 +175,17 @@ dbus_register_names (TrackerConfig *config)
DBUS_PATH_DBUS,
DBUS_INTERFACE_DBUS);
+ /* Register signals to know about tracker-indexer presence */
+ dbus_g_proxy_add_signal (gproxy, "NameOwnerChanged",
+ G_TYPE_STRING, G_TYPE_STRING,
+ G_TYPE_STRING, G_TYPE_INVALID);
+
+ dbus_g_proxy_connect_signal (gproxy, "NameOwnerChanged",
+ G_CALLBACK (indexer_name_owner_changed),
+ NULL, NULL);
+
+ initialize_indexer_presence (gproxy);
+
/* Register the service name for org.freedesktop.Tracker */
if (!dbus_register_service (gproxy, TRACKER_DAEMON_SERVICE)) {
return FALSE;
@@ -205,9 +245,8 @@ dbus_request_new_cb (guint request_id,
return;
}
- /* Don't try to pause unless we are in particular states */
- if (status != TRACKER_STATUS_INDEXING) {
- g_message ("New DBus request, not pausing indexer, not in indexing state");
+ if (!indexer_available) {
+ g_message ("New DBus request, not pausing indexer, since it's not there");
return;
}
@@ -412,7 +451,7 @@ tracker_dbus_register_objects (TrackerConfig *config,
dbus_g_proxy_connect_signal (gproxy, "NameOwnerChanged",
G_CALLBACK (tracker_xesam_name_owner_changed),
g_object_ref (G_OBJECT (object)),
- dbus_name_owner_changed);
+ (GClosureNotify) g_object_unref);
}
/* Reverse list since we added objects at the top each time */
@@ -446,9 +485,9 @@ tracker_dbus_indexer_get_proxy (void)
if (!proxy_for_indexer) {
/* Get proxy for Service / Path / Interface of the indexer */
proxy_for_indexer = dbus_g_proxy_new_for_name (connection,
- "org.freedesktop.Tracker.Indexer",
- "/org/freedesktop/Tracker/Indexer",
- "org.freedesktop.Tracker.Indexer");
+ TRACKER_INDEXER_SERVICE,
+ TRACKER_INDEXER_PATH,
+ TRACKER_INDEXER_INTERFACE);
if (!proxy_for_indexer) {
g_critical ("Couldn't create a DBusGProxy to the indexer service");
diff --git a/src/trackerd/tracker-metadata.c b/src/trackerd/tracker-metadata.c
index e251d639f..7baa6c470 100644
--- a/src/trackerd/tracker-metadata.c
+++ b/src/trackerd/tracker-metadata.c
@@ -77,7 +77,8 @@ tracker_metadata_get (TrackerMetadata *object,
TrackerDBResultSet *result_set;
guint request_id;
const gchar *service_result;
- gchar *service_id;
+ guint32 service_id;
+ gchar *service_id_str;
guint i;
gchar **values;
GError *actual_error = NULL;
@@ -104,8 +105,9 @@ tracker_metadata_get (TrackerMetadata *object,
return;
}
- service_id = tracker_data_query_file_id_as_string (service_type, uri);
- if (!service_id) {
+ service_id = tracker_data_query_file_id (service_type, uri);
+
+ if (service_id <= 0) {
tracker_dbus_request_failed (request_id,
&actual_error,
"Service URI '%s' not found",
@@ -138,7 +140,6 @@ tracker_metadata_get (TrackerMetadata *object,
service_result = tracker_data_query_service_type_by_id (iface, service_id);
if (!service_result) {
- g_free (service_id);
tracker_dbus_request_failed (request_id,
&actual_error,
"Service type can not be found for entity '%s'",
@@ -148,7 +149,10 @@ tracker_metadata_get (TrackerMetadata *object,
return;
}
- result_set = tracker_data_query_metadata_fields (iface, service_result, service_id, keys);
+ service_id_str = tracker_guint_to_string (service_id);
+ result_set = tracker_data_query_metadata_fields (iface, service_result, service_id_str, keys);
+ g_free (service_id_str);
+
if (result_set) {
values = tracker_dbus_query_result_columns_to_strv (result_set, -1, -1, TRUE);
g_object_unref (result_set);
@@ -166,7 +170,6 @@ tracker_metadata_get (TrackerMetadata *object,
dbus_g_method_return (context, values);
g_strfreev (values);
- g_free (service_id);
tracker_dbus_request_success (request_id);
}