gvfs/trash-Run-blocking-methods-on-a-thread-pool.patch
Ondrej Holy b57f602cb4 Improve trash backend performance
Resolves: RHEL-127445
2026-06-03 12:30:27 +02:00

242 lines
7.6 KiB
Diff

From 3889e4dec938a8023b8120545d4b53083b209dab Mon Sep 17 00:00:00 2001
From: Ondrej Holy <oholy@redhat.com>
Date: Thu, 19 Jan 2023 12:12:52 +0100
Subject: [PATCH] trash: Run blocking methods on a thread pool
All jobs use `_try` methods currently. This is wrong as most of them can
block. This works quite ok except the case of stale NFS mounts that can
block the main loop forever. Let's run the jobs on a thread pool instead.
This reverts commit 01fe5a61 except for the `create_dir_monitor` and
`create_file_monitor` methods in order to avoid issues like
https://bugzilla.gnome.org/show_bug.cgi?id=723305.
---
daemon/gvfsbackendtrash.c | 68 ++++++++++++++-------------------------
1 file changed, 25 insertions(+), 43 deletions(-)
diff --git a/daemon/gvfsbackendtrash.c b/daemon/gvfsbackendtrash.c
index 76c9e006..b4d3d089 100644
--- a/daemon/gvfsbackendtrash.c
+++ b/daemon/gvfsbackendtrash.c
@@ -227,7 +227,7 @@ trash_backend_get_file (GVfsBackendTrash *backend,
}
/* ======================= method implementations ======================= */
-static gboolean
+static void
trash_backend_open_for_read (GVfsBackend *vfs_backend,
GVfsJobOpenForRead *job,
const char *filename)
@@ -261,18 +261,16 @@ trash_backend_open_for_read (GVfsBackend *vfs_backend,
g_vfs_job_open_for_read_set_can_seek (job, TRUE);
g_vfs_job_succeeded (G_VFS_JOB (job));
- return TRUE;
+ return;
}
}
}
g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
g_error_free (error);
-
- return TRUE;
}
-static gboolean
+static void
trash_backend_read (GVfsBackend *backend,
GVfsJobRead *job,
GVfsBackendHandle handle,
@@ -290,16 +288,14 @@ trash_backend_read (GVfsBackend *backend,
g_vfs_job_read_set_size (job, bytes);
g_vfs_job_succeeded (G_VFS_JOB (job));
- return TRUE;
+ return;
}
g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
g_error_free (error);
-
- return TRUE;
}
-static gboolean
+static void
trash_backend_seek_on_read (GVfsBackend *backend,
GVfsJobSeekRead *job,
GVfsBackendHandle handle,
@@ -313,13 +309,11 @@ trash_backend_seek_on_read (GVfsBackend *backend,
g_vfs_job_seek_read_set_offset (job, g_seekable_tell (handle));
g_vfs_job_succeeded (G_VFS_JOB (job));
- return TRUE;
+ return;
}
g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
g_error_free (error);
-
- return TRUE;
}
static void
@@ -349,7 +343,7 @@ trash_backend_query_info_on_read (GVfsBackend *backend,
}
}
-static gboolean
+static void
trash_backend_close_read (GVfsBackend *backend,
GVfsJobCloseRead *job,
GVfsBackendHandle handle)
@@ -361,15 +355,13 @@ trash_backend_close_read (GVfsBackend *backend,
g_vfs_job_succeeded (G_VFS_JOB (job));
g_object_unref (handle);
- return TRUE;
+ return;
}
g_object_unref (handle);
g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
g_error_free (error);
-
- return TRUE;
}
static gboolean
@@ -394,7 +386,7 @@ trash_backend_schedule_thaw (GVfsBackendTrash *backend)
backend);
}
-static gboolean
+static void
trash_backend_delete (GVfsBackend *vfs_backend,
GVfsJobDelete *job,
const char *filename)
@@ -435,7 +427,7 @@ trash_backend_delete (GVfsBackend *vfs_backend,
g_vfs_job_succeeded (G_VFS_JOB (job));
trash_item_unref (item);
- return TRUE;
+ return;
}
}
@@ -445,11 +437,9 @@ trash_backend_delete (GVfsBackend *vfs_backend,
g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
g_error_free (error);
-
- return TRUE;
}
-static gboolean
+static void
trash_backend_pull (GVfsBackend *vfs_backend,
GVfsJobPull *job,
const gchar *source,
@@ -505,7 +495,7 @@ trash_backend_pull (GVfsBackend *vfs_backend,
trash_item_unref (item);
g_object_unref (real);
- return TRUE;
+ return;
}
}
@@ -517,8 +507,6 @@ trash_backend_pull (GVfsBackend *vfs_backend,
g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
g_error_free (error);
-
- return TRUE;
}
static void
@@ -676,7 +664,7 @@ trash_backend_enumerate_non_root (GVfsBackendTrash *backend,
g_error_free (error);
}
-static gboolean
+static void
trash_backend_enumerate (GVfsBackend *vfs_backend,
GVfsJobEnumerate *job,
const char *filename,
@@ -694,11 +682,9 @@ trash_backend_enumerate (GVfsBackend *vfs_backend,
attribute_matcher, flags);
else
trash_backend_enumerate_root (backend, job, attribute_matcher, flags);
-
- return TRUE;
}
-static gboolean
+static void
trash_backend_mount (GVfsBackend *vfs_backend,
GVfsJobMount *job,
GMountSpec *mount_spec,
@@ -716,11 +702,9 @@ trash_backend_mount (GVfsBackend *vfs_backend,
backend->watcher = trash_watcher_new (backend->root);
g_vfs_job_succeeded (G_VFS_JOB (job));
-
- return TRUE;
}
-static gboolean
+static void
trash_backend_query_info (GVfsBackend *vfs_backend,
GVfsJobQueryInfo *job,
const char *filename,
@@ -764,7 +748,7 @@ trash_backend_query_info (GVfsBackend *vfs_backend,
trash_item_unref (item);
g_object_unref (real_info);
- return TRUE;
+ return;
}
trash_item_unref (item);
@@ -798,8 +782,6 @@ trash_backend_query_info (GVfsBackend *vfs_backend,
g_vfs_job_succeeded (G_VFS_JOB (job));
}
-
- return TRUE;
}
static gboolean
@@ -926,17 +908,17 @@ g_vfs_backend_trash_class_init (GVfsBackendTrashClass *class)
gobject_class->finalize = trash_backend_finalize;
- backend_class->try_mount = trash_backend_mount;
- backend_class->try_open_for_read = trash_backend_open_for_read;
- backend_class->try_read = trash_backend_read;
- backend_class->try_seek_on_read = trash_backend_seek_on_read;
+ backend_class->mount = trash_backend_mount;
+ backend_class->open_for_read = trash_backend_open_for_read;
+ backend_class->read = trash_backend_read;
+ backend_class->seek_on_read = trash_backend_seek_on_read;
backend_class->query_info_on_read = trash_backend_query_info_on_read;
- backend_class->try_close_read = trash_backend_close_read;
- backend_class->try_query_info = trash_backend_query_info;
+ backend_class->close_read = trash_backend_close_read;
+ backend_class->query_info = trash_backend_query_info;
backend_class->try_query_fs_info = trash_backend_query_fs_info;
- backend_class->try_enumerate = trash_backend_enumerate;
- backend_class->try_delete = trash_backend_delete;
- backend_class->try_pull = trash_backend_pull;
+ backend_class->enumerate = trash_backend_enumerate;
+ backend_class->delete = trash_backend_delete;
+ backend_class->pull = trash_backend_pull;
backend_class->try_create_dir_monitor = trash_backend_create_dir_monitor;
backend_class->try_create_file_monitor = trash_backend_create_file_monitor;
}
--
2.53.0