diff options
author | Sam Thursfield <sam@afuera.me.uk> | 2023-02-24 09:39:52 +0000 |
---|---|---|
committer | Sam Thursfield <sam@afuera.me.uk> | 2023-02-24 09:39:52 +0000 |
commit | 24cda57523f5c07dc7ada85f83922bbb11b8e15b (patch) | |
tree | 6a3a6bab72ead3648a7f5dfe5b5f20268df2b011 | |
parent | bdf2a7dcd6291ad8017ce3951e8bcade90beb7b0 (diff) | |
parent | cc864ca1b80d408854e389539b311ac90553e130 (diff) | |
download | tracker-24cda57523f5c07dc7ada85f83922bbb11b8e15b.tar.gz |
Merge branch 'wip/carlosg/batch-test-leaks' into 'master'
Plugged leaks and other fixes
See merge request https://gitlab.gnome.org/GNOME/tracker/-/merge_requests/579
-rw-r--r-- | src/libtracker-sparql/bus/tracker-bus-statement.c | 10 | ||||
-rw-r--r-- | src/libtracker-sparql/bus/tracker-bus.c | 8 | ||||
-rw-r--r-- | src/libtracker-sparql/core/tracker-sparql-parser.c | 1 | ||||
-rw-r--r-- | src/libtracker-sparql/core/tracker-sparql.c | 1 | ||||
-rw-r--r-- | src/libtracker-sparql/core/tracker-vtab-triples.c | 2 | ||||
-rw-r--r-- | src/libtracker-sparql/direct/tracker-direct.c | 14 | ||||
-rw-r--r-- | src/libtracker-sparql/tracker-endpoint-dbus.c | 1 | ||||
-rw-r--r-- | tests/libtracker-sparql/tracker-batch-test.c | 165 |
8 files changed, 146 insertions, 56 deletions
diff --git a/src/libtracker-sparql/bus/tracker-bus-statement.c b/src/libtracker-sparql/bus/tracker-bus-statement.c index d24af164e..e5c6e9ef9 100644 --- a/src/libtracker-sparql/bus/tracker-bus-statement.c +++ b/src/libtracker-sparql/bus/tracker-bus-statement.c @@ -60,7 +60,7 @@ tracker_bus_statement_bind_string (TrackerSparqlStatement *stmt, g_hash_table_insert (bus_stmt->arguments, g_strdup (name), - g_variant_new_string (value)); + g_variant_ref_sink (g_variant_new_string (value))); } static void @@ -72,7 +72,7 @@ tracker_bus_statement_bind_boolean (TrackerSparqlStatement *stmt, g_hash_table_insert (bus_stmt->arguments, g_strdup (name), - g_variant_new_boolean (value)); + g_variant_ref_sink (g_variant_new_boolean (value))); } static void @@ -84,7 +84,7 @@ tracker_bus_statement_bind_double (TrackerSparqlStatement *stmt, g_hash_table_insert (bus_stmt->arguments, g_strdup (name), - g_variant_new_double (value)); + g_variant_ref_sink (g_variant_new_double (value))); } static void @@ -96,7 +96,7 @@ tracker_bus_statement_bind_int (TrackerSparqlStatement *stmt, g_hash_table_insert (bus_stmt->arguments, g_strdup (name), - g_variant_new_int64 (value)); + g_variant_ref_sink (g_variant_new_int64 (value))); } static void @@ -110,7 +110,7 @@ tracker_bus_statement_bind_datetime (TrackerSparqlStatement *stmt, date_str = tracker_date_format_iso8601 (value); g_hash_table_insert (bus_stmt->arguments, g_strdup (name), - g_variant_new_string (date_str)); + g_variant_ref_sink (g_variant_new_string (date_str))); g_free (date_str); } diff --git a/src/libtracker-sparql/bus/tracker-bus.c b/src/libtracker-sparql/bus/tracker-bus.c index 117cc34e6..bec72c822 100644 --- a/src/libtracker-sparql/bus/tracker-bus.c +++ b/src/libtracker-sparql/bus/tracker-bus.c @@ -255,7 +255,7 @@ convert_params (GHashTable *parameters) while (g_hash_table_iter_next (&iter, (gpointer*) &name, (gpointer*) &value)) { g_variant_builder_open (&builder, G_VARIANT_TYPE ("{sv}")); g_variant_builder_add (&builder, "s", name); - g_variant_builder_add (&builder, "v", g_variant_ref (value)); + g_variant_builder_add (&builder, "v", value); g_variant_builder_close (&builder); } @@ -1550,13 +1550,15 @@ query_dbus_call_cb (GObject *source, res, &error); if (reply && !g_dbus_message_to_gerror (reply, &error)) { TrackerSparqlCursor *cursor; - GVariant *body; + GVariant *body, *child; GInputStream *istream; body = g_dbus_message_get_body (reply); istream = g_task_get_task_data (task); - cursor = tracker_bus_cursor_new (istream, g_variant_get_child_value (body, 0)); + child = g_variant_get_child_value (body, 0); + cursor = tracker_bus_cursor_new (istream, child); g_task_return_pointer (task, cursor, g_object_unref); + g_variant_unref (child); } else { g_dbus_error_strip_remote_error (error); g_task_return_error (task, error); diff --git a/src/libtracker-sparql/core/tracker-sparql-parser.c b/src/libtracker-sparql/core/tracker-sparql-parser.c index 5ed15e2f9..ac4161e43 100644 --- a/src/libtracker-sparql/core/tracker-sparql-parser.c +++ b/src/libtracker-sparql/core/tracker-sparql-parser.c @@ -793,6 +793,7 @@ tracker_grammar_parser_apply (TrackerGrammarParser *parser, if (!tracker_grammar_parser_read (parser, &state)) { tracker_parser_state_propagate_error (parser, &state, error); tracker_node_tree_free (state.node_tree); + g_ptr_array_unref (state.error_rules); g_free (state.rule_states.rules); return NULL; } diff --git a/src/libtracker-sparql/core/tracker-sparql.c b/src/libtracker-sparql/core/tracker-sparql.c index 1e4bb752f..500a9af44 100644 --- a/src/libtracker-sparql/core/tracker-sparql.c +++ b/src/libtracker-sparql/core/tracker-sparql.c @@ -356,6 +356,7 @@ tracker_sparql_finalize (GObject *object) g_object_unref (sparql->data_manager); g_clear_pointer (&sparql->sql_string, g_free); + g_clear_pointer (&sparql->literal_bindings, g_ptr_array_unref); if (sparql->tree) tracker_node_tree_free (sparql->tree); diff --git a/src/libtracker-sparql/core/tracker-vtab-triples.c b/src/libtracker-sparql/core/tracker-vtab-triples.c index f3fe7aea1..a934219ef 100644 --- a/src/libtracker-sparql/core/tracker-vtab-triples.c +++ b/src/libtracker-sparql/core/tracker-vtab-triples.c @@ -528,8 +528,6 @@ init_stmt (TrackerTriplesCursor *cursor) graph, tracker_class_get_name (class)); } else if (property) { - sql = g_string_new (NULL); - if (tracker_property_get_multiple_values (property)) { g_string_append_printf (sql, "SELECT %" G_GINT64_FORMAT ", * " diff --git a/src/libtracker-sparql/direct/tracker-direct.c b/src/libtracker-sparql/direct/tracker-direct.c index 0d3be777f..2e70a3513 100644 --- a/src/libtracker-sparql/direct/tracker-direct.c +++ b/src/libtracker-sparql/direct/tracker-direct.c @@ -431,14 +431,6 @@ query_thread_pool_func (gpointer data, g_object_unref (task); } -static gint -task_compare_func (GTask *a, - GTask *b, - gpointer user_data) -{ - return g_task_get_priority (b) - g_task_get_priority (a); -} - static gboolean set_up_thread_pools (TrackerDirectConnection *conn, GError **error) @@ -457,12 +449,6 @@ set_up_thread_pools (TrackerDirectConnection *conn, if (!priv->update_thread) return FALSE; - g_thread_pool_set_sort_function (priv->select_pool, - (GCompareDataFunc) task_compare_func, - conn); - g_thread_pool_set_sort_function (priv->update_thread, - (GCompareDataFunc) task_compare_func, - conn); return TRUE; } diff --git a/src/libtracker-sparql/tracker-endpoint-dbus.c b/src/libtracker-sparql/tracker-endpoint-dbus.c index fab046622..14e6f274d 100644 --- a/src/libtracker-sparql/tracker-endpoint-dbus.c +++ b/src/libtracker-sparql/tracker-endpoint-dbus.c @@ -416,6 +416,7 @@ read_query (GDataInputStream *istream, g_ptr_array_add (*parameter_names, key); g_array_append_val (*parameter_values, gvalue); + g_variant_unref (value); } g_variant_unref (variant); diff --git a/tests/libtracker-sparql/tracker-batch-test.c b/tests/libtracker-sparql/tracker-batch-test.c index 8ba7adfe5..9b9f81b8c 100644 --- a/tests/libtracker-sparql/tracker-batch-test.c +++ b/tests/libtracker-sparql/tracker-batch-test.c @@ -41,8 +41,14 @@ struct _TestFixture { typedef struct { TrackerSparqlConnection *direct; GDBusConnection *dbus_conn; + GMainLoop *thread_loop; } StartupData; +typedef struct { + GThread *thread; + GMainLoop *loop; +} EndpointData; + static gboolean started = FALSE; static const gchar *bus_name = NULL; @@ -63,7 +69,7 @@ static TrackerSparqlCursor * get_cursor (TestFixture *test_fixture, const gchar *iri) { - TrackerSparqlStatement *stmt; + g_autoptr (TrackerSparqlStatement) stmt = NULL; TrackerSparqlCursor *cursor; GError *error = NULL; @@ -74,7 +80,6 @@ get_cursor (TestFixture *test_fixture, tracker_sparql_statement_bind_string (stmt, "iri", iri); cursor = tracker_sparql_statement_execute (stmt, NULL, &error); - g_object_unref (stmt); g_assert_no_error (error); return cursor; @@ -84,7 +89,7 @@ static void assert_no_match (TestFixture *test_fixture, const gchar *iri) { - TrackerSparqlCursor *cursor; + g_autoptr (TrackerSparqlCursor) cursor = NULL; GError *error = NULL; cursor = get_cursor (test_fixture, iri); @@ -164,13 +169,16 @@ assert_photo (TestFixture *test_fixture, gdouble exposure_time) { TrackerSparqlCursor *cursor; + GDateTime *cursor_date; GError *error = NULL; cursor = get_cursor (test_fixture, iri); g_assert_true (tracker_sparql_cursor_next (cursor, NULL, &error)); g_assert_cmpstr (tracker_sparql_cursor_get_string (cursor, 0, NULL), ==, TRACKER_PREFIX_DC "date"); - g_assert_true (g_date_time_compare (tracker_sparql_cursor_get_datetime (cursor, 1), date) == 0); + cursor_date = tracker_sparql_cursor_get_datetime (cursor, 1); + g_assert_true (g_date_time_compare (cursor_date, date) == 0); + g_date_time_unref (cursor_date); g_assert_true (tracker_sparql_cursor_next (cursor, NULL, &error)); g_assert_cmpstr (tracker_sparql_cursor_get_string (cursor, 0, NULL), ==, TRACKER_PREFIX_NFO "codec"); @@ -186,11 +194,15 @@ assert_photo (TestFixture *test_fixture, g_assert_true (tracker_sparql_cursor_next (cursor, NULL, &error)); g_assert_cmpstr (tracker_sparql_cursor_get_string (cursor, 0, NULL), ==, TRACKER_PREFIX_NIE "contentCreated"); - g_assert_true (g_date_time_compare (tracker_sparql_cursor_get_datetime (cursor, 1), date) == 0); + cursor_date = tracker_sparql_cursor_get_datetime (cursor, 1); + g_assert_true (g_date_time_compare (cursor_date, date) == 0); + g_date_time_unref (cursor_date); g_assert_true (tracker_sparql_cursor_next (cursor, NULL, &error)); g_assert_cmpstr (tracker_sparql_cursor_get_string (cursor, 0, NULL), ==, TRACKER_PREFIX_NIE "informationElementDate"); - g_assert_true (g_date_time_compare (tracker_sparql_cursor_get_datetime (cursor, 1), date) == 0); + cursor_date = tracker_sparql_cursor_get_datetime (cursor, 1); + g_assert_true (g_date_time_compare (cursor_date, date) == 0); + g_date_time_unref (cursor_date); g_assert_true (tracker_sparql_cursor_next (cursor, NULL, &error)); g_assert_cmpstr (tracker_sparql_cursor_get_string (cursor, 0, NULL), ==, TRACKER_PREFIX_NMM "exposureTime"); @@ -474,9 +486,6 @@ batch_resource_bnodes_same_batch (TestFixture *test_fixture, /* Insert a bnode with the same label twice in the same * batch, 1 blank node is expected */ - resource = tracker_resource_new ("_:bnode"); - tracker_resource_set_uri (resource, "rdf:type", "nmm:Photo"); - batch = tracker_sparql_connection_create_batch (test_fixture->conn); resource = tracker_resource_new ("_:bnode"); @@ -501,7 +510,7 @@ batch_statement_insert (TestFixture *test_fixture, gconstpointer context) { TrackerBatch *batch; - TrackerSparqlStatement *stmt; + g_autoptr (TrackerSparqlStatement) stmt = NULL; GError *error = NULL; GDateTime *date; @@ -527,7 +536,6 @@ batch_statement_insert (TestFixture *test_fixture, assert_photo (test_fixture, "http://example.com/e", "png", date, FALSE, 123, 0.12345678901); g_date_time_unref (date); - g_object_unref (stmt); } static void @@ -535,7 +543,7 @@ batch_statement_update (TestFixture *test_fixture, gconstpointer context) { TrackerBatch *batch; - TrackerSparqlStatement *stmt; + g_autoptr (TrackerSparqlStatement) stmt = NULL; GError *error = NULL; GDateTime *date; @@ -573,7 +581,6 @@ batch_statement_update (TestFixture *test_fixture, assert_photo (test_fixture, "http://example.com/f", "png", date, FALSE, 123, 0.12345678901); g_date_time_unref (date); - g_object_unref (stmt); } static void @@ -581,7 +588,7 @@ batch_statement_update_same_batch (TestFixture *test_fixture, gconstpointer context) { TrackerBatch *batch; - TrackerSparqlStatement *stmt; + g_autoptr (TrackerSparqlStatement) stmt = NULL; GError *error = NULL; GDateTime *date; @@ -612,7 +619,6 @@ batch_statement_update_same_batch (TestFixture *test_fixture, assert_photo (test_fixture, "http://example.com/g", "png", date, FALSE, 123, 0.12345678901); g_date_time_unref (date); - g_object_unref (stmt); } static void @@ -620,7 +626,8 @@ batch_statement_delete (TestFixture *test_fixture, gconstpointer context) { TrackerBatch *batch; - TrackerSparqlStatement *stmt, *del_stmt; + g_autoptr (TrackerSparqlStatement) stmt = NULL; + g_autoptr (TrackerSparqlStatement) del_stmt = NULL; GError *error = NULL; GDateTime *date; @@ -654,8 +661,6 @@ batch_statement_delete (TestFixture *test_fixture, assert_no_match (test_fixture, "http://example.com/h"); g_date_time_unref (date); - g_object_unref (stmt); - g_object_unref (del_stmt); } static void @@ -663,7 +668,8 @@ batch_statement_delete_same_batch (TestFixture *test_fixture, gconstpointer context) { TrackerBatch *batch; - TrackerSparqlStatement *stmt, *del_stmt; + g_autoptr (TrackerSparqlStatement) stmt = NULL; + g_autoptr (TrackerSparqlStatement) del_stmt = NULL; GError *error = NULL; GDateTime *date; @@ -690,15 +696,13 @@ batch_statement_delete_same_batch (TestFixture *test_fixture, assert_no_match (test_fixture, "http://example.com/i"); g_date_time_unref (date); - g_object_unref (stmt); - g_object_unref (del_stmt); } static void batch_statement_bnodes (TestFixture *test_fixture, gconstpointer context) { - TrackerSparqlStatement *stmt; + g_autoptr (TrackerSparqlStatement) stmt = NULL; TrackerBatch *batch; GError *error = NULL; @@ -730,7 +734,7 @@ static void batch_statement_bnodes_same_batch (TestFixture *test_fixture, gconstpointer context) { - TrackerSparqlStatement *stmt; + g_autoptr (TrackerSparqlStatement) stmt = NULL; TrackerBatch *batch; GError *error = NULL; @@ -827,8 +831,8 @@ update_async_cb (GObject *source, } static void -batch_async_order (TestFixture *test_fixture, - gconstpointer context) +batch_async_simultaneous (TestFixture *test_fixture, + gconstpointer context) { TrackerBatch *batch1, *batch2; TrackerResource *resource; @@ -837,14 +841,58 @@ batch_async_order (TestFixture *test_fixture, date = g_date_time_new_from_iso8601 ("2022-12-04T01:01:01Z", NULL); - /* Ensure batches are still executed in the given order, despite asynchronously */ + /* Ensure batches get both executed, despite asynchronously */ batch1 = tracker_sparql_connection_create_batch (test_fixture->conn); resource = create_photo_resource (test_fixture, "http://example.com/j", "png", date, TRUE, 234, 1.23456789012); tracker_batch_add_resource (batch1, NULL, resource); g_object_unref (resource); batch2 = tracker_sparql_connection_create_batch (test_fixture->conn); - resource = create_photo_resource (test_fixture, "http://example.com/j", "png", date, FALSE, 123, 0.12345678901); + resource = create_photo_resource (test_fixture, "http://example.com/j2", "png", date, FALSE, 123, 0.12345678901); + tracker_batch_add_resource (batch2, NULL, resource); + g_object_unref (resource); + + data.count = 2; + data.loop = g_main_loop_new (NULL, FALSE); + + tracker_batch_execute_async (batch1, NULL, update_async_cb, &data); + tracker_batch_execute_async (batch2, NULL, update_async_cb, &data); + + g_main_loop_run (data.loop); + + assert_photo (test_fixture, "http://example.com/j", "png", date, TRUE, 234, 1.23456789012); + assert_photo (test_fixture, "http://example.com/j2", "png", date, FALSE, 123, 0.12345678901); + + g_main_loop_unref (data.loop); + g_object_unref (batch1); + g_object_unref (batch2); + g_date_time_unref (date); +} + +static void +batch_async_same_item (TestFixture *test_fixture, + gconstpointer context) +{ + g_autoptr (TrackerSparqlCursor) cursor = NULL; + TrackerBatch *batch1, *batch2; + TrackerResource *resource; + GDateTime *date; + AsyncData data; + GError *error = NULL; + + date = g_date_time_new_from_iso8601 ("2022-12-04T01:01:01Z", NULL); + + /* Ensure changes from both batches get applied to + * the same resource, despite asynchronously */ + batch1 = tracker_sparql_connection_create_batch (test_fixture->conn); + resource = tracker_resource_new ("http://example.com/j3"); + tracker_resource_add_uri (resource, "rdf:type", "nie:DataObject"); + tracker_batch_add_resource (batch1, NULL, resource); + g_object_unref (resource); + + batch2 = tracker_sparql_connection_create_batch (test_fixture->conn); + resource = tracker_resource_new ("http://example.com/j3"); + tracker_resource_add_uri (resource, "rdf:type", "nie:InformationElement"); tracker_batch_add_resource (batch2, NULL, resource); g_object_unref (resource); @@ -856,8 +904,25 @@ batch_async_order (TestFixture *test_fixture, g_main_loop_run (data.loop); - assert_photo (test_fixture, "http://example.com/j", "png", date, FALSE, 123, 0.12345678901); + cursor = get_cursor (test_fixture, "http://example.com/j3"); + /* nrl:added */ + g_assert_true (tracker_sparql_cursor_next (cursor, NULL, &error)); + /* nrl:modified */ + g_assert_true (tracker_sparql_cursor_next (cursor, NULL, &error)); + /* rdf:type */ + g_assert_true (tracker_sparql_cursor_next (cursor, NULL, &error)); + g_assert_cmpstr (tracker_sparql_cursor_get_string (cursor, 0, NULL), ==, TRACKER_PREFIX_RDF "type"); + g_assert_cmpstr (tracker_sparql_cursor_get_string (cursor, 1, NULL), ==, TRACKER_PREFIX_NIE "DataObject"); + g_assert_true (tracker_sparql_cursor_next (cursor, NULL, &error)); + g_assert_cmpstr (tracker_sparql_cursor_get_string (cursor, 0, NULL), ==, TRACKER_PREFIX_RDF "type"); + g_assert_cmpstr (tracker_sparql_cursor_get_string (cursor, 1, NULL), ==, TRACKER_PREFIX_NIE "InformationElement"); + g_assert_true (tracker_sparql_cursor_next (cursor, NULL, &error)); + g_assert_cmpstr (tracker_sparql_cursor_get_string (cursor, 0, NULL), ==, TRACKER_PREFIX_RDF "type"); + g_assert_cmpstr (tracker_sparql_cursor_get_string (cursor, 1, NULL), ==, TRACKER_PREFIX_RDFS "Resource"); + g_assert_false (tracker_sparql_cursor_next (cursor, NULL, &error)); + g_assert_no_error (error); + g_main_loop_unref (data.loop); g_object_unref (batch1); g_object_unref (batch2); g_date_time_unref (date); @@ -929,18 +994,32 @@ thread_func (gpointer user_data) if (!endpoint) return NULL; + data->thread_loop = main_loop; started = TRUE; g_main_loop_run (main_loop); + g_main_loop_unref (main_loop); + + g_object_unref (endpoint); + return NULL; } +static void +finish_endpoint (EndpointData *endpoint_data) +{ + g_main_loop_quit (endpoint_data->loop); + g_thread_join (endpoint_data->thread); + g_free (endpoint_data); +} + static gboolean create_connections (TrackerSparqlConnection **dbus, TrackerSparqlConnection **direct, GError **error) { StartupData data; + EndpointData *endpoint_data; GThread *thread; data.direct = create_local_connection (NULL); @@ -955,11 +1034,22 @@ create_connections (TrackerSparqlConnection **dbus, while (!started) g_usleep (100); + endpoint_data = g_new0 (EndpointData, 1); + endpoint_data->thread = thread; + endpoint_data->loop = data.thread_loop; + bus_name = g_dbus_connection_get_unique_name (data.dbus_conn); *dbus = tracker_sparql_connection_bus_new (bus_name, NULL, data.dbus_conn, error); + g_object_set_data_full (G_OBJECT (*dbus), + "endpoint-data", + endpoint_data, + (GDestroyNotify) finish_endpoint); + *direct = create_local_connection (error); - g_thread_unref (thread); + + g_object_unref (data.direct); + g_object_unref (data.dbus_conn); return TRUE; } @@ -983,6 +1073,13 @@ setup (TestFixture *fixture, g_assert_no_error (error); } +static void +teardown (TestFixture *fixture, + gconstpointer context) +{ + g_object_unref (fixture->conn); +} + TestInfo tests[] = { { "sparql/insert", batch_sparql_insert }, { "sparql/delete", batch_sparql_delete }, @@ -1002,7 +1099,8 @@ TestInfo tests[] = { { "statement/bnodes", batch_statement_bnodes }, { "statement/bnodes-same-batch", batch_statement_bnodes_same_batch }, { "mixed/bnodes", batch_bnodes }, - { "async/order", batch_async_order }, + { "async/simultaneous", batch_async_simultaneous }, + { "async/same-item", batch_async_same_item }, { "error/transaction", batch_transaction_error }, }; @@ -1018,10 +1116,10 @@ add_tests (TrackerSparqlConnection *conn, gchar *testpath; fixture = g_new0 (TestFixture, 1); - fixture->conn = conn; + fixture->conn = g_object_ref (conn); fixture->test = &tests[i]; testpath = g_strconcat ("/libtracker-sparql/batch/", name, "/", tests[i].test_name, NULL); - g_test_add (testpath, TestFixture, fixture, setup, tests[i].func, NULL); + g_test_add (testpath, TestFixture, fixture, setup, tests[i].func, teardown); g_free (testpath); } } @@ -1040,5 +1138,8 @@ main (gint argc, gchar **argv) add_tests (direct, "direct", TRUE); add_tests (dbus, "dbus", FALSE); + g_clear_object (&dbus); + g_clear_object (&direct); + return g_test_run (); } |