diff options
author | junyulai <junyulai@google.com> | 2019-05-13 14:19:00 +0800 |
---|---|---|
committer | junyulai <junyulai@google.com> | 2019-05-13 14:48:41 +0800 |
commit | cf43dbdbc69e5cb36ba874d21511a76240069abc (patch) | |
tree | 9e22a377faef4373aa90696821c4a476b42b4e92 | |
parent | ce5ecd93044754cafcdf6ca5e1348527ad57dcb2 (diff) | |
download | base-cf43dbdbc69e5cb36ba874d21511a76240069abc.tar.gz |
Fix concurrent modification exception in KeepaliveTracker
In aosp/951200, the clean up function delete the item in the
hash map that holds the record while iterating it, where the
list used to iterate the records is backed by the hash map,
so changes to the map are reflected in the list and caused
the concurrent modification exception.
Bug: 132341736
Test: 1. atest com.android.server.ConnectivityServiceTest \
#testNattSocketKeepalives --generate-new-metrics 300
2. atest FrameworksNetTests --generate-new-metrics 10
Change-Id: I0481a469ee23231e5f0ab738a06b5e09f6cdb680
-rw-r--r-- | services/core/java/com/android/server/connectivity/KeepaliveTracker.java | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/connectivity/KeepaliveTracker.java b/services/core/java/com/android/server/connectivity/KeepaliveTracker.java index 526b4ffabb52..e10d7373359b 100644 --- a/services/core/java/com/android/server/connectivity/KeepaliveTracker.java +++ b/services/core/java/com/android/server/connectivity/KeepaliveTracker.java @@ -462,9 +462,10 @@ public class KeepaliveTracker { } public void handleStopAllKeepalives(NetworkAgentInfo nai, int reason) { - HashMap <Integer, KeepaliveInfo> networkKeepalives = mKeepalives.get(nai); + final HashMap<Integer, KeepaliveInfo> networkKeepalives = mKeepalives.get(nai); if (networkKeepalives != null) { - for (KeepaliveInfo ki : networkKeepalives.values()) { + final ArrayList<KeepaliveInfo> kalist = new ArrayList(networkKeepalives.values()); + for (KeepaliveInfo ki : kalist) { ki.stop(reason); // Clean up keepalives since the network agent is disconnected and unable to pass // back asynchronous result of stop(). |