You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@lucene.apache.org by Uwe Schindler <uw...@thetaphi.de> on 2016/08/09 11:22:20 UTC
Re: lucene-solr:master: LUCENE-7409: improve MockDirectoryWrapper's IndexInput to detect if a clone is being used after its parent was closed
Instead of the lambda in assertThrows, use this: assertThrows(RuntimeException.class, in::readByte)
A method reference is much better here, as we have no parameter, so javac can implement this more easy without stupid synthetic method appearing in stack trace. :)
Uwe
Am 9. August 2016 11:03:41 MESZ, schrieb mikemccand@apache.org:
>Repository: lucene-solr
>Updated Branches:
> refs/heads/master 1164c17e0 -> 04086fbfc
>
>
>LUCENE-7409: improve MockDirectoryWrapper's IndexInput to detect if a
>clone is being used after its parent was closed
>
>
>Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
>Commit:
>http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/04086fbf
>Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/04086fbf
>Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/04086fbf
>
>Branch: refs/heads/master
>Commit: 04086fbfc4e1103605267024adad121077ae52d6
>Parents: 1164c17
>Author: Mike McCandless <mi...@apache.org>
>Authored: Tue Aug 9 05:03:29 2016 -0400
>Committer: Mike McCandless <mi...@apache.org>
>Committed: Tue Aug 9 05:03:29 2016 -0400
>
>----------------------------------------------------------------------
> .../lucene/store/MockDirectoryWrapper.java | 2 +-
> .../lucene/store/MockIndexInputWrapper.java | 27 ++++++++++-----
> .../store/SlowClosingMockIndexInputWrapper.java | 2 +-
> .../store/SlowOpeningMockIndexInputWrapper.java | 2 +-
>.../lucene/store/TestMockDirectoryWrapper.java | 36
>++++++++++++++++++++
> 5 files changed, 57 insertions(+), 12 deletions(-)
>----------------------------------------------------------------------
>
>
>http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/04086fbf/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java
>----------------------------------------------------------------------
>diff --git
>a/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java
>b/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java
>index e78968d..1ff9470 100644
>---
>a/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java
>+++
>b/lucene/test-framework/src/java/org/apache/lucene/store/MockDirectoryWrapper.java
>@@ -771,7 +771,7 @@ public class MockDirectoryWrapper extends
>BaseDirectoryWrapper {
> }
> ii = new SlowOpeningMockIndexInputWrapper(this, name, delegateInput);
> } else {
>- ii = new MockIndexInputWrapper(this, name, delegateInput);
>+ ii = new MockIndexInputWrapper(this, name, delegateInput, null);
> }
> addFileHandle(ii, name, Handle.Input);
> return ii;
>
>http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/04086fbf/lucene/test-framework/src/java/org/apache/lucene/store/MockIndexInputWrapper.java
>----------------------------------------------------------------------
>diff --git
>a/lucene/test-framework/src/java/org/apache/lucene/store/MockIndexInputWrapper.java
>b/lucene/test-framework/src/java/org/apache/lucene/store/MockIndexInputWrapper.java
>index f62d67b..f68e18c 100644
>---
>a/lucene/test-framework/src/java/org/apache/lucene/store/MockIndexInputWrapper.java
>+++
>b/lucene/test-framework/src/java/org/apache/lucene/store/MockIndexInputWrapper.java
>@@ -30,12 +30,19 @@ public class MockIndexInputWrapper extends
>IndexInput {
> private MockDirectoryWrapper dir;
> final String name;
> private IndexInput delegate;
>- private boolean isClone;
>- private boolean closed;
>+ private volatile boolean closed;
>
>- /** Construct an empty output buffer. */
>- public MockIndexInputWrapper(MockDirectoryWrapper dir, String name,
>IndexInput delegate) {
>+ // Which MockIndexInputWrapper we were cloned from, or null if we
>are not a clone:
>+ private final MockIndexInputWrapper parent;
>+
>+ /** Sole constructor */
>+ public MockIndexInputWrapper(MockDirectoryWrapper dir, String name,
>IndexInput delegate, MockIndexInputWrapper parent) {
>super("MockIndexInputWrapper(name=" + name + " delegate=" + delegate +
>")");
>+
>+ // If we are a clone then our parent better not be a clone!
>+ assert parent == null || parent.parent == null;
>+
>+ this.parent = parent;
> this.name = name;
> this.dir = dir;
> this.delegate = delegate;
>@@ -54,7 +61,7 @@ public class MockIndexInputWrapper extends IndexInput
>{
> // remove the conditional check so we also track that
> // all clones get closed:
> assert delegate != null;
>- if (!isClone) {
>+ if (parent == null) {
> dir.removeIndexInput(this, name);
> }
> dir.maybeThrowDeterministicException();
>@@ -62,9 +69,13 @@ public class MockIndexInputWrapper extends
>IndexInput {
> }
>
> private void ensureOpen() {
>+ // TODO: not great this is a volatile read (closed) ... we should
>deploy heavy JVM voodoo like SwitchPoint to avoid this
> if (closed) {
> throw new RuntimeException("Abusing closed IndexInput!");
> }
>+ if (parent != null && parent.closed) {
>+ throw new RuntimeException("Abusing clone of a closed
>IndexInput!");
>+ }
> }
>
> @Override
>@@ -75,8 +86,7 @@ public class MockIndexInputWrapper extends IndexInput
>{
> }
> dir.inputCloneCount.incrementAndGet();
> IndexInput iiclone = delegate.clone();
>- MockIndexInputWrapper clone = new MockIndexInputWrapper(dir, name,
>iiclone);
>- clone.isClone = true;
>+ MockIndexInputWrapper clone = new MockIndexInputWrapper(dir, name,
>iiclone, parent != null ? parent : this);
> // Pending resolution on LUCENE-686 we may want to
> // uncomment this code so that we also track that all
> // clones get closed:
>@@ -102,8 +112,7 @@ public class MockIndexInputWrapper extends
>IndexInput {
> }
> dir.inputCloneCount.incrementAndGet();
> IndexInput slice = delegate.slice(sliceDescription, offset, length);
>- MockIndexInputWrapper clone = new MockIndexInputWrapper(dir,
>sliceDescription, slice);
>- clone.isClone = true;
>+ MockIndexInputWrapper clone = new MockIndexInputWrapper(dir,
>sliceDescription, slice, parent != null ? parent : this);
> return clone;
> }
>
>
>http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/04086fbf/lucene/test-framework/src/java/org/apache/lucene/store/SlowClosingMockIndexInputWrapper.java
>----------------------------------------------------------------------
>diff --git
>a/lucene/test-framework/src/java/org/apache/lucene/store/SlowClosingMockIndexInputWrapper.java
>b/lucene/test-framework/src/java/org/apache/lucene/store/SlowClosingMockIndexInputWrapper.java
>index 2be2e27..e6c3857 100644
>---
>a/lucene/test-framework/src/java/org/apache/lucene/store/SlowClosingMockIndexInputWrapper.java
>+++
>b/lucene/test-framework/src/java/org/apache/lucene/store/SlowClosingMockIndexInputWrapper.java
>@@ -30,7 +30,7 @@ class SlowClosingMockIndexInputWrapper extends
>MockIndexInputWrapper {
>
> public SlowClosingMockIndexInputWrapper(MockDirectoryWrapper dir,
> String name, IndexInput delegate) {
>- super(dir, name, delegate);
>+ super(dir, name, delegate, null);
> }
>
> @Override
>
>http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/04086fbf/lucene/test-framework/src/java/org/apache/lucene/store/SlowOpeningMockIndexInputWrapper.java
>----------------------------------------------------------------------
>diff --git
>a/lucene/test-framework/src/java/org/apache/lucene/store/SlowOpeningMockIndexInputWrapper.java
>b/lucene/test-framework/src/java/org/apache/lucene/store/SlowOpeningMockIndexInputWrapper.java
>index 4cc2b19..1e95451e 100644
>---
>a/lucene/test-framework/src/java/org/apache/lucene/store/SlowOpeningMockIndexInputWrapper.java
>+++
>b/lucene/test-framework/src/java/org/apache/lucene/store/SlowOpeningMockIndexInputWrapper.java
>@@ -28,7 +28,7 @@ class SlowOpeningMockIndexInputWrapper extends
>MockIndexInputWrapper {
>
> public SlowOpeningMockIndexInputWrapper(MockDirectoryWrapper dir,
> String name, IndexInput delegate) throws IOException {
>- super(dir, name, delegate);
>+ super(dir, name, delegate, null);
> try {
> Thread.sleep(50);
> } catch (InterruptedException ie) {
>
>http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/04086fbf/lucene/test-framework/src/test/org/apache/lucene/store/TestMockDirectoryWrapper.java
>----------------------------------------------------------------------
>diff --git
>a/lucene/test-framework/src/test/org/apache/lucene/store/TestMockDirectoryWrapper.java
>b/lucene/test-framework/src/test/org/apache/lucene/store/TestMockDirectoryWrapper.java
>index ae453e5..145b40b 100644
>---
>a/lucene/test-framework/src/test/org/apache/lucene/store/TestMockDirectoryWrapper.java
>+++
>b/lucene/test-framework/src/test/org/apache/lucene/store/TestMockDirectoryWrapper.java
>@@ -171,4 +171,40 @@ public class TestMockDirectoryWrapper extends
>BaseDirectoryTestCase {
>
>assertTrue("MockDirectoryWrapper on dir=" + dir + " failed to corrupt
>an unsync'd file", changed);
> }
>+
>+ public void testAbuseClosedIndexInput() throws Exception {
>+ MockDirectoryWrapper dir = newMockDirectory();
>+ IndexOutput out = dir.createOutput("foo", IOContext.DEFAULT);
>+ out.writeByte((byte) 42);
>+ out.close();
>+ final IndexInput in = dir.openInput("foo", IOContext.DEFAULT);
>+ in.close();
>+ expectThrows(RuntimeException.class, () -> {in.readByte();});
>+ dir.close();
>+ }
>+
>+ public void testAbuseCloneAfterParentClosed() throws Exception {
>+ MockDirectoryWrapper dir = newMockDirectory();
>+ IndexOutput out = dir.createOutput("foo", IOContext.DEFAULT);
>+ out.writeByte((byte) 42);
>+ out.close();
>+ IndexInput in = dir.openInput("foo", IOContext.DEFAULT);
>+ final IndexInput clone = in.clone();
>+ in.close();
>+ expectThrows(RuntimeException.class, () -> {clone.readByte();});
>+ dir.close();
>+ }
>+
>+ public void testAbuseCloneOfCloneAfterParentClosed() throws
>Exception {
>+ MockDirectoryWrapper dir = newMockDirectory();
>+ IndexOutput out = dir.createOutput("foo", IOContext.DEFAULT);
>+ out.writeByte((byte) 42);
>+ out.close();
>+ IndexInput in = dir.openInput("foo", IOContext.DEFAULT);
>+ IndexInput clone1 = in.clone();
>+ IndexInput clone2 = clone1.clone();
>+ in.close();
>+ expectThrows(RuntimeException.class, () -> {clone2.readByte();});
>+ dir.close();
>+ }
> }
--
Uwe Schindler
H.-H.-Meier-Allee 63, 28213 Bremen
http://www.thetaphi.de
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@lucene.apache.org
For additional commands, e-mail: dev-help@lucene.apache.org
Re: lucene-solr:master: LUCENE-7409: improve MockDirectoryWrapper's
IndexInput to detect if a clone is being used after its parent was closed
Posted by Michael McCandless <lu...@mikemccandless.com>.
Oh that's great! Thanks for the pointer Uwe, I'll fix it.
Mike McCandless
http://blog.mikemccandless.com
On Tue, Aug 9, 2016 at 7:22 AM, Uwe Schindler <uw...@thetaphi.de> wrote:
> Instead of the lambda in assertThrows, use this:
> assertThrows(RuntimeException.class, in::readByte)
>
> A method reference is much better here, as we have no parameter, so javac
> can implement this more easy without stupid synthetic method appearing in
> stack trace. :)
>
> Uwe
>
> Am 9. August 2016 11:03:41 MESZ, schrieb mikemccand@apache.org:
> >Repository: lucene-solr
> >Updated Branches:
> > refs/heads/master 1164c17e0 -> 04086fbfc
> >
> >
> >LUCENE-7409: improve MockDirectoryWrapper's IndexInput to detect if a
> >clone is being used after its parent was closed
> >
> >
> >Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
> >Commit:
> >http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/04086fbf
> >Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/04086fbf
> >Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/04086fbf
> >
> >Branch: refs/heads/master
> >Commit: 04086fbfc4e1103605267024adad121077ae52d6
> >Parents: 1164c17
> >Author: Mike McCandless <mi...@apache.org>
> >Authored: Tue Aug 9 05:03:29 2016 -0400
> >Committer: Mike McCandless <mi...@apache.org>
> >Committed: Tue Aug 9 05:03:29 2016 -0400
> >
> >----------------------------------------------------------------------
> > .../lucene/store/MockDirectoryWrapper.java | 2 +-
> > .../lucene/store/MockIndexInputWrapper.java | 27 ++++++++++-----
> > .../store/SlowClosingMockIndexInputWrapper.java | 2 +-
> > .../store/SlowOpeningMockIndexInputWrapper.java | 2 +-
> >.../lucene/store/TestMockDirectoryWrapper.java | 36
> >++++++++++++++++++++
> > 5 files changed, 57 insertions(+), 12 deletions(-)
> >----------------------------------------------------------------------
> >
> >
> >http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/
> 04086fbf/lucene/test-framework/src/java/org/apache/lucene/store/
> MockDirectoryWrapper.java
> >----------------------------------------------------------------------
> >diff --git
> >a/lucene/test-framework/src/java/org/apache/lucene/store/
> MockDirectoryWrapper.java
> >b/lucene/test-framework/src/java/org/apache/lucene/store/
> MockDirectoryWrapper.java
> >index e78968d..1ff9470 100644
> >---
> >a/lucene/test-framework/src/java/org/apache/lucene/store/
> MockDirectoryWrapper.java
> >+++
> >b/lucene/test-framework/src/java/org/apache/lucene/store/
> MockDirectoryWrapper.java
> >@@ -771,7 +771,7 @@ public class MockDirectoryWrapper extends
> >BaseDirectoryWrapper {
> > }
> > ii = new SlowOpeningMockIndexInputWrapper(this, name, delegateInput);
> > } else {
> >- ii = new MockIndexInputWrapper(this, name, delegateInput);
> >+ ii = new MockIndexInputWrapper(this, name, delegateInput, null);
> > }
> > addFileHandle(ii, name, Handle.Input);
> > return ii;
> >
> >http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/
> 04086fbf/lucene/test-framework/src/java/org/apache/lucene/store/
> MockIndexInputWrapper.java
> >----------------------------------------------------------------------
> >diff --git
> >a/lucene/test-framework/src/java/org/apache/lucene/store/
> MockIndexInputWrapper.java
> >b/lucene/test-framework/src/java/org/apache/lucene/store/
> MockIndexInputWrapper.java
> >index f62d67b..f68e18c 100644
> >---
> >a/lucene/test-framework/src/java/org/apache/lucene/store/
> MockIndexInputWrapper.java
> >+++
> >b/lucene/test-framework/src/java/org/apache/lucene/store/
> MockIndexInputWrapper.java
> >@@ -30,12 +30,19 @@ public class MockIndexInputWrapper extends
> >IndexInput {
> > private MockDirectoryWrapper dir;
> > final String name;
> > private IndexInput delegate;
> >- private boolean isClone;
> >- private boolean closed;
> >+ private volatile boolean closed;
> >
> >- /** Construct an empty output buffer. */
> >- public MockIndexInputWrapper(MockDirectoryWrapper dir, String name,
> >IndexInput delegate) {
> >+ // Which MockIndexInputWrapper we were cloned from, or null if we
> >are not a clone:
> >+ private final MockIndexInputWrapper parent;
> >+
> >+ /** Sole constructor */
> >+ public MockIndexInputWrapper(MockDirectoryWrapper dir, String name,
> >IndexInput delegate, MockIndexInputWrapper parent) {
> >super("MockIndexInputWrapper(name=" + name + " delegate=" + delegate +
> >")");
> >+
> >+ // If we are a clone then our parent better not be a clone!
> >+ assert parent == null || parent.parent == null;
> >+
> >+ this.parent = parent;
> > this.name = name;
> > this.dir = dir;
> > this.delegate = delegate;
> >@@ -54,7 +61,7 @@ public class MockIndexInputWrapper extends IndexInput
> >{
> > // remove the conditional check so we also track that
> > // all clones get closed:
> > assert delegate != null;
> >- if (!isClone) {
> >+ if (parent == null) {
> > dir.removeIndexInput(this, name);
> > }
> > dir.maybeThrowDeterministicException();
> >@@ -62,9 +69,13 @@ public class MockIndexInputWrapper extends
> >IndexInput {
> > }
> >
> > private void ensureOpen() {
> >+ // TODO: not great this is a volatile read (closed) ... we should
> >deploy heavy JVM voodoo like SwitchPoint to avoid this
> > if (closed) {
> > throw new RuntimeException("Abusing closed IndexInput!");
> > }
> >+ if (parent != null && parent.closed) {
> >+ throw new RuntimeException("Abusing clone of a closed
> >IndexInput!");
> >+ }
> > }
> >
> > @Override
> >@@ -75,8 +86,7 @@ public class MockIndexInputWrapper extends IndexInput
> >{
> > }
> > dir.inputCloneCount.incrementAndGet();
> > IndexInput iiclone = delegate.clone();
> >- MockIndexInputWrapper clone = new MockIndexInputWrapper(dir, name,
> >iiclone);
> >- clone.isClone = true;
> >+ MockIndexInputWrapper clone = new MockIndexInputWrapper(dir, name,
> >iiclone, parent != null ? parent : this);
> > // Pending resolution on LUCENE-686 we may want to
> > // uncomment this code so that we also track that all
> > // clones get closed:
> >@@ -102,8 +112,7 @@ public class MockIndexInputWrapper extends
> >IndexInput {
> > }
> > dir.inputCloneCount.incrementAndGet();
> > IndexInput slice = delegate.slice(sliceDescription, offset, length);
> >- MockIndexInputWrapper clone = new MockIndexInputWrapper(dir,
> >sliceDescription, slice);
> >- clone.isClone = true;
> >+ MockIndexInputWrapper clone = new MockIndexInputWrapper(dir,
> >sliceDescription, slice, parent != null ? parent : this);
> > return clone;
> > }
> >
> >
> >http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/
> 04086fbf/lucene/test-framework/src/java/org/apache/lucene/store/
> SlowClosingMockIndexInputWrapper.java
> >----------------------------------------------------------------------
> >diff --git
> >a/lucene/test-framework/src/java/org/apache/lucene/store/
> SlowClosingMockIndexInputWrapper.java
> >b/lucene/test-framework/src/java/org/apache/lucene/store/
> SlowClosingMockIndexInputWrapper.java
> >index 2be2e27..e6c3857 100644
> >---
> >a/lucene/test-framework/src/java/org/apache/lucene/store/
> SlowClosingMockIndexInputWrapper.java
> >+++
> >b/lucene/test-framework/src/java/org/apache/lucene/store/
> SlowClosingMockIndexInputWrapper.java
> >@@ -30,7 +30,7 @@ class SlowClosingMockIndexInputWrapper extends
> >MockIndexInputWrapper {
> >
> > public SlowClosingMockIndexInputWrapper(MockDirectoryWrapper dir,
> > String name, IndexInput delegate) {
> >- super(dir, name, delegate);
> >+ super(dir, name, delegate, null);
> > }
> >
> > @Override
> >
> >http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/
> 04086fbf/lucene/test-framework/src/java/org/apache/lucene/store/
> SlowOpeningMockIndexInputWrapper.java
> >----------------------------------------------------------------------
> >diff --git
> >a/lucene/test-framework/src/java/org/apache/lucene/store/
> SlowOpeningMockIndexInputWrapper.java
> >b/lucene/test-framework/src/java/org/apache/lucene/store/
> SlowOpeningMockIndexInputWrapper.java
> >index 4cc2b19..1e95451e 100644
> >---
> >a/lucene/test-framework/src/java/org/apache/lucene/store/
> SlowOpeningMockIndexInputWrapper.java
> >+++
> >b/lucene/test-framework/src/java/org/apache/lucene/store/
> SlowOpeningMockIndexInputWrapper.java
> >@@ -28,7 +28,7 @@ class SlowOpeningMockIndexInputWrapper extends
> >MockIndexInputWrapper {
> >
> > public SlowOpeningMockIndexInputWrapper(MockDirectoryWrapper dir,
> > String name, IndexInput delegate) throws IOException {
> >- super(dir, name, delegate);
> >+ super(dir, name, delegate, null);
> > try {
> > Thread.sleep(50);
> > } catch (InterruptedException ie) {
> >
> >http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/
> 04086fbf/lucene/test-framework/src/test/org/apache/lucene/store/
> TestMockDirectoryWrapper.java
> >----------------------------------------------------------------------
> >diff --git
> >a/lucene/test-framework/src/test/org/apache/lucene/store/
> TestMockDirectoryWrapper.java
> >b/lucene/test-framework/src/test/org/apache/lucene/store/
> TestMockDirectoryWrapper.java
> >index ae453e5..145b40b 100644
> >---
> >a/lucene/test-framework/src/test/org/apache/lucene/store/
> TestMockDirectoryWrapper.java
> >+++
> >b/lucene/test-framework/src/test/org/apache/lucene/store/
> TestMockDirectoryWrapper.java
> >@@ -171,4 +171,40 @@ public class TestMockDirectoryWrapper extends
> >BaseDirectoryTestCase {
> >
> >assertTrue("MockDirectoryWrapper on dir=" + dir + " failed to corrupt
> >an unsync'd file", changed);
> > }
> >+
> >+ public void testAbuseClosedIndexInput() throws Exception {
> >+ MockDirectoryWrapper dir = newMockDirectory();
> >+ IndexOutput out = dir.createOutput("foo", IOContext.DEFAULT);
> >+ out.writeByte((byte) 42);
> >+ out.close();
> >+ final IndexInput in = dir.openInput("foo", IOContext.DEFAULT);
> >+ in.close();
> >+ expectThrows(RuntimeException.class, () -> {in.readByte();});
> >+ dir.close();
> >+ }
> >+
> >+ public void testAbuseCloneAfterParentClosed() throws Exception {
> >+ MockDirectoryWrapper dir = newMockDirectory();
> >+ IndexOutput out = dir.createOutput("foo", IOContext.DEFAULT);
> >+ out.writeByte((byte) 42);
> >+ out.close();
> >+ IndexInput in = dir.openInput("foo", IOContext.DEFAULT);
> >+ final IndexInput clone = in.clone();
> >+ in.close();
> >+ expectThrows(RuntimeException.class, () -> {clone.readByte();});
> >+ dir.close();
> >+ }
> >+
> >+ public void testAbuseCloneOfCloneAfterParentClosed() throws
> >Exception {
> >+ MockDirectoryWrapper dir = newMockDirectory();
> >+ IndexOutput out = dir.createOutput("foo", IOContext.DEFAULT);
> >+ out.writeByte((byte) 42);
> >+ out.close();
> >+ IndexInput in = dir.openInput("foo", IOContext.DEFAULT);
> >+ IndexInput clone1 = in.clone();
> >+ IndexInput clone2 = clone1.clone();
> >+ in.close();
> >+ expectThrows(RuntimeException.class, () -> {clone2.readByte();});
> >+ dir.close();
> >+ }
> > }
>
> --
> Uwe Schindler
> H.-H.-Meier-Allee 63, 28213 Bremen
> http://www.thetaphi.de
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@lucene.apache.org
> For additional commands, e-mail: dev-help@lucene.apache.org
>
>