diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2022-10-24 15:24:30 +0200 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2022-10-24 15:30:14 +0200 |
commit | e012d3756b0c738f7b69f1d06eeaea8d8bf2a475 (patch) | |
tree | cf76b1b0499430d964a502ca9dca162db505d746 /src | |
parent | 7c66946a6dd4cfaff2dfe7952417f34ed91b3854 (diff) | |
download | tracker-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.c | 14 |
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); |