Repository: accumulo Updated Branches: refs/heads/1.7 d26fc146b -> 312b8762d
ACCUMULO-3745 Always obtain locks in same order in SourceSwitching iter [~ecn] and I sat together and fixed this. We are not sure how to test. We both visually analyzed all locking to ensure it was done in the same order. Project: http://git-wip-us.apache.org/repos/asf/accumulo/repo Commit: http://git-wip-us.apache.org/repos/asf/accumulo/commit/95e234c7 Tree: http://git-wip-us.apache.org/repos/asf/accumulo/tree/95e234c7 Diff: http://git-wip-us.apache.org/repos/asf/accumulo/diff/95e234c7 Branch: refs/heads/1.7 Commit: 95e234c7e468d61211d6f1d65ee1955d2bf53a9b Parents: fca7cb4 Author: Keith Turner <ktur...@apache.org> Authored: Wed Apr 22 15:05:06 2015 -0400 Committer: Keith Turner <ktur...@apache.org> Committed: Wed Apr 22 15:05:06 2015 -0400 ---------------------------------------------------------------------- .../system/SourceSwitchingIterator.java | 29 +++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/accumulo/blob/95e234c7/core/src/main/java/org/apache/accumulo/core/iterators/system/SourceSwitchingIterator.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/iterators/system/SourceSwitchingIterator.java b/core/src/main/java/org/apache/accumulo/core/iterators/system/SourceSwitchingIterator.java index 6c40176..7684352 100644 --- a/core/src/main/java/org/apache/accumulo/core/iterators/system/SourceSwitchingIterator.java +++ b/core/src/main/java/org/apache/accumulo/core/iterators/system/SourceSwitchingIterator.java @@ -69,11 +69,11 @@ public class SourceSwitchingIterator implements SortedKeyValueIterator<Key,Value this.source = source; this.onlySwitchAfterRow = onlySwitchAfterRow; this.copies = copies; - copies.add(this); } public SourceSwitchingIterator(DataSource source, boolean onlySwitchAfterRow) { this(source, onlySwitchAfterRow, Collections.synchronizedList(new ArrayList<SourceSwitchingIterator>())); + copies.add(this); } public SourceSwitchingIterator(DataSource source) { @@ -81,8 +81,14 @@ public class SourceSwitchingIterator implements SortedKeyValueIterator<Key,Value } @Override - public synchronized SortedKeyValueIterator<Key,Value> deepCopy(IteratorEnvironment env) { - return new SourceSwitchingIterator(source.getDeepCopyDataSource(env), onlySwitchAfterRow, copies); + public SortedKeyValueIterator<Key,Value> deepCopy(IteratorEnvironment env) { + synchronized (copies) { + synchronized(this){ + SourceSwitchingIterator ssi = new SourceSwitchingIterator(source.getDeepCopyDataSource(env), onlySwitchAfterRow, copies); + copies.add(ssi); + return ssi; + } + } } @Override @@ -186,14 +192,17 @@ public class SourceSwitchingIterator implements SortedKeyValueIterator<Key,Value } @Override - public synchronized void setInterruptFlag(AtomicBoolean flag) { - if (copies.size() != 1) - throw new IllegalStateException("setInterruptFlag() called after deep copies made " + copies.size()); + public void setInterruptFlag(AtomicBoolean flag) { + synchronized (copies) { + synchronized (this) { + if (copies.size() != 1) + throw new IllegalStateException("setInterruptFlag() called after deep copies made " + copies.size()); - if (iter != null) - ((InterruptibleIterator) iter).setInterruptFlag(flag); + if (iter != null) + ((InterruptibleIterator) iter).setInterruptFlag(flag); - source.setInterruptFlag(flag); + source.setInterruptFlag(flag); + } + } } - }