]> wimlib.net Git - wimlib/blobdiff - src/verify.c
verify: update progress per-chunk instead of per-blob
[wimlib] / src / verify.c
index 81aa96d085fdf5e3ded1718af6d44115c05c4f7a..e11561efcf790021799ea9f4193924f38f5f4146 100644 (file)
@@ -44,57 +44,50 @@ struct verify_blob_list_ctx {
        void *progctx;
        union wimlib_progress_info *progress;
        u64 next_progress;
+       u64 cur_blob_offset;
+       u64 cur_blob_size;
 };
 
 static int
-end_verify_blob(struct blob_descriptor *blob, int status, void *_ctx)
+verify_begin_blob(struct blob_descriptor *blob, void *_ctx)
 {
        struct verify_blob_list_ctx *ctx = _ctx;
-       union wimlib_progress_info *progress = ctx->progress;
 
-       if (status)
-               return status;
+       ctx->cur_blob_offset = 0;
+       ctx->cur_blob_size = blob->size;
+       return 0;
+}
 
-       progress->verify_streams.completed_streams++;
-       progress->verify_streams.completed_bytes += blob->size;
+static int
+verify_consume_chunk(const void *chunk, size_t size, void *_ctx)
+{
+       struct verify_blob_list_ctx *ctx = _ctx;
+       union wimlib_progress_info *progress = ctx->progress;
 
-       /* Handle rate-limiting of progress messages  */
+       ctx->cur_blob_offset += size;
+       if (ctx->cur_blob_offset == ctx->cur_blob_size)
+               progress->verify_streams.completed_streams++;
 
-       if (progress->verify_streams.completed_bytes < ctx->next_progress)
-               return 0;
+       progress->verify_streams.completed_bytes += size;
 
-       /* Time for another progress message.  */
+       if (progress->verify_streams.completed_bytes >= ctx->next_progress) {
 
-       status = call_progress(ctx->progfunc, WIMLIB_PROGRESS_MSG_VERIFY_STREAMS,
-                              progress, ctx->progctx);
-       if (status)
-               return status;
+               int ret = call_progress(ctx->progfunc,
+                                       WIMLIB_PROGRESS_MSG_VERIFY_STREAMS,
+                                       progress, ctx->progctx);
+               if (ret)
+                       return ret;
 
-       if (ctx->next_progress == progress->verify_streams.total_bytes) {
-               ctx->next_progress = ~(uint64_t)0;
-               return 0;
+               set_next_progress(progress->verify_streams.completed_bytes,
+                                 progress->verify_streams.total_bytes,
+                                 &ctx->next_progress);
        }
-
-       /* Send new message as soon as another 1/128 of the total has
-        * been verified.  (Arbitrary number.)  */
-       ctx->next_progress = progress->verify_streams.completed_bytes +
-                            progress->verify_streams.total_bytes / 128;
-
-       /* ... Unless that would be more than 5000000 bytes, in which case send
-        * the next after the next 5000000 bytes. (Another arbitrary number.) */
-       if (progress->verify_streams.completed_bytes + 5000000 < ctx->next_progress)
-               ctx->next_progress = progress->verify_streams.completed_bytes + 5000000;
-
-       /* ... But always send a message as soon as we're completely
-        * done.  */
-       if (progress->verify_streams.total_bytes < ctx->next_progress)
-               ctx->next_progress = progress->verify_streams.total_bytes;
        return 0;
 }
 
 static int
-verify_image_blobs_present(struct wim_image_metadata *imd,
-                          struct blob_table *blob_table)
+verify_file_data_present(struct wim_image_metadata *imd,
+                        struct blob_table *blob_table)
 {
        struct wim_inode *inode;
        int ret;
@@ -116,9 +109,10 @@ wimlib_verify_wim(WIMStruct *wim, int verify_flags)
        union wimlib_progress_info progress;
        struct verify_blob_list_ctx ctx;
        struct blob_descriptor *blob;
-       struct read_blob_list_callbacks cbs = {
-               .end_blob = end_verify_blob,
-               .end_blob_ctx = &ctx,
+       struct read_blob_callbacks cbs = {
+               .begin_blob     = verify_begin_blob,
+               .consume_chunk  = verify_consume_chunk,
+               .ctx            = &ctx,
        };
 
        /* Check parameters  */
@@ -150,8 +144,8 @@ wimlib_verify_wim(WIMStruct *wim, int verify_flags)
                        if (ret)
                                return ret;
 
-                       ret = verify_image_blobs_present(wim_get_current_image_metadata(wim),
-                                                        wim->blob_table);
+                       ret = verify_file_data_present(wim_get_current_image_metadata(wim),
+                                                      wim->blob_table);
                        if (ret)
                                return ret;