From 1ce6a7e40ccf0e4c2259cd631ab5c9a8a91e3893 Mon Sep 17 00:00:00 2001 From: Akilesh Kailash Date: Thu, 11 Feb 2021 22:09:46 +0000 Subject: [PATCH] libsnapshot: Print merge completion ops Once the daemon is terminated, print merge completion ops and the total ops present in the COW file. This will help to know if the merge operation was interrupted and how many pending operations were done during each reboot until merge is completed Bug: 167409187 Test: Incremental and full OTA Signed-off-by: Akilesh Kailash Change-Id: Ie33c840e80aaeca86f51adc8085cb4e306dca110 --- fs_mgr/libsnapshot/cow_reader.cpp | 1 + .../include/libsnapshot/cow_reader.h | 5 +++++ fs_mgr/libsnapshot/snapuserd.cpp | 18 +++++++++++++++++- fs_mgr/libsnapshot/snapuserd.h | 2 ++ fs_mgr/libsnapshot/snapuserd_server.cpp | 1 + 5 files changed, 26 insertions(+), 1 deletion(-) diff --git a/fs_mgr/libsnapshot/cow_reader.cpp b/fs_mgr/libsnapshot/cow_reader.cpp index 75c05d1fd..cf9f6eabf 100644 --- a/fs_mgr/libsnapshot/cow_reader.cpp +++ b/fs_mgr/libsnapshot/cow_reader.cpp @@ -237,6 +237,7 @@ void CowReader::InitializeMerge() { [](CowOperation& op) { return IsMetadataOp(op); }), ops_.get()->end()); + set_total_data_ops(ops_->size()); // We will re-arrange the vector in such a way that // kernel can batch merge. Ex: // diff --git a/fs_mgr/libsnapshot/include/libsnapshot/cow_reader.h b/fs_mgr/libsnapshot/include/libsnapshot/cow_reader.h index 62b54f901..1de7473a9 100644 --- a/fs_mgr/libsnapshot/include/libsnapshot/cow_reader.h +++ b/fs_mgr/libsnapshot/include/libsnapshot/cow_reader.h @@ -142,6 +142,10 @@ class CowReader : public ICowReader { void InitializeMerge(); + void set_total_data_ops(uint64_t size) { total_data_ops_ = size; } + + uint64_t total_data_ops() { return total_data_ops_; } + private: bool ParseOps(std::optional label); @@ -152,6 +156,7 @@ class CowReader : public ICowReader { uint64_t fd_size_; std::optional last_label_; std::shared_ptr> ops_; + uint64_t total_data_ops_; }; } // namespace snapshot diff --git a/fs_mgr/libsnapshot/snapuserd.cpp b/fs_mgr/libsnapshot/snapuserd.cpp index 0a02bd04a..d62030050 100644 --- a/fs_mgr/libsnapshot/snapuserd.cpp +++ b/fs_mgr/libsnapshot/snapuserd.cpp @@ -424,6 +424,7 @@ bool Snapuserd::ProcessMergeComplete(chunk_t chunk, void* buffer) { } SNAP_LOG(DEBUG) << "Merge success: " << merged_ops_cur_iter << "chunk: " << chunk; + merge_initiated_ = true; return true; } @@ -445,6 +446,19 @@ chunk_t Snapuserd::GetNextAllocatableChunkId(chunk_t chunk) { return next_chunk; } +void Snapuserd::CheckMergeCompletionStatus() { + CowHeader header; + + if (merge_initiated_) { + reader_->GetHeader(&header); + SNAP_LOG(INFO) << "Merge-status: Total-Merged-ops: " << header.num_merge_ops + << " Total-data-ops: " << reader_->total_data_ops(); + } else { + SNAP_LOG(INFO) << "Merge was not initiated. Total-Merged-ops: " << header.num_merge_ops + << " Total-data-ops: " << reader_->total_data_ops(); + } +} + /* * Read the metadata from COW device and * construct the metadata as required by the kernel. @@ -818,11 +832,13 @@ bool Snapuserd::ReadMetadata() { << " Num Sector: " << ChunkToSector(data_chunk_id) << " Replace-ops: " << replace_ops << " Zero-ops: " << zero_ops << " Copy-ops: " << copy_ops << " Areas: " << vec_.size() - << " Num-ops-merged: " << header.num_merge_ops; + << " Num-ops-merged: " << header.num_merge_ops + << " Total-data-ops: " << reader_->total_data_ops(); // Total number of sectors required for creating dm-user device num_sectors_ = ChunkToSector(data_chunk_id); metadata_read_done_ = true; + merge_initiated_ = false; return true; } diff --git a/fs_mgr/libsnapshot/snapuserd.h b/fs_mgr/libsnapshot/snapuserd.h index dba3186cf..518d08b84 100644 --- a/fs_mgr/libsnapshot/snapuserd.h +++ b/fs_mgr/libsnapshot/snapuserd.h @@ -70,6 +70,7 @@ class Snapuserd final { const std::string& GetMiscName() { return misc_name_; } uint64_t GetNumSectors() { return num_sectors_; } bool IsAttached() const { return ctrl_fd_ >= 0; } + void CheckMergeCompletionStatus(); void CloseFds() { ctrl_fd_ = {}; cow_fd_ = {}; @@ -141,6 +142,7 @@ class Snapuserd final { std::map chunk_map_; bool metadata_read_done_ = false; + bool merge_initiated_ = false; BufferSink bufsink_; }; diff --git a/fs_mgr/libsnapshot/snapuserd_server.cpp b/fs_mgr/libsnapshot/snapuserd_server.cpp index 68a00a03c..017de3b1c 100644 --- a/fs_mgr/libsnapshot/snapuserd_server.cpp +++ b/fs_mgr/libsnapshot/snapuserd_server.cpp @@ -214,6 +214,7 @@ void SnapuserdServer::RunThread(std::shared_ptr handler) { auto misc_name = handler->misc_name(); LOG(INFO) << "Handler thread about to exit: " << misc_name; + handler->snapuserd()->CheckMergeCompletionStatus(); { std::lock_guard lock(lock_);