summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2023-01-23 13:11:43 +0100
committerCarlos Garnacho <carlosg@gnome.org>2023-01-23 15:51:36 +0100
commit6555ef2c8d5c7933f1d8be3d79671a9a4ed99282 (patch)
treecf9e62a1c3f0a7dfaf38f5f8422c3cc59cc656a4 /src
parentb7f0bd26bdf257ad18de40bcd5aab2dee0bdda74 (diff)
downloadtracker-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')
-rw-r--r--src/libtracker-common/tracker-debug.c1
-rw-r--r--src/libtracker-common/tracker-debug.h1
-rw-r--r--src/libtracker-sparql/core/tracker-data-update.c27
3 files changed, 29 insertions, 0 deletions
diff --git a/src/libtracker-common/tracker-debug.c b/src/libtracker-common/tracker-debug.c
index 2843ca691..3aa15e14d 100644
--- a/src/libtracker-common/tracker-debug.c
+++ b/src/libtracker-common/tracker-debug.c
@@ -28,6 +28,7 @@ static const GDebugKey tracker_debug_keys[] = {
{ "sqlite", TRACKER_DEBUG_SQLITE },
{ "sparql", TRACKER_DEBUG_SPARQL },
{ "sql-statements", TRACKER_DEBUG_SQL_STATEMENTS },
+ { "fts-integrity", TRACKER_DEBUG_FTS_INTEGRITY },
};
#endif /* G_ENABLE_DEBUG */
diff --git a/src/libtracker-common/tracker-debug.h b/src/libtracker-common/tracker-debug.h
index 59da04240..37a302e94 100644
--- a/src/libtracker-common/tracker-debug.h
+++ b/src/libtracker-common/tracker-debug.h
@@ -34,6 +34,7 @@ typedef enum {
TRACKER_DEBUG_SPARQL = 1 << 3,
TRACKER_DEBUG_SQLITE = 1 << 4,
TRACKER_DEBUG_SQL_STATEMENTS = 1 << 5,
+ TRACKER_DEBUG_FTS_INTEGRITY = 1 << 6,
} TrackerDebugFlag;
#ifdef G_ENABLE_DEBUG
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);