From c2b2bb5d788b68c641c66f4cf40e653d41f77754 Mon Sep 17 00:00:00 2001 From: Tianjie Xu Date: Tue, 15 May 2018 15:09:59 -0700 Subject: Last command file should be updated after a command finishes The last command file has the last executed stash command by convention. So we should update the file after we actually finishes executing the command; instead of after loading src/tgt. Bug: 79756267 Test: unit tests pass Change-Id: I4535b5836e7eb13b3abe3d02f9f362ec5e9ec969 --- updater/blockimg.cpp | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/updater/blockimg.cpp b/updater/blockimg.cpp index 156a82939..236644e7f 100644 --- a/updater/blockimg.cpp +++ b/updater/blockimg.cpp @@ -132,8 +132,7 @@ static bool FsyncDir(const std::string& dirname) { return true; } -// Update the last command index in the last_command_file if the current command writes to the -// stash either explicitly or implicitly. +// Update the last executed command index in the last_command_file. static bool UpdateLastCommandIndex(int command_index, const std::string& command_string) { const std::string& last_command_file = Paths::Get().last_command_file(); std::string last_command_tmp = last_command_file + ".tmp"; @@ -1161,10 +1160,6 @@ static int LoadSrcTgtVersion3(CommandParameters& params, RangeSet& tgt, size_t* return -1; } - if (!UpdateLastCommandIndex(params.cmdindex, params.cmdline)) { - LOG(WARNING) << "Failed to update the last command file."; - } - params.stashed += *src_blocks; // Can be deleted when the write has completed. if (!stash_exists) { @@ -1275,10 +1270,6 @@ static int PerformCommandStash(CommandParameters& params) { LOG(INFO) << "stashing " << blocks << " blocks to " << id; int result = WriteStash(params.stashbase, id, blocks, params.buffer, false, nullptr); if (result == 0) { - if (!UpdateLastCommandIndex(params.cmdindex, params.cmdline)) { - LOG(WARNING) << "Failed to update the last command file."; - } - params.stashed += blocks; } return result; @@ -1701,7 +1692,7 @@ static Value* PerformBlockImageUpdate(const char* name, State* state, params.createdstash = res; // When performing an update, save the index and cmdline of the current command into - // the last_command_file if this command writes to the stash either explicitly of implicitly. + // the last_command_file. // Upon resuming an update, read the saved index first; then // 1. In verification mode, check if the 'move' or 'diff' commands before the saved index has // the expected target blocks already. If not, these commands cannot be skipped and we need @@ -1797,6 +1788,11 @@ static Value* PerformBlockImageUpdate(const char* name, State* state, PLOG(ERROR) << "fsync failed"; goto pbiudone; } + + if (!UpdateLastCommandIndex(params.cmdindex, params.cmdline)) { + LOG(WARNING) << "Failed to update the last command file."; + } + fprintf(cmd_pipe, "set_progress %.4f\n", static_cast(params.written) / total_blocks); fflush(cmd_pipe); } -- cgit v1.2.3