You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@edgent.apache.org by dl...@apache.org on 2017/11/02 03:21:30 UTC

[19/50] [abbrv] incubator-edgent git commit: TrakcingScheduledExecutor CME fix take 2

TrakcingScheduledExecutor CME fix take 2

Project: http://git-wip-us.apache.org/repos/asf/incubator-edgent/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-edgent/commit/bea8576b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-edgent/tree/bea8576b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-edgent/diff/bea8576b

Branch: refs/heads/develop
Commit: bea8576b6eaa8c607263a1f633fffc7bf40b53da
Parents: 786d934
Author: Dale LaBossiere <dl...@us.ibm.com>
Authored: Thu Oct 26 13:04:11 2017 -0400
Committer: Dale LaBossiere <dl...@us.ibm.com>
Committed: Thu Oct 26 13:04:11 2017 -0400

----------------------------------------------------------------------
 .../runtime/etiao/TrackingScheduledExecutor.java     | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/bea8576b/runtime/etiao/src/main/java/org/apache/edgent/runtime/etiao/TrackingScheduledExecutor.java
----------------------------------------------------------------------
diff --git a/runtime/etiao/src/main/java/org/apache/edgent/runtime/etiao/TrackingScheduledExecutor.java b/runtime/etiao/src/main/java/org/apache/edgent/runtime/etiao/TrackingScheduledExecutor.java
index 478e419..fef4105 100644
--- a/runtime/etiao/src/main/java/org/apache/edgent/runtime/etiao/TrackingScheduledExecutor.java
+++ b/runtime/etiao/src/main/java/org/apache/edgent/runtime/etiao/TrackingScheduledExecutor.java
@@ -117,6 +117,7 @@ public final class TrackingScheduledExecutor extends ScheduledThreadPoolExecutor
 
     private int cancelAllAsyncTasks(boolean mayInterruptIfRunning) {
         int notCanceled = 0;
+        // follow the iterator access pattern doc'd by Collections:synchronizedSet()
         synchronized (asyncTasks) {
             // hmm have gotten CMEs here with testMultiTopologyPollWithError.
             // This seems to follow the required access pattern for synchronized collection iterator.
@@ -126,10 +127,22 @@ public final class TrackingScheduledExecutor extends ScheduledThreadPoolExecutor
             //    hasActiveTasks() - iterates while synchronized and can remove
             //    removeTrack() - remove
             // Just to make things iron clad, synch the add and remove too
-            for (RunnableScheduledFuture<?> task : asyncTasks) {
+            // hmm... got another CME even after mods to the above.
+            //   java.util.ConcurrentModificationException
+            //   at java.util.HashMap$HashIterator.nextNode(HashMap.java:1437)
+            //   at java.util.HashMap$KeyIterator.next(HashMap.java:1461)
+            //   at: for (RunnableScheduledFuture<?> task : asyncTasks)
+//            for (RunnableScheduledFuture<?> task : asyncTasks) {
+//                if (!task.cancel(mayInterruptIfRunning))
+//                    notCanceled++;
+//            }
+            Iterator<RunnableScheduledFuture<?>> i = asyncTasks.iterator();
+            while (i.hasNext()) {
+                RunnableScheduledFuture<?> task = i.next();
                 if (!task.cancel(mayInterruptIfRunning))
                     notCanceled++;
             }
+
             // remove tasks which are done
             hasActiveTasks();
         }