am 6f6326bc: Implement a exponential backoff for NTP time and XTRA data retry.
* commit '6f6326bc75be652a0b88b73fd6e0b73dbe2fabb6': Implement a exponential backoff for NTP time and XTRA data retry.
This commit is contained in:
@@ -22,10 +22,8 @@ import com.android.internal.location.GpsNetInitiatedHandler;
|
||||
import com.android.internal.location.GpsNetInitiatedHandler.GpsNiNotification;
|
||||
import com.android.internal.location.ProviderProperties;
|
||||
import com.android.internal.location.ProviderRequest;
|
||||
import com.android.internal.R;
|
||||
import com.android.internal.telephony.Phone;
|
||||
import com.android.internal.telephony.PhoneConstants;
|
||||
import com.android.internal.telephony.TelephonyIntents;
|
||||
|
||||
import android.app.AlarmManager;
|
||||
import android.app.AppOpsManager;
|
||||
@@ -72,7 +70,6 @@ import android.provider.Settings;
|
||||
import android.provider.Telephony.Carriers;
|
||||
import android.provider.Telephony.Sms.Intents;
|
||||
import android.telephony.SmsMessage;
|
||||
import android.telephony.SubscriptionInfo;
|
||||
import android.telephony.SubscriptionManager;
|
||||
import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
|
||||
import android.telephony.TelephonyManager;
|
||||
@@ -91,7 +88,6 @@ import java.io.StringReader;
|
||||
import java.net.InetAddress;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Properties;
|
||||
|
||||
@@ -283,8 +279,16 @@ public class GpsLocationProvider implements LocationProviderInterface {
|
||||
// current setting 24 hours
|
||||
private static final long NTP_INTERVAL = 24*60*60*1000;
|
||||
// how long to wait if we have a network error in NTP or XTRA downloading
|
||||
// the initial value of the exponential backoff
|
||||
// current setting - 5 minutes
|
||||
private static final long RETRY_INTERVAL = 5*60*1000;
|
||||
// how long to wait if we have a network error in NTP or XTRA downloading
|
||||
// the max value of the exponential backoff
|
||||
// current setting - 4 hours
|
||||
private static final long MAX_RETRY_INTERVAL = 4*60*60*1000;
|
||||
|
||||
private BackOff mNtpBackOff = new BackOff(RETRY_INTERVAL, MAX_RETRY_INTERVAL);
|
||||
private BackOff mXtraBackOff = new BackOff(RETRY_INTERVAL, MAX_RETRY_INTERVAL);
|
||||
|
||||
// true if we are enabled, protected by this
|
||||
private boolean mEnabled;
|
||||
@@ -877,9 +881,10 @@ public class GpsLocationProvider implements LocationProviderInterface {
|
||||
|
||||
native_inject_time(time, timeReference, (int) certainty);
|
||||
delay = NTP_INTERVAL;
|
||||
mNtpBackOff.reset();
|
||||
} else {
|
||||
if (DEBUG) Log.d(TAG, "requestTime failed");
|
||||
delay = RETRY_INTERVAL;
|
||||
delay = mNtpBackOff.nextBackoffMillis();
|
||||
}
|
||||
|
||||
sendMessage(INJECT_NTP_TIME_FINISHED, 0, null);
|
||||
@@ -920,6 +925,7 @@ public class GpsLocationProvider implements LocationProviderInterface {
|
||||
Log.d(TAG, "calling native_inject_xtra_data");
|
||||
}
|
||||
native_inject_xtra_data(data, data.length);
|
||||
mXtraBackOff.reset();
|
||||
}
|
||||
|
||||
sendMessage(DOWNLOAD_XTRA_DATA_FINISHED, 0, null);
|
||||
@@ -927,7 +933,8 @@ public class GpsLocationProvider implements LocationProviderInterface {
|
||||
if (data == null) {
|
||||
// try again later
|
||||
// since this is delayed and not urgent we do not hold a wake lock here
|
||||
mHandler.sendEmptyMessageDelayed(DOWNLOAD_XTRA_DATA, RETRY_INTERVAL);
|
||||
mHandler.sendEmptyMessageDelayed(DOWNLOAD_XTRA_DATA,
|
||||
mXtraBackOff.nextBackoffMillis());
|
||||
}
|
||||
|
||||
// release wake lock held by task
|
||||
@@ -2147,6 +2154,36 @@ public class GpsLocationProvider implements LocationProviderInterface {
|
||||
pw.append(s);
|
||||
}
|
||||
|
||||
/**
|
||||
* A simple implementation of exponential backoff.
|
||||
*/
|
||||
private static final class BackOff {
|
||||
private static final int MULTIPLIER = 2;
|
||||
private final long mInitIntervalMillis;
|
||||
private final long mMaxIntervalMillis;
|
||||
private long mCurrentIntervalMillis;
|
||||
|
||||
public BackOff(long initIntervalMillis, long maxIntervalMillis) {
|
||||
mInitIntervalMillis = initIntervalMillis;
|
||||
mMaxIntervalMillis = maxIntervalMillis;
|
||||
|
||||
mCurrentIntervalMillis = mInitIntervalMillis / MULTIPLIER;
|
||||
}
|
||||
|
||||
public long nextBackoffMillis() {
|
||||
if (mCurrentIntervalMillis > mMaxIntervalMillis) {
|
||||
return mMaxIntervalMillis;
|
||||
}
|
||||
|
||||
mCurrentIntervalMillis *= MULTIPLIER;
|
||||
return mCurrentIntervalMillis;
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
mCurrentIntervalMillis = mInitIntervalMillis / MULTIPLIER;
|
||||
}
|
||||
}
|
||||
|
||||
// for GPS SV statistics
|
||||
private static final int MAX_SVS = 32;
|
||||
private static final int EPHEMERIS_MASK = 0;
|
||||
|
||||
Reference in New Issue
Block a user