Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4de75921 authored by Automerger Merge Worker's avatar Automerger Merge Worker
Browse files

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

Change-Id: I66ed43aab0ad622a21c306fd33f9d5edc0fad856
parents 24de2637 42cac08f
Loading
Loading
Loading
Loading
+37 −27
Original line number Diff line number Diff line
@@ -917,19 +917,23 @@ std::vector<std::string> IncrementalService::listFiles(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) {
            return false;
        }
    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;
            ifs->dataLoaderStartRequested = true;
            return true;
        }
    }
    return startDataLoader(storage);
}

bool IncrementalService::startDataLoader(MountId mountId) const {
    sp<IDataLoader> dataloader;
    auto status = mDataLoaderManager->getDataLoader(ifs->mountId, &dataloader);
    auto status = mDataLoaderManager->getDataLoader(mountId, &dataloader);
    if (!status.isOk()) {
        return false;
    }
@@ -1065,15 +1069,9 @@ bool IncrementalService::prepareDataLoader(IncrementalService::IncFsMount& ifs,
        }
        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);
    if (ifs.dataLoaderStatus == IDataLoaderStatusListener::DATA_LOADER_CREATED) {
    if (ifs.dataLoaderStatus != -1) {
        LOG(INFO) << "Skipped data loader preparation because it already exists";
        return true;
    }
@@ -1226,6 +1224,8 @@ binder::Status IncrementalService::IncrementalDataLoaderListener::onStatusChange
        externalListener->onStatusChanged(mountId, newStatus);
    }

    bool startRequested = false;
    {
        std::unique_lock l(incrementalService.mLock);
        const auto& ifs = incrementalService.getIfsLocked(mountId);
        if (!ifs) {
@@ -1234,22 +1234,32 @@ binder::Status IncrementalService::IncrementalDataLoaderListener::onStatusChange
            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;
    }

    switch (newStatus) {
        case IDataLoaderStatusListener::DATA_LOADER_NO_CONNECTION: {
            // TODO(b/150411019): handle data loader connection loss
            break;
        }
        case IDataLoaderStatusListener::DATA_LOADER_CONNECTION_OK: {
            ifs->dataLoaderStatus = IDataLoaderStatusListener::DATA_LOADER_STARTED;
            // TODO(b/150411019): handle data loader connection loss
            break;
        }
        case IDataLoaderStatusListener::DATA_LOADER_CREATED: {
            ifs->dataLoaderReady.notify_one();
            if (startRequested) {
                incrementalService.startDataLoader(mountId);
            }
            break;
        }
        case IDataLoaderStatusListener::DATA_LOADER_DESTROYED: {
            ifs->dataLoaderStatus = IDataLoaderStatusListener::DATA_LOADER_STOPPED;
            incrementalService.deleteStorageLocked(*ifs, std::move(l));
            break;
        }
        case IDataLoaderStatusListener::DATA_LOADER_STARTED: {
+3 −1
Original line number Diff line number Diff line
@@ -170,7 +170,7 @@ private:
        std::optional<DataLoaderParamsParcel> savedDataLoaderParams;
        std::atomic<int> nextStorageDirNo{0};
        std::atomic<int> dataLoaderStatus = -1;
        std::condition_variable dataLoaderReady;
        bool dataLoaderStartRequested = false;
        TimePoint connectionLostTime = TimePoint();
        const IncrementalService& incrementalService;

@@ -208,6 +208,8 @@ private:

    bool prepareDataLoader(IncFsMount& ifs, DataLoaderParamsParcel* params = nullptr,
                           const DataLoaderStatusListener* externalListener = nullptr);
    bool startDataLoader(MountId mountId) const;

    BindPathMap::const_iterator findStorageLocked(std::string_view path) const;
    StorageId findStorageId(std::string_view path) const;