DO NOT MERGE Duplicate the last_install content into last_log.

Currently we save the OTA metrics in last_install, which keeps the data
for the _last_ install only. This CL logs the same content into last_log
so that we keep the metrics for every install.

Bug: 31607469
Test: Apply an update (via OTA and sideload) and check last_log and last_install.

Change-Id: Id8f174d79534fddc9f06d72a4e69b2b1d8ab186c
(cherry picked from commit f4885adc18)
This commit is contained in:
Tao Bao 2016-09-26 11:39:14 -07:00
parent 41a3fd4e20
commit a8c0d0b43a
2 changed files with 40 additions and 38 deletions

View file

@ -31,7 +31,6 @@
#include <vector> #include <vector>
#include <android-base/file.h> #include <android-base/file.h>
#include <android-base/logging.h>
#include <android-base/parseint.h> #include <android-base/parseint.h>
#include <android-base/stringprintf.h> #include <android-base/stringprintf.h>
#include <android-base/strings.h> #include <android-base/strings.h>
@ -514,13 +513,6 @@ install_package(const char* path, bool* wipe_cache, const char* install_file,
modified_flash = true; modified_flash = true;
auto start = std::chrono::system_clock::now(); auto start = std::chrono::system_clock::now();
FILE* install_log = fopen_path(install_file, "w");
if (install_log) {
fputs(path, install_log);
fputc('\n', install_log);
} else {
LOGE("failed to open last_install: %s\n", strerror(errno));
}
int result; int result;
std::vector<std::string> log_buffer; std::vector<std::string> log_buffer;
if (setup_install_mounts() != 0) { if (setup_install_mounts() != 0) {
@ -529,33 +521,40 @@ install_package(const char* path, bool* wipe_cache, const char* install_file,
} else { } else {
result = really_install_package(path, wipe_cache, needs_mount, log_buffer, retry_count); result = really_install_package(path, wipe_cache, needs_mount, log_buffer, retry_count);
} }
if (install_log != nullptr) {
fputc(result == INSTALL_SUCCESS ? '1' : '0', install_log);
fputc('\n', install_log);
std::chrono::duration<double> duration = std::chrono::system_clock::now() - start;
int count = static_cast<int>(duration.count());
// Report the time spent to apply OTA update in seconds.
fprintf(install_log, "time_total: %d\n", count);
fprintf(install_log, "retry: %d\n", retry_count);
for (const auto& s : log_buffer) { // Measure the time spent to apply OTA update in seconds.
fprintf(install_log, "%s\n", s.c_str()); std::chrono::duration<double> duration = std::chrono::system_clock::now() - start;
} int time_total = static_cast<int>(duration.count());
if (ensure_path_mounted(UNCRYPT_STATUS) != 0) { if (ensure_path_mounted(UNCRYPT_STATUS) != 0) {
LOG(WARNING) << "Can't mount " << UNCRYPT_STATUS; LOGW("Can't mount %s\n", UNCRYPT_STATUS);
} else {
std::string uncrypt_status;
if (!android::base::ReadFileToString(UNCRYPT_STATUS, &uncrypt_status)) {
LOGW("failed to read uncrypt status: %s\n", strerror(errno));
} else if (!android::base::StartsWith(uncrypt_status, "uncrypt_time:")) {
LOGW("corrupted uncrypt_status: %s: %s\n", uncrypt_status.c_str(), strerror(errno));
} else { } else {
std::string uncrypt_status; log_buffer.push_back(android::base::Trim(uncrypt_status));
if (!android::base::ReadFileToString(UNCRYPT_STATUS, &uncrypt_status)) {
PLOG(WARNING) << "failed to read uncrypt status";
} else if (!android::base::StartsWith(uncrypt_status, "uncrypt_time:")) {
PLOG(WARNING) << "corrupted uncrypt_status: " << uncrypt_status;
} else {
fprintf(install_log, "%s\n", android::base::Trim(uncrypt_status).c_str());
}
} }
fclose(install_log);
} }
// The first two lines need to be the package name and install result.
std::vector<std::string> log_header = {
path,
result == INSTALL_SUCCESS ? "1" : "0",
"time_total: " + std::to_string(time_total),
"retry: " + std::to_string(retry_count),
};
std::string log_content = android::base::Join(log_header, "\n") + "\n" +
android::base::Join(log_buffer, "\n");
if (!android::base::WriteStringToFile(log_content, install_file)) {
LOGE("failed to write %s: %s\n", install_file, strerror(errno));
}
// Write a copy into last_log.
LOGI("%s\n", log_content.c_str());
return result; return result;
} }

View file

@ -1429,15 +1429,18 @@ static bool bootreason_in_blacklist() {
} }
static void log_failure_code(ErrorCode code, const char *update_package) { static void log_failure_code(ErrorCode code, const char *update_package) {
FILE* install_log = fopen_path(TEMPORARY_INSTALL_FILE, "w"); std::vector<std::string> log_buffer = {
if (install_log != nullptr) { update_package,
fprintf(install_log, "%s\n", update_package); "0", // install result
fprintf(install_log, "0\n"); "error: " + std::to_string(code),
fprintf(install_log, "error: %d\n", code); };
fclose(install_log); std::string log_content = android::base::Join(log_buffer, "\n");
} else { if (!android::base::WriteStringToFile(log_content, TEMPORARY_INSTALL_FILE)) {
LOGE("failed to open last_install: %s\n", strerror(errno)); LOGE("failed to write %s: %s\n", TEMPORARY_INSTALL_FILE, strerror(errno));
} }
// Also write the info into last_log.
LOGI("%s\n", log_content.c_str());
} }
static ssize_t logbasename( static ssize_t logbasename(