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 | |
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')
-rw-r--r-- | src/libtracker-common/tracker-debug.c | 1 | ||||
-rw-r--r-- | src/libtracker-common/tracker-debug.h | 1 | ||||
-rw-r--r-- | src/libtracker-sparql/core/tracker-data-update.c | 27 |
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); |