//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes: //ORIGINAL LINE: @Test(timeout = 5_000) public void shouldAcceptNewJobWhenRunningJobFinishes() throws Throwable //JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in C#: public virtual void ShouldAcceptNewJobWhenRunningJobFinishes() { // Given when(_config.jobLimit()).thenReturn(1); JobScheduler jobScheduler = createInitialisedScheduler(); //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final IndexSamplingJobTracker jobTracker = new IndexSamplingJobTracker(config, jobScheduler); IndexSamplingJobTracker jobTracker = new IndexSamplingJobTracker(_config, jobScheduler); //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final org.neo4j.test.DoubleLatch latch = new org.neo4j.test.DoubleLatch(); DoubleLatch latch = new DoubleLatch(); //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final java.util.concurrent.atomic.AtomicBoolean lastJobExecuted = new java.util.concurrent.atomic.AtomicBoolean(); AtomicBoolean lastJobExecuted = new AtomicBoolean(); jobTracker.ScheduleSamplingJob(new IndexSamplingJobAnonymousInnerClass3(this, latch)); // When Executors.newSingleThreadExecutor().execute(() => { jobTracker.WaitUntilCanExecuteMoreSamplingJobs(); jobTracker.ScheduleSamplingJob(new IndexSamplingJobAnonymousInnerClass4(this, latch, lastJobExecuted)); }); assertFalse(jobTracker.CanExecuteMoreSamplingJobs()); latch.StartAndWaitForAllToStart(); latch.WaitForAllToFinish(); // Then assertTrue(lastJobExecuted.get()); }
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes: //ORIGINAL LINE: @Test public void shouldNotRunASampleJobWhichIsAlreadyRunning() throws Throwable //JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in C#: public virtual void ShouldNotRunASampleJobWhichIsAlreadyRunning() { // given when(_config.jobLimit()).thenReturn(2); JobScheduler jobScheduler = createInitialisedScheduler(); IndexSamplingJobTracker jobTracker = new IndexSamplingJobTracker(_config, jobScheduler); //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final org.neo4j.test.DoubleLatch latch = new org.neo4j.test.DoubleLatch(); DoubleLatch latch = new DoubleLatch(); // when //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final java.util.concurrent.atomic.AtomicInteger count = new java.util.concurrent.atomic.AtomicInteger(0); AtomicInteger count = new AtomicInteger(0); assertTrue(jobTracker.CanExecuteMoreSamplingJobs()); IndexSamplingJob job = new IndexSamplingJobAnonymousInnerClass(this, latch, count); jobTracker.ScheduleSamplingJob(job); jobTracker.ScheduleSamplingJob(job); latch.StartAndWaitForAllToStart(); latch.WaitForAllToFinish(); assertEquals(1, count.get()); }
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes: //ORIGINAL LINE: @Test public void shouldNotStartOtherSamplingWhenSamplingAllTheIndexes() public virtual void ShouldNotStartOtherSamplingWhenSamplingAllTheIndexes() { // given //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final java.util.concurrent.atomic.AtomicInteger totalCount = new java.util.concurrent.atomic.AtomicInteger(0); AtomicInteger totalCount = new AtomicInteger(0); //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final java.util.concurrent.atomic.AtomicInteger concurrentCount = new java.util.concurrent.atomic.AtomicInteger(0); AtomicInteger concurrentCount = new AtomicInteger(0); //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final org.neo4j.test.DoubleLatch jobLatch = new org.neo4j.test.DoubleLatch(); DoubleLatch jobLatch = new DoubleLatch(); //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final org.neo4j.test.DoubleLatch testLatch = new org.neo4j.test.DoubleLatch(); DoubleLatch testLatch = new DoubleLatch(); IndexSamplingJobFactory jobFactory = (_indexId, proxy) => { if (!concurrentCount.compareAndSet(0, 1)) { throw new System.InvalidOperationException("count !== 0 on create"); } totalCount.incrementAndGet(); jobLatch.WaitForAllToStart(); testLatch.StartAndWaitForAllToStart(); jobLatch.WaitForAllToFinish(); concurrentCount.decrementAndGet(); testLatch.Finish(); return(null); }; //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final IndexSamplingController controller = new IndexSamplingController(samplingConfig, jobFactory, jobQueue, tracker, snapshotProvider, scheduler, always(true)); IndexSamplingController controller = new IndexSamplingController(_samplingConfig, jobFactory, _jobQueue, _tracker, _snapshotProvider, _scheduler, Always(true)); when(_tracker.canExecuteMoreSamplingJobs()).thenReturn(true); when(_indexProxy.State).thenReturn(ONLINE); // when running once (new Thread(RunController(controller, TRIGGER_REBUILD_UPDATED))).Start(); jobLatch.StartAndWaitForAllToStart(); testLatch.WaitForAllToStart(); // then blocking on first job assertEquals(1, concurrentCount.get()); // when running a second time controller.SampleIndexes(BACKGROUND_REBUILD_UPDATED); // then no concurrent job execution jobLatch.Finish(); testLatch.WaitForAllToFinish(); // and finally exactly one job has run to completion assertEquals(0, concurrentCount.get()); assertEquals(1, totalCount.get()); }
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes: //ORIGINAL LINE: @Test public void shouldNotAcceptMoreJobsThanAllowed() throws Throwable //JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in C#: public virtual void ShouldNotAcceptMoreJobsThanAllowed() { // given when(_config.jobLimit()).thenReturn(1); JobScheduler jobScheduler = createInitialisedScheduler(); //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final IndexSamplingJobTracker jobTracker = new IndexSamplingJobTracker(config, jobScheduler); IndexSamplingJobTracker jobTracker = new IndexSamplingJobTracker(_config, jobScheduler); //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final org.neo4j.test.DoubleLatch latch = new org.neo4j.test.DoubleLatch(); DoubleLatch latch = new DoubleLatch(); //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final org.neo4j.test.DoubleLatch waitingLatch = new org.neo4j.test.DoubleLatch(); DoubleLatch waitingLatch = new DoubleLatch(); // when assertTrue(jobTracker.CanExecuteMoreSamplingJobs()); jobTracker.ScheduleSamplingJob(new IndexSamplingJobAnonymousInnerClass2(this, latch)); // then latch.WaitForAllToStart(); assertFalse(jobTracker.CanExecuteMoreSamplingJobs()); //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final java.util.concurrent.atomic.AtomicBoolean waiting = new java.util.concurrent.atomic.AtomicBoolean(false); AtomicBoolean waiting = new AtomicBoolean(false); (new Thread(() => { waiting.set(true); waitingLatch.StartAndWaitForAllToStart(); jobTracker.WaitUntilCanExecuteMoreSamplingJobs(); waiting.set(false); waitingLatch.Finish(); })).Start(); waitingLatch.WaitForAllToStart(); assertTrue(waiting.get()); latch.Finish(); waitingLatch.WaitForAllToFinish(); assertFalse(waiting.get()); // eventually we accept new jobs while (!jobTracker.CanExecuteMoreSamplingJobs()) { Thread.yield(); } }
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes: //ORIGINAL LINE: @Test(timeout = 10_000) public void shouldBlockUniqueIndexSeekFromCompetingTransaction() throws Exception //JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in C#: public virtual void ShouldBlockUniqueIndexSeekFromCompetingTransaction() { // This is the interleaving that we are trying to verify works correctly: // ---------------------------------------------------------------------- // Thread1 (main) : Thread2 // create unique node : // lookup(node) : // open start latch -----> // | : lookup(node) // wait for T2 to block : | // : *block* // commit ---------------> *unblock* // wait for T2 end latch : | // : finish transaction // : open end latch // *unblock* <-------------‘ // assert that we complete before timeout //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final org.neo4j.test.DoubleLatch latch = new org.neo4j.test.DoubleLatch(); DoubleLatch latch = new DoubleLatch(); //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final org.neo4j.internal.kernel.api.IndexReference index = createUniquenessConstraint(labelId, propertyId1); IndexReference index = CreateUniquenessConstraint(_labelId, _propertyId1); //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final org.neo4j.values.storable.Value value = org.neo4j.values.storable.Values.of("value"); Value value = Values.of("value"); Write write = DataWriteInNewTransaction(); long nodeId = write.NodeCreate(); write.NodeAddLabel(nodeId, _labelId); // This adds the node to the unique index and should take an index write lock write.NodeSetProperty(nodeId, _propertyId1, value); ThreadStart runnableForThread2 = () => { latch.WaitForAllToStart(); try { using (Transaction tx = Kernel.beginTransaction(Transaction.Type.@implicit, LoginContext.AUTH_DISABLED)) { tx.dataRead().lockingNodeUniqueIndexSeek(index, exact(_propertyId1, value)); tx.success(); } } catch (KernelException e) { throw new Exception(e); } finally { latch.Finish(); } }; Thread thread2 = new Thread(runnableForThread2, "Transaction Thread 2"); thread2.Start(); latch.StartAndWaitForAllToStart(); while ((thread2.State != Thread.State.TIMED_WAITING) && (thread2.State != Thread.State.WAITING)) { Thread.yield(); } Commit(); latch.WaitForAllToFinish(); }