Fix missing IpConnectivity metrics

The IpConnectivityLog class looks up MetricsLoggerService once only
at creation. If a IpConnectivityLog user instantiates this class too
early during the boot process, the MetricsLoggerService is not found
and no event can be recorded.

This patch makes IpConnectivityLog attempt to look up
MetricsLoggerService as long as it hasn't found it yet.

This allows IpManager and ConnectivityService to upload
android.net.metrics events.

Bug: 30490301
Change-Id: I97102b95a775ea9e90351b9887ae4661fddc2af9
This commit is contained in:
Hugo Benichi
2016-07-29 16:29:46 +09:00
parent 378183607b
commit 90cbc5b444
2 changed files with 17 additions and 4 deletions

View File

@@ -46,11 +46,12 @@ public class ConnectivityMetricsLogger {
public static final String DATA_KEY_EVENTS_COUNT = "count";
/** {@hide} */ protected final IConnectivityMetricsLogger mService;
/** {@hide} */ protected IConnectivityMetricsLogger mService;
/** {@hide} */ protected volatile long mServiceUnblockedTimestampMillis;
private int mNumSkippedEvents;
public ConnectivityMetricsLogger() {
// TODO: consider not initializing mService in constructor
this(IConnectivityMetricsLogger.Stub.asInterface(
ServiceManager.getService(CONNECTIVITY_METRICS_LOGGER_SERVICE)));
}
@@ -61,6 +62,18 @@ public class ConnectivityMetricsLogger {
mService = service;
}
/** {@hide} */
protected boolean checkLoggerService() {
if (mService != null) {
return true;
}
// Two threads racing here will write the same pointer because getService
// is idempotent once MetricsLoggerService is initialized.
mService = IConnectivityMetricsLogger.Stub.asInterface(
ServiceManager.getService(CONNECTIVITY_METRICS_LOGGER_SERVICE));
return mService != null;
}
/**
* Log a ConnectivityMetricsEvent.
*

View File

@@ -31,7 +31,7 @@ import com.android.internal.annotations.VisibleForTesting;
*/
public class IpConnectivityLog extends ConnectivityMetricsLogger {
private static String TAG = "IpConnectivityMetricsLogger";
private static final boolean DBG = false;
private static final boolean DBG = true;
public IpConnectivityLog() {
// mService initialized in super constructor.
@@ -52,9 +52,9 @@ public class IpConnectivityLog extends ConnectivityMetricsLogger {
* @return true if the event was successfully logged.
*/
public boolean log(long timestamp, Parcelable data) {
if (mService == null) {
if (!checkLoggerService()) {
if (DBG) {
Log.d(TAG, CONNECTIVITY_METRICS_LOGGER_SERVICE + " service not ready");
Log.d(TAG, CONNECTIVITY_METRICS_LOGGER_SERVICE + " service was not ready");
}
return false;
}