Verity writes propogate progress report
Test: tested on cuttlefish device with inc_ota from build 9263663 9419942. Ensured progress grows linearly from 0 - 0.6. Half time spent in read step, half in Verity Writes.
Change-Id: Iffa16571e828909cd6ac58f262736c0b6ca7b066
diff --git a/payload_consumer/filesystem_verifier_action.cc b/payload_consumer/filesystem_verifier_action.cc
index e88337b..dfbe513 100644
--- a/payload_consumer/filesystem_verifier_action.cc
+++ b/payload_consumer/filesystem_verifier_action.cc
@@ -80,7 +80,9 @@
namespace {
const off_t kReadFileBufferSize = 128 * 1024;
-constexpr float kVerityProgressPercent = 0.6;
+constexpr float kVerityProgressPercent = 0.3;
+constexpr float kEncodeFECPercent = 0.3;
+
} // namespace
void FilesystemVerifierAction::PerformAction() {
@@ -239,6 +241,8 @@
LOG(ERROR) << "Failed to write verity data";
Cleanup(ErrorCode::kVerityCalculationError);
}
+ UpdatePartitionProgress(kVerityProgressPercent +
+ verity_writer_->GetProgress() * kEncodeFECPercent);
CHECK(pending_task_id_.PostTask(
FROM_HERE,
base::BindOnce(&FilesystemVerifierAction::WriteVerityData,
@@ -333,8 +337,9 @@
// verity writes and partition hashing. Otherwise, the entire progress bar is
// dedicated to partition hashing for smooth progress.
if (ShouldWriteVerity()) {
- UpdatePartitionProgress(progress * (1 - kVerityProgressPercent) +
- kVerityProgressPercent);
+ UpdatePartitionProgress(
+ progress * (1 - (kVerityProgressPercent + kEncodeFECPercent)) +
+ kVerityProgressPercent + kEncodeFECPercent);
} else {
UpdatePartitionProgress(progress);
}
diff --git a/payload_consumer/verity_writer_android.cc b/payload_consumer/verity_writer_android.cc
index 479231d..31d2875 100644
--- a/payload_consumer/verity_writer_android.cc
+++ b/payload_consumer/verity_writer_android.cc
@@ -150,6 +150,10 @@
return current_step_ == EncodeFECStep::kComplete;
}
+double IncrementalEncodeFEC::ReportProgress() const {
+ return static_cast<double>(current_round_) / num_rounds_;
+}
+
namespace verity_writer {
std::unique_ptr<VerityWriterInterface> CreateVerityWriter() {
return std::make_unique<VerityWriterAndroid>();
@@ -312,6 +316,11 @@
}
return false;
}
+
+double VerityWriterAndroid::GetProgress() {
+ return encodeFEC_.ReportProgress();
+}
+
bool VerityWriterAndroid::EncodeFEC(FileDescriptor* read_fd,
FileDescriptor* write_fd,
uint64_t data_offset,
diff --git a/payload_consumer/verity_writer_android.h b/payload_consumer/verity_writer_android.h
index 0d48803..1aaafd5 100644
--- a/payload_consumer/verity_writer_android.h
+++ b/payload_consumer/verity_writer_android.h
@@ -55,6 +55,7 @@
void UpdateState();
bool Finished() const;
void Reset();
+ double ReportProgress() const;
private:
brillo::Blob rs_blocks_;
@@ -88,7 +89,7 @@
bool Finalize(FileDescriptor* read_fd, FileDescriptor* write_fd) override;
bool IncrementalFinalize(FileDescriptor* read_fd,
FileDescriptor* write_fd) override;
-
+ double GetProgress() override;
bool FECFinished() const override;
// Read [data_offset : data_offset + data_size) from |path| and encode FEC
// data, if |verify_mode|, then compare the encoded FEC with the one in
diff --git a/payload_consumer/verity_writer_interface.h b/payload_consumer/verity_writer_interface.h
index 8b4f080..3ebe768 100644
--- a/payload_consumer/verity_writer_interface.h
+++ b/payload_consumer/verity_writer_interface.h
@@ -55,6 +55,9 @@
// Returns true once FEC data is finished writing
virtual bool FECFinished() const = 0;
+ // Gets progress report on FEC write
+ virtual double GetProgress() = 0;
+
protected:
VerityWriterInterface() = default;