You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@lucene.apache.org by Dawid Weiss <da...@gmail.com> on 2012/06/10 19:12:14 UTC
Re: svn commit: r1348623 - in /lucene/dev/branches/branch_4x: ./
dev-tools/ lucene/ lucene/analysis/ lucene/analysis/common/
lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/std31/ lucene/analysis/common/src/java/org/apache/lucene/
Synchonizer -> Synchronizer?
D.
On Sun, Jun 10, 2012 at 6:42 PM, <si...@apache.org> wrote:
> Author: simonw
> Date: Sun Jun 10 16:42:55 2012
> New Revision: 1348623
>
> URL: http://svn.apache.org/viewvc?rev=1348623&view=rev
> Log:
> LUCENE-4116: fix concurrency test for DWPTStallControl
>
> Modified:
> lucene/dev/branches/branch_4x/ (props changed)
> lucene/dev/branches/branch_4x/dev-tools/ (props changed)
> lucene/dev/branches/branch_4x/lucene/ (props changed)
> lucene/dev/branches/branch_4x/lucene/BUILD.txt (props changed)
> lucene/dev/branches/branch_4x/lucene/CHANGES.txt (props changed)
> lucene/dev/branches/branch_4x/lucene/JRE_VERSION_MIGRATION.txt (props changed)
> lucene/dev/branches/branch_4x/lucene/LICENSE.txt (props changed)
> lucene/dev/branches/branch_4x/lucene/MIGRATE.txt (props changed)
> lucene/dev/branches/branch_4x/lucene/NOTICE.txt (props changed)
> lucene/dev/branches/branch_4x/lucene/README.txt (props changed)
> lucene/dev/branches/branch_4x/lucene/analysis/ (props changed)
> lucene/dev/branches/branch_4x/lucene/analysis/common/ (props changed)
> lucene/dev/branches/branch_4x/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/std31/package.html (props changed)
> lucene/dev/branches/branch_4x/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/std34/package.html (props changed)
> lucene/dev/branches/branch_4x/lucene/backwards/ (props changed)
> lucene/dev/branches/branch_4x/lucene/benchmark/ (props changed)
> lucene/dev/branches/branch_4x/lucene/build.xml (props changed)
> lucene/dev/branches/branch_4x/lucene/common-build.xml (props changed)
> lucene/dev/branches/branch_4x/lucene/core/ (props changed)
> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterStallControl.java
> lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterStallControl.java
> lucene/dev/branches/branch_4x/lucene/demo/ (props changed)
> lucene/dev/branches/branch_4x/lucene/facet/ (props changed)
> lucene/dev/branches/branch_4x/lucene/grouping/ (props changed)
> lucene/dev/branches/branch_4x/lucene/highlighter/ (props changed)
> lucene/dev/branches/branch_4x/lucene/ivy-settings.xml (props changed)
> lucene/dev/branches/branch_4x/lucene/join/ (props changed)
> lucene/dev/branches/branch_4x/lucene/memory/ (props changed)
> lucene/dev/branches/branch_4x/lucene/misc/ (props changed)
> lucene/dev/branches/branch_4x/lucene/module-build.xml (props changed)
> lucene/dev/branches/branch_4x/lucene/queries/ (props changed)
> lucene/dev/branches/branch_4x/lucene/queryparser/ (props changed)
> lucene/dev/branches/branch_4x/lucene/sandbox/ (props changed)
> lucene/dev/branches/branch_4x/lucene/site/ (props changed)
> lucene/dev/branches/branch_4x/lucene/spatial/ (props changed)
> lucene/dev/branches/branch_4x/lucene/suggest/ (props changed)
> lucene/dev/branches/branch_4x/lucene/test-framework/ (props changed)
> lucene/dev/branches/branch_4x/lucene/tools/ (props changed)
> lucene/dev/branches/branch_4x/solr/ (props changed)
> lucene/dev/branches/branch_4x/solr/CHANGES.txt (props changed)
> lucene/dev/branches/branch_4x/solr/LICENSE.txt (props changed)
> lucene/dev/branches/branch_4x/solr/NOTICE.txt (props changed)
> lucene/dev/branches/branch_4x/solr/README.txt (props changed)
> lucene/dev/branches/branch_4x/solr/build.xml (props changed)
> lucene/dev/branches/branch_4x/solr/cloud-dev/ (props changed)
> lucene/dev/branches/branch_4x/solr/common-build.xml (props changed)
> lucene/dev/branches/branch_4x/solr/contrib/ (props changed)
> lucene/dev/branches/branch_4x/solr/core/ (props changed)
> lucene/dev/branches/branch_4x/solr/dev-tools/ (props changed)
> lucene/dev/branches/branch_4x/solr/example/ (props changed)
> lucene/dev/branches/branch_4x/solr/lib/ (props changed)
> lucene/dev/branches/branch_4x/solr/lib/httpclient-LICENSE-ASL.txt (props changed)
> lucene/dev/branches/branch_4x/solr/lib/httpclient-NOTICE.txt (props changed)
> lucene/dev/branches/branch_4x/solr/lib/httpcore-LICENSE-ASL.txt (props changed)
> lucene/dev/branches/branch_4x/solr/lib/httpcore-NOTICE.txt (props changed)
> lucene/dev/branches/branch_4x/solr/lib/httpmime-LICENSE-ASL.txt (props changed)
> lucene/dev/branches/branch_4x/solr/lib/httpmime-NOTICE.txt (props changed)
> lucene/dev/branches/branch_4x/solr/scripts/ (props changed)
> lucene/dev/branches/branch_4x/solr/solrj/ (props changed)
> lucene/dev/branches/branch_4x/solr/test-framework/ (props changed)
> lucene/dev/branches/branch_4x/solr/testlogging.properties (props changed)
> lucene/dev/branches/branch_4x/solr/webapp/ (props changed)
>
> Modified: lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterStallControl.java
> URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterStallControl.java?rev=1348623&r1=1348622&r2=1348623&view=diff
> ==============================================================================
> --- lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterStallControl.java (original)
> +++ lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterStallControl.java Sun Jun 10 16:42:55 2012
> @@ -39,7 +39,6 @@ import org.apache.lucene.util.ThreadInte
> final class DocumentsWriterStallControl {
> @SuppressWarnings("serial")
> private static final class Sync extends AbstractQueuedSynchronizer {
> - volatile boolean hasBlockedThreads = false; // only with assert
>
> Sync() {
> setState(0);
> @@ -67,15 +66,10 @@ final class DocumentsWriterStallControl
>
> @Override
> public int tryAcquireShared(int acquires) {
> - assert maybeSetHasBlocked(getState());
> return getState() == 0 ? 1 : -1;
> }
>
> - // only used for testing
> - private boolean maybeSetHasBlocked(int state) {
> - hasBlockedThreads |= getState() != 0;
> - return true;
> - }
> +
>
> @Override
> public boolean tryReleaseShared(int newState) {
> @@ -130,7 +124,7 @@ final class DocumentsWriterStallControl
> }
>
> boolean hasBlocked() { // for tests
> - return sync.hasBlockedThreads;
> + return sync.hasQueuedThreads();
> }
>
> static interface MemoryController {
> @@ -138,4 +132,12 @@ final class DocumentsWriterStallControl
> long flushBytes();
> long stallLimitBytes();
> }
> +
> + public boolean isHealthy() {
> + return sync.isHealthy();
> + }
> +
> + public boolean isThreadQueued(Thread t) {
> + return sync.isQueued(t);
> + }
> }
>
> Modified: lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterStallControl.java
> URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterStallControl.java?rev=1348623&r1=1348622&r2=1348623&view=diff
> ==============================================================================
> --- lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterStallControl.java (original)
> +++ lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterStallControl.java Sun Jun 10 16:42:55 2012
> @@ -127,22 +127,19 @@ public class TestDocumentsWriterStallCon
> int numStallers = atLeast(1);
> int numReleasers = atLeast(1);
> int numWaiters = atLeast(1);
> -
> - final CountDownLatch[] latches = new CountDownLatch[] {
> - new CountDownLatch(numStallers + numReleasers), new CountDownLatch(1),
> - new CountDownLatch(numWaiters)};
> + final Synchonizer sync = new Synchonizer(numStallers + numReleasers, numStallers + numReleasers+numWaiters);
> Thread[] threads = new Thread[numReleasers + numStallers + numWaiters];
> List<Throwable> exceptions = Collections.synchronizedList(new ArrayList<Throwable>());
> for (int i = 0; i < numReleasers; i++) {
> - threads[i] = new Updater(stop, checkPoint, ctrl, latches, true, exceptions);
> + threads[i] = new Updater(stop, checkPoint, ctrl, sync, true, exceptions);
> }
> for (int i = numReleasers; i < numReleasers + numStallers; i++) {
> - threads[i] = new Updater(stop, checkPoint, ctrl, latches, false, exceptions);
> + threads[i] = new Updater(stop, checkPoint, ctrl, sync, false, exceptions);
>
> }
> for (int i = numReleasers + numStallers; i < numReleasers + numStallers
> + numWaiters; i++) {
> - threads[i] = new Waiter(stop, checkPoint, ctrl, latches, exceptions);
> + threads[i] = new Waiter(stop, checkPoint, ctrl, sync, exceptions);
>
> }
>
> @@ -151,7 +148,7 @@ public class TestDocumentsWriterStallCon
> for (int i = 0; i < iters; i++) {
> if (checkPoint.get()) {
>
> - assertTrue("timed out waiting for update threads - deadlock?", latches[0].await(10, TimeUnit.SECONDS));
> + assertTrue("timed out waiting for update threads - deadlock?", sync.updateJoin.await(10, TimeUnit.SECONDS));
> if (!exceptions.isEmpty()) {
> for (Throwable throwable : exceptions) {
> throwable.printStackTrace();
> @@ -159,27 +156,38 @@ public class TestDocumentsWriterStallCon
> fail("got exceptions in threads");
> }
>
> - if (!ctrl.anyStalledThreads()) {
> - assertTrue(
> - "control claims no stalled threads but waiter seems to be blocked",
> - latches[2].await(10, TimeUnit.SECONDS));
> - }
> - checkPoint.set(false);
> + if (ctrl.hasBlocked() && ctrl.isHealthy()) {
> + assertState(numReleasers, numStallers, numWaiters, threads, ctrl);
> +
> +
> + }
>
> - latches[1].countDown();
> + checkPoint.set(false);
> + sync.waiter.countDown();
> + sync.leftCheckpoint.await();
> }
> assertFalse(checkPoint.get());
> + assertEquals(0, sync.waiter.getCount());
> if (random().nextInt(2) == 0) {
> - latches[0] = new CountDownLatch(numStallers + numReleasers);
> - latches[1] = new CountDownLatch(1);
> - latches[2] = new CountDownLatch(numWaiters);
> + sync.reset(numStallers + numReleasers, numStallers + numReleasers
> + + numWaiters);
> checkPoint.set(true);
> }
>
> }
> + if (!checkPoint.get()) {
> + sync.reset(numStallers + numReleasers, numStallers + numReleasers
> + + numWaiters);
> + checkPoint.set(true);
> + }
>
> + assertTrue(sync.updateJoin.await(10, TimeUnit.SECONDS));
> + assertState(numReleasers, numStallers, numWaiters, threads, ctrl);
> + checkPoint.set(false);
> stop.set(true);
> - latches[1].countDown();
> + sync.waiter.countDown();
> + sync.leftCheckpoint.await();
> +
>
> for (int i = 0; i < threads.length; i++) {
> memCtrl.limit = 1000;
> @@ -196,20 +204,45 @@ public class TestDocumentsWriterStallCon
> }
> }
>
> + private void assertState(int numReleasers, int numStallers, int numWaiters, Thread[] threads, DocumentsWriterStallControl ctrl) throws InterruptedException {
> + int millisToSleep = 100;
> + while (true) {
> + if (ctrl.hasBlocked() && ctrl.isHealthy()) {
> + for (int n = numReleasers + numStallers; n < numReleasers
> + + numStallers + numWaiters; n++) {
> + if (ctrl.isThreadQueued(threads[n])) {
> + if (millisToSleep < 60000) {
> + Thread.sleep(millisToSleep);
> + millisToSleep *=2;
> + break;
> + } else {
> + fail("control claims no stalled threads but waiter seems to be blocked ");
> + }
> + }
> + }
> + break;
> + } else {
> + break;
> + }
> + }
> +
> + }
> +
> public static class Waiter extends Thread {
> - private CountDownLatch[] latches;
> + private Synchonizer sync;
> private DocumentsWriterStallControl ctrl;
> private AtomicBoolean checkPoint;
> private AtomicBoolean stop;
> private List<Throwable> exceptions;
>
> public Waiter(AtomicBoolean stop, AtomicBoolean checkPoint,
> - DocumentsWriterStallControl ctrl, CountDownLatch[] latches,
> + DocumentsWriterStallControl ctrl, Synchonizer sync,
> List<Throwable> exceptions) {
> + super("waiter");
> this.stop = stop;
> this.checkPoint = checkPoint;
> this.ctrl = ctrl;
> - this.latches = latches;
> + this.sync = sync;
> this.exceptions = exceptions;
> }
>
> @@ -218,13 +251,10 @@ public class TestDocumentsWriterStallCon
> while (!stop.get()) {
> ctrl.waitIfStalled();
> if (checkPoint.get()) {
> - CountDownLatch join = latches[2];
> - CountDownLatch wait = latches[1];
> - join.countDown();
> try {
> - assertTrue(wait.await(10, TimeUnit.SECONDS));
> + assertTrue(sync.await());
> } catch (InterruptedException e) {
> - System.out.println("[Waiter] got interrupted - wait count: " + wait.getCount());
> + System.out.println("[Waiter] got interrupted - wait count: " + sync.waiter.getCount());
> throw new ThreadInterruptedException(e);
> }
> }
> @@ -238,7 +268,7 @@ public class TestDocumentsWriterStallCon
>
> public static class Updater extends Thread {
>
> - private CountDownLatch[] latches;
> + private Synchonizer sync;
> private DocumentsWriterStallControl ctrl;
> private AtomicBoolean checkPoint;
> private AtomicBoolean stop;
> @@ -246,12 +276,13 @@ public class TestDocumentsWriterStallCon
> private List<Throwable> exceptions;
>
> public Updater(AtomicBoolean stop, AtomicBoolean checkPoint,
> - DocumentsWriterStallControl ctrl, CountDownLatch[] latches,
> + DocumentsWriterStallControl ctrl, Synchonizer sync,
> boolean release, List<Throwable> exceptions) {
> + super("updater");
> this.stop = stop;
> this.checkPoint = checkPoint;
> this.ctrl = ctrl;
> - this.latches = latches;
> + this.sync = sync;
> this.release = release;
> this.exceptions = exceptions;
> }
> @@ -268,22 +299,24 @@ public class TestDocumentsWriterStallCon
> ctrl.updateStalled(memCtrl);
> }
> if (checkPoint.get()) {
> - CountDownLatch join = latches[0];
> - CountDownLatch wait = latches[1];
> - join.countDown();
> + sync.updateJoin.countDown();
> try {
> - assertTrue(wait.await(10, TimeUnit.SECONDS));
> + assertTrue(sync.await());
> } catch (InterruptedException e) {
> - System.out.println("[Updater] got interrupted - wait count: " + wait.getCount());
> + System.out.println("[Updater] got interrupted - wait count: " + sync.waiter.getCount());
> throw new ThreadInterruptedException(e);
> }
> + sync.leftCheckpoint.countDown();
> + }
> + if (random().nextBoolean()) {
> + Thread.yield();
> }
> - Thread.yield();
> }
> } catch (Throwable e) {
> e.printStackTrace();
> exceptions.add(e);
> }
> + sync.updateJoin.countDown();
> }
>
> }
> @@ -366,4 +399,25 @@ public class TestDocumentsWriterStallCon
> }
>
> }
> +
> + private static final class Synchonizer {
> + volatile CountDownLatch waiter;
> + volatile CountDownLatch updateJoin;
> + volatile CountDownLatch leftCheckpoint;
> +
> + public Synchonizer(int numUpdater, int numThreads) {
> + reset(numUpdater, numThreads);
> + }
> +
> + public void reset(int numUpdaters, int numThreads) {
> + this.waiter = new CountDownLatch(1);
> + this.updateJoin = new CountDownLatch(numUpdaters);
> + this.leftCheckpoint = new CountDownLatch(numUpdaters);
> + }
> +
> + public boolean await() throws InterruptedException {
> + return waiter.await(10, TimeUnit.SECONDS);
> + }
> +
> + }
> }
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@lucene.apache.org
For additional commands, e-mail: dev-help@lucene.apache.org
Re: svn commit: r1348623 - in /lucene/dev/branches/branch_4x: ./
dev-tools/ lucene/ lucene/analysis/ lucene/analysis/common/
lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/std31/ lucene/analysis/common/src/java/org/apache/lucene/
Posted by Simon Willnauer <si...@googlemail.com>.
fixed thanks dawid!
On Sun, Jun 10, 2012 at 7:12 PM, Dawid Weiss <da...@gmail.com> wrote:
> Synchonizer -> Synchronizer?
>
> D.
>
> On Sun, Jun 10, 2012 at 6:42 PM, <si...@apache.org> wrote:
>> Author: simonw
>> Date: Sun Jun 10 16:42:55 2012
>> New Revision: 1348623
>>
>> URL: http://svn.apache.org/viewvc?rev=1348623&view=rev
>> Log:
>> LUCENE-4116: fix concurrency test for DWPTStallControl
>>
>> Modified:
>> lucene/dev/branches/branch_4x/ (props changed)
>> lucene/dev/branches/branch_4x/dev-tools/ (props changed)
>> lucene/dev/branches/branch_4x/lucene/ (props changed)
>> lucene/dev/branches/branch_4x/lucene/BUILD.txt (props changed)
>> lucene/dev/branches/branch_4x/lucene/CHANGES.txt (props changed)
>> lucene/dev/branches/branch_4x/lucene/JRE_VERSION_MIGRATION.txt (props changed)
>> lucene/dev/branches/branch_4x/lucene/LICENSE.txt (props changed)
>> lucene/dev/branches/branch_4x/lucene/MIGRATE.txt (props changed)
>> lucene/dev/branches/branch_4x/lucene/NOTICE.txt (props changed)
>> lucene/dev/branches/branch_4x/lucene/README.txt (props changed)
>> lucene/dev/branches/branch_4x/lucene/analysis/ (props changed)
>> lucene/dev/branches/branch_4x/lucene/analysis/common/ (props changed)
>> lucene/dev/branches/branch_4x/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/std31/package.html (props changed)
>> lucene/dev/branches/branch_4x/lucene/analysis/common/src/java/org/apache/lucene/analysis/standard/std34/package.html (props changed)
>> lucene/dev/branches/branch_4x/lucene/backwards/ (props changed)
>> lucene/dev/branches/branch_4x/lucene/benchmark/ (props changed)
>> lucene/dev/branches/branch_4x/lucene/build.xml (props changed)
>> lucene/dev/branches/branch_4x/lucene/common-build.xml (props changed)
>> lucene/dev/branches/branch_4x/lucene/core/ (props changed)
>> lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterStallControl.java
>> lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterStallControl.java
>> lucene/dev/branches/branch_4x/lucene/demo/ (props changed)
>> lucene/dev/branches/branch_4x/lucene/facet/ (props changed)
>> lucene/dev/branches/branch_4x/lucene/grouping/ (props changed)
>> lucene/dev/branches/branch_4x/lucene/highlighter/ (props changed)
>> lucene/dev/branches/branch_4x/lucene/ivy-settings.xml (props changed)
>> lucene/dev/branches/branch_4x/lucene/join/ (props changed)
>> lucene/dev/branches/branch_4x/lucene/memory/ (props changed)
>> lucene/dev/branches/branch_4x/lucene/misc/ (props changed)
>> lucene/dev/branches/branch_4x/lucene/module-build.xml (props changed)
>> lucene/dev/branches/branch_4x/lucene/queries/ (props changed)
>> lucene/dev/branches/branch_4x/lucene/queryparser/ (props changed)
>> lucene/dev/branches/branch_4x/lucene/sandbox/ (props changed)
>> lucene/dev/branches/branch_4x/lucene/site/ (props changed)
>> lucene/dev/branches/branch_4x/lucene/spatial/ (props changed)
>> lucene/dev/branches/branch_4x/lucene/suggest/ (props changed)
>> lucene/dev/branches/branch_4x/lucene/test-framework/ (props changed)
>> lucene/dev/branches/branch_4x/lucene/tools/ (props changed)
>> lucene/dev/branches/branch_4x/solr/ (props changed)
>> lucene/dev/branches/branch_4x/solr/CHANGES.txt (props changed)
>> lucene/dev/branches/branch_4x/solr/LICENSE.txt (props changed)
>> lucene/dev/branches/branch_4x/solr/NOTICE.txt (props changed)
>> lucene/dev/branches/branch_4x/solr/README.txt (props changed)
>> lucene/dev/branches/branch_4x/solr/build.xml (props changed)
>> lucene/dev/branches/branch_4x/solr/cloud-dev/ (props changed)
>> lucene/dev/branches/branch_4x/solr/common-build.xml (props changed)
>> lucene/dev/branches/branch_4x/solr/contrib/ (props changed)
>> lucene/dev/branches/branch_4x/solr/core/ (props changed)
>> lucene/dev/branches/branch_4x/solr/dev-tools/ (props changed)
>> lucene/dev/branches/branch_4x/solr/example/ (props changed)
>> lucene/dev/branches/branch_4x/solr/lib/ (props changed)
>> lucene/dev/branches/branch_4x/solr/lib/httpclient-LICENSE-ASL.txt (props changed)
>> lucene/dev/branches/branch_4x/solr/lib/httpclient-NOTICE.txt (props changed)
>> lucene/dev/branches/branch_4x/solr/lib/httpcore-LICENSE-ASL.txt (props changed)
>> lucene/dev/branches/branch_4x/solr/lib/httpcore-NOTICE.txt (props changed)
>> lucene/dev/branches/branch_4x/solr/lib/httpmime-LICENSE-ASL.txt (props changed)
>> lucene/dev/branches/branch_4x/solr/lib/httpmime-NOTICE.txt (props changed)
>> lucene/dev/branches/branch_4x/solr/scripts/ (props changed)
>> lucene/dev/branches/branch_4x/solr/solrj/ (props changed)
>> lucene/dev/branches/branch_4x/solr/test-framework/ (props changed)
>> lucene/dev/branches/branch_4x/solr/testlogging.properties (props changed)
>> lucene/dev/branches/branch_4x/solr/webapp/ (props changed)
>>
>> Modified: lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterStallControl.java
>> URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterStallControl.java?rev=1348623&r1=1348622&r2=1348623&view=diff
>> ==============================================================================
>> --- lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterStallControl.java (original)
>> +++ lucene/dev/branches/branch_4x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterStallControl.java Sun Jun 10 16:42:55 2012
>> @@ -39,7 +39,6 @@ import org.apache.lucene.util.ThreadInte
>> final class DocumentsWriterStallControl {
>> @SuppressWarnings("serial")
>> private static final class Sync extends AbstractQueuedSynchronizer {
>> - volatile boolean hasBlockedThreads = false; // only with assert
>>
>> Sync() {
>> setState(0);
>> @@ -67,15 +66,10 @@ final class DocumentsWriterStallControl
>>
>> @Override
>> public int tryAcquireShared(int acquires) {
>> - assert maybeSetHasBlocked(getState());
>> return getState() == 0 ? 1 : -1;
>> }
>>
>> - // only used for testing
>> - private boolean maybeSetHasBlocked(int state) {
>> - hasBlockedThreads |= getState() != 0;
>> - return true;
>> - }
>> +
>>
>> @Override
>> public boolean tryReleaseShared(int newState) {
>> @@ -130,7 +124,7 @@ final class DocumentsWriterStallControl
>> }
>>
>> boolean hasBlocked() { // for tests
>> - return sync.hasBlockedThreads;
>> + return sync.hasQueuedThreads();
>> }
>>
>> static interface MemoryController {
>> @@ -138,4 +132,12 @@ final class DocumentsWriterStallControl
>> long flushBytes();
>> long stallLimitBytes();
>> }
>> +
>> + public boolean isHealthy() {
>> + return sync.isHealthy();
>> + }
>> +
>> + public boolean isThreadQueued(Thread t) {
>> + return sync.isQueued(t);
>> + }
>> }
>>
>> Modified: lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterStallControl.java
>> URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterStallControl.java?rev=1348623&r1=1348622&r2=1348623&view=diff
>> ==============================================================================
>> --- lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterStallControl.java (original)
>> +++ lucene/dev/branches/branch_4x/lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterStallControl.java Sun Jun 10 16:42:55 2012
>> @@ -127,22 +127,19 @@ public class TestDocumentsWriterStallCon
>> int numStallers = atLeast(1);
>> int numReleasers = atLeast(1);
>> int numWaiters = atLeast(1);
>> -
>> - final CountDownLatch[] latches = new CountDownLatch[] {
>> - new CountDownLatch(numStallers + numReleasers), new CountDownLatch(1),
>> - new CountDownLatch(numWaiters)};
>> + final Synchonizer sync = new Synchonizer(numStallers + numReleasers, numStallers + numReleasers+numWaiters);
>> Thread[] threads = new Thread[numReleasers + numStallers + numWaiters];
>> List<Throwable> exceptions = Collections.synchronizedList(new ArrayList<Throwable>());
>> for (int i = 0; i < numReleasers; i++) {
>> - threads[i] = new Updater(stop, checkPoint, ctrl, latches, true, exceptions);
>> + threads[i] = new Updater(stop, checkPoint, ctrl, sync, true, exceptions);
>> }
>> for (int i = numReleasers; i < numReleasers + numStallers; i++) {
>> - threads[i] = new Updater(stop, checkPoint, ctrl, latches, false, exceptions);
>> + threads[i] = new Updater(stop, checkPoint, ctrl, sync, false, exceptions);
>>
>> }
>> for (int i = numReleasers + numStallers; i < numReleasers + numStallers
>> + numWaiters; i++) {
>> - threads[i] = new Waiter(stop, checkPoint, ctrl, latches, exceptions);
>> + threads[i] = new Waiter(stop, checkPoint, ctrl, sync, exceptions);
>>
>> }
>>
>> @@ -151,7 +148,7 @@ public class TestDocumentsWriterStallCon
>> for (int i = 0; i < iters; i++) {
>> if (checkPoint.get()) {
>>
>> - assertTrue("timed out waiting for update threads - deadlock?", latches[0].await(10, TimeUnit.SECONDS));
>> + assertTrue("timed out waiting for update threads - deadlock?", sync.updateJoin.await(10, TimeUnit.SECONDS));
>> if (!exceptions.isEmpty()) {
>> for (Throwable throwable : exceptions) {
>> throwable.printStackTrace();
>> @@ -159,27 +156,38 @@ public class TestDocumentsWriterStallCon
>> fail("got exceptions in threads");
>> }
>>
>> - if (!ctrl.anyStalledThreads()) {
>> - assertTrue(
>> - "control claims no stalled threads but waiter seems to be blocked",
>> - latches[2].await(10, TimeUnit.SECONDS));
>> - }
>> - checkPoint.set(false);
>> + if (ctrl.hasBlocked() && ctrl.isHealthy()) {
>> + assertState(numReleasers, numStallers, numWaiters, threads, ctrl);
>> +
>> +
>> + }
>>
>> - latches[1].countDown();
>> + checkPoint.set(false);
>> + sync.waiter.countDown();
>> + sync.leftCheckpoint.await();
>> }
>> assertFalse(checkPoint.get());
>> + assertEquals(0, sync.waiter.getCount());
>> if (random().nextInt(2) == 0) {
>> - latches[0] = new CountDownLatch(numStallers + numReleasers);
>> - latches[1] = new CountDownLatch(1);
>> - latches[2] = new CountDownLatch(numWaiters);
>> + sync.reset(numStallers + numReleasers, numStallers + numReleasers
>> + + numWaiters);
>> checkPoint.set(true);
>> }
>>
>> }
>> + if (!checkPoint.get()) {
>> + sync.reset(numStallers + numReleasers, numStallers + numReleasers
>> + + numWaiters);
>> + checkPoint.set(true);
>> + }
>>
>> + assertTrue(sync.updateJoin.await(10, TimeUnit.SECONDS));
>> + assertState(numReleasers, numStallers, numWaiters, threads, ctrl);
>> + checkPoint.set(false);
>> stop.set(true);
>> - latches[1].countDown();
>> + sync.waiter.countDown();
>> + sync.leftCheckpoint.await();
>> +
>>
>> for (int i = 0; i < threads.length; i++) {
>> memCtrl.limit = 1000;
>> @@ -196,20 +204,45 @@ public class TestDocumentsWriterStallCon
>> }
>> }
>>
>> + private void assertState(int numReleasers, int numStallers, int numWaiters, Thread[] threads, DocumentsWriterStallControl ctrl) throws InterruptedException {
>> + int millisToSleep = 100;
>> + while (true) {
>> + if (ctrl.hasBlocked() && ctrl.isHealthy()) {
>> + for (int n = numReleasers + numStallers; n < numReleasers
>> + + numStallers + numWaiters; n++) {
>> + if (ctrl.isThreadQueued(threads[n])) {
>> + if (millisToSleep < 60000) {
>> + Thread.sleep(millisToSleep);
>> + millisToSleep *=2;
>> + break;
>> + } else {
>> + fail("control claims no stalled threads but waiter seems to be blocked ");
>> + }
>> + }
>> + }
>> + break;
>> + } else {
>> + break;
>> + }
>> + }
>> +
>> + }
>> +
>> public static class Waiter extends Thread {
>> - private CountDownLatch[] latches;
>> + private Synchonizer sync;
>> private DocumentsWriterStallControl ctrl;
>> private AtomicBoolean checkPoint;
>> private AtomicBoolean stop;
>> private List<Throwable> exceptions;
>>
>> public Waiter(AtomicBoolean stop, AtomicBoolean checkPoint,
>> - DocumentsWriterStallControl ctrl, CountDownLatch[] latches,
>> + DocumentsWriterStallControl ctrl, Synchonizer sync,
>> List<Throwable> exceptions) {
>> + super("waiter");
>> this.stop = stop;
>> this.checkPoint = checkPoint;
>> this.ctrl = ctrl;
>> - this.latches = latches;
>> + this.sync = sync;
>> this.exceptions = exceptions;
>> }
>>
>> @@ -218,13 +251,10 @@ public class TestDocumentsWriterStallCon
>> while (!stop.get()) {
>> ctrl.waitIfStalled();
>> if (checkPoint.get()) {
>> - CountDownLatch join = latches[2];
>> - CountDownLatch wait = latches[1];
>> - join.countDown();
>> try {
>> - assertTrue(wait.await(10, TimeUnit.SECONDS));
>> + assertTrue(sync.await());
>> } catch (InterruptedException e) {
>> - System.out.println("[Waiter] got interrupted - wait count: " + wait.getCount());
>> + System.out.println("[Waiter] got interrupted - wait count: " + sync.waiter.getCount());
>> throw new ThreadInterruptedException(e);
>> }
>> }
>> @@ -238,7 +268,7 @@ public class TestDocumentsWriterStallCon
>>
>> public static class Updater extends Thread {
>>
>> - private CountDownLatch[] latches;
>> + private Synchonizer sync;
>> private DocumentsWriterStallControl ctrl;
>> private AtomicBoolean checkPoint;
>> private AtomicBoolean stop;
>> @@ -246,12 +276,13 @@ public class TestDocumentsWriterStallCon
>> private List<Throwable> exceptions;
>>
>> public Updater(AtomicBoolean stop, AtomicBoolean checkPoint,
>> - DocumentsWriterStallControl ctrl, CountDownLatch[] latches,
>> + DocumentsWriterStallControl ctrl, Synchonizer sync,
>> boolean release, List<Throwable> exceptions) {
>> + super("updater");
>> this.stop = stop;
>> this.checkPoint = checkPoint;
>> this.ctrl = ctrl;
>> - this.latches = latches;
>> + this.sync = sync;
>> this.release = release;
>> this.exceptions = exceptions;
>> }
>> @@ -268,22 +299,24 @@ public class TestDocumentsWriterStallCon
>> ctrl.updateStalled(memCtrl);
>> }
>> if (checkPoint.get()) {
>> - CountDownLatch join = latches[0];
>> - CountDownLatch wait = latches[1];
>> - join.countDown();
>> + sync.updateJoin.countDown();
>> try {
>> - assertTrue(wait.await(10, TimeUnit.SECONDS));
>> + assertTrue(sync.await());
>> } catch (InterruptedException e) {
>> - System.out.println("[Updater] got interrupted - wait count: " + wait.getCount());
>> + System.out.println("[Updater] got interrupted - wait count: " + sync.waiter.getCount());
>> throw new ThreadInterruptedException(e);
>> }
>> + sync.leftCheckpoint.countDown();
>> + }
>> + if (random().nextBoolean()) {
>> + Thread.yield();
>> }
>> - Thread.yield();
>> }
>> } catch (Throwable e) {
>> e.printStackTrace();
>> exceptions.add(e);
>> }
>> + sync.updateJoin.countDown();
>> }
>>
>> }
>> @@ -366,4 +399,25 @@ public class TestDocumentsWriterStallCon
>> }
>>
>> }
>> +
>> + private static final class Synchonizer {
>> + volatile CountDownLatch waiter;
>> + volatile CountDownLatch updateJoin;
>> + volatile CountDownLatch leftCheckpoint;
>> +
>> + public Synchonizer(int numUpdater, int numThreads) {
>> + reset(numUpdater, numThreads);
>> + }
>> +
>> + public void reset(int numUpdaters, int numThreads) {
>> + this.waiter = new CountDownLatch(1);
>> + this.updateJoin = new CountDownLatch(numUpdaters);
>> + this.leftCheckpoint = new CountDownLatch(numUpdaters);
>> + }
>> +
>> + public boolean await() throws InterruptedException {
>> + return waiter.await(10, TimeUnit.SECONDS);
>> + }
>> +
>> + }
>> }
>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@lucene.apache.org
> For additional commands, e-mail: dev-help@lucene.apache.org
>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@lucene.apache.org
For additional commands, e-mail: dev-help@lucene.apache.org