remount: If checkpoint is in progress, wait for it to complete

Instead of having the user to retry the `remount` command until success
(manual poll). Just block the remount command until checkpoint is
complete, and then continue.

Bug: 252989722
Test: adb remount on a cold device, remount command would block for a
  few dozens of seconds and then continue.
Test: adb remount on a warm device, remount command would process
  immediately. Do not show "force end checkpointing" instructions.
Change-Id: I65f3a5ade4c9538a55892345c75b45ac3a1755fd
This commit is contained in:
Yi-Yo Chiang 2023-10-24 20:59:39 +08:00
parent d1e286f12f
commit 50dca4a77b

View file

@ -158,15 +158,25 @@ bool VerifyCheckpointing() {
// not checkpointing.
auto vold = GetVold();
bool checkpointing = false;
if (!vold->isCheckpointing(&checkpointing).isOk()) {
LOG(ERROR) << "Could not determine checkpointing status.";
return false;
}
if (checkpointing) {
LOG(ERROR) << "Cannot use remount when a checkpoint is in progress.";
LOG(ERROR) << "To force end checkpointing, call 'vdc checkpoint commitChanges'";
LOG(ERROR) << "Warning: this can lead to data corruption if rolled back.";
return false;
bool show_help = true;
while (true) {
if (!vold->isCheckpointing(&checkpointing).isOk()) {
LOG(ERROR) << "Could not determine checkpointing status.";
return false;
}
if (!checkpointing) {
break;
}
if (show_help) {
show_help = false;
std::cerr << "WARNING: Userdata checkpoint is in progress. To force end checkpointing, "
"call 'vdc checkpoint commitChanges'. This can lead to data corruption if "
"rolled back."
<< std::endl;
LOG(INFO) << "Waiting for checkpoint to complete and then continue remount.";
}
std::this_thread::sleep_for(4s);
}
return true;
}