summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkilesh Kailash <akailash@google.com>2021-09-12 12:31:33 +0000
committerAkilesh Kailash <akailash@google.com>2021-09-17 18:16:20 +0000
commitab12b4e8ff3d6cff4ff5aed14f07b64a35c654a1 (patch)
tree41f5c9516c4e1a3234bd302bf555b8bcf6f64529
parentf7185915be50baa489ec627d0c3571d546866e17 (diff)
downloadcore-ab12b4e8ff3d6cff4ff5aed14f07b64a35c654a1.tar.gz
libsnapshot: Error handling after QuerySnapshotStatus
QuerySnapshotStatus will capture the error codes from dm-snapshot if there are any snapshot related failure. Handle the error codes and fail the QuerySnapshotStatus call. Validate snapshot status in MapSnapshot(). If the mode is set to Persistent and snapshot status is in Merging state, then forcefully set the mode to Merge state. Bug: 198265278 Test: Full/incremental OTA Signed-off-by: Akilesh Kailash <akailash@google.com> Change-Id: I779184f1998b23edacd6e780acf2676442004340 Merged-In: I779184f1998b23edacd6e780acf2676442004340
-rw-r--r--fs_mgr/libsnapshot/snapshot.cpp11
1 files changed, 11 insertions, 0 deletions
diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp
index 739fcbb2f..65b73614d 100644
--- a/fs_mgr/libsnapshot/snapshot.cpp
+++ b/fs_mgr/libsnapshot/snapshot.cpp
@@ -518,6 +518,13 @@ bool SnapshotManager::MapSnapshot(LockedFile* lock, const std::string& name,
break;
}
+ if (mode == SnapshotStorageMode::Persistent && status.state() == SnapshotState::MERGING) {
+ LOG(ERROR) << "Snapshot: " << name
+ << " has snapshot status Merging but mode set to Persistent."
+ << " Changing mode to Snapshot-Merge.";
+ mode = SnapshotStorageMode::Merge;
+ }
+
DmTable table;
table.Emplace<DmTargetSnapshot>(0, snapshot_sectors, base_device, cow_device, mode,
kSnapshotChunkSize);
@@ -886,6 +893,10 @@ bool SnapshotManager::QuerySnapshotStatus(const std::string& dm_name, std::strin
if (target_type) {
*target_type = DeviceMapper::GetTargetType(target.spec);
}
+ if (!status->error.empty()) {
+ LOG(ERROR) << "Snapshot: " << dm_name << " returned error code: " << status->error;
+ return false;
+ }
return true;
}