[tracker/wip/carlosg/update-perf: 7/18] core: Decouple FTS updates from previous property value lookups
- From: Carlos Garnacho <carlosg src gnome org>
 
- To: commits-list gnome org
 
- Cc: 
 
- Subject: [tracker/wip/carlosg/update-perf: 7/18] core: Decouple FTS updates from previous property value lookups
 
- Date: Tue, 23 Aug 2022 09:43:13 +0000 (UTC)
 
commit fa49717065853b3946d8b8256d6707a3a98d0a70
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sat Aug 20 18:46:16 2022 +0200
    core: Decouple FTS updates from previous property value lookups
    
    Right now, FTS updates do iterate the set of previously looked up
    properties in order to find the FTS ones and issue the FTS update.
    
    We want to optimize on fetching the old values for properties, and
    FTS is orthogonal to it, so decouple both machineries. As a replacement
    keep a list of FTS properties that were modified, so that these are
    updated when flushing.
 src/libtracker-sparql/core/tracker-data-update.c | 115 ++++++++++-------------
 1 file changed, 51 insertions(+), 64 deletions(-)
---
diff --git a/src/libtracker-sparql/core/tracker-data-update.c 
b/src/libtracker-sparql/core/tracker-data-update.c
index 930ade036..25ece7ddd 100644
--- a/src/libtracker-sparql/core/tracker-data-update.c
+++ b/src/libtracker-sparql/core/tracker-data-update.c
@@ -134,7 +134,7 @@ struct _TrackerDataUpdateBufferResource {
        /* TrackerClass */
        GPtrArray *types;
 
-       gboolean fts_updated;
+       GList *fts_properties;
 };
 
 struct _TrackerStatementDelegate {
@@ -1404,6 +1404,7 @@ static void resource_buffer_free (TrackerDataUpdateBufferResource *resource)
 {
        g_clear_pointer (&resource->predicates, g_hash_table_unref);
 
+       g_list_free (resource->fts_properties);
        g_ptr_array_free (resource->types, TRUE);
        resource->types = NULL;
 
@@ -1420,6 +1421,7 @@ tracker_data_update_buffer_flush (TrackerData  *data,
        GHashTableIter iter;
        GError *actual_error = NULL;
        const gchar *database;
+       GList *l;
        guint i;
 
        if (data->update_buffer.update_log->len == 0)
@@ -1432,38 +1434,27 @@ tracker_data_update_buffer_flush (TrackerData  *data,
                g_hash_table_iter_init (&iter, graph->resources);
 
                while (g_hash_table_iter_next (&iter, NULL, (gpointer*) &resource)) {
-                       if (resource->fts_updated && !resource->create) {
-                               TrackerProperty *prop;
-                               GArray *values;
-                               GHashTableIter prop_iter;
+                       if (resource->fts_properties && !resource->create) {
                                GPtrArray *properties;
                                gboolean retval;
 
-                               properties = NULL;
+                               properties = g_ptr_array_sized_new (8);
                                database = resource->graph->graph ? resource->graph->graph : "main";
-                               g_hash_table_iter_init (&prop_iter, resource->predicates);
-                               while (g_hash_table_iter_next (&prop_iter, (gpointer*) &prop, (gpointer*) 
&values)) {
-                                       if (tracker_property_get_fulltext_indexed (prop)) {
-                                               if (!properties)
-                                                       properties = g_ptr_array_new ();
-
-                                               g_ptr_array_add (properties, (gpointer) 
tracker_property_get_name (prop));
-                                       }
-                               }
 
-                               if (properties) {
-                                       g_ptr_array_add (properties, NULL);
+                               for (l = resource->fts_properties; l; l = l->next)
+                                       g_ptr_array_add (properties, (gpointer) tracker_property_get_name 
(l->data));
 
-                                       retval = tracker_db_interface_sqlite_fts_delete_text (iface,
-                                                                                             database,
-                                                                                             resource->id,
-                                                                                             (const gchar 
**) properties->pdata,
-                                                                                             error);
-                                       g_ptr_array_free (properties, TRUE);
+                               g_ptr_array_add (properties, NULL);
 
-                                       if (!retval)
-                                               goto out;
-                               }
+                               retval = tracker_db_interface_sqlite_fts_delete_text (iface,
+                                                                                     database,
+                                                                                     resource->id,
+                                                                                     (const gchar **) 
properties->pdata,
+                                                                                     error);
+                               g_ptr_array_free (properties, TRUE);
+
+                               if (!retval)
+                                       goto out;
                        }
                }
        }
@@ -1476,38 +1467,27 @@ tracker_data_update_buffer_flush (TrackerData  *data,
                g_hash_table_iter_init (&iter, graph->resources);
 
                while (g_hash_table_iter_next (&iter, NULL, (gpointer*) &resource)) {
-                       if (resource->fts_updated) {
-                               TrackerProperty *prop;
-                               GArray *values;
-                               GHashTableIter prop_iter;
+                       if (resource->fts_properties) {
                                GPtrArray *properties;
                                gboolean retval;
 
-                               properties = NULL;
+                               properties = g_ptr_array_sized_new (8);
                                database = resource->graph->graph ? resource->graph->graph : "main";
-                               g_hash_table_iter_init (&prop_iter, resource->predicates);
-                               while (g_hash_table_iter_next (&prop_iter, (gpointer*) &prop, (gpointer*) 
&values)) {
-                                       if (tracker_property_get_fulltext_indexed (prop)) {
-                                               if (!properties)
-                                                       properties = g_ptr_array_new ();
-
-                                               g_ptr_array_add (properties, (gpointer) 
tracker_property_get_name (prop));
-                                       }
-                               }
 
-                               if (properties) {
-                                       g_ptr_array_add (properties, NULL);
+                               for (l = resource->fts_properties; l; l = l->next)
+                                       g_ptr_array_add (properties, (gpointer) tracker_property_get_name 
(l->data));
 
-                                       retval = tracker_db_interface_sqlite_fts_update_text (iface,
-                                                                                             database,
-                                                                                             resource->id,
-                                                                                             (const gchar 
**) properties->pdata,
-                                                                                             error);
-                                       g_ptr_array_free (properties, TRUE);
+                               g_ptr_array_add (properties, NULL);
 
-                                       if (!retval)
-                                               goto out;
-                               }
+                               retval = tracker_db_interface_sqlite_fts_update_text (iface,
+                                                                                     database,
+                                                                                     resource->id,
+                                                                                     (const gchar **) 
properties->pdata,
+                                                                                     error);
+                               g_ptr_array_free (properties, TRUE);
+
+                               if (!retval)
+                                       goto out;
                        }
                }
 
@@ -1974,6 +1954,20 @@ maybe_convert_value (TrackerData         *data,
        return FALSE;
 }
 
+static void
+maybe_append_fts_property (TrackerData     *data,
+                           TrackerProperty *property)
+{
+       if (!tracker_property_get_fulltext_indexed (property))
+               return;
+
+       if (g_list_find (data->resource_buffer->fts_properties, property))
+               return;
+
+       data->resource_buffer->fts_properties =
+               g_list_prepend (data->resource_buffer->fts_properties, property);
+}
+
 static gboolean
 cache_insert_metadata_decomposed (TrackerData      *data,
                                   TrackerProperty  *property,
@@ -2024,8 +2018,7 @@ cache_insert_metadata_decomposed (TrackerData      *data,
        super_properties = tracker_property_get_super_properties (property);
        multiple_values = tracker_property_get_multiple_values (property);
 
-       data->resource_buffer->fts_updated |=
-               tracker_property_get_fulltext_indexed (property);
+       maybe_append_fts_property (data, property);
 
        while (*super_properties) {
                gboolean super_is_multi;
@@ -2040,8 +2033,7 @@ cache_insert_metadata_decomposed (TrackerData      *data,
                        return FALSE;
                }
 
-               data->resource_buffer->fts_updated |=
-                       tracker_property_get_fulltext_indexed (*super_properties);
+               maybe_append_fts_property (data, *super_properties);
 
                if (maybe_convert_value (data,
                                         tracker_property_get_data_type (property),
@@ -2165,8 +2157,7 @@ delete_metadata_decomposed (TrackerData      *data,
 
        multiple_values = tracker_property_get_multiple_values (property);
 
-       data->resource_buffer->fts_updated |=
-               tracker_property_get_fulltext_indexed (property);
+       maybe_append_fts_property (data, property);
 
        /* read existing property values */
        old_values = get_property_values (data, property, &new_error);
@@ -2331,8 +2322,7 @@ cache_delete_resource_type_full (TrackerData   *data,
 
                multiple_values = tracker_property_get_multiple_values (prop);
 
-               data->resource_buffer->fts_updated |=
-                       tracker_property_get_fulltext_indexed (prop);
+               maybe_append_fts_property (data, prop);
 
                old_values = get_property_values (data, prop, error);
                if (!old_values)
@@ -2480,7 +2470,6 @@ resource_buffer_switch (TrackerData   *data,
                resource_buffer->id = subject;
                resource_buffer->create = create;
 
-               resource_buffer->fts_updated = FALSE;
                if (resource_buffer->create) {
                        resource_buffer->types = g_ptr_array_new ();
                } else {
@@ -2885,8 +2874,7 @@ tracker_data_update_statement (TrackerData      *data,
                if (!resource_buffer_switch (data, graph, subject, error))
                        return;
 
-               data->resource_buffer->fts_updated |=
-                       tracker_property_get_fulltext_indexed (predicate);
+               maybe_append_fts_property (data, predicate);
 
                log_entry_for_multi_value_property (data,
                                                    TRACKER_LOG_MULTIVALUED_PROPERTY_CLEAR,
@@ -2900,8 +2888,7 @@ tracker_data_update_statement (TrackerData      *data,
                if (!resource_buffer_switch (data, graph, subject, error))
                        return;
 
-               data->resource_buffer->fts_updated |=
-                       tracker_property_get_fulltext_indexed (predicate);
+               maybe_append_fts_property (data, predicate);
 
                if (!delete_single_valued (data, graph, subject, predicate,
                                           !tracker_property_get_multiple_values (predicate),
[
Date Prev][
Date Next]   [
Thread Prev][
Thread Next]   
[
Thread Index]
[
Date Index]
[
Author Index]