diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2018-07-17 17:48:07 +0200 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2018-07-20 18:27:32 +0200 |
commit | 85e58a5219b66f77cbb534c0de39563ff50ec9a9 (patch) | |
tree | 35c1dd7882c05c9dc59e02e15016d49208226775 | |
parent | add37bb9e8b79da1d01442037ea155421857465e (diff) | |
download | tracker-85e58a5219b66f77cbb534c0de39563ff50ec9a9.tar.gz |
libtracker-data: Fetch shared connection on failure to create one
On stress situations (tests/functional-tests/ipc/test-bus-query-cancellation
is known to trigger this) there may be too many opened FDs all around (dbus
related, fds passed for resultsets, DB connections, ...) to keep it all
together.
In those cases, we may attempt to create an extra interface to cater for
the incoming request, but it will just fail underneath us. In those cases
it is preferrable to fetch a connection from the pool and have it shared
across threads than tripping into critical warnings and undefined behavior.
-rw-r--r-- | src/libtracker-data/tracker-db-manager.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/src/libtracker-data/tracker-db-manager.c b/src/libtracker-data/tracker-db-manager.c index 33e178f4f..5e5b7299c 100644 --- a/src/libtracker-data/tracker-db-manager.c +++ b/src/libtracker-data/tracker-db-manager.c @@ -1055,14 +1055,20 @@ tracker_db_manager_get_db_interface (TrackerDBManager *db_manager) interface = tracker_db_manager_create_db_interface (db_manager, TRUE, &internal_error); - if (internal_error) { - g_critical ("Error opening database: %s", internal_error->message); - g_error_free (internal_error); - g_async_queue_unlock (db_manager->interfaces); - return NULL; + if (interface) { + tracker_data_manager_init_fts (interface, FALSE); + } else { + if (g_async_queue_length_unlocked (db_manager->interfaces) == 0) { + g_critical ("Error opening database: %s", internal_error->message); + g_error_free (internal_error); + g_async_queue_unlock (db_manager->interfaces); + return NULL; + } else { + g_error_free (internal_error); + /* Fetch the first interface back. Oh well */ + interface = g_async_queue_try_pop_unlocked (db_manager->interfaces); + } } - - tracker_data_manager_init_fts (interface, FALSE); } g_async_queue_push_unlocked (db_manager->interfaces, interface); @@ -1102,7 +1108,8 @@ tracker_db_manager_get_writable_db_interface (TrackerDBManager *db_manager) TrackerDBInterface * tracker_db_manager_get_wal_db_interface (TrackerDBManager *db_manager) { - if (db_manager->db.wal_iface == NULL) { + if (db_manager->db.wal_iface == NULL && + (db_manager->flags & TRACKER_DB_MANAGER_READONLY) == 0) { db_manager->db.wal_iface = init_writable_db_interface (db_manager); } |