From 35f09f4cd9ea058b4a1ae1bb045e4721d74b03e5 Mon Sep 17 00:00:00 2001 From: Michael Wachenschwanz Date: Mon, 14 Nov 2022 17:44:30 -0800 Subject: [PATCH] Log unexpected EnergyConsumer results Log WTF to try to detect missing EnergyConsumer results in the field. Bug: 253292374 Test: n/a Change-Id: Id07b52d718a1816814b871d800f38b3e792689d1 --- .../server/powerstats/PowerStatsService.java | 76 ++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/powerstats/PowerStatsService.java b/services/core/java/com/android/server/powerstats/PowerStatsService.java index 9953ca8f9b65e..135841729e696 100644 --- a/services/core/java/com/android/server/powerstats/PowerStatsService.java +++ b/services/core/java/com/android/server/powerstats/PowerStatsService.java @@ -83,6 +83,9 @@ public class PowerStatsService extends SystemService { @Nullable @GuardedBy("this") private Looper mLooper; + @Nullable + @GuardedBy("this") + private EnergyConsumer[] mEnergyConsumers = null; @VisibleForTesting static class Injector { @@ -260,6 +263,15 @@ public class PowerStatsService extends SystemService { } } + private EnergyConsumer[] getEnergyConsumerInfo() { + synchronized (this) { + if (mEnergyConsumers == null) { + mEnergyConsumers = getPowerStatsHal().getEnergyConsumerInfo(); + } + return mEnergyConsumers; + } + } + public PowerStatsService(Context context) { this(context, new Injector()); } @@ -327,7 +339,69 @@ public class PowerStatsService extends SystemService { private void getEnergyConsumedAsync(CompletableFuture future, int[] energyConsumerIds) { - future.complete(getPowerStatsHal().getEnergyConsumed(energyConsumerIds)); + EnergyConsumerResult[] results = getPowerStatsHal().getEnergyConsumed(energyConsumerIds); + + // STOPSHIP(253292374): Remove once missing EnergyConsumer results issue is resolved. + EnergyConsumer[] energyConsumers = getEnergyConsumerInfo(); + if (energyConsumers != null) { + final int expectedLength; + if (energyConsumerIds.length == 0) { + // Empty request is a request for all available EnergyConsumers. + expectedLength = energyConsumers.length; + } else { + expectedLength = energyConsumerIds.length; + } + + if (results == null || expectedLength != results.length) { + // Mismatch in requested/received energy consumer data. + StringBuilder sb = new StringBuilder(); + sb.append("Requested ids:"); + if (energyConsumerIds.length == 0) { + sb.append("ALL"); + } + sb.append("["); + for (int i = 0; i < expectedLength; i++) { + final int id = energyConsumerIds[i]; + sb.append(id); + sb.append("(type:"); + sb.append(energyConsumers[id].type); + sb.append(",ord:"); + sb.append(energyConsumers[id].ordinal); + sb.append(",name:"); + sb.append(energyConsumers[id].name); + sb.append(")"); + if (i != expectedLength - 1) { + sb.append(", "); + } + } + sb.append("]"); + + sb.append(", Received result ids:"); + if (results == null) { + sb.append("null"); + } else { + sb.append("["); + final int resultLength = results.length; + for (int i = 0; i < resultLength; i++) { + final int id = results[i].id; + sb.append(id); + sb.append("(type:"); + sb.append(energyConsumers[id].type); + sb.append(",ord:"); + sb.append(energyConsumers[id].ordinal); + sb.append(",name:"); + sb.append(energyConsumers[id].name); + sb.append(")"); + if (i != resultLength - 1) { + sb.append(", "); + } + } + sb.append("]"); + } + Slog.wtf(TAG, "Missing result from getEnergyConsumedAsync call. " + sb); + } + } + future.complete(results); } private void getStateResidencyAsync(CompletableFuture future,