aboutsummaryrefslogtreecommitdiffstats
path: root/recovery.cpp
diff options
context:
space:
mode:
authorTao Bao <tbao@google.com>2015-04-07 17:16:35 -0700
committerTao Bao <tbao@google.com>2015-04-07 22:02:27 -0700
commit682c34bbc32f3a9f007dd949282651ed35d4f6e3 (patch)
treef91733ca7065a14f6a8e0007cb7ea3d3685f3b3e /recovery.cpp
parent6896f9d47db1f959a907d2e67e55860af23e65f8 (diff)
downloadbootable_recovery-682c34bbc32f3a9f007dd949282651ed35d4f6e3.zip
bootable_recovery-682c34bbc32f3a9f007dd949282651ed35d4f6e3.tar.gz
bootable_recovery-682c34bbc32f3a9f007dd949282651ed35d4f6e3.tar.bz2
Rotate logs only when there are actual operations
Currently it rotates the log files every time it boots into the recovery mode. We lose useful logs after ten times. This CL changes the rotation condition so that it will rotate only if it performs some actual operations that modify the flash (installs, wipes, sideloads and etc). Bug: 19695622 Change-Id: Ie708ad955ef31aa500b6590c65faa72391705940
Diffstat (limited to 'recovery.cpp')
-rw-r--r--recovery.cpp37
1 files changed, 28 insertions, 9 deletions
diff --git a/recovery.cpp b/recovery.cpp
index 0ba4d1e..2f8654a 100644
--- a/recovery.cpp
+++ b/recovery.cpp
@@ -92,6 +92,7 @@ char* locale = NULL;
char recovery_version[PROPERTY_VALUE_MAX+1];
char* stage = NULL;
char* reason = NULL;
+bool modified_flash = false;
/*
* The recovery tool communicates with the main system through /cache files.
@@ -337,13 +338,18 @@ copy_log_file(const char* source, const char* destination, int append) {
// Rename last_log -> last_log.1 -> last_log.2 -> ... -> last_log.$max
// Overwrites any existing last_log.$max.
-static void
-rotate_last_logs(int max) {
+static void rotate_last_logs(int max) {
+ // Logs should only be rotated once.
+ static bool rotated = false;
+ if (rotated) {
+ return;
+ }
+ rotated = true;
+ ensure_path_mounted(LAST_LOG_FILE);
+
char oldfn[256];
char newfn[256];
-
- int i;
- for (i = max-1; i >= 0; --i) {
+ for (int i = max-1; i >= 0; --i) {
snprintf(oldfn, sizeof(oldfn), (i==0) ? LAST_LOG_FILE : (LAST_LOG_FILE ".%d"), i);
snprintf(newfn, sizeof(newfn), LAST_LOG_FILE ".%d", i+1);
// ignore errors
@@ -351,8 +357,17 @@ rotate_last_logs(int max) {
}
}
-static void
-copy_logs() {
+static void copy_logs() {
+ // We only rotate and record the log of the current session if there are
+ // actual attempts to modify the flash, such as wipes, installs from BCB
+ // or menu selections. This is to avoid unnecessary rotation (and
+ // possible deletion) of log files, if it does not do anything loggable.
+ if (!modified_flash) {
+ return;
+ }
+
+ rotate_last_logs(KEEP_LOG_COUNT);
+
// Copy logs to cache so the system can find out what happened.
copy_log_file(TEMPORARY_LOG_FILE, LOG_FILE, true);
copy_log_file(TEMPORARY_LOG_FILE, LAST_LOG_FILE, false);
@@ -692,6 +707,8 @@ static bool wipe_data(int should_confirm, Device* device) {
return false;
}
+ modified_flash = true;
+
ui->Print("\n-- Wiping data...\n");
if (device->WipeData() == 0 && erase_volume("/data") == 0 && erase_volume("/cache") == 0) {
ui->Print("Data wipe complete.\n");
@@ -708,6 +725,8 @@ static bool wipe_cache(bool should_confirm, Device* device) {
return false;
}
+ modified_flash = true;
+
ui->Print("\n-- Wiping cache...\n");
if (erase_volume("/cache") == 0) {
ui->Print("Cache wipe complete.\n");
@@ -816,6 +835,8 @@ static void choose_recovery_file(Device* device) {
}
static int apply_from_sdcard(Device* device, bool* wipe_cache) {
+ modified_flash = true;
+
if (ensure_path_mounted(SDCARD_ROOT) != 0) {
ui->Print("\n-- Couldn't mount %s.\n", SDCARD_ROOT);
return INSTALL_ERROR;
@@ -990,8 +1011,6 @@ main(int argc, char **argv) {
printf("Starting recovery (pid %d) on %s", getpid(), ctime(&start));
load_volume_table();
- ensure_path_mounted(LAST_LOG_FILE);
- rotate_last_logs(KEEP_LOG_COUNT);
get_args(&argc, &argv);
const char *send_intent = NULL;