summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2022-07-17 01:28:36 +0200
committerCarlos Garnacho <carlosg@gnome.org>2022-08-09 02:21:11 +0200
commitc3f53e4b6eb7d1a90dbb0e6981b3a273a314c277 (patch)
treea3fec7231f88e7ffcd84e34d966f106b0f406516
parentb08f4768357593b426723ebcf62098be16669db3 (diff)
downloadtracker-c3f53e4b6eb7d1a90dbb0e6981b3a273a314c277.tar.gz
libtracker-sparql: Reply earlier to D-Bus query messages in endpoints
Currently, the endpoint waits to write the full cursor contents before replying to a Query D-Bus request. This relies on the caller side simultaneously issuing the D-Bus request and reading all data from the cursor, so that on the endpoint side writing the cursor does not end up blocking when the buffer grew too large. This relies on the bus TrackerSparqlConnection side doing exactly that, and splicing all cursor contents in a memory buffer, This is however not friendly to an approach using input streams, since the TrackerSparqlConnection side would read pipe contents incrementally while iterating the cursor, but it didn't get it yet since the endpoint will end up clogging the pipe and the Query request will not be replied. In order to fix this, reply the D-Bus request before writing the cursor contents, so that the other end can get ahead with creating a TrackerSparqlCursor that will stream the contents during iteration. As a result the errors happening during writes are not forwarded to the other end anymore, but since they would mostly consist of write errors, it sounds likely the other end had some involvement in that (e.g. dying or prematurely closing the cursor). (cherry-picked from commit 425411307ea0487279fb768dd69368da4ac59bd4)
-rw-r--r--src/libtracker-sparql/tracker-endpoint-dbus.c9
1 files changed, 3 insertions, 6 deletions
diff --git a/src/libtracker-sparql/tracker-endpoint-dbus.c b/src/libtracker-sparql/tracker-endpoint-dbus.c
index c6735603d..917342563 100644
--- a/src/libtracker-sparql/tracker-endpoint-dbus.c
+++ b/src/libtracker-sparql/tracker-endpoint-dbus.c
@@ -432,13 +432,10 @@ handle_cursor_reply (GTask *task,
for (i = 0; i < n_columns; i++)
variable_names[i] = tracker_sparql_cursor_get_variable_name (cursor, i);
- write_cursor (request, cursor, &write_error);
-
- if (write_error)
- g_dbus_method_invocation_return_gerror (request->invocation, write_error);
- else
- g_dbus_method_invocation_return_value (request->invocation, g_variant_new ("(^as)", variable_names));
+ g_dbus_method_invocation_return_value (request->invocation, g_variant_new ("(^as)", variable_names));
+ if (!write_cursor (request, cursor, &write_error))
+ g_warning ("Endpoint failed to fully write cursor: %s\n", write_error->message);
g_free (variable_names);
g_clear_error (&write_error);