blob: 504c02a57b86be09263b08102177abb182536c80 [file] [log] [blame]
Songchun Fan3c82a302019-11-29 14:23:45 -08001/*
2 * Copyright (C) 2019 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#pragma once
18
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -070019#include <android/content/pm/BnDataLoaderStatusListener.h>
Songchun Fan3c82a302019-11-29 14:23:45 -080020#include <android/content/pm/DataLoaderParamsParcel.h>
Alex Buynytskyycca2c112020-05-05 12:48:41 -070021#include <android/content/pm/FileSystemControlParcel.h>
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -070022#include <android/content/pm/IDataLoaderStatusListener.h>
23#include <android/os/incremental/BnIncrementalServiceConnector.h>
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -070024#include <android/os/incremental/BnStorageHealthListener.h>
Songchun Fana7098592020-09-03 11:45:53 -070025#include <android/os/incremental/BnStorageLoadingProgressListener.h>
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -070026#include <android/os/incremental/StorageHealthCheckParams.h>
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -070027#include <binder/IAppOpsCallback.h>
Songchun Fan3c82a302019-11-29 14:23:45 -080028#include <utils/String16.h>
29#include <utils/StrongPointer.h>
Yurii Zubrytskyida208012020-04-07 15:35:21 -070030#include <ziparchive/zip_archive.h>
Songchun Fan3c82a302019-11-29 14:23:45 -080031
32#include <atomic>
33#include <chrono>
Yurii Zubrytskyida208012020-04-07 15:35:21 -070034#include <condition_variable>
35#include <functional>
Songchun Fan3c82a302019-11-29 14:23:45 -080036#include <limits>
37#include <map>
38#include <mutex>
Alex Buynytskyy4760d8f2020-05-08 16:18:52 -070039#include <set>
Songchun Fan9b753082020-02-26 13:08:06 -080040#include <span>
Songchun Fan3c82a302019-11-29 14:23:45 -080041#include <string>
42#include <string_view>
Yurii Zubrytskyida208012020-04-07 15:35:21 -070043#include <thread>
Songchun Fan3c82a302019-11-29 14:23:45 -080044#include <unordered_map>
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -070045#include <unordered_set>
Songchun Fan3c82a302019-11-29 14:23:45 -080046#include <utility>
47#include <vector>
48
49#include "ServiceWrappers.h"
Songchun Fan3c82a302019-11-29 14:23:45 -080050#include "incfs.h"
51#include "path.h"
52
Songchun Fan3c82a302019-11-29 14:23:45 -080053namespace android::incremental {
54
55using MountId = int;
56using StorageId = int;
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -080057using FileId = incfs::FileId;
Songchun Fan3c82a302019-11-29 14:23:45 -080058using BlockIndex = incfs::BlockIndex;
59using RawMetadata = incfs::RawMetadata;
Songchun Fan3c82a302019-11-29 14:23:45 -080060using Seconds = std::chrono::seconds;
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -070061using BootClockTsUs = uint64_t;
Songchun Fan3c82a302019-11-29 14:23:45 -080062
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -070063using IDataLoaderStatusListener = ::android::content::pm::IDataLoaderStatusListener;
64using DataLoaderStatusListener = ::android::sp<IDataLoaderStatusListener>;
Alex Buynytskyy04f73912020-02-10 08:34:18 -080065
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -070066using StorageHealthCheckParams = ::android::os::incremental::StorageHealthCheckParams;
67using IStorageHealthListener = ::android::os::incremental::IStorageHealthListener;
68using StorageHealthListener = ::android::sp<IStorageHealthListener>;
Songchun Fana7098592020-09-03 11:45:53 -070069using IStorageLoadingProgressListener = ::android::os::incremental::IStorageLoadingProgressListener;
70using StorageLoadingProgressListener = ::android::sp<IStorageLoadingProgressListener>;
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -070071
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -080072class IncrementalService final {
Songchun Fan3c82a302019-11-29 14:23:45 -080073public:
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -080074 explicit IncrementalService(ServiceManagerWrapper&& sm, std::string_view rootDir);
Songchun Fan3c82a302019-11-29 14:23:45 -080075
76#pragma GCC diagnostic push
77#pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
78 ~IncrementalService();
79#pragma GCC diagnostic pop
80
81 static constexpr StorageId kInvalidStorageId = -1;
82 static constexpr StorageId kMaxStorageId = std::numeric_limits<int>::max();
83
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -070084 static constexpr BootClockTsUs kMaxBootClockTsUs = std::numeric_limits<BootClockTsUs>::max();
85
Songchun Fan3c82a302019-11-29 14:23:45 -080086 enum CreateOptions {
87 TemporaryBind = 1,
88 PermanentBind = 2,
89 CreateNew = 4,
90 OpenExisting = 8,
91
92 Default = TemporaryBind | CreateNew
93 };
94
95 enum class BindKind {
96 Temporary = 0,
97 Permanent = 1,
98 };
99
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -0700100 enum StorageFlags {
101 ReadLogsEnabled = 1,
102 };
103
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800104 static FileId idFromMetadata(std::span<const uint8_t> metadata);
105 static inline FileId idFromMetadata(std::span<const char> metadata) {
106 return idFromMetadata({(const uint8_t*)metadata.data(), metadata.size()});
107 }
108
Alex Buynytskyy18b07a42020-02-03 20:06:00 -0800109 void onDump(int fd);
110
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700111 void onSystemReady();
Songchun Fan3c82a302019-11-29 14:23:45 -0800112
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700113 StorageId createStorage(std::string_view mountPoint,
114 content::pm::DataLoaderParamsParcel&& dataLoaderParams,
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700115 CreateOptions options, const DataLoaderStatusListener& statusListener,
116 StorageHealthCheckParams&& healthCheckParams,
117 const StorageHealthListener& healthListener);
Songchun Fan3c82a302019-11-29 14:23:45 -0800118 StorageId createLinkedStorage(std::string_view mountPoint, StorageId linkedStorage,
119 CreateOptions options = CreateOptions::Default);
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800120 StorageId openStorage(std::string_view path);
Songchun Fan3c82a302019-11-29 14:23:45 -0800121
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800122 int bind(StorageId storage, std::string_view source, std::string_view target, BindKind kind);
Songchun Fan3c82a302019-11-29 14:23:45 -0800123 int unbind(StorageId storage, std::string_view target);
124 void deleteStorage(StorageId storage);
125
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -0700126 void disableReadLogs(StorageId storage);
Alex Buynytskyy5e860ba2020-03-31 15:30:21 -0700127 int setStorageParams(StorageId storage, bool enableReadLogs);
128
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800129 int makeFile(StorageId storage, std::string_view path, int mode, FileId id,
Alex Buynytskyyb39d13e2020-09-12 16:12:36 -0700130 incfs::NewFileParams params, std::span<const uint8_t> data);
Songchun Fan96100932020-02-03 19:20:58 -0800131 int makeDir(StorageId storage, std::string_view path, int mode = 0755);
132 int makeDirs(StorageId storage, std::string_view path, int mode = 0755);
Songchun Fan3c82a302019-11-29 14:23:45 -0800133
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800134 int link(StorageId sourceStorageId, std::string_view oldPath, StorageId destStorageId,
135 std::string_view newPath);
136 int unlink(StorageId storage, std::string_view path);
Songchun Fan3c82a302019-11-29 14:23:45 -0800137
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -0700138 int isFileFullyLoaded(StorageId storage, const std::string& path) const;
Songchun Fan374f7652020-08-20 08:40:29 -0700139 float getLoadingProgress(StorageId storage) const;
Songchun Fana7098592020-09-03 11:45:53 -0700140 bool registerLoadingProgressListener(StorageId storage,
141 const StorageLoadingProgressListener& progressListener);
142 bool unregisterLoadingProgressListener(StorageId storage);
Songchun Fan3c82a302019-11-29 14:23:45 -0800143
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700144 RawMetadata getMetadata(StorageId storage, std::string_view path) const;
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800145 RawMetadata getMetadata(StorageId storage, FileId node) const;
Songchun Fan3c82a302019-11-29 14:23:45 -0800146
Songchun Fan3c82a302019-11-29 14:23:45 -0800147 bool startLoading(StorageId storage) const;
Yurii Zubrytskyida208012020-04-07 15:35:21 -0700148
Songchun Fan0f8b6fe2020-02-05 17:41:25 -0800149 bool configureNativeBinaries(StorageId storage, std::string_view apkFullPath,
Songchun Fan14f6c3c2020-05-21 18:19:07 -0700150 std::string_view libDirRelativePath, std::string_view abi,
151 bool extractNativeLibs);
Yurii Zubrytskyida208012020-04-07 15:35:21 -0700152 bool waitForNativeBinariesExtraction(StorageId storage);
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700153
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700154 class AppOpsListener : public android::BnAppOpsCallback {
155 public:
Yurii Zubrytskyida208012020-04-07 15:35:21 -0700156 AppOpsListener(IncrementalService& incrementalService, std::string packageName)
157 : incrementalService(incrementalService), packageName(std::move(packageName)) {}
Alex Buynytskyyf4156792020-04-07 14:26:55 -0700158 void opChanged(int32_t op, const String16& packageName) final;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700159
160 private:
161 IncrementalService& incrementalService;
162 const std::string packageName;
163 };
164
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700165 class IncrementalServiceConnector : public os::incremental::BnIncrementalServiceConnector {
Alex Buynytskyyf4156792020-04-07 14:26:55 -0700166 public:
167 IncrementalServiceConnector(IncrementalService& incrementalService, int32_t storage)
Alex Buynytskyy5f9e3a02020-04-07 21:13:41 -0700168 : incrementalService(incrementalService), storage(storage) {}
Alex Buynytskyyf4156792020-04-07 14:26:55 -0700169 binder::Status setStorageParams(bool enableReadLogs, int32_t* _aidl_return) final;
170
171 private:
172 IncrementalService& incrementalService;
Alex Buynytskyy5f9e3a02020-04-07 21:13:41 -0700173 int32_t const storage;
Alex Buynytskyyf4156792020-04-07 14:26:55 -0700174 };
175
Songchun Fan3c82a302019-11-29 14:23:45 -0800176private:
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700177 struct IncFsMount;
178
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700179 class DataLoaderStub : public content::pm::BnDataLoaderStatusListener {
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700180 public:
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700181 DataLoaderStub(IncrementalService& service, MountId id,
182 content::pm::DataLoaderParamsParcel&& params,
183 content::pm::FileSystemControlParcel&& control,
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700184 const DataLoaderStatusListener* statusListener,
185 StorageHealthCheckParams&& healthCheckParams,
186 const StorageHealthListener* healthListener, std::string&& healthPath);
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700187 ~DataLoaderStub();
Alex Buynytskyy9a54579a2020-04-17 15:34:47 -0700188 // Cleans up the internal state and invalidates DataLoaderStub. Any subsequent calls will
189 // result in an error.
190 void cleanupResources();
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700191
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700192 bool requestCreate();
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700193 bool requestStart();
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700194 bool requestDestroy();
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700195
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700196 void onDump(int fd);
197
Alex Buynytskyy4760d8f2020-05-08 16:18:52 -0700198 MountId id() const { return mId.load(std::memory_order_relaxed); }
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700199 const content::pm::DataLoaderParamsParcel& params() const { return mParams; }
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700200
201 private:
202 binder::Status onStatusChanged(MountId mount, int newStatus) final;
Songchun Fan33093982020-09-10 13:12:39 -0700203 binder::Status reportStreamHealth(MountId mount, int newStatus) final;
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700204
Alex Buynytskyy0bdbccf2020-04-23 20:36:42 -0700205 sp<content::pm::IDataLoader> getDataLoader();
Alex Buynytskyy9a54579a2020-04-17 15:34:47 -0700206
Alex Buynytskyyea1390f2020-04-22 16:08:50 -0700207 bool bind();
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700208 bool create();
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700209 bool start();
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700210 bool destroy();
211
212 bool setTargetStatus(int status);
Alex Buynytskyy7e0a1a82020-04-27 17:06:10 -0700213 void setTargetStatusLocked(int status);
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700214
215 bool fsmStep();
Alex Buynytskyy4760d8f2020-05-08 16:18:52 -0700216 bool fsmStep(int currentStatus, int targetStatus);
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700217
Alex Buynytskyy4760d8f2020-05-08 16:18:52 -0700218 void onHealthStatus(StorageHealthListener healthListener, int healthStatus);
219 void updateHealthStatus(bool baseline = false);
220
221 bool isValid() const { return id() != kInvalidStorageId; }
222
223 bool isHealthParamsValid() const;
224
225 const incfs::UniqueControl& initializeHealthControl();
226 void resetHealthControl();
227
228 BootClockTsUs getOldestPendingReadTs();
229
230 void registerForPendingReads();
231 void unregisterFromPendingReads();
Alex Buynytskyyd0855a32020-05-07 18:40:51 -0700232
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700233 IncrementalService& mService;
Alex Buynytskyyb0ea4482020-05-04 18:39:58 -0700234
235 std::mutex mMutex;
Alex Buynytskyy4760d8f2020-05-08 16:18:52 -0700236 std::atomic<MountId> mId = kInvalidStorageId;
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700237 content::pm::DataLoaderParamsParcel mParams;
238 content::pm::FileSystemControlParcel mControl;
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700239 DataLoaderStatusListener mStatusListener;
240 StorageHealthListener mHealthListener;
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700241
Alex Buynytskyy0b202662020-04-13 09:53:04 -0700242 std::condition_variable mStatusCondition;
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700243 int mCurrentStatus = content::pm::IDataLoaderStatusListener::DATA_LOADER_DESTROYED;
244 int mTargetStatus = content::pm::IDataLoaderStatusListener::DATA_LOADER_DESTROYED;
Alex Buynytskyyab65cb12020-04-17 10:01:47 -0700245 TimePoint mTargetStatusTs = {};
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700246
Alex Buynytskyyd0855a32020-05-07 18:40:51 -0700247 std::string mHealthPath;
248 incfs::UniqueControl mHealthControl;
Alex Buynytskyy4760d8f2020-05-08 16:18:52 -0700249 struct {
250 TimePoint userTs;
251 BootClockTsUs kernelTsUs;
252 } mHealthBase = {TimePoint::max(), kMaxBootClockTsUs};
253 StorageHealthCheckParams mHealthCheckParams;
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700254 };
255 using DataLoaderStubPtr = sp<DataLoaderStub>;
256
Songchun Fan3c82a302019-11-29 14:23:45 -0800257 struct IncFsMount {
258 struct Bind {
259 StorageId storage;
260 std::string savedFilename;
261 std::string sourceDir;
262 BindKind kind;
263 };
264
265 struct Storage {
266 std::string name;
Songchun Fan3c82a302019-11-29 14:23:45 -0800267 };
268
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800269 using Control = incfs::UniqueControl;
Songchun Fan3c82a302019-11-29 14:23:45 -0800270
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700271 using BindMap = std::map<std::string, Bind, path::PathLess>;
Songchun Fan3c82a302019-11-29 14:23:45 -0800272 using StorageMap = std::unordered_map<StorageId, Storage>;
273
274 mutable std::mutex lock;
275 const std::string root;
276 Control control;
277 /*const*/ MountId mountId;
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -0700278 int32_t flags = StorageFlags::ReadLogsEnabled;
Songchun Fan3c82a302019-11-29 14:23:45 -0800279 StorageMap storages;
280 BindMap bindPoints;
Alex Buynytskyy0ea4ff42020-04-09 17:25:42 -0700281 DataLoaderStubPtr dataLoaderStub;
Songchun Fan3c82a302019-11-29 14:23:45 -0800282 std::atomic<int> nextStorageDirNo{0};
Songchun Fan3c82a302019-11-29 14:23:45 -0800283 const IncrementalService& incrementalService;
284
285 IncFsMount(std::string root, MountId mountId, Control control,
286 const IncrementalService& incrementalService)
287 : root(std::move(root)),
288 control(std::move(control)),
289 mountId(mountId),
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700290 incrementalService(incrementalService) {}
Songchun Fan3c82a302019-11-29 14:23:45 -0800291 IncFsMount(IncFsMount&&) = delete;
292 IncFsMount& operator=(IncFsMount&&) = delete;
293 ~IncFsMount();
294
295 StorageMap::iterator makeStorage(StorageId id);
296
Alex Buynytskyy3697d9e2020-06-06 20:15:58 -0700297 void disableReadLogs() { flags &= ~StorageFlags::ReadLogsEnabled; }
298 int32_t readLogsEnabled() const { return (flags & StorageFlags::ReadLogsEnabled); }
299
Songchun Fan3c82a302019-11-29 14:23:45 -0800300 static void cleanupFilesystem(std::string_view root);
301 };
302
303 using IfsMountPtr = std::shared_ptr<IncFsMount>;
304 using MountMap = std::unordered_map<MountId, IfsMountPtr>;
305 using BindPathMap = std::map<std::string, IncFsMount::BindMap::iterator, path::PathLess>;
306
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700307 static bool perfLoggingEnabled();
308
309 std::unordered_set<std::string_view> adoptMountedInstances();
310 void mountExistingImages(const std::unordered_set<std::string_view>& mountedRootNames);
Yurii Zubrytskyi107ae352020-04-03 13:12:51 -0700311 bool mountExistingImage(std::string_view root);
Songchun Fan3c82a302019-11-29 14:23:45 -0800312
313 IfsMountPtr getIfs(StorageId storage) const;
314 const IfsMountPtr& getIfsLocked(StorageId storage) const;
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800315 int addBindMount(IncFsMount& ifs, StorageId storage, std::string_view storageRoot,
316 std::string&& source, std::string&& target, BindKind kind,
317 std::unique_lock<std::mutex>& mainLock);
Songchun Fan3c82a302019-11-29 14:23:45 -0800318
319 int addBindMountWithMd(IncFsMount& ifs, StorageId storage, std::string&& metadataName,
Yurii Zubrytskyi4a25dfb2020-01-10 11:53:24 -0800320 std::string&& source, std::string&& target, BindKind kind,
Songchun Fan3c82a302019-11-29 14:23:45 -0800321 std::unique_lock<std::mutex>& mainLock);
322
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700323 void addBindMountRecordLocked(IncFsMount& ifs, StorageId storage, std::string&& metadataName,
324 std::string&& source, std::string&& target, BindKind kind);
325
326 DataLoaderStubPtr prepareDataLoader(IncFsMount& ifs,
327 content::pm::DataLoaderParamsParcel&& params,
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700328 const DataLoaderStatusListener* statusListener = nullptr,
329 StorageHealthCheckParams&& healthCheckParams = {},
330 const StorageHealthListener* healthListener = nullptr);
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700331 void prepareDataLoaderLocked(IncFsMount& ifs, content::pm::DataLoaderParamsParcel&& params,
Alex Buynytskyy8ef61ae2020-05-08 16:18:52 -0700332 const DataLoaderStatusListener* statusListener = nullptr,
333 StorageHealthCheckParams&& healthCheckParams = {},
334 const StorageHealthListener* healthListener = nullptr);
Alex Buynytskyybf1c0632020-03-10 15:49:29 -0700335
Songchun Fan3c82a302019-11-29 14:23:45 -0800336 BindPathMap::const_iterator findStorageLocked(std::string_view path) const;
337 StorageId findStorageId(std::string_view path) const;
338
339 void deleteStorage(IncFsMount& ifs);
340 void deleteStorageLocked(IncFsMount& ifs, std::unique_lock<std::mutex>&& ifsLock);
341 MountMap::iterator getStorageSlotLocked();
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -0700342 std::string normalizePathToStorage(const IncFsMount& incfs, StorageId storage,
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700343 std::string_view path) const;
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -0700344 std::string normalizePathToStorageLocked(const IncFsMount& incfs,
345 IncFsMount::StorageMap::const_iterator storageIt,
Yurii Zubrytskyi629051fd2020-04-17 23:13:47 -0700346 std::string_view path) const;
Yurii Zubrytskyiefebb452020-04-22 13:59:06 -0700347 int makeDirs(const IncFsMount& ifs, StorageId storageId, std::string_view path, int mode);
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700348 binder::Status applyStorageParams(IncFsMount& ifs, bool enableReadLogs);
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700349
Alex Buynytskyybc0a7e62020-08-25 12:45:22 -0700350 int isFileFullyLoadedFromPath(const IncFsMount& ifs, std::string_view filePath) const;
Songchun Fan374f7652020-08-20 08:40:29 -0700351 float getLoadingProgressFromPath(const IncFsMount& ifs, std::string_view path) const;
352
Alex Buynytskyyb39d13e2020-09-12 16:12:36 -0700353 int setFileContent(const IfsMountPtr& ifs, const incfs::FileId& fileId,
354 std::string_view debugFilePath, std::span<const uint8_t> data) const;
355
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700356 void registerAppOpsCallback(const std::string& packageName);
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700357 bool unregisterAppOpsCallback(const std::string& packageName);
358 void onAppOpChanged(const std::string& packageName);
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700359
Yurii Zubrytskyida208012020-04-07 15:35:21 -0700360 void runJobProcessing();
361 void extractZipFile(const IfsMountPtr& ifs, ZipArchiveHandle zipFile, ZipEntry& entry,
Alex Buynytskyyb39d13e2020-09-12 16:12:36 -0700362 const incfs::FileId& libFileId, std::string_view debugLibPath,
Yurii Zubrytskyida208012020-04-07 15:35:21 -0700363 Clock::time_point scheduledTs);
364
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700365 void runCmdLooper();
366
Songchun Fana7098592020-09-03 11:45:53 -0700367 bool addTimedJob(TimedQueueWrapper& timedQueue, MountId id, Milliseconds after, Job what);
368 bool removeTimedJobs(TimedQueueWrapper& timedQueue, MountId id);
369 bool updateLoadingProgress(int32_t storageId,
370 const StorageLoadingProgressListener& progressListener);
Alex Buynytskyy4760d8f2020-05-08 16:18:52 -0700371
Yurii Zubrytskyida208012020-04-07 15:35:21 -0700372private:
Yurii Zubrytskyi86321402020-04-09 19:22:30 -0700373 const std::unique_ptr<VoldServiceWrapper> mVold;
374 const std::unique_ptr<DataLoaderManagerWrapper> mDataLoaderManager;
375 const std::unique_ptr<IncFsWrapper> mIncFs;
376 const std::unique_ptr<AppOpsManagerWrapper> mAppOpsManager;
377 const std::unique_ptr<JniWrapper> mJni;
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700378 const std::unique_ptr<LooperWrapper> mLooper;
Alex Buynytskyy46d3ddb2020-05-29 12:05:05 -0700379 const std::unique_ptr<TimedQueueWrapper> mTimedQueue;
Songchun Fana7098592020-09-03 11:45:53 -0700380 const std::unique_ptr<TimedQueueWrapper> mProgressUpdateJobQueue;
Songchun Fan374f7652020-08-20 08:40:29 -0700381 const std::unique_ptr<FsWrapper> mFs;
Songchun Fan3c82a302019-11-29 14:23:45 -0800382 const std::string mIncrementalDir;
383
384 mutable std::mutex mLock;
385 mutable std::mutex mMountOperationLock;
386 MountMap mMounts;
387 BindPathMap mBindsByPath;
388
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700389 std::mutex mCallbacksLock;
Alex Buynytskyy1d892162020-04-03 23:00:19 -0700390 std::map<std::string, sp<AppOpsListener>> mCallbackRegistered;
Alex Buynytskyy96e350b2020-04-02 20:03:47 -0700391
Songchun Fan3c82a302019-11-29 14:23:45 -0800392 std::atomic_bool mSystemReady = false;
393 StorageId mNextId = 0;
Yurii Zubrytskyida208012020-04-07 15:35:21 -0700394
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700395 std::atomic_bool mRunning{true};
396
Yurii Zubrytskyi721ac4d2020-04-13 11:34:32 -0700397 std::unordered_map<MountId, std::vector<Job>> mJobQueue;
398 MountId mPendingJobsMount = kInvalidStorageId;
Yurii Zubrytskyida208012020-04-07 15:35:21 -0700399 std::condition_variable mJobCondition;
400 std::mutex mJobMutex;
401 std::thread mJobProcessor;
Alex Buynytskyycca2c112020-05-05 12:48:41 -0700402
403 std::thread mCmdLooperThread;
Songchun Fan3c82a302019-11-29 14:23:45 -0800404};
405
406} // namespace android::incremental