summaryrefslogtreecommitdiff
path: root/services/incremental/IncrementalService.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'services/incremental/IncrementalService.cpp')
-rw-r--r--services/incremental/IncrementalService.cpp83
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;