[
https://issues.apache.org/jira/browse/FLINK-22097?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17316830#comment-17316830
]
Shengkai Fang commented on FLINK-22097:
---------------------------------------
The failed test is mainly to test the view thread has the ability to exit
gracefully when users(main thread) interrupt the view thread.
We have 3 threads in the test: main thread, view thread and refresh thread.
- The main thread has the resource {{Terminal}} and uses the the resource to
create the view thread. When the view thread starts, it set the interrupt flag
on the view thread and *close* the {{Terminal}} until view thread exits
- When view thread start, it start the refresh thread and monitors the user
input. In the test, it only monitors interrput signal. When get the signal, it
mark the flag {{isRunning}} of the refresh thread {{false}} and notify the
refresh thread.
- The refresh thread is used to fetch the data from the remote periodically
and display the results on {{Terminal}}. When exits, the refresh thread will
invoke the \{{Executor.cancelQuery}} and count down the {{cancellation}}.
The reason why we can NPE is because when view thread exits, it only notifies
the refresh thread instead of waiting for the refresh thread exits. It's
possible
# the view thread notifies the refresh thread
# the refresh thread wakes up and prepares to display the result on the
terminal
# the view thread exits
# the main thread finds the view thread exit and closes the resource
# the refresh thread gets NPE
# the main thread find the {{cancellation}} is not as same as the expected
Therefore, we should request the view thread wait for the refresh thread exit.
To reproduce the bug, we can request the refresh thread sleep 1 seconds before
display.
> testChangelogResultViewClearEmptyResult fail.
> ---------------------------------------------
>
> Key: FLINK-22097
> URL: https://issues.apache.org/jira/browse/FLINK-22097
> Project: Flink
> Issue Type: Bug
> Components: Table SQL / Client
> Affects Versions: 1.13.0
> Reporter: Guowei Ma
> Assignee: Shengkai Fang
> Priority: Major
> Labels: test-stability
> Fix For: 1.13.0
>
>
> https://dev.azure.com/apache-flink/apache-flink/_build/results?buildId=15968&view=logs&j=b2f046ab-ae17-5406-acdc-240be7e870e4&t=93e5ae06-d194-513d-ba8d-150ef6da1d7c&l=8539
> {code:java}
> Exception in thread "Thread-9" java.lang.NullPointerException
> at
> org.apache.flink.table.client.cli.CliClient.isPlainTerminal(CliClient.java:181)
> at
> org.apache.flink.table.client.cli.CliClient.clearTerminal(CliClient.java:169)
> at org.apache.flink.table.client.cli.CliView.display(CliView.java:191)
> at
> org.apache.flink.table.client.cli.CliChangelogResultView.display(CliChangelogResultView.java:101)
> at
> org.apache.flink.table.client.cli.CliResultView$RefreshThread.run(CliResultView.java:267)
> {code}
> {code:java}
> java.lang.AssertionError: Invalid number of cancellations.
> at org.junit.Assert.fail(Assert.java:88)
> at org.junit.Assert.assertTrue(Assert.java:41)
> at
> org.apache.flink.table.client.cli.CliResultViewTest.testResultViewClearResult(CliResultViewTest.java:117)
> at
> org.apache.flink.table.client.cli.CliResultViewTest.testChangelogResultViewClearEmptyResult(CliResultViewTest.java:73)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:498)
> at
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
> at
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
> at
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
> at
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
> at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
> at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
> at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
> at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
> at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
> at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
> at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
> at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
> at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
> at
> org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:365)
> at
> org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:273)
> at
> org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:238)
> at
> org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:159)
> at
> org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:384)
> at
> org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:345)
> at
> org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:126)
> at
> org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:418)
> {code}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)