We are looking on how to reproduce as a small test case.
In the mean time below is the stack trace from the debugger of where it hangs: LockSupport.park method.
We have also found that increasing the commit interval greater than the no. of rows it reads prevents the hang.
For Example: One of our test cases has 4 reader rows. Setting commit interval to 5 or above works and 4 or below hangs.
The writer has no effect - if its in the config or removed from the config, there is no change.
If we revert back to 2.1.0, it works.
Code:
Thread [main] (Suspended)
LockSupport.park(Object) line: 158
Semaphore$NonfairSync(AbstractQueuedSynchronizer).parkAndCheckInterrupt() line: 747
Semaphore$NonfairSync(AbstractQueuedSynchronizer).doAcquireSharedInterruptibly(int) line: 905
Semaphore$NonfairSync(AbstractQueuedSynchronizer).acquireSharedInterruptibly(int) line: 1217
Semaphore.acquire() line: 286
TaskletStep$ChunkTransactionCallback.doInTransaction(TransactionStatus) line: 372
TransactionTemplate.execute(TransactionCallback<T>) line: 130
TaskletStep$2.doInChunkContext(RepeatContext, ChunkContext) line: 261
TaskletStep$2(StepContextRepeatCallback).doInIteration(RepeatContext) line: 76
RepeatTemplate.getNextResult(RepeatContext, RepeatCallback, RepeatInternalState) line: 367
RepeatTemplate.executeInternal(RepeatCallback) line: 214
RepeatTemplate.iterate(RepeatCallback) line: 143
TaskletStep.doExecute(StepExecution) line: 247
TaskletStep(AbstractStep).execute(StepExecution) line: 196
SimpleStepHandler.handleStep(Step, JobExecution) line: 135
JobFlowExecutor.executeStep(Step) line: 61
StepState.handle(FlowExecutor) line: 60
SimpleFlow.resume(String, FlowExecutor) line: 144
SimpleFlow.start(FlowExecutor) line: 124
FlowJob.doExecute(JobExecution) line: 135
FlowJob(AbstractJob).execute(JobExecution) line: 281
SimpleJobLauncher$1.run() line: 120
SyncTaskExecutor.execute(Runnable) line: 48
SimpleJobLauncher.run(Job, JobParameters) line: 114
JobLauncherTestUtils.launchJob(JobParameters) line: 151
MdsResidentsJobTest(BatchItTestBase).runBatchJob(VerifyTableDefinition[], String[], String[], int, BatchStatus, Map<String,JobParameter>, String) line: 257
MdsResidentsJobTest(BatchItTestBase).runBatchJob(VerifyTableDefinition[], String[], String[], Map<String,JobParameter>) line: 213
MdsResidentsJobTest.testUpdatePerformedForMatchingCmrResident() line: 65
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
Method.invoke(Object, Object...) line: 597
FrameworkMethod$1.runReflectiveCall() line: 44
FrameworkMethod$1(ReflectiveCallable).run() line: 15
FrameworkMethod.invokeExplosively(Object, Object...) line: 41
InvokeMethod.evaluate() line: 20
TestWatchman$1.evaluate() line: 48
RunBefores.evaluate() line: 28
RunBeforeTestMethodCallbacks.evaluate() line: 74
RunAfters.evaluate() line: 31
RunAfterTestMethodCallbacks.evaluate() line: 82
SpringRepeat.evaluate() line: 72
SpringJUnit4ClassRunner.runChild(FrameworkMethod, RunNotifier) line: 240
SpringJUnit4ClassRunner(BlockJUnit4ClassRunner).runChild(Object, RunNotifier) line: 50
ParentRunner$3.run() line: 193
ParentRunner$1.schedule(Runnable) line: 52
SpringJUnit4ClassRunner(ParentRunner<T>).runChildren(RunNotifier) line: 191
ParentRunner<T>.access$000(ParentRunner, RunNotifier) line: 42
ParentRunner$2.evaluate() line: 184
RunBeforeTestClassCallbacks.evaluate() line: 61
RunAfterTestClassCallbacks.evaluate() line: 70
SpringJUnit4ClassRunner(ParentRunner<T>).run(RunNotifier) line: 236
SpringJUnit4ClassRunner.run(RunNotifier) line: 180
JUnit4TestMethodReference(JUnit4TestReference).run(TestExecution) line: 46
TestExecution.run(ITestReference[]) line: 38
RemoteTestRunner.runTests(String[], String, TestExecution) line: 467
RemoteTestRunner.runTests(TestExecution) line: 683
RemoteTestRunner.run() line: 390
RemoteTestRunner.main(String[]) line: 197