Add a checkout option to skip fsync
This is a better followup to dc9239dd7b
since I wanted to do fsync-less checkouts in rpm-ostree too, and
replicating the "turn off fsync temporarily" was in retrospect just a
hack.
We can simply add a boolean to the checkout options.
https://github.com/GNOME/ostree/pull/172
This commit is contained in:
parent
a13b56f91c
commit
cd0a9d3435
|
|
@ -102,9 +102,16 @@ checkout_object_for_uncompressed_cache (OstreeRepo *self,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
fsync_is_enabled (OstreeRepo *self,
|
||||||
|
OstreeRepoCheckoutOptions *options)
|
||||||
|
{
|
||||||
|
return !(self->disable_fsync || options->disable_fsync);
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
write_regular_file_content (OstreeRepo *self,
|
write_regular_file_content (OstreeRepo *self,
|
||||||
OstreeRepoCheckoutMode mode,
|
OstreeRepoCheckoutOptions *options,
|
||||||
GOutputStream *output,
|
GOutputStream *output,
|
||||||
GFileInfo *file_info,
|
GFileInfo *file_info,
|
||||||
GVariant *xattrs,
|
GVariant *xattrs,
|
||||||
|
|
@ -113,6 +120,7 @@ write_regular_file_content (OstreeRepo *self,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
gboolean ret = FALSE;
|
||||||
|
const OstreeRepoCheckoutMode mode = options->mode;
|
||||||
int fd;
|
int fd;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
|
|
@ -154,12 +162,12 @@ write_regular_file_content (OstreeRepo *self,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!self->disable_fsync)
|
if (fsync_is_enabled (self, options))
|
||||||
{
|
{
|
||||||
if (fsync (fd) == -1)
|
if (fsync (fd) == -1)
|
||||||
{
|
{
|
||||||
gs_set_error_from_errno (error, errno);
|
gs_set_error_from_errno (error, errno);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -238,7 +246,7 @@ checkout_file_from_input_at (OstreeRepo *self,
|
||||||
temp_out = g_unix_output_stream_new (fd, TRUE);
|
temp_out = g_unix_output_stream_new (fd, TRUE);
|
||||||
fd = -1; /* Transfer ownership */
|
fd = -1; /* Transfer ownership */
|
||||||
|
|
||||||
if (!write_regular_file_content (self, options->mode, temp_out, file_info, xattrs, input,
|
if (!write_regular_file_content (self, options, temp_out, file_info, xattrs, input,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
@ -298,7 +306,7 @@ checkout_file_unioning_from_input_at (OstreeRepo *repo,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (!write_regular_file_content (repo, options->mode, temp_out, file_info, xattrs, input,
|
if (!write_regular_file_content (repo, options, temp_out, file_info, xattrs, input,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
@ -726,17 +734,13 @@ checkout_tree_at (OstreeRepo *self,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Finally, fsync to ensure all entries are on disk. Ultimately
|
if (fsync_is_enabled (self, options))
|
||||||
* this should be configurable for the case where we're constructing
|
|
||||||
* buildroots.
|
|
||||||
*/
|
|
||||||
if (!self->disable_fsync)
|
|
||||||
{
|
{
|
||||||
if (fsync (destination_dfd) == -1)
|
if (fsync (destination_dfd) == -1)
|
||||||
{
|
{
|
||||||
gs_set_error_from_errno (error, errno);
|
gs_set_error_from_errno (error, errno);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
|
|
|
||||||
|
|
@ -532,7 +532,8 @@ typedef struct {
|
||||||
OstreeRepoCheckoutOverwriteMode overwrite_mode;
|
OstreeRepoCheckoutOverwriteMode overwrite_mode;
|
||||||
|
|
||||||
guint enable_uncompressed_cache : 1;
|
guint enable_uncompressed_cache : 1;
|
||||||
guint unused : 31;
|
guint disable_fsync : 1;
|
||||||
|
guint reserved : 30;
|
||||||
|
|
||||||
const char *subpath;
|
const char *subpath;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -528,6 +528,11 @@ checkout_deployment_tree (OstreeSysroot *sysroot,
|
||||||
glnx_fd_close int osdeploy_dfd = -1;
|
glnx_fd_close int osdeploy_dfd = -1;
|
||||||
int ret_fd;
|
int ret_fd;
|
||||||
|
|
||||||
|
/* We end up using syncfs for the entire filesystem, so turn off
|
||||||
|
* OstreeRepo level fsync.
|
||||||
|
*/
|
||||||
|
checkout_opts.disable_fsync = TRUE;
|
||||||
|
|
||||||
osdeploy_path = g_strconcat ("ostree/deploy/", ostree_deployment_get_osname (deployment), "/deploy", NULL);
|
osdeploy_path = g_strconcat ("ostree/deploy/", ostree_deployment_get_osname (deployment), "/deploy", NULL);
|
||||||
checkout_target_name = g_strdup_printf ("%s.%d", csum, ostree_deployment_get_deployserial (deployment));
|
checkout_target_name = g_strdup_printf ("%s.%d", csum, ostree_deployment_get_deployserial (deployment));
|
||||||
|
|
||||||
|
|
@ -540,20 +545,10 @@ checkout_deployment_tree (OstreeSysroot *sysroot,
|
||||||
if (!glnx_shutil_rm_rf_at (osdeploy_dfd, checkout_target_name, cancellable, error))
|
if (!glnx_shutil_rm_rf_at (osdeploy_dfd, checkout_target_name, cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* We end up using syncfs for the entire filesystem, so turn off
|
if (!ostree_repo_checkout_tree_at (repo, &checkout_opts, osdeploy_dfd,
|
||||||
* OstreeRepo level fsync.
|
checkout_target_name, csum,
|
||||||
*/
|
cancellable, error))
|
||||||
{ gboolean fsync_was_disabled = ostree_repo_get_disable_fsync (repo);
|
goto out;
|
||||||
gboolean checkout_success;
|
|
||||||
|
|
||||||
ostree_repo_set_disable_fsync (repo, TRUE);
|
|
||||||
checkout_success = ostree_repo_checkout_tree_at (repo, &checkout_opts, osdeploy_dfd,
|
|
||||||
checkout_target_name, csum,
|
|
||||||
cancellable, error);
|
|
||||||
ostree_repo_set_disable_fsync (repo, fsync_was_disabled);
|
|
||||||
if (!checkout_success)
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!glnx_opendirat (osdeploy_dfd, checkout_target_name, TRUE, &ret_fd, error))
|
if (!glnx_opendirat (osdeploy_dfd, checkout_target_name, TRUE, &ret_fd, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue