lucene-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Simon Willnauer <simon.willna...@googlemail.com>
Subject 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/
Date Mon, 11 Jun 2012 07:06:23 GMT
fixed thanks dawid!

On Sun, Jun 10, 2012 at 7:12 PM, Dawid Weiss <dawid.weiss@gmail.com> wrote:
> Synchonizer -> Synchronizer?
>
> D.
>
> On Sun, Jun 10, 2012 at 6:42 PM,  <simonw@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


Mime
View raw message