diff options
author | Carlos Garnacho <carlos@imendio.com> | 2009-03-06 15:16:15 +0000 |
---|---|---|
committer | Carlos Garnacho <carlosg@src.gnome.org> | 2009-03-06 15:16:15 +0000 |
commit | d65482ae462a14b7e3d5450f698c4207f95a0ea4 (patch) | |
tree | 1b0f71795ed24fa26737ded59e29ef8b1c3a314c /src/trackerd | |
parent | b3983c626c6d21aa9fd7fb45cd6e72d77a7f9a05 (diff) | |
download | tracker-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.c | 59 | ||||
-rw-r--r-- | src/trackerd/tracker-metadata.c | 15 |
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); } |