diff options
Diffstat (limited to 'services/incremental/IncrementalService.cpp')
-rw-r--r-- | services/incremental/IncrementalService.cpp | 83 |
1 files changed, 56 insertions, 27 deletions
diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp index 4ce336d16f15..f3e7d672ec95 100644 --- a/services/incremental/IncrementalService.cpp +++ b/services/incremental/IncrementalService.cpp @@ -2394,26 +2394,20 @@ void IncrementalService::removeIfsStateCallbacks(StorageId storageId) { } void IncrementalService::getMetrics(StorageId storageId, android::os::PersistableBundle* result) { - const auto duration = getMillsSinceOldestPendingRead(storageId); - if (duration >= 0) { - const auto kMetricsMillisSinceOldestPendingRead = - os::incremental::BnIncrementalService::METRICS_MILLIS_SINCE_OLDEST_PENDING_READ(); - result->putLong(String16(kMetricsMillisSinceOldestPendingRead.data()), duration); - } -} - -long IncrementalService::getMillsSinceOldestPendingRead(StorageId storageId) { const auto ifs = getIfs(storageId); if (!ifs) { - LOG(ERROR) << "getMillsSinceOldestPendingRead failed, invalid storageId: " << storageId; - return -EINVAL; + LOG(ERROR) << "getMetrics failed, invalid storageId: " << storageId; + return; } + const auto kMetricsReadLogsEnabled = + os::incremental::BnIncrementalService::METRICS_READ_LOGS_ENABLED(); + result->putBoolean(String16(kMetricsReadLogsEnabled.data()), ifs->readLogsEnabled() != 0); + std::unique_lock l(ifs->lock); if (!ifs->dataLoaderStub) { - LOG(ERROR) << "getMillsSinceOldestPendingRead failed, no data loader: " << storageId; - return -EINVAL; + return; } - return ifs->dataLoaderStub->elapsedMsSinceOldestPendingRead(); + ifs->dataLoaderStub->getMetrics(result); } IncrementalService::DataLoaderStub::DataLoaderStub( @@ -2660,9 +2654,6 @@ bool IncrementalService::DataLoaderStub::fsmStep() { } switch (targetStatus) { - case IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE: - // Do nothing, this is a reset state. - break; case IDataLoaderStatusListener::DATA_LOADER_DESTROYED: { switch (currentStatus) { case IDataLoaderStatusListener::DATA_LOADER_BINDING: @@ -2683,8 +2674,12 @@ bool IncrementalService::DataLoaderStub::fsmStep() { } case IDataLoaderStatusListener::DATA_LOADER_CREATED: switch (currentStatus) { - case IDataLoaderStatusListener::DATA_LOADER_DESTROYED: case IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE: + case IDataLoaderStatusListener::DATA_LOADER_UNRECOVERABLE: + // Before binding need to make sure we are unbound. + // Otherwise we'll get stuck binding. + return destroy(); + case IDataLoaderStatusListener::DATA_LOADER_DESTROYED: case IDataLoaderStatusListener::DATA_LOADER_BINDING: return bind(); case IDataLoaderStatusListener::DATA_LOADER_BOUND: @@ -2709,7 +2704,8 @@ binder::Status IncrementalService::DataLoaderStub::onStatusChanged(MountId mount << ", but got: " << mountId; return binder::Status::fromServiceSpecificError(-EPERM, "Mount ID mismatch."); } - if (newStatus == IDataLoaderStatusListener::DATA_LOADER_UNRECOVERABLE) { + if (newStatus == IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE || + newStatus == IDataLoaderStatusListener::DATA_LOADER_UNRECOVERABLE) { // User-provided status, let's postpone the handling to avoid possible deadlocks. mService.addTimedJob(*mService.mTimedQueue, id(), Constants::userStatusDelay, [this, newStatus]() { setCurrentStatus(newStatus); }); @@ -2721,7 +2717,7 @@ binder::Status IncrementalService::DataLoaderStub::onStatusChanged(MountId mount } void IncrementalService::DataLoaderStub::setCurrentStatus(int newStatus) { - int targetStatus, oldStatus; + int oldStatus, oldTargetStatus, newTargetStatus; DataLoaderStatusListener listener; { std::unique_lock lock(mMutex); @@ -2730,22 +2726,31 @@ void IncrementalService::DataLoaderStub::setCurrentStatus(int newStatus) { } oldStatus = mCurrentStatus; - targetStatus = mTargetStatus; + oldTargetStatus = mTargetStatus; listener = mStatusListener; // Change the status. mCurrentStatus = newStatus; mCurrentStatusTs = mService.mClock->now(); - if (mCurrentStatus == IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE || - mCurrentStatus == IDataLoaderStatusListener::DATA_LOADER_UNRECOVERABLE) { - // For unavailable, unbind from DataLoader to ensure proper re-commit. - setTargetStatusLocked(IDataLoaderStatusListener::DATA_LOADER_DESTROYED); + switch (mCurrentStatus) { + case IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE: + // Unavailable, retry. + setTargetStatusLocked(IDataLoaderStatusListener::DATA_LOADER_STARTED); + break; + case IDataLoaderStatusListener::DATA_LOADER_UNRECOVERABLE: + // Unrecoverable, just unbind. + setTargetStatusLocked(IDataLoaderStatusListener::DATA_LOADER_DESTROYED); + break; + default: + break; } + + newTargetStatus = mTargetStatus; } LOG(DEBUG) << "Current status update for DataLoader " << id() << ": " << oldStatus << " -> " - << newStatus << " (target " << targetStatus << ")"; + << newStatus << " (target " << oldTargetStatus << " -> " << newTargetStatus << ")"; if (listener) { listener->onStatusChanged(id(), newStatus); @@ -2767,6 +2772,7 @@ void IncrementalService::DataLoaderStub::onHealthStatus(const StorageHealthListe if (healthListener) { healthListener->onHealthStatus(id(), healthStatus); } + mHealthStatus = healthStatus; } void IncrementalService::DataLoaderStub::updateHealthStatus(bool baseline) { @@ -2938,6 +2944,29 @@ BootClockTsUs IncrementalService::DataLoaderStub::getOldestTsFromLastPendingRead return result; } +void IncrementalService::DataLoaderStub::getMetrics(android::os::PersistableBundle* result) { + const auto duration = elapsedMsSinceOldestPendingRead(); + if (duration >= 0) { + const auto kMetricsMillisSinceOldestPendingRead = + os::incremental::BnIncrementalService::METRICS_MILLIS_SINCE_OLDEST_PENDING_READ(); + result->putLong(String16(kMetricsMillisSinceOldestPendingRead.data()), duration); + } + const auto kMetricsStorageHealthStatusCode = + os::incremental::BnIncrementalService::METRICS_STORAGE_HEALTH_STATUS_CODE(); + result->putInt(String16(kMetricsStorageHealthStatusCode.data()), mHealthStatus); + const auto kMetricsDataLoaderStatusCode = + os::incremental::BnIncrementalService::METRICS_DATA_LOADER_STATUS_CODE(); + result->putInt(String16(kMetricsDataLoaderStatusCode.data()), mCurrentStatus); + const auto kMetricsMillisSinceLastDataLoaderBind = + os::incremental::BnIncrementalService::METRICS_MILLIS_SINCE_LAST_DATA_LOADER_BIND(); + result->putLong(String16(kMetricsMillisSinceLastDataLoaderBind.data()), + (long)(elapsedMcs(mPreviousBindTs, mService.mClock->now()) / 1000)); + const auto kMetricsDataLoaderBindDelayMillis = + os::incremental::BnIncrementalService::METRICS_DATA_LOADER_BIND_DELAY_MILLIS(); + result->putLong(String16(kMetricsDataLoaderBindDelayMillis.data()), + (long)(mPreviousBindDelay.count())); +} + long IncrementalService::DataLoaderStub::elapsedMsSinceOldestPendingRead() { const auto oldestPendingReadKernelTs = getOldestTsFromLastPendingReads(); if (oldestPendingReadKernelTs == kMaxBootClockTsUs) { @@ -3007,7 +3036,7 @@ void IncrementalService::DataLoaderStub::onDump(int fd) { dprintf(fd, " bootClockTsUs: %lld\n", (long long)pendingRead.bootClockTsUs); } dprintf(fd, " bind: %llds ago (delay: %llds)\n", - (long long)(elapsedMcs(mPreviousBindTs, Clock::now()) / 1000000), + (long long)(elapsedMcs(mPreviousBindTs, mService.mClock->now()) / 1000000), (long long)(mPreviousBindDelay.count() / 1000)); dprintf(fd, " }\n"); const auto& params = mParams; |