src: Port to new OstreeAsyncProgress atomic API

This will eliminate most of the potential races in progress reporting.
ostree_repo_pull_default_console_progress_changed() still calls three
getters, so there may still be races there, however.

Signed-off-by: Philip Withnall <withnall@endlessm.com>

Closes: #819
Approved by: cgwalters
This commit is contained in:
Philip Withnall 2017-04-28 16:24:00 +01:00 committed by Atomic Bot
parent c27b66de80
commit cdf876101b
3 changed files with 69 additions and 56 deletions

View File

@ -211,36 +211,36 @@ update_progress (gpointer user_data)
n_scanned_metadata = pull_data->n_scanned_metadata; n_scanned_metadata = pull_data->n_scanned_metadata;
start_time = pull_data->start_time; start_time = pull_data->start_time;
ostree_async_progress_set_uint (pull_data->progress, "outstanding-fetches", outstanding_fetches); ostree_async_progress_set (pull_data->progress,
ostree_async_progress_set_uint (pull_data->progress, "outstanding-writes", outstanding_writes); "outstanding-fetches", "u", outstanding_fetches,
ostree_async_progress_set_uint (pull_data->progress, "fetched", fetched); "outstanding-writes", "u", outstanding_writes,
ostree_async_progress_set_uint (pull_data->progress, "requested", requested); "fetched", "u", fetched,
ostree_async_progress_set_uint (pull_data->progress, "scanning", g_queue_is_empty (&pull_data->scan_object_queue) ? 0 : 1); "requested", "u", requested,
ostree_async_progress_set_uint (pull_data->progress, "scanned-metadata", n_scanned_metadata); "scanning", "u", g_queue_is_empty (&pull_data->scan_object_queue) ? 0 : 1,
ostree_async_progress_set_uint64 (pull_data->progress, "bytes-transferred", bytes_transferred); "scanned-metadata", "u", n_scanned_metadata,
ostree_async_progress_set_uint64 (pull_data->progress, "start-time", start_time); "bytes-transferred", "t", bytes_transferred,
"start-time", "t", start_time,
/* Deltas */ /* Deltas */
ostree_async_progress_set_uint (pull_data->progress, "fetched-delta-parts", "fetched-delta-parts",
pull_data->n_fetched_deltaparts); "u", pull_data->n_fetched_deltaparts,
ostree_async_progress_set_uint (pull_data->progress, "total-delta-parts", "total-delta-parts",
pull_data->n_total_deltaparts); "u", pull_data->n_total_deltaparts,
ostree_async_progress_set_uint (pull_data->progress, "fetched-delta-fallbacks", "fetched-delta-fallbacks",
pull_data->n_fetched_deltapart_fallbacks); "u", pull_data->n_fetched_deltapart_fallbacks,
ostree_async_progress_set_uint (pull_data->progress, "total-delta-fallbacks", "total-delta-fallbacks",
pull_data->n_total_delta_fallbacks); "u", pull_data->n_total_delta_fallbacks,
ostree_async_progress_set_uint64 (pull_data->progress, "fetched-delta-part-size", "fetched-delta-part-size",
pull_data->fetched_deltapart_size); "t", pull_data->fetched_deltapart_size,
ostree_async_progress_set_uint64 (pull_data->progress, "total-delta-part-size", "total-delta-part-size",
pull_data->total_deltapart_size); "t", pull_data->total_deltapart_size,
ostree_async_progress_set_uint64 (pull_data->progress, "total-delta-part-usize", "total-delta-part-usize",
pull_data->total_deltapart_usize); "t", pull_data->total_deltapart_usize,
ostree_async_progress_set_uint (pull_data->progress, "total-delta-superblocks", "total-delta-superblocks",
pull_data->static_delta_superblocks->len); "u", pull_data->static_delta_superblocks->len,
/* We fetch metadata before content. These allow us to report metadata fetch progress specifically. */ /* We fetch metadata before content. These allow us to report metadata fetch progress specifically. */
ostree_async_progress_set_uint (pull_data->progress, "outstanding-metadata-fetches", pull_data->n_outstanding_metadata_fetches); "outstanding-metadata-fetches", "u", pull_data->n_outstanding_metadata_fetches,
ostree_async_progress_set_uint (pull_data->progress, "metadata-fetched", pull_data->n_fetched_metadata); "metadata-fetched", "u", pull_data->n_fetched_metadata,
NULL);
ostree_async_progress_set_status (pull_data->progress, NULL); ostree_async_progress_set_status (pull_data->progress, NULL);

View File

