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_);