diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2023-01-23 13:11:43 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2023-01-23 15:51:36 +0100 |
commit | 6555ef2c8d5c7933f1d8be3d79671a9a4ed99282 (patch) | |
tree | cf9e62a1c3f0a7dfaf38f5f8422c3cc59cc656a4 /src/libtracker-sparql | |
parent | b7f0bd26bdf257ad18de40bcd5aab2dee0bdda74 (diff) | |
download | tracker-6555ef2c8d5c7933f1d8be3d79671a9a4ed99282.tar.gz |
libtracker-common: Add 'fts-integrity' debug flag
This debug flag forces a FTS integrity check after every set of FTS
updates, and raises an error if the integrity check did fail. This
is a more proactive (and expensive) approach to finding out FTS index
corruptions.
In order to make this helpful right away, toggle this flag on for
our own test suite, so that CI may catch any remaining/popping issues.
Diffstat (limited to 'src/libtracker-sparql')
-rw-r--r-- | src/libtracker-sparql/core/tracker-data-update.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/libtracker-sparql/core/tracker-data-update.c b/src/libtracker-sparql/core/tracker-data-update.c index 1a3789cc4..e564fdaf0 100644 --- a/src/libtracker-sparql/core/tracker-data-update.c +++ b/src/libtracker-sparql/core/tracker-data-update.c @@ -1578,6 +1578,7 @@ tracker_data_update_buffer_flush (TrackerData *data, TrackerDataUpdateBufferResource *resource; GHashTableIter iter; GError *actual_error = NULL; + G_GNUC_UNUSED gboolean fts_updated = FALSE; guint i; if (data->update_buffer.update_log->len == 0) @@ -1589,6 +1590,7 @@ tracker_data_update_buffer_flush (TrackerData *data, while (g_hash_table_iter_next (&iter, NULL, (gpointer*) &resource)) { if (resource->fts_update && !resource->create) { + fts_updated = TRUE; if (!tracker_data_ensure_graph_fts_stmts (data, graph, error)) @@ -1611,6 +1613,7 @@ tracker_data_update_buffer_flush (TrackerData *data, while (g_hash_table_iter_next (&iter, NULL, (gpointer*) &resource)) { if (resource->fts_update) { + fts_updated = TRUE; if (!tracker_data_ensure_graph_fts_stmts (data, graph, error)) @@ -1633,6 +1636,30 @@ tracker_data_update_buffer_flush (TrackerData *data, g_array_set_size (graph->refcounts, 0); } +#ifdef G_ENABLE_DEBUG + if (fts_updated && TRACKER_DEBUG_CHECK (FTS_INTEGRITY)) { + TrackerDBInterface *iface; + + iface = tracker_data_manager_get_writable_db_interface (data->manager); + + for (i = 0; i < data->update_buffer.graphs->len; i++) { + const gchar *database; + + graph = g_ptr_array_index (data->update_buffer.graphs, i); + database = graph->graph ? graph->graph : "main"; + + if (!tracker_db_interface_sqlite_fts_integrity_check (iface, database)) { + g_set_error (error, + TRACKER_DB_INTERFACE_ERROR, + TRACKER_DB_CORRUPT, + "FTS index is corrupt in %s", + graph->graph ? graph->graph : "default graph"); + goto out; + } + } + } +#endif + out: g_hash_table_remove_all (data->update_buffer.new_resources); g_hash_table_remove_all (data->update_buffer.class_updates); |