summaryrefslogtreecommitdiff
path: root/services/incremental/IncrementalService.cpp
diff options
context:
space:
mode:
author Alex Buynytskyy <alexbuy@google.com> 2020-02-10 08:34:18 -0800
committer Alex Buynytskyy <alexbuy@google.com> 2020-02-11 13:11:31 -0800
commit04f7391fc3a3bd2dc0dd477a84d13e111d59423c (patch)
tree5ca2b8e14ac72043e9f27616074172f2a2f8ff9c /services/incremental/IncrementalService.cpp
parentad1c9607445e374c88a273d562295d492b9072e1 (diff)
Incremental installations in PackageManagerShellCommand.
- onPrepareImage in native, - allow to check installation type and choose native or managed dataloaders, - native data loader for Incremental, - install-incremental shell command. Test: atest PackageManagerShellCommandTest Test: atest IncrementalServiceTest Bug: b/136132412 b/133435829 Change-Id: I530a8a203fb50132c1869abd0b869036add18699
Diffstat (limited to 'services/incremental/IncrementalService.cpp')
-rw-r--r--services/incremental/IncrementalService.cpp38
1 files changed, 18 insertions, 20 deletions
diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp
index 3b513774b615..ebadf565706d 100644
--- a/services/incremental/IncrementalService.cpp
+++ b/services/incremental/IncrementalService.cpp
@@ -30,7 +30,6 @@
#include <binder/BinderService.h>
#include <binder/ParcelFileDescriptor.h>
#include <binder/Status.h>
-#include <openssl/sha.h>
#include <sys/stat.h>
#include <uuid/uuid.h>
#include <zlib.h>
@@ -242,20 +241,7 @@ IncrementalService::IncrementalService(ServiceManagerWrapper&& sm, std::string_v
}
FileId IncrementalService::idFromMetadata(std::span<const uint8_t> metadata) {
- incfs::FileId id = {};
- if (size_t(metadata.size()) <= sizeof(id)) {
- memcpy(&id, metadata.data(), metadata.size());
- } else {
- uint8_t buffer[SHA_DIGEST_LENGTH];
- static_assert(sizeof(buffer) >= sizeof(id));
-
- SHA_CTX ctx;
- SHA1_Init(&ctx);
- SHA1_Update(&ctx, metadata.data(), metadata.size());
- SHA1_Final(buffer, &ctx);
- memcpy(&id, buffer, sizeof(id));
- }
- return id;
+ return IncFs_FileIdFromMetadata({(const char*)metadata.data(), metadata.size()});
}
IncrementalService::~IncrementalService() = default;
@@ -344,7 +330,7 @@ std::optional<std::future<void>> IncrementalService::onSystemReady() {
std::thread([this, mounts = std::move(mounts)]() {
std::vector<IfsMountPtr> failedLoaderMounts;
for (auto&& ifs : mounts) {
- if (prepareDataLoader(*ifs, nullptr)) {
+ if (prepareDataLoader(*ifs)) {
LOG(INFO) << "Successfully started data loader for mount " << ifs->mountId;
} else {
LOG(WARNING) << "Failed to start data loader for mount " << ifs->mountId;
@@ -377,6 +363,7 @@ auto IncrementalService::getStorageSlotLocked() -> MountMap::iterator {
StorageId IncrementalService::createStorage(std::string_view mountPoint,
DataLoaderParamsParcel&& dataLoaderParams,
+ const DataLoaderStatusListener& dataLoaderStatusListener,
CreateOptions options) {
LOG(INFO) << "createStorage: " << mountPoint << " | " << int(options);
if (!path::isAbsolute(mountPoint)) {
@@ -509,7 +496,7 @@ StorageId IncrementalService::createStorage(std::string_view mountPoint,
// Done here as well, all data structures are in good state.
secondCleanupOnFailure.release();
- if (!prepareDataLoader(*ifs, &dataLoaderParams)) {
+ if (!prepareDataLoader(*ifs, &dataLoaderParams, &dataLoaderStatusListener)) {
LOG(ERROR) << "prepareDataLoader() failed";
deleteStorageLocked(*ifs, std::move(l));
return kInvalidStorageId;
@@ -767,7 +754,6 @@ int IncrementalService::makeFile(StorageId storage, std::string_view path, int m
if (params.metadata.data && params.metadata.size > 0) {
metadataBytes.assign(params.metadata.data, params.metadata.data + params.metadata.size);
}
- mIncrementalManager->newFileForDataLoader(ifs->mountId, id, metadataBytes);
return 0;
}
return -EINVAL;
@@ -1074,7 +1060,8 @@ bool IncrementalService::mountExistingImage(std::string_view root, std::string_v
}
bool IncrementalService::prepareDataLoader(IncrementalService::IncFsMount& ifs,
- DataLoaderParamsParcel* params) {
+ DataLoaderParamsParcel* params,
+ const DataLoaderStatusListener* externalListener) {
if (!mSystemReady.load(std::memory_order_relaxed)) {
std::unique_lock l(ifs.lock);
if (params) {
@@ -1117,7 +1104,7 @@ bool IncrementalService::prepareDataLoader(IncrementalService::IncFsMount& ifs,
fsControlParcel.incremental->pendingReads.reset(
base::unique_fd(::dup(ifs.control.pendingReads)));
fsControlParcel.incremental->log.reset(base::unique_fd(::dup(ifs.control.logs)));
- sp<IncrementalDataLoaderListener> listener = new IncrementalDataLoaderListener(*this);
+ sp<IncrementalDataLoaderListener> listener = new IncrementalDataLoaderListener(*this, *externalListener);
bool created = false;
auto status = mIncrementalManager->prepareDataLoader(ifs.mountId, fsControlParcel, *dlp,
listener, &created);
@@ -1247,6 +1234,11 @@ bool IncrementalService::configureNativeBinaries(StorageId storage, std::string_
binder::Status IncrementalService::IncrementalDataLoaderListener::onStatusChanged(MountId mountId,
int newStatus) {
+ if (externalListener) {
+ // Give an external listener a chance to act before we destroy something.
+ externalListener->onStatusChanged(mountId, newStatus);
+ }
+
std::unique_lock l(incrementalService.mLock);
const auto& ifs = incrementalService.getIfsLocked(mountId);
if (!ifs) {
@@ -1288,6 +1280,12 @@ binder::Status IncrementalService::IncrementalDataLoaderListener::onStatusChange
case IDataLoaderStatusListener::DATA_LOADER_STOPPED: {
break;
}
+ case IDataLoaderStatusListener::DATA_LOADER_IMAGE_READY: {
+ break;
+ }
+ case IDataLoaderStatusListener::DATA_LOADER_IMAGE_NOT_READY: {
+ break;
+ }
default: {
LOG(WARNING) << "Unknown data loader status: " << newStatus
<< " for mount: " << mountId;