blob: 69b41c2cb9747280b5fa10c0f6f9b44b8cc44820 [file] [log] [blame]
yro947fbce2017-11-15 22:50:23 -08001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef STORAGE_MANAGER_H
18#define STORAGE_MANAGER_H
19
20#include <android/util/ProtoOutputStream.h>
21#include <utils/Log.h>
22#include <utils/RefBase.h>
23
24#include "packages/UidMap.h"
25
26namespace android {
27namespace os {
28namespace statsd {
29
30using android::util::ProtoOutputStream;
31
32class StorageManager : public virtual RefBase {
33public:
Yao Chen9a43b4f2019-04-10 10:43:20 -070034 struct FileInfo {
35 FileInfo(std::string name, bool isHistory, int fileSize, long fileAge)
36 : mFileName(name),
37 mIsHistory(isHistory),
38 mFileSizeBytes(fileSize),
39 mFileAgeSec(fileAge) {
40 }
41 std::string mFileName;
42 bool mIsHistory;
43 int mFileSizeBytes;
44 long mFileAgeSec;
45 };
46
yro947fbce2017-11-15 22:50:23 -080047 /**
48 * Writes a given byte array as a file to the specified file path.
49 */
50 static void writeFile(const char* file, const void* buffer, int numBytes);
51
52 /**
Chenjie Yu6b1667c2019-01-18 10:09:33 -080053 * Writes train info.
54 */
Muhammad Qureshif4ca8242019-03-01 09:20:15 -080055 static bool writeTrainInfo(int64_t trainVersionCode, const std::string& trainName,
Jeff Hamiltonfa2f91c2019-03-22 00:25:02 -040056 int32_t status, const std::vector<int64_t>& experimentIds);
Chenjie Yu6b1667c2019-01-18 10:09:33 -080057
58 /**
59 * Reads train info.
60 */
Chenjie Yu97dbb202019-02-13 16:42:04 -080061 static bool readTrainInfo(InstallTrainInfo& trainInfo);
Chenjie Yu6b1667c2019-01-18 10:09:33 -080062
63 /**
Yangster-mac932ecec2018-02-01 10:23:52 -080064 * Reads the file content to the buffer.
65 */
66 static bool readFileToString(const char* file, string* content);
67
68 /**
yro947fbce2017-11-15 22:50:23 -080069 * Deletes a single file given a file name.
70 */
71 static void deleteFile(const char* file);
72
73 /**
74 * Deletes all files in a given directory.
75 */
76 static void deleteAllFiles(const char* path);
77
78 /**
yroe5f82922018-01-22 18:37:27 -080079 * Deletes all files whose name matches with a provided suffix.
yro947fbce2017-11-15 22:50:23 -080080 */
yroe5f82922018-01-22 18:37:27 -080081 static void deleteSuffixedFiles(const char* path, const char* suffix);
yro947fbce2017-11-15 22:50:23 -080082
83 /**
84 * Send broadcasts to relevant receiver for each data stored on disk.
85 */
86 static void sendBroadcast(const char* path,
87 const std::function<void(const ConfigKey&)>& sendBroadcast);
88
89 /**
David Chen48944902018-05-03 10:29:11 -070090 * Returns true if there's at least one report on disk.
91 */
92 static bool hasConfigMetricsReport(const ConfigKey& key);
93
94 /**
Bookatzc71d9012018-12-19 12:28:38 -080095 * Appends the ConfigMetricsReport found on disk to the specifid proto
96 * and, if erase_data, deletes it from disk.
Yao Chen9a43b4f2019-04-10 10:43:20 -070097 *
98 * [isAdb]: if the caller is adb dump. This includes local adb dump or dumpsys by
99 * bugreport or incidentd. When true, we will append any local history data too.
100 *
101 * When
102 * erase_data=true, isAdb=true: append history data to output, remove all data after read
103 * erase_data=false, isAdb=true: append history data to output, keep data after read
104 * erase_data=true, isAdb=false: do not append history data, and remove data after read
105 * erase_data=false, isAdb=false: do not append history data and *rename* all data files to
106 * history files.
yro947fbce2017-11-15 22:50:23 -0800107 */
Yao Chen9a43b4f2019-04-10 10:43:20 -0700108 static void appendConfigMetricsReport(const ConfigKey& key, ProtoOutputStream* proto,
109 bool erase_data, bool isAdb);
yro947fbce2017-11-15 22:50:23 -0800110
111 /**
112 * Call to load the saved configs from disk.
113 */
Yao Chenf09569f2017-12-13 17:00:51 -0800114 static void readConfigFromDisk(std::map<ConfigKey, StatsdConfig>& configsMap);
yro98a28502018-01-18 17:00:14 -0800115
116 /**
Yangster-macb142cc82018-03-30 15:22:08 -0700117 * Call to load the specified config from disk. Returns false if the config file does not
118 * exist or error occurs when reading the file.
119 */
120 static bool readConfigFromDisk(const ConfigKey& key, StatsdConfig* config);
121 static bool readConfigFromDisk(const ConfigKey& key, string* config);
122
123 /**
yro98a28502018-01-18 17:00:14 -0800124 * Trims files in the provided directory to limit the total size, number of
125 * files, accumulation of outdated files.
126 */
127 static void trimToFit(const char* dir);
yro44907652018-03-12 20:44:05 -0700128
129 /**
130 * Returns true if there already exists identical configuration on device.
131 */
132 static bool hasIdenticalConfig(const ConfigKey& key,
133 const vector<uint8_t>& config);
yro665208d2018-03-13 18:08:09 -0700134
135 /**
136 * Prints disk usage statistics related to statsd.
137 */
Yao Chena80e5c02018-09-04 13:55:29 -0700138 static void printStats(int out);
yro665208d2018-03-13 18:08:09 -0700139
Yao Chen9a43b4f2019-04-10 10:43:20 -0700140 static string getDataFileName(long wallClockSec, int uid, int64_t id);
141
142 static string getDataHistoryFileName(long wallClockSec, int uid, int64_t id);
143
144 static void sortFiles(vector<FileInfo>* fileNames);
145
yro665208d2018-03-13 18:08:09 -0700146private:
147 /**
148 * Prints disk usage statistics about a directory related to statsd.
149 */
Yao Chena80e5c02018-09-04 13:55:29 -0700150 static void printDirStats(int out, const char* path);
Chenjie Yu6b1667c2019-01-18 10:09:33 -0800151
152 static std::mutex sTrainInfoMutex;
yro947fbce2017-11-15 22:50:23 -0800153};
154
155} // namespace statsd
156} // namespace os
157} // namespace android
158
159#endif // STORAGE_MANAGER_H