Merge "DataLoader lifecycle cleanup." into rvc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
42cac08f17
@@ -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);
|
{
|
||||||
|
std::unique_lock l(mLock);
|
||||||
|
const auto& ifs = getIfsLocked(storage);
|
||||||
if (!ifs) {
|
if (!ifs) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
std::unique_lock l(ifs->lock);
|
|
||||||
if (ifs->dataLoaderStatus != IDataLoaderStatusListener::DATA_LOADER_CREATED) {
|
if (ifs->dataLoaderStatus != IDataLoaderStatusListener::DATA_LOADER_CREATED) {
|
||||||
if (ifs->dataLoaderReady.wait_for(l, Seconds(5)) == std::cv_status::timeout) {
|
ifs->dataLoaderStartRequested = true;
|
||||||
LOG(ERROR) << "Timeout waiting for data loader to be ready";
|
return true;
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
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,6 +1224,8 @@ binder::Status IncrementalService::IncrementalDataLoaderListener::onStatusChange
|
|||||||
externalListener->onStatusChanged(mountId, newStatus);
|
externalListener->onStatusChanged(mountId, newStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool startRequested = false;
|
||||||
|
{
|
||||||
std::unique_lock l(incrementalService.mLock);
|
std::unique_lock l(incrementalService.mLock);
|
||||||
const auto& ifs = incrementalService.getIfsLocked(mountId);
|
const auto& ifs = incrementalService.getIfsLocked(mountId);
|
||||||
if (!ifs) {
|
if (!ifs) {
|
||||||
@@ -1234,22 +1234,32 @@ binder::Status IncrementalService::IncrementalDataLoaderListener::onStatusChange
|
|||||||
return binder::Status::ok();
|
return binder::Status::ok();
|
||||||
}
|
}
|
||||||
ifs->dataLoaderStatus = newStatus;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
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: {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user