示例#1
0
//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());
        }
示例#2
0
//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());
        }
示例#4
0
//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();
            }
        }
示例#5
0
//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();
        }