summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2022-10-24 15:24:30 +0200
committerCarlos Garnacho <carlosg@gnome.org>2022-10-24 15:30:14 +0200
commite012d3756b0c738f7b69f1d06eeaea8d8bf2a475 (patch)
treecf76b1b0499430d964a502ca9dca162db505d746 /src
parent7c66946a6dd4cfaff2dfe7952417f34ed91b3854 (diff)
downloadtracker-e012d3756b0c738f7b69f1d06eeaea8d8bf2a475.tar.gz
libtracker-sparql/core: Ensure update log flushing harder
Our update log is a fixed size, we (usually) try hard that it remains within it, and avoid GArray resizes which in turn result in GHashTable entries suddenly pointing to invalid memory. This however may break if many multivalued property additions on the same graph/subject/predicate happen. This is seen in valgrind as: ==477545== Invalid read of size 8 ==477545== at 0x4C67E9A: tracker_data_log_entry_equal (tracker-data-update.c:231) ==477545== by 0x48E4AF1: UnknownInlinedFun (ghash.c:495) ==477545== by 0x48E4AF1: g_hash_table_lookup (ghash.c:1540) ==477545== by 0x4C685F7: log_entry_for_single_value_property (tracker-data-update.c:768) ==477545== by 0x4C6A4A4: cache_insert_metadata_decomposed (tracker-data-update.c:2215) ==477545== by 0x4C6C1DD: tracker_data_insert_statement_with_string (tracker-data-update.c:2922) ==477545== by 0x4C6C400: tracker_data_insert_statement (tracker-data-update.c:2826) ==477545== by 0x4C8F94D: tracker_sparql_apply_quad (tracker-sparql.c:2239) ==477545== by 0x4C8FC66: translate_GraphNode (tracker-sparql.c:7466) ==477545== by 0x4C8219F: _call_rule_func (tracker-sparql.c:9805) ==477545== by 0x4C82636: translate_Object (tracker-sparql.c:6537) ==477545== by 0x4C8219F: _call_rule_func (tracker-sparql.c:9805) ==477545== by 0x4C89655: translate_ObjectList (tracker-sparql.c:6522) ==477545== by 0x4C8219F: _call_rule_func (tracker-sparql.c:9805) ==477545== by 0x4C8C47D: translate_PropertyListNotEmpty (tracker-sparql.c:6491) ==477545== by 0x4C8219F: _call_rule_func (tracker-sparql.c:9805) ==477545== by 0x4C82995: translate_TriplesSameSubject (tracker-sparql.c:6406) ==477545== by 0x4C8219F: _call_rule_func (tracker-sparql.c:9805) ==477545== by 0x4C84E3E: translate_TriplesTemplate (tracker-sparql.c:5206) ==477545== by 0x4C8219F: _call_rule_func (tracker-sparql.c:9805) ==477545== by 0x4C84ECF: translate_TriplesTemplate (tracker-sparql.c:5210) ==477545== by 0x4C8219F: _call_rule_func (tracker-sparql.c:9805) ==477545== by 0x4C84ECF: translate_TriplesTemplate (tracker-sparql.c:5210) ==477545== by 0x4C8219F: _call_rule_func (tracker-sparql.c:9805) ==477545== by 0x4C84ECF: translate_TriplesTemplate (tracker-sparql.c:5210) ==477545== by 0x4C8219F: _call_rule_func (tracker-sparql.c:9805) ==477545== by 0x4C84ECF: translate_TriplesTemplate (tracker-sparql.c:5210) ==477545== by 0x4C8219F: _call_rule_func (tracker-sparql.c:9805) ==477545== by 0x4C84ECF: translate_TriplesTemplate (tracker-sparql.c:5210) ==477545== by 0x4C8219F: _call_rule_func (tracker-sparql.c:9805) ==477545== by 0x4C84ECF: translate_TriplesTemplate (tracker-sparql.c:5210) ==477545== Address 0x8688768 is 104 bytes inside a block of size 4,096 free'd ==477545== at 0x48466AF: realloc (vg_replace_malloc.c:1437) ==477545== by 0x49095BF: g_realloc (gmem.c:201) ==477545== by 0x48CEF52: g_array_maybe_expand (garray.c:1000) ==477545== by 0x48CF2DF: g_array_append_vals (garray.c:528) ==477545== by 0x4C68797: log_entry_for_multi_value_property (tracker-data-update.c:748) ==477545== by 0x4C6A433: cache_insert_metadata_decomposed (tracker-data-update.c:2211) ==477545== by 0x4C6BFF9: tracker_data_insert_statement_with_uri (tracker-data-update.c:2880) ==477545== by 0x4C6C497: tracker_data_insert_statement (tracker-data-update.c:2824) ==477545== by 0x4C8F94D: tracker_sparql_apply_quad (tracker-sparql.c:2239) ==477545== by 0x4C8FC66: translate_GraphNode (tracker-sparql.c:7466) ==477545== by 0x4C8219F: _call_rule_func (tracker-sparql.c:9805) ==477545== by 0x4C82636: translate_Object (tracker-sparql.c:6537) ==477545== by 0x4C89769: _call_rule_func (tracker-sparql.c:9805) ==477545== by 0x4C89769: translate_ObjectList (tracker-sparql.c:6525) ==477545== by 0x4C8219F: _call_rule_func (tracker-sparql.c:9805) ==477545== by 0x4C8C47D: translate_PropertyListNotEmpty (tracker-sparql.c:6491) ==477545== by 0x4C8219F: _call_rule_func (tracker-sparql.c:9805) ==477545== by 0x4C82995: translate_TriplesSameSubject (tracker-sparql.c:6406) ==477545== by 0x4C8219F: _call_rule_func (tracker-sparql.c:9805) ==477545== by 0x4C84E3E: translate_TriplesTemplate (tracker-sparql.c:5206) ==477545== by 0x4C8219F: _call_rule_func (tracker-sparql.c:9805) ==477545== by 0x4C84ECF: translate_TriplesTemplate (tracker-sparql.c:5210) ==477545== by 0x4C8219F: _call_rule_func (tracker-sparql.c:9805) ==477545== by 0x4C84ECF: translate_TriplesTemplate (tracker-sparql.c:5210) ==477545== by 0x4C8219F: _call_rule_func (tracker-sparql.c:9805) ==477545== by 0x4C84ECF: translate_TriplesTemplate (tracker-sparql.c:5210) ==477545== by 0x4C8219F: _call_rule_func (tracker-sparql.c:9805) ==477545== by 0x4C84ECF: translate_TriplesTemplate (tracker-sparql.c:5210) ==477545== by 0x4C8219F: _call_rule_func (tracker-sparql.c:9805) ==477545== by 0x4C84ECF: translate_TriplesTemplate (tracker-sparql.c:5210) ==477545== by 0x4C8219F: _call_rule_func (tracker-sparql.c:9805) ==477545== Block was alloc'd at ==477545== at 0x484178A: malloc (vg_replace_malloc.c:380) ==477545== by 0x484670B: realloc (vg_replace_malloc.c:1437) ==477545== by 0x49095BF: g_realloc (gmem.c:201) ==477545== by 0x48CEF52: g_array_maybe_expand (garray.c:1000) ==477545== by 0x48CF07C: g_array_sized_new (garray.c:287) ==477545== by 0x4C6C942: tracker_data_begin_transaction (tracker-data-update.c:3056) ==477545== by 0x4C6C995: tracker_data_begin_ontology_transaction (tracker-data-update.c:3081) ==477545== by 0x4C63F2E: tracker_data_manager_initable_init (tracker-data-manager.c:4317) ==477545== by 0x4C9E724: tracker_direct_connection_initable_init (tracker-direct.c:493) ==477545== by 0x4A656B7: g_initable_new_valist (ginitable.c:250) ==477545== by 0x4A657AC: g_initable_new (ginitable.c:164) ==477545== by 0x4C9F5AB: tracker_direct_connection_new (tracker-direct.c:1562) ==477545== by 0x4C47D20: tracker_sparql_connection_new (tracker-connection.c:1025) ==477545== by 0x40AF7B: setup_connection_and_endpoint (tracker-main.c:823) ==477545== by 0x40AF7B: main (tracker-main.c:1062) Ensure to flush harder, even if the resource would stay the same, this avoids the log array from growing past this fixed limit.
Diffstat (limited to 'src')
-rw-r--r--src/libtracker-sparql/core/tracker-data-update.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/src/libtracker-sparql/core/tracker-data-update.c b/src/libtracker-sparql/core/tracker-data-update.c
index 0347877b9..c675f6da6 100644
--- a/src/libtracker-sparql/core/tracker-data-update.c
+++ b/src/libtracker-sparql/core/tracker-data-update.c
@@ -2521,13 +2521,6 @@ resource_buffer_switch (TrackerData *data,
TrackerDataUpdateBufferGraph *graph_buffer;
GError *inner_error = NULL;
- if (data->resource_buffer != NULL &&
- g_strcmp0 (data->resource_buffer->graph->graph, graph) == 0 &&
- data->resource_buffer->id == subject) {
- /* Resource buffer stays the same */
- return TRUE;
- }
-
/* large INSERTs with thousands of resources could lead to
high peak memory usage due to the update buffer
flush the buffer if it already contains 1000 resources */
@@ -2535,6 +2528,13 @@ resource_buffer_switch (TrackerData *data,
if (inner_error)
return FALSE;
+ if (data->resource_buffer != NULL &&
+ g_strcmp0 (data->resource_buffer->graph->graph, graph) == 0 &&
+ data->resource_buffer->id == subject) {
+ /* Resource buffer stays the same */
+ return TRUE;
+ }
+
data->resource_buffer = NULL;
graph_buffer = ensure_graph_buffer (&data->update_buffer, data, graph, error);