Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 504350c5 authored by Jack Yu's avatar Jack Yu
Browse files

Improved logging of APN context

Instead of sharing one local log for all APN context, create
one local log for each APN context.

Bug: 130819450
Test: Manual
Change-Id: Ie5c42cf7b52f0bb81b28d9f2e865728245892300
parent d825b351
Loading
Loading
Loading
Loading
+33 −45
Original line number Diff line number Diff line
@@ -153,10 +153,7 @@ public class ApnContext {
     * @param dc data connection
     */
    public synchronized void setDataConnection(DataConnection dc) {
        if (DBG) {
            log("setDataConnectionAc: old dc=" + mDataConnection + ",new dc=" + dc
                    + " this=" + this);
        }
        log("setDataConnectionAc: old=" + mDataConnection + ",new=" + dc + " this=" + this);
        mDataConnection = dc;
    }

@@ -193,7 +190,7 @@ public class ApnContext {
     * @return APN setting
     */
    public synchronized ApnSetting getApnSetting() {
        if (DBG) log("getApnSetting: apnSetting=" + mApnSetting);
        log("getApnSetting: apnSetting=" + mApnSetting);
        return mApnSetting;
    }

@@ -202,7 +199,7 @@ public class ApnContext {
     * @param apnSetting APN setting
     */
    public synchronized void setApnSetting(ApnSetting apnSetting) {
        if (DBG) log("setApnSetting: apnSetting=" + apnSetting);
        log("setApnSetting: apnSetting=" + apnSetting);
        mApnSetting = apnSetting;
    }

@@ -279,9 +276,7 @@ public class ApnContext {
     * @param s Current data call state
     */
    public synchronized void setState(DctConstants.State s) {
        if (DBG) {
        log("setState: " + s + ", previous state:" + mState);
        }

        if (mState != s) {
            mStateLocalLog.log("State changed from " + mState + " to " + s);
@@ -290,7 +285,8 @@ public class ApnContext {

        if (mState == DctConstants.State.FAILED) {
            if (mRetryManager.getWaitingApns() != null) {
                mRetryManager.getWaitingApns().clear(); // when teardown the connection and set to IDLE
                // when teardown the connection and set to IDLE
                mRetryManager.getWaitingApns().clear();
            }
        }
    }
@@ -318,9 +314,7 @@ public class ApnContext {
     * @param reason Reason for data call connection
     */
    public synchronized void setReason(String reason) {
        if (DBG) {
        log("set reason as " + reason + ",current state " + mState);
        }
        mReason = reason;
    }

@@ -373,9 +367,7 @@ public class ApnContext {
     * @param enabled True if data call is enabled
     */
    public void setEnabled(boolean enabled) {
        if (DBG) {
        log("set enabled as " + enabled + ", current state is " + mDataEnabled.get());
        }
        mDataEnabled.set(enabled);
    }

@@ -402,23 +394,22 @@ public class ApnContext {
        }
    }

    private final ArrayList<LocalLog> mLocalLogs = new ArrayList<>();
    private final LocalLog mLocalLog = new LocalLog(150);
    private final ArrayList<NetworkRequest> mNetworkRequests = new ArrayList<>();
    private final LocalLog mStateLocalLog = new LocalLog(50);

    public void requestLog(String str) {
        synchronized (mRefCountLock) {
            for (LocalLog l : mLocalLogs) {
                l.log(str);
            }
        synchronized (mLocalLog) {
            mLocalLog.log(str);
        }
    }

    public void requestNetwork(NetworkRequest networkRequest, @RequestNetworkType int type,
                               Message onCompleteMsg, LocalLog log) {
                               Message onCompleteMsg) {
        synchronized (mRefCountLock) {
            mLocalLogs.add(log);
            mNetworkRequests.add(networkRequest);
            logl("requestNetwork for " + networkRequest + ", type="
                    + DcTracker.requestTypeToString(type));
            mDcTracker.enableApn(ApnSetting.getApnTypesBitmaskFromString(mApnType), type,
                    onCompleteMsg);
            if (mDataConnection != null) {
@@ -429,17 +420,10 @@ public class ApnContext {
        }
    }

    public void releaseNetwork(NetworkRequest networkRequest, @ReleaseNetworkType int type,
                               LocalLog log) {
    public void releaseNetwork(NetworkRequest networkRequest, @ReleaseNetworkType int type) {
        synchronized (mRefCountLock) {
            if (mLocalLogs.contains(log) == false) {
                log.log("ApnContext.releaseNetwork can't find this log");
            } else {
                mLocalLogs.remove(log);
            }
            if (mNetworkRequests.contains(networkRequest) == false) {
                log.log("ApnContext.releaseNetwork can't find this request ("
                        + networkRequest + ")");
                logl("releaseNetwork can't find this request (" + networkRequest + ")");
            } else {
                mNetworkRequests.remove(networkRequest);
                if (mDataConnection != null) {
@@ -447,8 +431,8 @@ public class ApnContext {
                    // the data connection. For example, the score may change.
                    mDataConnection.reevaluateDataConnectionProperties();
                }
                log.log("ApnContext.releaseNetwork left with " + mNetworkRequests.size() +
                        " requests.");
                logl("releaseNetwork left with " + mNetworkRequests.size()
                        + " requests.");
                if (mNetworkRequests.size() == 0
                        || type == DcTracker.RELEASE_TYPE_DETACH
                        || type == DcTracker.RELEASE_TYPE_HANDOVER) {
@@ -482,8 +466,7 @@ public class ApnContext {
    private final SparseIntArray mRetriesLeftPerErrorCode = new SparseIntArray();

    public void resetErrorCodeRetries() {
        requestLog("ApnContext.resetErrorCodeRetries");
        if (DBG) log("ApnContext.resetErrorCodeRetries");
        logl("ApnContext.resetErrorCodeRetries");

        String[] config = mPhone.getContext().getResources().getStringArray(
                com.android.internal.R.array.config_cell_retries_per_error_code);
@@ -533,10 +516,8 @@ public class ApnContext {
                }
            }
        }
        String str = "ApnContext.restartOnError(" + errorCode + ") found " + retriesLeft +
                " and returned " + result;
        if (DBG) log(str);
        requestLog(str);
        logl("ApnContext.restartOnError(" + errorCode + ") found " + retriesLeft
                + " and returned " + result);
        return result;
    }

@@ -658,8 +639,15 @@ public class ApnContext {
    }

    private void log(String s) {
        if (DBG) {
            Rlog.d(LOG_TAG, "[ApnContext:" + mApnType + "] " + s);
        }
    }

    private void logl(String s) {
        log(s);
        mLocalLog.log(s);
    }

    public void dump(FileDescriptor fd, PrintWriter printWriter, String[] args) {
        final IndentingPrintWriter pw = new IndentingPrintWriter(printWriter, "  ");
@@ -674,10 +662,10 @@ public class ApnContext {
                pw.decreaseIndent();
            }
            pw.increaseIndent();
            for (LocalLog l : mLocalLogs) {
                l.dump(fd, pw, args);
            pw.println("-----");
            }
            pw.println("Local log:");
            mLocalLog.dump(fd, pw, args);
            pw.println("-----");
            pw.decreaseIndent();
            pw.println("Historical APN state:");
            pw.increaseIndent();
+4 −6
Original line number Diff line number Diff line
@@ -606,12 +606,10 @@ public class DataConnection extends StateMachine {
     * @return Fail cause if failed to setup data connection. {@link DataFailCause#NONE} if success.
     */
    private @DataFailCause.FailCause int connect(ConnectionParams cp) {
        if (DBG) {
        log("connect: carrier='" + mApnSetting.getEntryName()
                + "' APN='" + mApnSetting.getApnName()
                + "' proxy='" + mApnSetting.getProxyAddressAsString()
                + "' port='" + mApnSetting.getProxyPort() + "'");
        }
        if (cp.mApnContext != null) cp.mApnContext.requestLog("DataConnection.connect");

        // Check if we should fake an error.
+4 −10
Original line number Diff line number Diff line
@@ -897,24 +897,19 @@ public class DcTracker extends Handler {
    }

    public void requestNetwork(NetworkRequest networkRequest, @RequestNetworkType int type,
                               Message onCompleteMsg, LocalLog log) {
                               Message onCompleteMsg) {
        final int apnType = ApnContext.getApnTypeFromNetworkRequest(networkRequest);
        final ApnContext apnContext = mApnContextsByType.get(apnType);
        log.log("DcTracker.requestNetwork for " + networkRequest + " found " + apnContext
                + ", type=" + requestTypeToString(type));
        if (apnContext != null) {
            apnContext.requestNetwork(networkRequest, type, onCompleteMsg, log);
            apnContext.requestNetwork(networkRequest, type, onCompleteMsg);
        }
    }

    public void releaseNetwork(NetworkRequest networkRequest, @ReleaseNetworkType int type,
                               LocalLog log) {
    public void releaseNetwork(NetworkRequest networkRequest, @ReleaseNetworkType int type) {
        final int apnType = ApnContext.getApnTypeFromNetworkRequest(networkRequest);
        final ApnContext apnContext = mApnContextsByType.get(apnType);
        log.log("DcTracker.releaseNetwork for " + networkRequest + " found " + apnContext
                + ", type=" + releaseTypeToString(type));
        if (apnContext != null) {
            apnContext.releaseNetwork(networkRequest, type, log);
            apnContext.releaseNetwork(networkRequest, type);
        }
    }

@@ -1710,7 +1705,6 @@ public class DcTracker extends Handler {
        str = "cleanUpConnectionInternal: X detach=" + detach + " reason="
                + apnContext.getReason();
        if (DBG) log(str + " apnContext=" + apnContext + " dc=" + apnContext.getDataConnection());
        apnContext.requestLog(str);
    }

    /**
+2 −3
Original line number Diff line number Diff line
@@ -204,7 +204,7 @@ public class TelephonyNetworkFactory extends NetworkFactory {
                                        int transport, Message onCompleteMsg) {
        if (mPhone.getDcTracker(transport) != null) {
            mPhone.getDcTracker(transport).requestNetwork(networkRequest, requestType,
                    onCompleteMsg, mLocalLog);
                    onCompleteMsg);
        }
    }

@@ -212,8 +212,7 @@ public class TelephonyNetworkFactory extends NetworkFactory {
                                        @ReleaseNetworkType int releaseType,
                                        int transport) {
        if (mPhone.getDcTracker(transport) != null) {
            mPhone.getDcTracker(transport).releaseNetwork(networkRequest, releaseType,
                    mLocalLog);
            mPhone.getDcTracker(transport).releaseNetwork(networkRequest, releaseType);
        }
    }

+10 −16
Original line number Diff line number Diff line
@@ -30,7 +30,6 @@ import android.net.NetworkConfig;
import android.net.NetworkRequest;
import android.telephony.data.ApnSetting;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.LocalLog;

import com.android.internal.R;
import com.android.internal.telephony.DctConstants;
@@ -117,9 +116,8 @@ public class ApnContextTest extends TelephonyTest {
    @Test
    @SmallTest
    public void testNetworkRequestNormal() throws Exception {
        LocalLog log = new LocalLog(3);
        NetworkRequest nr1 = new NetworkRequest.Builder().build();
        mApnContext.requestNetwork(nr1, DcTracker.REQUEST_TYPE_NORMAL, null, log);
        mApnContext.requestNetwork(nr1, DcTracker.REQUEST_TYPE_NORMAL, null);

        verify(mDcTracker, times(1)).enableApn(eq(ApnSetting.TYPE_DEFAULT),
                eq(DcTracker.REQUEST_TYPE_NORMAL), eq(null));
@@ -129,17 +127,16 @@ public class ApnContextTest extends TelephonyTest {
                .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
                .build();
        LocalLog log2 = new LocalLog(3);

        mApnContext.requestNetwork(nr2, DcTracker.REQUEST_TYPE_NORMAL, null, log2);
        mApnContext.requestNetwork(nr2, DcTracker.REQUEST_TYPE_NORMAL, null);
        verify(mDcTracker, times(2)).enableApn(eq(ApnSetting.TYPE_DEFAULT),
                eq(DcTracker.REQUEST_TYPE_NORMAL), eq(null));

        mApnContext.releaseNetwork(nr1, DcTracker.RELEASE_TYPE_NORMAL, log);
        mApnContext.releaseNetwork(nr1, DcTracker.RELEASE_TYPE_NORMAL);
        verify(mDcTracker, never()).disableApn(eq(ApnSetting.TYPE_DEFAULT),
                eq(DcTracker.RELEASE_TYPE_NORMAL));

        mApnContext.releaseNetwork(nr2, DcTracker.RELEASE_TYPE_NORMAL, log2);
        mApnContext.releaseNetwork(nr2, DcTracker.RELEASE_TYPE_NORMAL);
        verify(mDcTracker, times(1)).disableApn(eq(ApnSetting.TYPE_DEFAULT),
                eq(DcTracker.RELEASE_TYPE_NORMAL));
    }
@@ -147,9 +144,8 @@ public class ApnContextTest extends TelephonyTest {
    @Test
    @SmallTest
    public void testNetworkRequestDetach() throws Exception {
        LocalLog log = new LocalLog(3);
        NetworkRequest nr1 = new NetworkRequest.Builder().build();
        mApnContext.requestNetwork(nr1, DcTracker.REQUEST_TYPE_NORMAL, null, log);
        mApnContext.requestNetwork(nr1, DcTracker.REQUEST_TYPE_NORMAL, null);
        verify(mDcTracker, times(1)).enableApn(eq(ApnSetting.TYPE_DEFAULT),
                eq(DcTracker.REQUEST_TYPE_NORMAL), eq(null));

@@ -158,17 +154,16 @@ public class ApnContextTest extends TelephonyTest {
                .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
                .build();
        LocalLog log2 = new LocalLog(3);

        mApnContext.requestNetwork(nr2, DcTracker.REQUEST_TYPE_NORMAL, null, log2);
        mApnContext.requestNetwork(nr2, DcTracker.REQUEST_TYPE_NORMAL, null);
        verify(mDcTracker, times(2)).enableApn(eq(ApnSetting.TYPE_DEFAULT),
                eq(DcTracker.REQUEST_TYPE_NORMAL), eq(null));

        mApnContext.releaseNetwork(nr1, DcTracker.RELEASE_TYPE_DETACH, log);
        mApnContext.releaseNetwork(nr1, DcTracker.RELEASE_TYPE_DETACH);
        verify(mDcTracker, times(1)).disableApn(eq(ApnSetting.TYPE_DEFAULT),
                eq(DcTracker.RELEASE_TYPE_DETACH));

        mApnContext.releaseNetwork(nr2, DcTracker.RELEASE_TYPE_NORMAL, log2);
        mApnContext.releaseNetwork(nr2, DcTracker.RELEASE_TYPE_NORMAL);
        verify(mDcTracker, times(1)).disableApn(eq(ApnSetting.TYPE_DEFAULT),
                eq(DcTracker.RELEASE_TYPE_NORMAL));
    }
@@ -176,13 +171,12 @@ public class ApnContextTest extends TelephonyTest {
    @Test
    @SmallTest
    public void testNetworkRequestHandover() throws Exception {
        LocalLog log = new LocalLog(3);
        NetworkRequest nr1 = new NetworkRequest.Builder().build();
        mApnContext.requestNetwork(nr1, DcTracker.REQUEST_TYPE_HANDOVER, null, log);
        mApnContext.requestNetwork(nr1, DcTracker.REQUEST_TYPE_HANDOVER, null);
        verify(mDcTracker, times(1)).enableApn(eq(ApnSetting.TYPE_DEFAULT),
                eq(DcTracker.REQUEST_TYPE_HANDOVER), eq(null));

        mApnContext.releaseNetwork(nr1, DcTracker.RELEASE_TYPE_HANDOVER, log);
        mApnContext.releaseNetwork(nr1, DcTracker.RELEASE_TYPE_HANDOVER);
        verify(mDcTracker, times(1)).disableApn(eq(ApnSetting.TYPE_DEFAULT),
                eq(DcTracker.RELEASE_TYPE_HANDOVER));
    }
Loading