Revert "odrefresh: compilation backoff"

This reverts commit 6859ffca5ffd15128459293046590488008221ff.

Reason for revert: Break presubmits (b/189316064)
Fix: 189316064
Bug: 187494247

Change-Id: I146480c01e401e5e0de8f7e0dcf1dbc9d68850f4
diff --git a/odrefresh/Android.bp b/odrefresh/Android.bp
index 255acc9..10845c5 100644
--- a/odrefresh/Android.bp
+++ b/odrefresh/Android.bp
@@ -29,7 +29,6 @@
     defaults: ["art_defaults"],
     srcs: [
         "odrefresh.cc",
-        "odr_compilation_log.cc",
         "odr_fs_utils.cc",
         "odr_metrics.cc",
         "odr_metrics_record.cc",
@@ -169,8 +168,6 @@
     header_libs: ["odrefresh_headers"],
     srcs: [
         "odr_artifacts_test.cc",
-        "odr_compilation_log.cc",
-        "odr_compilation_log_test.cc",
         "odr_fs_utils.cc",
         "odr_fs_utils_test.cc",
         "odr_metrics.cc",
diff --git a/odrefresh/TODO.md b/odrefresh/TODO.md
index 9d7c9fc..5676398 100644
--- a/odrefresh/TODO.md
+++ b/odrefresh/TODO.md
@@ -2,7 +2,7 @@
 
 ## TODO (STOPSHIP until done)
 
-1. denylist for AOT artifacts.
+1. Implement back off on trying compilation when previous attempt(s) failed.
 
 ## DONE
 
@@ -21,6 +21,5 @@
    - Unexpected error (a setup or clean-up action failed).
 6. Metrics recording for subprocess timeouts.
 7. Free space calculation and only attempting compilation if sufficient space.
-8. Implement back off on trying compilation when previous attempt(s) failed.
 
-</strike>
+</strike>
\ No newline at end of file
diff --git a/odrefresh/odr_compilation_log.cc b/odrefresh/odr_compilation_log.cc
deleted file mode 100644
index 55432f4..0000000
--- a/odrefresh/odr_compilation_log.cc
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <odr_compilation_log.h>
-
-#include <errno.h>
-
-#include <fstream>
-#include <ios>
-#include <iosfwd>
-#include <istream>
-#include <ostream>
-#include <streambuf>
-#include <string>
-#include <vector>
-
-#include "android-base/logging.h"
-#include "base/os.h"
-
-#include "odrefresh/odrefresh.h"
-#include "odr_metrics.h"
-
-namespace art {
-namespace odrefresh {
-
-std::istream& operator>>(std::istream& is, OdrCompilationLogEntry& entry) {
-  // Block I/O related exceptions
-  auto saved_exceptions = is.exceptions();
-  is.exceptions(std::ios_base::iostate {});
-
-  is >> entry.apex_version >> std::ws;
-  is >> entry.trigger >> std::ws;
-  is >> entry.when >> std::ws;
-  is >> entry.exit_code >> std::ws;
-
-  // Restore I/O related exceptions
-  is.exceptions(saved_exceptions);
-  return is;
-}
-
-std::ostream& operator<<(std::ostream& os, const OdrCompilationLogEntry& entry) {
-  static const char kSpace = ' ';
-
-  // Block I/O related exceptions
-  auto saved_exceptions = os.exceptions();
-  os.exceptions(std::ios_base::iostate {});
-
-  os << entry.apex_version << kSpace;
-  os << entry.trigger << kSpace;
-  os << entry.when << kSpace;
-  os << entry.exit_code << std::endl;
-
-  // Restore I/O related exceptions
-  os.exceptions(saved_exceptions);
-  return os;
-}
-
-bool operator==(const OdrCompilationLogEntry& lhs, const OdrCompilationLogEntry& rhs) {
-  return lhs.apex_version == rhs.apex_version && lhs.trigger == rhs.trigger &&
-         lhs.when == rhs.when && lhs.exit_code == rhs.exit_code;
-}
-
-bool operator!=(const OdrCompilationLogEntry& lhs, const OdrCompilationLogEntry& rhs) {
-  return !(lhs == rhs);
-}
-
-OdrCompilationLog::OdrCompilationLog(const char* compilation_log_path)
-    : log_path_(compilation_log_path) {
-  if (log_path_ != nullptr && OS::FileExists(log_path_)) {
-    if (!Read()) {
-      PLOG(ERROR) << "Failed to read compilation log: " << log_path_;
-    }
-  }
-}
-
-OdrCompilationLog::~OdrCompilationLog() {
-  if (log_path_ != nullptr && !Write()) {
-    PLOG(ERROR) << "Failed to write compilation log: " << log_path_;
-  }
-}
-
-bool OdrCompilationLog::Read() {
-  std::ifstream ifs(log_path_);
-  if (!ifs.good()) {
-    return false;
-  }
-
-  while (!ifs.eof()) {
-    OdrCompilationLogEntry entry;
-    ifs >> entry;
-    if (ifs.fail()) {
-      entries_.clear();
-      return false;
-    }
-    entries_.push_back(entry);
-  }
-
-  return true;
-}
-
-bool OdrCompilationLog::Write() const {
-  std::ofstream ofs(log_path_, std::ofstream::trunc);
-  if (!ofs.good()) {
-    return false;
-  }
-
-  for (const auto& entry : entries_) {
-    ofs << entry;
-    if (ofs.fail()) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-void OdrCompilationLog::Truncate() {
-  if (entries_.size() < kMaxLoggedEntries) {
-    return;
-  }
-
-  size_t excess = entries_.size() - kMaxLoggedEntries;
-  entries_.erase(entries_.begin(), entries_.begin() + excess);
-}
-
-size_t OdrCompilationLog::NumberOfEntries() const {
-  return entries_.size();
-}
-
-const OdrCompilationLogEntry* OdrCompilationLog::Peek(size_t index) const {
-  if (index >= entries_.size()) {
-    return nullptr;
-  }
-  return &entries_[index];
-}
-
-void OdrCompilationLog::Log(int64_t apex_version,
-                            OdrMetrics::Trigger trigger,
-                            ExitCode compilation_result) {
-  time_t now;
-  time(&now);
-  Log(apex_version, trigger, now, compilation_result);
-}
-
-void OdrCompilationLog::Log(int64_t apex_version,
-                            OdrMetrics::Trigger trigger,
-                            time_t when,
-                            ExitCode compilation_result) {
-  entries_.push_back(OdrCompilationLogEntry{
-      apex_version, static_cast<int32_t>(trigger), when, static_cast<int32_t>(compilation_result)});
-  Truncate();
-}
-
-bool OdrCompilationLog::ShouldAttemptCompile(int64_t apex_version,
-                                             OdrMetrics::Trigger trigger,
-                                             time_t now) const {
-  if (entries_.size() == 0) {
-    // We have no history, try to compile.
-    return true;
-  }
-
-  if (apex_version != entries_.back().apex_version) {
-    // There is a new ART APEX, we should use compile right away.
-    return true;
-  }
-
-  if (trigger == OdrMetrics::Trigger::kDexFilesChanged) {
-    // The DEX files in the classpaths have changed, possibly an OTA has updated them.
-    return true;
-  }
-
-  // Compute the backoff time based on the number of consecutive failures.
-  //
-  // Wait 12 hrs * pow(2, consecutive_failures) since the last compilation attempt.
-  static const int kSecondsPerDay = 86'400;
-  time_t backoff = kSecondsPerDay / 2;
-  for (auto it = entries_.crbegin(); it != entries_.crend(); ++it, backoff *= 2) {
-    if (it->exit_code == ExitCode::kCompilationSuccess) {
-      break;
-    }
-  }
-
-  if (now == 0) {
-    time(&now);
-  }
-
-  const time_t last_attempt = entries_.back().when;
-  const time_t threshold = last_attempt + backoff;
-  return now >= threshold;
-}
-
-}  // namespace odrefresh
-}  // namespace art
diff --git a/odrefresh/odr_compilation_log.h b/odrefresh/odr_compilation_log.h
deleted file mode 100644
index 6f13c97..0000000
--- a/odrefresh/odr_compilation_log.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ART_ODREFRESH_ODR_COMPILATION_LOG_H_
-#define ART_ODREFRESH_ODR_COMPILATION_LOG_H_
-
-#include <time.h>
-
-#include <cstdint>
-#include <iosfwd>
-#include <vector>
-
-#include <odrefresh/odrefresh.h>
-#include <odr_metrics.h>
-
-namespace art {
-namespace odrefresh {
-
-// OdrCompilationLogEntry represents the result of a compilation attempt by odrefresh.
-struct OdrCompilationLogEntry {
-  int64_t apex_version;
-  int32_t trigger;
-  time_t when;
-  int32_t exit_code;
-};
-
-// Read an `OdrCompilationLogEntry` from an input stream.
-std::istream& operator>>(std::istream& is, OdrCompilationLogEntry& entry);
-
-// Write an `OdrCompilationLogEntry` to an output stream.
-std::ostream& operator<<(std::ostream& os, const OdrCompilationLogEntry& entry);
-
-// Equality test for two `OdrCompilationLogEntry` instances.
-bool operator==(const OdrCompilationLogEntry& lhs, const OdrCompilationLogEntry& rhs);
-bool operator!=(const OdrCompilationLogEntry& lhs, const OdrCompilationLogEntry& rhs);
-
-class OdrCompilationLog {
- public:
-  // The compilation log location is in the same directory as used for the metricss.log. This
-  // directory is only used by odrefresh whereas the ART apexdata directory is also used by odsign
-  // and others which may lead to the deletion (or rollback) of the log file.
-  static constexpr const char* kCompilationLogFile = "/data/misc/odrefresh/compilation-log.txt";
-  static constexpr const size_t kMaxLoggedEntries = 4;
-
-  explicit OdrCompilationLog(const char* compilation_log_path = kCompilationLogFile);
-  ~OdrCompilationLog();
-
-  // Applies policy to compilation log to determine whether to recompile.
-  bool ShouldAttemptCompile(int64_t apex_version,
-                            OdrMetrics::Trigger trigger,
-                            time_t now = 0) const;
-
-  // Returns the number of entries in the log. The log never exceeds `kMaxLoggedEntries`.
-  size_t NumberOfEntries() const;
-
-  // Returns the entry at position `index` or nullptr if `index` is out of bounds.
-  const OdrCompilationLogEntry* Peek(size_t index) const;
-
-  void Log(int64_t apex_version, OdrMetrics::Trigger trigger, ExitCode compilation_result);
-
-  void Log(int64_t apex_version,
-           OdrMetrics::Trigger trigger,
-           time_t when,
-           ExitCode compilation_result);
-
-  // Truncates the in memory log to have `kMaxLoggedEntries` records.
-  void Truncate();
-
- private:
-  bool Read();
-  bool Write() const;
-
-  std::vector<OdrCompilationLogEntry> entries_;
-  const char* log_path_;
-};
-
-}  // namespace odrefresh
-}  // namespace art
-
-#endif  // ART_ODREFRESH_ODR_COMPILATION_LOG_H_
diff --git a/odrefresh/odr_compilation_log_test.cc b/odrefresh/odr_compilation_log_test.cc
deleted file mode 100644
index c5c9555..0000000
--- a/odrefresh/odr_compilation_log_test.cc
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <odr_compilation_log.h>
-
-#include <time.h>
-
-#include <cstdint>
-#include <ctime>
-#include <iosfwd>
-#include <istream>
-#include <limits>
-#include <ostream>
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "base/common_art_test.h"
-
-#include "odrefresh/odrefresh.h"
-#include "odr_metrics.h"
-
-namespace art {
-namespace odrefresh {
-
-const time_t kSecondsPerDay = 86'400;
-
-class OdrCompilationLogTest : public CommonArtTest {};
-
-TEST(OdrCompilationLogEntry, Equality) {
-  OdrCompilationLogEntry a{1, 2, 3, 4};
-
-  ASSERT_EQ(a, (OdrCompilationLogEntry{1, 2, 3, 4}));
-  ASSERT_NE(a, (OdrCompilationLogEntry{9, 2, 3, 4}));
-  ASSERT_NE(a, (OdrCompilationLogEntry{1, 9, 3, 4}));
-  ASSERT_NE(a, (OdrCompilationLogEntry{1, 2, 9, 4}));
-  ASSERT_NE(a, (OdrCompilationLogEntry{2, 2, 3, 9}));
-}
-
-TEST(OdrCompilationLogEntry, InputOutput) {
-  const OdrCompilationLogEntry entries[] = {
-      {1, 2, 3, 4},
-      {std::numeric_limits<int64_t>::min(),
-       std::numeric_limits<int32_t>::min(),
-       std::numeric_limits<time_t>::min(),
-       std::numeric_limits<int32_t>::min()},
-      {std::numeric_limits<int64_t>::max(),
-       std::numeric_limits<int32_t>::max(),
-       std::numeric_limits<time_t>::max(),
-       std::numeric_limits<int32_t>::max()},
-       {0, 0, 0, 0},
-      {0x7fedcba9'87654321, 0x12345678, 0x2346789, 0x76543210}
-  };
-  for (const auto& entry : entries) {
-    std::stringstream ss;
-    ss << entry;
-    OdrCompilationLogEntry actual;
-    ss >> actual;
-    ASSERT_EQ(entry, actual);
-  }
-}
-
-TEST(OdrCompilationLogEntry, TruncatedInput) {
-  std::stringstream ss;
-  ss << "1 2";
-
-  OdrCompilationLogEntry entry;
-  ss >> entry;
-
-  ASSERT_TRUE(ss.fail());
-  ASSERT_FALSE(ss.bad());
-}
-
-TEST(OdrCompilationLogEntry, ReadMultiple) {
-  std::stringstream ss;
-  ss << "1 2 3 4\n5 6 7 8\n";
-
-  OdrCompilationLogEntry entry0, entry1;
-  ss >> entry0 >> entry1;
-  ASSERT_EQ(entry0, (OdrCompilationLogEntry{1, 2, 3, 4}));
-  ASSERT_EQ(entry1, (OdrCompilationLogEntry{5, 6, 7, 8}));
-
-  ASSERT_FALSE(ss.fail());
-  ASSERT_FALSE(ss.bad());
-}
-
-TEST(OdrCompilationLog, ShouldAttemptCompile) {
-  OdrCompilationLog ocl(/*compilation_log_path=*/nullptr);
-
-  ASSERT_TRUE(ocl.ShouldAttemptCompile(1, OdrMetrics::Trigger::kMissingArtifacts, 0));
-
-  ocl.Log(
-      /*apex_version=*/1, OdrMetrics::Trigger::kApexVersionMismatch, ExitCode::kCompilationSuccess);
-  ASSERT_TRUE(ocl.ShouldAttemptCompile(2, OdrMetrics::Trigger::kApexVersionMismatch));
-  ASSERT_FALSE(ocl.ShouldAttemptCompile(1, OdrMetrics::Trigger::kApexVersionMismatch));
-  ASSERT_TRUE(ocl.ShouldAttemptCompile(1, OdrMetrics::Trigger::kDexFilesChanged));
-  ASSERT_FALSE(ocl.ShouldAttemptCompile(1, OdrMetrics::Trigger::kUnknown));
-}
-
-TEST(OdrCompilationLog, BackOffNoHistory) {
-  time_t start_time;
-  time(&start_time);
-
-  OdrCompilationLog ocl(/*compilation_log_path=*/nullptr);
-
-  ASSERT_TRUE(ocl.ShouldAttemptCompile(
-      /*apex_version=*/1, OdrMetrics::Trigger::kApexVersionMismatch, start_time));
-
-  // Start log
-  ocl.Log(/*apex_version=*/1,
-          OdrMetrics::Trigger::kApexVersionMismatch,
-          start_time,
-          ExitCode::kCompilationFailed);
-  ASSERT_FALSE(ocl.ShouldAttemptCompile(
-      /*apex_version=*/1, OdrMetrics::Trigger::kApexVersionMismatch, start_time));
-  ASSERT_FALSE(ocl.ShouldAttemptCompile(
-      /*apex_version=*/1,
-      OdrMetrics::Trigger::kApexVersionMismatch,
-      start_time + kSecondsPerDay / 2));
-  ASSERT_TRUE(ocl.ShouldAttemptCompile(
-      /*apex_version=*/1,
-      OdrMetrics::Trigger::kApexVersionMismatch,
-      start_time + kSecondsPerDay));
-
-  // Add one more log entry
-  ocl.Log(/*apex_version=*/1,
-          OdrMetrics::Trigger::kApexVersionMismatch,
-          start_time,
-          ExitCode::kCompilationFailed);
-  ASSERT_FALSE(ocl.ShouldAttemptCompile(
-      /*apex_version=*/1,
-      OdrMetrics::Trigger::kApexVersionMismatch,
-      start_time + kSecondsPerDay));
-  ASSERT_TRUE(ocl.ShouldAttemptCompile(
-      /*apex_version=*/1,
-      OdrMetrics::Trigger::kApexVersionMismatch,
-      start_time + 2 * kSecondsPerDay));
-
-  // One more.
-  ocl.Log(/*apex_version=*/1,
-          OdrMetrics::Trigger::kApexVersionMismatch,
-          start_time,
-          ExitCode::kCompilationFailed);
-  ASSERT_FALSE(ocl.ShouldAttemptCompile(
-      /*apex_version=*/1,
-      OdrMetrics::Trigger::kApexVersionMismatch,
-      start_time + 3 * kSecondsPerDay));
-  ASSERT_TRUE(ocl.ShouldAttemptCompile(
-      /*apex_version=*/1,
-      OdrMetrics::Trigger::kApexVersionMismatch,
-      start_time + 4 * kSecondsPerDay));
-
-  // And one for the road.
-  ocl.Log(/*apex_version=*/1,
-          OdrMetrics::Trigger::kApexVersionMismatch,
-          start_time,
-          ExitCode::kCompilationFailed);
-  ASSERT_FALSE(ocl.ShouldAttemptCompile(
-      /*apex_version=*/1,
-      OdrMetrics::Trigger::kApexVersionMismatch,
-      start_time + 7 * kSecondsPerDay));
-  ASSERT_TRUE(ocl.ShouldAttemptCompile(
-      /*apex_version=*/1,
-      OdrMetrics::Trigger::kApexVersionMismatch,
-      start_time + 8 * kSecondsPerDay));
-}
-
-TEST(OdrCompilationLog, BackOffHappyHistory) {
-  time_t start_time;
-  time(&start_time);
-
-  OdrCompilationLog ocl(/*compilation_log_path=*/nullptr);
-
-  // Start log with a successful entry.
-  ocl.Log(/*apex_version=*/1,
-          OdrMetrics::Trigger::kApexVersionMismatch,
-          start_time,
-          ExitCode::kCompilationSuccess);
-  ASSERT_FALSE(ocl.ShouldAttemptCompile(
-      /*apex_version=*/1, OdrMetrics::Trigger::kApexVersionMismatch, start_time));
-  ASSERT_FALSE(ocl.ShouldAttemptCompile(
-      /*apex_version=*/1,
-      OdrMetrics::Trigger::kApexVersionMismatch,
-      start_time + kSecondsPerDay / 4));
-  ASSERT_TRUE(ocl.ShouldAttemptCompile(
-      /*apex_version=*/1,
-      OdrMetrics::Trigger::kApexVersionMismatch,
-      start_time + kSecondsPerDay / 2));
-
-    // Add a log entry for a failed compilation.
-  ocl.Log(/*apex_version=*/1,
-          OdrMetrics::Trigger::kApexVersionMismatch,
-          start_time,
-          ExitCode::kCompilationFailed);
-  ASSERT_FALSE(ocl.ShouldAttemptCompile(
-      /*apex_version=*/1,
-      OdrMetrics::Trigger::kApexVersionMismatch,
-      start_time + kSecondsPerDay / 2));
-  ASSERT_TRUE(ocl.ShouldAttemptCompile(
-      /*apex_version=*/1,
-      OdrMetrics::Trigger::kApexVersionMismatch,
-      start_time + kSecondsPerDay));
-}
-
-TEST_F(OdrCompilationLogTest, LogNumberOfEntriesAndPeek) {
-  OdrCompilationLog ocl(/*compilation_log_path=*/nullptr);
-
-  std::vector<OdrCompilationLogEntry> entries = {
-    { 0, 1, 2, 3 },
-    { 1, 2, 3, 4 },
-    { 2, 3, 4, 5 },
-    { 3, 4, 5, 6 },
-    { 4, 5, 6, 7 },
-    { 5, 6, 7, 8 },
-    { 6, 7, 8, 9 }
-  };
-
-  for (size_t i = 0; i < entries.size(); ++i) {
-    OdrCompilationLogEntry& e = entries[i];
-    ocl.Log(e.apex_version,
-            static_cast<OdrMetrics::Trigger>(e.trigger),
-            e.when,
-            static_cast<ExitCode>(e.exit_code));
-    if (i < OdrCompilationLog::kMaxLoggedEntries) {
-      ASSERT_EQ(i + 1, ocl.NumberOfEntries());
-    } else {
-      ASSERT_EQ(OdrCompilationLog::kMaxLoggedEntries, ocl.NumberOfEntries());
-    }
-
-    for (size_t j = 0; j < ocl.NumberOfEntries(); ++j) {
-      const OdrCompilationLogEntry* logged = ocl.Peek(j);
-      ASSERT_TRUE(logged != nullptr);
-      const OdrCompilationLogEntry& expected = entries[i + 1 - ocl.NumberOfEntries() + j];
-      ASSERT_EQ(expected, *logged);
-    }
-  }
-}
-
-TEST_F(OdrCompilationLogTest, LogReadWrite) {
-  std::vector<OdrCompilationLogEntry> entries = {
-    { 0, 1, 2, 3 },
-    { 1, 2, 3, 4 },
-    { 2, 3, 4, 5 },
-    { 3, 4, 5, 6 },
-    { 4, 5, 6, 7 },
-    { 5, 6, 7, 8 },
-    { 6, 7, 8, 9 }
-  };
-
-  ScratchFile scratch_file;
-  scratch_file.Close();
-
-  for (size_t i = 0; i < entries.size(); ++i) {
-    {
-      OdrCompilationLog ocl(scratch_file.GetFilename().c_str());
-      OdrCompilationLogEntry& e = entries[i];
-      ocl.Log(e.apex_version,
-              static_cast<OdrMetrics::Trigger>(e.trigger),
-              e.when,
-              static_cast<ExitCode>(e.exit_code));
-    }
-
-    {
-      OdrCompilationLog ocl(scratch_file.GetFilename().c_str());
-      if (i < OdrCompilationLog::kMaxLoggedEntries) {
-        ASSERT_EQ(i + 1, ocl.NumberOfEntries());
-      } else {
-        ASSERT_EQ(OdrCompilationLog::kMaxLoggedEntries, ocl.NumberOfEntries());
-      }
-
-      for (size_t j = 0; j < ocl.NumberOfEntries(); ++j) {
-        const OdrCompilationLogEntry* logged = ocl.Peek(j);
-        ASSERT_TRUE(logged != nullptr);
-        const OdrCompilationLogEntry& expected = entries[i + 1 - ocl.NumberOfEntries() + j];
-        ASSERT_EQ(expected, *logged);
-      }
-    }
-  }
-}
-
-TEST_F(OdrCompilationLogTest, BackoffBasedOnLog) {
-  time_t start_time;
-  time(&start_time);
-
-  ScratchFile scratch_file;
-  scratch_file.Close();
-
-  const char* log_path = scratch_file.GetFilename().c_str();
-  {
-    OdrCompilationLog ocl(log_path);
-
-    ASSERT_TRUE(ocl.ShouldAttemptCompile(
-        /*apex_version=*/1, OdrMetrics::Trigger::kApexVersionMismatch, start_time));
-  }
-
-  {
-    OdrCompilationLog ocl(log_path);
-
-    // Start log
-    ocl.Log(/*apex_version=*/1,
-            OdrMetrics::Trigger::kApexVersionMismatch,
-            start_time,
-            ExitCode::kCompilationFailed);
-  }
-
-  {
-    OdrCompilationLog ocl(log_path);
-    ASSERT_FALSE(ocl.ShouldAttemptCompile(
-        /*apex_version=*/1, OdrMetrics::Trigger::kApexVersionMismatch, start_time));
-    ASSERT_FALSE(ocl.ShouldAttemptCompile(
-        /*apex_version=*/1,
-        OdrMetrics::Trigger::kApexVersionMismatch,
-        start_time + kSecondsPerDay / 2));
-    ASSERT_TRUE(ocl.ShouldAttemptCompile(
-        /*apex_version=*/1,
-        OdrMetrics::Trigger::kApexVersionMismatch,
-        start_time + kSecondsPerDay));
-  }
-
-  {
-    // Add one more log entry
-    OdrCompilationLog ocl(log_path);
-    ocl.Log(/*apex_version=*/1,
-            OdrMetrics::Trigger::kApexVersionMismatch,
-            start_time,
-            ExitCode::kCompilationFailed);
-  }
-
-  {
-    OdrCompilationLog ocl(log_path);
-
-    ASSERT_FALSE(ocl.ShouldAttemptCompile(
-        /*apex_version=*/1,
-        OdrMetrics::Trigger::kApexVersionMismatch,
-        start_time + kSecondsPerDay));
-    ASSERT_TRUE(ocl.ShouldAttemptCompile(
-        /*apex_version=*/1,
-        OdrMetrics::Trigger::kApexVersionMismatch,
-        start_time + 2 * kSecondsPerDay));
-  }
-
-  {
-    // One more log entry.
-    OdrCompilationLog ocl(log_path);
-    ocl.Log(/*apex_version=*/1,
-          OdrMetrics::Trigger::kApexVersionMismatch,
-          start_time,
-          ExitCode::kCompilationFailed);
-  }
-
-  {
-    OdrCompilationLog ocl(log_path);
-    ASSERT_FALSE(ocl.ShouldAttemptCompile(
-        /*apex_version=*/1,
-        OdrMetrics::Trigger::kApexVersionMismatch,
-        start_time + 3 * kSecondsPerDay));
-    ASSERT_TRUE(ocl.ShouldAttemptCompile(
-        /*apex_version=*/1,
-        OdrMetrics::Trigger::kApexVersionMismatch,
-        start_time + 4 * kSecondsPerDay));
-  }
-
-  {
-    // And one for the road.
-    OdrCompilationLog ocl(log_path);
-    ocl.Log(/*apex_version=*/1,
-            OdrMetrics::Trigger::kApexVersionMismatch,
-            start_time,
-            ExitCode::kCompilationFailed);
-  }
-
-  {
-    OdrCompilationLog ocl(log_path);
-    ASSERT_FALSE(ocl.ShouldAttemptCompile(
-        /*apex_version=*/1,
-        OdrMetrics::Trigger::kApexVersionMismatch,
-        start_time + 7 * kSecondsPerDay));
-    ASSERT_TRUE(ocl.ShouldAttemptCompile(
-        /*apex_version=*/1,
-        OdrMetrics::Trigger::kApexVersionMismatch,
-        start_time + 8 * kSecondsPerDay));
-  }
-}
-
-}  // namespace odrefresh
-}  // namespace art
diff --git a/odrefresh/odr_metrics.h b/odrefresh/odr_metrics.h
index 5ff9df2..8b8d5ff 100644
--- a/odrefresh/odr_metrics.h
+++ b/odrefresh/odr_metrics.h
@@ -74,22 +74,11 @@
                       const std::string& metrics_file = kOdrefreshMetricsFile);
   ~OdrMetrics();
 
-  // Gets the ART APEX that metrics are being collected on behalf of.
-  int64_t GetApexVersion() const {
-    return art_apex_version_;
-  }
-
   // Sets the ART APEX that metrics are being collected on behalf of.
   void SetArtApexVersion(int64_t version) {
     art_apex_version_ = version;
   }
 
-  // Gets the trigger for metrics collection. The trigger is the reason why odrefresh considers
-  // compilation necessary.
-  Trigger GetTrigger() const {
-    return trigger_.has_value() ? trigger_.value() : Trigger::kUnknown;
-  }
-
   // Sets the trigger for metrics collection. The trigger is the reason why odrefresh considers
   // compilation necessary. Only call this method if compilation is necessary as the presence
   // of a trigger means we will try to record and upload metrics.
diff --git a/odrefresh/odrefresh.cc b/odrefresh/odrefresh.cc
index 66e2758..d744dfc 100644
--- a/odrefresh/odrefresh.cc
+++ b/odrefresh/odrefresh.cc
@@ -69,7 +69,6 @@
 #include "palette/palette_types.h"
 
 #include "odr_artifacts.h"
-#include "odr_compilation_log.h"
 #include "odr_config.h"
 #include "odr_fs_utils.h"
 #include "odr_metrics.h"
@@ -1457,16 +1456,10 @@
         return odr.CheckArtifactsAreUpToDate(metrics);
       } else if (action == "--compile") {
         const ExitCode exit_code = odr.CheckArtifactsAreUpToDate(metrics);
-        if (exit_code != ExitCode::kCompilationRequired) {
-          return exit_code;
+        if (exit_code == ExitCode::kCompilationRequired) {
+          return odr.Compile(metrics, /*force_compile=*/false);
         }
-        OdrCompilationLog compilation_log;
-        if (!compilation_log.ShouldAttemptCompile(metrics.GetApexVersion(), metrics.GetTrigger())) {
-          return ExitCode::kOkay;
-        }
-        ExitCode compile_result = odr.Compile(metrics, /*force_compile=*/false);
-        compilation_log.Log(metrics.GetApexVersion(), metrics.GetTrigger(), compile_result);
-        return compile_result;
+        return exit_code;
       } else if (action == "--force-compile") {
         return odr.Compile(metrics, /*force_compile=*/true);
       } else if (action == "--verify") {