@ -3749,15 +3749,18 @@ ostree_repo_pull_default_console_progress_changed (OstreeAsyncProgress *progress
buf = g_string_new (""); buf = g_string_new ("");
status = ostree_async_progress_get_status (progress); status = ostree_async_progress_get_status (progress);
outstanding_fetches = ostree_async_progress_get_uint (progress, "outstanding-fetches");
outstanding_metadata_fetches = ostree_async_progress_get_uint (progress, "outstanding-metadata-fetches"); ostree_async_progress_get (progress,
outstanding_writes = ostree_async_progress_get_uint (progress, "outstanding-writes"); "outstanding-fetches", "u", &outstanding_fetches,
scanning = ostree_async_progress_get_uint (progress, "scanning") == 1; "outstanding-metadata-fetches", "u", &outstanding_metadata_fetches,
n_scanned_metadata = ostree_async_progress_get_uint (progress, "scanned-metadata"); "outstanding-writes", "u", &outstanding_writes,
fetched_delta_parts = ostree_async_progress_get_uint (progress, "fetched-delta-parts"); "scanning", "u", &scanning,
total_delta_parts = ostree_async_progress_get_uint (progress, "total-delta-parts"); "scanned-metadata", "u", &n_scanned_metadata,
fetched_delta_part_fallbacks = ostree_async_progress_get_uint (progress, "fetched-delta-fallbacks"); "fetched-delta-parts", "u", &fetched_delta_parts,
total_delta_part_fallbacks = ostree_async_progress_get_uint (progress, "total-delta-fallbacks"); "total-delta-parts", "u", &total_delta_parts,
"fetched-delta-fallbacks", "u", &fetched_delta_part_fallbacks,
"total-delta-fallbacks", "u", &total_delta_part_fallbacks,
NULL);
if (status) if (status)
{ {
@ -3765,18 +3768,25 @@ ostree_repo_pull_default_console_progress_changed (OstreeAsyncProgress *progress
} }
else if (outstanding_fetches) else if (outstanding_fetches)
{ {
guint64 bytes_transferred = ostree_async_progress_get_uint64 (progress, "bytes-transferred"); guint64 bytes_transferred, start_time, total_delta_part_size;
guint fetched = ostree_async_progress_get_uint (progress, "fetched"); guint fetched, metadata_fetched, requested;
guint metadata_fetched = ostree_async_progress_get_uint (progress, "metadata-fetched");
guint requested = ostree_async_progress_get_uint (progress, "requested");
guint64 start_time = ostree_async_progress_get_uint64 (progress, "start-time");
guint64 total_delta_part_size = ostree_async_progress_get_uint64 (progress, "total-delta-part-size");
guint64 current_time = g_get_monotonic_time (); guint64 current_time = g_get_monotonic_time ();
g_autofree char *formatted_bytes_transferred = g_autofree char *formatted_bytes_transferred = NULL;
g_format_size_full (bytes_transferred, 0);
g_autofree char *formatted_bytes_sec = NULL; g_autofree char *formatted_bytes_sec = NULL;
guint64 bytes_sec; guint64 bytes_sec;
/* Note: This is not atomic wrt the above getter call. */
ostree_async_progress_get (progress,
"bytes-transferred", "t", &bytes_transferred,
"fetched", "u", &fetched,
"metadata-fetched", "u", &metadata_fetched,
"requested", "u", &requested,
"start-time", "t", &start_time,
"total-delta-part-size", "t", &total_delta_part_size,
NULL);
formatted_bytes_transferred = g_format_size_full (bytes_transferred, 0);
/* Ignore the first second, or when we haven't transferred any /* Ignore the first second, or when we haven't transferred any
* data, since those could cause divide by zero below. * data, since those could cause divide by zero below.
*/ */

View File

@ -89,20 +89,23 @@ dry_run_console_progress_changed (OstreeAsyncProgress *progress,
g_assert (!printed_console_progress); g_assert (!printed_console_progress);
printed_console_progress = TRUE; printed_console_progress = TRUE;
ostree_async_progress_get (progress,
/* Number of parts */ /* Number of parts */
fetched_delta_parts = ostree_async_progress_get_uint (progress, "fetched-delta-parts"); "fetched-delta-parts", "u", &fetched_delta_parts,
total_delta_parts = ostree_async_progress_get_uint (progress, "total-delta-parts"); "total-delta-parts", "u", &total_delta_parts,
fetched_delta_part_fallbacks = ostree_async_progress_get_uint (progress, "fetched-delta-fallbacks"); "fetched-delta-fallbacks", "u", &fetched_delta_part_fallbacks,
total_delta_part_fallbacks = ostree_async_progress_get_uint (progress, "total-delta-fallbacks"); "total-delta-fallbacks", "u", &total_delta_part_fallbacks,
/* Size variables */
"fetched-delta-part-size", "t", &fetched_delta_part_size,
"total-delta-part-size", "t", &total_delta_part_size,
"total-delta-part-usize", "t", &total_delta_part_usize,
NULL);
/* Fold the count of deltaparts + fallbacks for simplicity; if changing this, /* Fold the count of deltaparts + fallbacks for simplicity; if changing this,
* please change ostree_repo_pull_default_console_progress_changed() first. * please change ostree_repo_pull_default_console_progress_changed() first.
*/ */
fetched_delta_parts += fetched_delta_part_fallbacks; fetched_delta_parts += fetched_delta_part_fallbacks;
total_delta_parts += total_delta_part_fallbacks; total_delta_parts += total_delta_part_fallbacks;
/* Size variables */
fetched_delta_part_size = ostree_async_progress_get_uint64 (progress, "fetched-delta-part-size");
total_delta_part_size = ostree_async_progress_get_uint64 (progress, "total-delta-part-size");
total_delta_part_usize = ostree_async_progress_get_uint64 (progress, "total-delta-part-usize");
buf = g_string_new (""); buf = g_string_new ("");