Log unexpected EnergyConsumer results

Log WTF to try to detect missing EnergyConsumer results in the field.

Bug: 253292374
Test: n/a
Change-Id: Id07b52d718a1816814b871d800f38b3e792689d1
This commit is contained in:
Michael Wachenschwanz
2022-11-14 17:44:30 -08:00
parent 78fe6e71c2
commit 35f09f4cd9

View File

@@ -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<EnergyConsumerResult[]> 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<StateResidencyResult[]> future,