Merge "DataLoader lifecycle cleanup." into rvc-dev am: 42cac08f17

Change-Id: I8ada8247bce7266392cdceea8e069b45f3a38e3b
This commit is contained in:
Automerger Merge Worker
2020-03-11 20:21:10 +00:00
2 changed files with 40 additions and 28 deletions

View File

@@ -917,19 +917,23 @@ std::vector<std::string> IncrementalService::listFiles(StorageId storage) const
} }
bool IncrementalService::startLoading(StorageId storage) const { bool IncrementalService::startLoading(StorageId storage) const {
const auto ifs = getIfs(storage); {
if (!ifs) { std::unique_lock l(mLock);
return false; const auto& ifs = getIfsLocked(storage);
} if (!ifs) {
std::unique_lock l(ifs->lock);
if (ifs->dataLoaderStatus != IDataLoaderStatusListener::DATA_LOADER_CREATED) {
if (ifs->dataLoaderReady.wait_for(l, Seconds(5)) == std::cv_status::timeout) {
LOG(ERROR) << "Timeout waiting for data loader to be ready";
return false; return false;
} }
if (ifs->dataLoaderStatus != IDataLoaderStatusListener::DATA_LOADER_CREATED) {
ifs->dataLoaderStartRequested = true;
return true;
}
} }
return startDataLoader(storage);
}
bool IncrementalService::startDataLoader(MountId mountId) const {
sp<IDataLoader> dataloader; sp<IDataLoader> dataloader;
auto status = mDataLoaderManager->getDataLoader(ifs->mountId, &dataloader); auto status = mDataLoaderManager->getDataLoader(mountId, &dataloader);
if (!status.isOk()) { if (!status.isOk()) {
return false; return false;
} }
@@ -1065,15 +1069,9 @@ bool IncrementalService::prepareDataLoader(IncrementalService::IncFsMount& ifs,
} }
return true; // eventually... return true; // eventually...
} }
if (base::GetBoolProperty("incremental.skip_loader", false)) {
LOG(INFO) << "Skipped data loader because of incremental.skip_loader property";
std::unique_lock l(ifs.lock);
ifs.savedDataLoaderParams.reset();
return true;
}
std::unique_lock l(ifs.lock); std::unique_lock l(ifs.lock);
if (ifs.dataLoaderStatus == IDataLoaderStatusListener::DATA_LOADER_CREATED) { if (ifs.dataLoaderStatus != -1) {
LOG(INFO) << "Skipped data loader preparation because it already exists"; LOG(INFO) << "Skipped data loader preparation because it already exists";
return true; return true;
} }
@@ -1226,30 +1224,42 @@ binder::Status IncrementalService::IncrementalDataLoaderListener::onStatusChange
externalListener->onStatusChanged(mountId, newStatus); externalListener->onStatusChanged(mountId, newStatus);
} }
std::unique_lock l(incrementalService.mLock); bool startRequested = false;
const auto& ifs = incrementalService.getIfsLocked(mountId); {
if (!ifs) { std::unique_lock l(incrementalService.mLock);
LOG(WARNING) << "Received data loader status " << int(newStatus) << " for unknown mount " const auto& ifs = incrementalService.getIfsLocked(mountId);
<< mountId; if (!ifs) {
return binder::Status::ok(); LOG(WARNING) << "Received data loader status " << int(newStatus) << " for unknown mount "
<< mountId;
return binder::Status::ok();
}
ifs->dataLoaderStatus = newStatus;
if (newStatus == IDataLoaderStatusListener::DATA_LOADER_DESTROYED) {
ifs->dataLoaderStatus = IDataLoaderStatusListener::DATA_LOADER_STOPPED;
incrementalService.deleteStorageLocked(*ifs, std::move(l));
return binder::Status::ok();
}
startRequested = ifs->dataLoaderStartRequested;
} }
ifs->dataLoaderStatus = newStatus;
switch (newStatus) { switch (newStatus) {
case IDataLoaderStatusListener::DATA_LOADER_NO_CONNECTION: { case IDataLoaderStatusListener::DATA_LOADER_NO_CONNECTION: {
// TODO(b/150411019): handle data loader connection loss // TODO(b/150411019): handle data loader connection loss
break; break;
} }
case IDataLoaderStatusListener::DATA_LOADER_CONNECTION_OK: { case IDataLoaderStatusListener::DATA_LOADER_CONNECTION_OK: {
ifs->dataLoaderStatus = IDataLoaderStatusListener::DATA_LOADER_STARTED; // TODO(b/150411019): handle data loader connection loss
break; break;
} }
case IDataLoaderStatusListener::DATA_LOADER_CREATED: { case IDataLoaderStatusListener::DATA_LOADER_CREATED: {
ifs->dataLoaderReady.notify_one(); if (startRequested) {
incrementalService.startDataLoader(mountId);
}
break; break;
} }
case IDataLoaderStatusListener::DATA_LOADER_DESTROYED: { case IDataLoaderStatusListener::DATA_LOADER_DESTROYED: {
ifs->dataLoaderStatus = IDataLoaderStatusListener::DATA_LOADER_STOPPED;
incrementalService.deleteStorageLocked(*ifs, std::move(l));
break; break;
} }
case IDataLoaderStatusListener::DATA_LOADER_STARTED: { case IDataLoaderStatusListener::DATA_LOADER_STARTED: {

View File

@@ -170,7 +170,7 @@ private:
std::optional<DataLoaderParamsParcel> savedDataLoaderParams; std::optional<DataLoaderParamsParcel> savedDataLoaderParams;
std::atomic<int> nextStorageDirNo{0}; std::atomic<int> nextStorageDirNo{0};
std::atomic<int> dataLoaderStatus = -1; std::atomic<int> dataLoaderStatus = -1;
std::condition_variable dataLoaderReady; bool dataLoaderStartRequested = false;
TimePoint connectionLostTime = TimePoint(); TimePoint connectionLostTime = TimePoint();
const IncrementalService& incrementalService; const IncrementalService& incrementalService;
@@ -208,6 +208,8 @@ private:
bool prepareDataLoader(IncFsMount& ifs, DataLoaderParamsParcel* params = nullptr, bool prepareDataLoader(IncFsMount& ifs, DataLoaderParamsParcel* params = nullptr,
const DataLoaderStatusListener* externalListener = nullptr); const DataLoaderStatusListener* externalListener = nullptr);
bool startDataLoader(MountId mountId) const;
BindPathMap::const_iterator findStorageLocked(std::string_view path) const; BindPathMap::const_iterator findStorageLocked(std::string_view path) const;
StorageId findStorageId(std::string_view path) const; StorageId findStorageId(std::string_view path) const;