1 // Copyright 2022 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/android/remove_stale_data.h"
6
7 #include "base/files/file_path.h"
8 #include "base/files/file_util.h"
9 #include "base/metrics/histogram_functions.h"
10 #include "base/task/task_traits.h"
11 #include "base/task/thread_pool.h"
12 #include "base/trace_event/base_tracing.h"
13
14 namespace base {
15 namespace android {
16
17 namespace {
18
19 // These values are persisted to logs. Entries should not be renumbered and
20 // numeric values should never be reused.
21 enum class DeleteResult {
22 kNotFound = 0,
23 kDeleted = 1,
24 kDeleteError = 2,
25 kMaxValue = kDeleteError,
26 };
27
RecordDeleteResult(DeleteResult result)28 void RecordDeleteResult(DeleteResult result) {
29 base::UmaHistogramEnumeration("NetworkService.ClearStaleDataDirectoryResult",
30 result);
31 }
32
RemoveStaleDataDirectoryOnPool(const base::FilePath & data_directory)33 void RemoveStaleDataDirectoryOnPool(const base::FilePath& data_directory) {
34 TRACE_EVENT0("startup", "RemoveStaleDataDirectoryOnPool");
35 if (!base::PathExists(data_directory)) {
36 RecordDeleteResult(DeleteResult::kNotFound);
37 return;
38 }
39 if (base::DeletePathRecursively(data_directory)) {
40 RecordDeleteResult(DeleteResult::kDeleted);
41 return;
42 }
43 RecordDeleteResult(DeleteResult::kDeleteError);
44 }
45
46 } // namespace
47
RemoveStaleDataDirectory(const base::FilePath & data_directory)48 void RemoveStaleDataDirectory(const base::FilePath& data_directory) {
49 base::ThreadPool::PostTask(
50 FROM_HERE,
51 {base::TaskPriority::BEST_EFFORT, base::MayBlock(),
52 base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
53 base::BindOnce(&RemoveStaleDataDirectoryOnPool, data_directory));
54 }
55
56 } // namespace android
57 } // namespace base
58