summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2018-07-17 17:48:07 +0200
committerCarlos Garnacho <carlosg@gnome.org>2018-07-20 18:27:32 +0200
commit85e58a5219b66f77cbb534c0de39563ff50ec9a9 (patch)
tree35c1dd7882c05c9dc59e02e15016d49208226775
parentadd37bb9e8b79da1d01442037ea155421857465e (diff)
downloadtracker-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.c23
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);
}