Commit e7be4210 authored by Carlos Garnacho's avatar Carlos Garnacho

tracker-miner-fs: Avoid multiple calls to extractor_process_failsafe()

The accounting of currently processed files has been also improved, all
to ensure extractor_process_failsafe() is called just once, and tasks
waiting for process_file_cb() don't sneak in and break failsafe
extraction.

Conflicts:

	src/miners/fs/tracker-miner-files.c
parent 52e75ceb
......@@ -138,6 +138,8 @@ struct TrackerMinerFilesPrivate {
guint failed_extraction_pause_cookie;
GList *extraction_queue;
GList *failed_extraction_queue;
gboolean failsafe_extraction;
};
enum {
......@@ -2055,6 +2057,7 @@ extractor_get_failsafe_metadata_cb (const gchar *preupdate,
{
ProcessFileData *data = user_data;
TrackerMinerFiles *miner = data->miner;
TrackerMinerFilesPrivate *priv = miner->private;
gchar *uri;
if (error) {
......@@ -2066,7 +2069,6 @@ extractor_get_failsafe_metadata_cb (const gchar *preupdate,
sparql_builder_finish (data, NULL, NULL);
g_error_free (error);
g_free (uri);
} else {
g_debug (" Extraction succeeded the second time");
......@@ -2077,6 +2079,8 @@ extractor_get_failsafe_metadata_cb (const gchar *preupdate,
* again, so we get the essential data in the store.
*/
tracker_miner_fs_file_notify (TRACKER_MINER_FS (miner), data->file, NULL);
priv->failed_extraction_queue = g_list_remove (priv->failed_extraction_queue, data);
process_file_data_free (data);
/* Get on to the next failed extraction, or resume miner */
......@@ -2121,7 +2125,31 @@ extractor_process_failsafe (TrackerMinerFiles *miner)
priv->failed_extraction_pause_cookie = 0;
}
priv->failsafe_extraction = FALSE;
}
}
static void
extractor_check_process_failsafe (TrackerMinerFiles *miner)
{
TrackerMinerFilesPrivate *priv;
priv = miner->private;
if (priv->failsafe_extraction) {
/* already on failsafe extraction */
return;
}
if (priv->extraction_queue ||
!priv->failed_extraction_queue) {
/* No reasons (yet) to start failsafe extraction */
return;
}
priv->failsafe_extraction = TRUE;
extractor_process_failsafe (miner);
}
static void
......@@ -2147,7 +2175,6 @@ extractor_get_embedded_metadata_cb (const gchar *preupdate,
uri = g_file_get_uri (data->file);
g_warning (" Got extraction DBus error on '%s': %s", uri, error->message);
/* Pause the miner until we've finished failsafe extraction retry */
if (priv->failed_extraction_pause_cookie != 0) {
priv->failed_extraction_pause_cookie =
tracker_miner_pause (TRACKER_MINER (data->miner),
......@@ -2163,8 +2190,6 @@ extractor_get_embedded_metadata_cb (const gchar *preupdate,
tracker_miner_fs_file_notify (TRACKER_MINER_FS (data->miner), data->file, error);
process_file_data_free (data);
}
g_error_free (error);
} else {
sparql_builder_finish (data, preupdate, sparql);
......@@ -2176,10 +2201,7 @@ extractor_get_embedded_metadata_cb (const gchar *preupdate,
/* Wait until there are no pending extraction requests
* before starting failsafe extraction process.
*/
if (!priv->extraction_queue &&
priv->failed_extraction_queue) {
extractor_process_failsafe (miner);
}
extractor_check_process_failsafe (miner);
}
static SendAndSpliceData *
......@@ -2524,7 +2546,7 @@ process_file_cb (GObject *object,
file = G_FILE (object);
sparql = data->sparql;
file_info = g_file_query_info_finish (file, result, &error);
priv = data->miner->private;
priv = TRACKER_MINER_FILES (data->miner)->private;
if (error) {
/* Something bad happened, notify about the error */
......@@ -2598,8 +2620,6 @@ process_file_cb (GObject *object,
miner_files_add_to_datasource (data->miner, file, sparql);
if (!is_directory) {
priv->extraction_queue = g_list_prepend (priv->extraction_queue, data);
/* Next step, if NOT a directory, get embedded metadata */
extractor_get_embedded_metadata (data, uri, mime_type);
} else {
......@@ -2607,6 +2627,9 @@ process_file_cb (GObject *object,
g_debug ("Avoiding embedded metadata request for directory '%s'", uri);
sparql_builder_finish (data, NULL, NULL);
tracker_miner_fs_file_notify (TRACKER_MINER_FS (data->miner), data->file, NULL);
priv->extraction_queue = g_list_remove (priv->extraction_queue, data);
extractor_check_process_failsafe (data->miner);
}
g_object_unref (file_info);
......@@ -2619,6 +2642,7 @@ miner_files_process_file (TrackerMinerFS *fs,
TrackerSparqlBuilder *sparql,
GCancellable *cancellable)
{
TrackerMinerFilesPrivate *priv;
ProcessFileData *data;
const gchar *attrs;
......@@ -2628,6 +2652,9 @@ miner_files_process_file (TrackerMinerFS *fs,
data->sparql = g_object_ref (sparql);
data->file = g_object_ref (file);
priv = TRACKER_MINER_FILES (fs)->private;
priv->extraction_queue = g_list_prepend (priv->extraction_queue, data);
attrs = G_FILE_ATTRIBUTE_STANDARD_TYPE ","
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE ","
G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME ","
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment