Merge changes I3f912418,Idd2465d5 into rvc-dev am: b010fc5534 am: 50c05bdbf7

Change-Id: I0be54e258a541d2e0b1c650939ba957a595f8499
This commit is contained in:
Jeffrey Huang
2020-04-10 18:46:54 +00:00
committed by Automerger Merge Worker
6 changed files with 88 additions and 4 deletions

View File

@@ -30,6 +30,11 @@ interface IStatsd {
*/ */
oneway void systemRunning(); oneway void systemRunning();
/**
* Tell the stats daemon that the android system has finished booting.
*/
oneway void bootCompleted();
/** /**
* Tell the stats daemon that the StatsCompanionService is up and running. * Tell the stats daemon that the StatsCompanionService is up and running.
* Two-way binder call so that caller knows message received. * Two-way binder call so that caller knows message received.
@@ -182,10 +187,15 @@ interface IStatsd {
*/ */
void sendAppBreadcrumbAtom(int label, int state); void sendAppBreadcrumbAtom(int label, int state);
/** /**
* Registers a puller callback function that, when invoked, pulls the data * Tell the stats daemon that all the pullers registered during boot have been sent.
* for the specified atom tag. */
*/ oneway void allPullersFromBootRegistered();
/**
* Registers a puller callback function that, when invoked, pulls the data
* for the specified atom tag.
*/
oneway void registerPullAtomCallback(int uid, int atomTag, long coolDownMillis, oneway void registerPullAtomCallback(int uid, int atomTag, long coolDownMillis,
long timeoutMillis,in int[] additiveFields, long timeoutMillis,in int[] additiveFields,
IPullAtomCallback pullerCallback); IPullAtomCallback pullerCallback);

View File

@@ -87,6 +87,9 @@ public class StatsCompanion {
if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) { if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) {
mStatsCompanionService.systemReady(); mStatsCompanionService.systemReady();
} }
if (phase == PHASE_BOOT_COMPLETED) {
mStatsCompanionService.bootCompleted();
}
} }
} }

View File

@@ -112,6 +112,18 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
private final HashMap<Long, String> mDeletedFiles = new HashMap<>(); private final HashMap<Long, String> mDeletedFiles = new HashMap<>();
private final CompanionHandler mHandler; private final CompanionHandler mHandler;
// Flag that is set when PHASE_BOOT_COMPLETED is triggered in the StatsCompanion lifecycle. This
// and the flag mSentBootComplete below is used for synchronization to ensure that the boot
// complete signal is only ever sent once to statsd. Two signals are needed because
// #sayHiToStatsd can be called from both statsd and #onBootPhase
// PHASE_THIRD_PARTY_APPS_CAN_START.
@GuardedBy("sStatsdLock")
private boolean mBootCompleted = false;
// Flag that is set when IStatsd#bootCompleted is called. This flag ensures that boot complete
// signal is only ever sent once.
@GuardedBy("sStatsdLock")
private boolean mSentBootComplete = false;
public StatsCompanionService(Context context) { public StatsCompanionService(Context context) {
super(); super();
mContext = context; mContext = context;
@@ -688,6 +700,19 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
List.of(appUpdateReceiver, userUpdateReceiver, shutdownEventReceiver)); List.of(appUpdateReceiver, userUpdateReceiver, shutdownEventReceiver));
final long token = Binder.clearCallingIdentity(); final long token = Binder.clearCallingIdentity();
// Used so we can call statsd.bootComplete() outside of the lock.
boolean shouldSendBootComplete = false;
synchronized (sStatsdLock) {
if (mBootCompleted && !mSentBootComplete) {
mSentBootComplete = true;
shouldSendBootComplete = true;
}
}
if (shouldSendBootComplete) {
statsd.bootCompleted();
}
try { try {
// Pull the latest state of UID->app name, version mapping when // Pull the latest state of UID->app name, version mapping when
// statsd starts. // statsd starts.
@@ -749,6 +774,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
mContext.unregisterReceiver(receiver); mContext.unregisterReceiver(receiver);
} }
statsdNotReadyLocked(); statsdNotReadyLocked();
mSentBootComplete = false;
} }
} }
} }
@@ -758,6 +784,28 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
mStatsManagerService.statsdNotReady(); mStatsManagerService.statsdNotReady();
} }
void bootCompleted() {
IStatsd statsd = getStatsdNonblocking();
synchronized (sStatsdLock) {
mBootCompleted = true;
if (mSentBootComplete) {
// do not send a boot complete a second time.
return;
}
if (statsd == null) {
// Statsd is not yet ready.
// Delay the boot completed ping to {@link #sayHiToStatsd()}
return;
}
mSentBootComplete = true;
}
try {
statsd.bootCompleted();
} catch (RemoteException e) {
Log.e(TAG, "Failed to notify statsd that boot completed");
}
}
@Override @Override
protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) { protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)

View File

@@ -600,6 +600,7 @@ public class StatsManagerService extends IStatsManagerService.Stub {
statsd.registerPullAtomCallback(key.getUid(), key.getAtom(), value.getCoolDownMillis(), statsd.registerPullAtomCallback(key.getUid(), key.getAtom(), value.getCoolDownMillis(),
value.getTimeoutMillis(), value.getAdditiveFields(), value.getCallback()); value.getTimeoutMillis(), value.getAdditiveFields(), value.getCallback());
} }
statsd.allPullersFromBootRegistered();
} }
// Pre-condition: the Binder calling identity has already been cleared // Pre-condition: the Binder calling identity has already been cleared

View File

@@ -1054,6 +1054,14 @@ Status StatsService::statsCompanionReady() {
return Status::ok(); return Status::ok();
} }
Status StatsService::bootCompleted() {
ENFORCE_UID(AID_SYSTEM);
VLOG("StatsService::bootCompleted was called");
return Status::ok();
}
void StatsService::Startup() { void StatsService::Startup() {
mConfigManager->Startup(); mConfigManager->Startup();
mProcessor->LoadActiveConfigsFromDisk(); mProcessor->LoadActiveConfigsFromDisk();
@@ -1205,6 +1213,14 @@ Status StatsService::sendAppBreadcrumbAtom(int32_t label, int32_t state) {
return Status::ok(); return Status::ok();
} }
Status StatsService::allPullersFromBootRegistered() {
ENFORCE_UID(AID_SYSTEM);
VLOG("StatsService::allPullersFromBootRegistered was called");
return Status::ok();
}
Status StatsService::registerPullAtomCallback(int32_t uid, int32_t atomTag, int64_t coolDownMillis, Status StatsService::registerPullAtomCallback(int32_t uid, int32_t atomTag, int64_t coolDownMillis,
int64_t timeoutMillis, int64_t timeoutMillis,
const std::vector<int32_t>& additiveFields, const std::vector<int32_t>& additiveFields,

View File

@@ -64,6 +64,7 @@ public:
virtual Status systemRunning(); virtual Status systemRunning();
virtual Status statsCompanionReady(); virtual Status statsCompanionReady();
virtual Status bootCompleted();
virtual Status informAnomalyAlarmFired(); virtual Status informAnomalyAlarmFired();
virtual Status informPollAlarmFired(); virtual Status informPollAlarmFired();
virtual Status informAlarmForSubscriberTriggeringFired(); virtual Status informAlarmForSubscriberTriggeringFired();
@@ -164,6 +165,11 @@ public:
*/ */
virtual Status sendAppBreadcrumbAtom(int32_t label, int32_t state) override; virtual Status sendAppBreadcrumbAtom(int32_t label, int32_t state) override;
/**
* Binder call to notify statsd that all pullers from boot have been registered.
*/
virtual Status allPullersFromBootRegistered();
/** /**
* Binder call to register a callback function for a pulled atom. * Binder call to register a callback function for a pulled atom.
*/ */