@@ -141,13 +141,14 @@ public void testPipeGeneratedWriteProcessRejectSkipsStateMachineRetry() {
141141
142142 @ Test
143143 public void testNonPipeWriteProcessRejectCanStillRetry () {
144- final DataRegionStateMachine stateMachine = new DataRegionStateMachine ( null );
144+ final TestingDataRegionStateMachine stateMachine = new TestingDataRegionStateMachine ( false );
145145 final RetryControlledPlanNode planNode = new RetryControlledPlanNode (false );
146146
147147 final TSStatus status = stateMachine .write (planNode );
148148
149149 Assert .assertEquals (TSStatusCode .SUCCESS_STATUS .getStatusCode (), status .getCode ());
150150 Assert .assertEquals (2 , planNode .getAcceptCount ());
151+ Assert .assertEquals (1 , stateMachine .getWaitCount ());
151152 }
152153
153154 @ Test
@@ -164,7 +165,7 @@ public void testMetadataLeaseFencedNoRetry() {
164165
165166 @ Test
166167 public void testMetadataLeaseFencedRetryRequiredRetriesAndFails () {
167- final DataRegionStateMachine stateMachine = new DataRegionStateMachine ( null );
168+ final TestingDataRegionStateMachine stateMachine = new TestingDataRegionStateMachine ( false );
168169 final FixedStatusPlanNode planNode =
169170 new FixedStatusPlanNode (TSStatusCode .METADATA_LEASE_FENCED_RETRY_REQUIRED .getStatusCode ());
170171
@@ -173,11 +174,12 @@ public void testMetadataLeaseFencedRetryRequiredRetriesAndFails() {
173174 Assert .assertEquals (
174175 TSStatusCode .METADATA_LEASE_FENCED_RETRY_REQUIRED .getStatusCode (), status .getCode ());
175176 Assert .assertEquals (5 , planNode .getAcceptCount ());
177+ Assert .assertEquals (4 , stateMachine .getWaitCount ());
176178 }
177179
178180 @ Test
179181 public void testMetadataLeaseFencedRetryRequiredRetriesAndSucceeds () {
180- final DataRegionStateMachine stateMachine = new DataRegionStateMachine ( null );
182+ final TestingDataRegionStateMachine stateMachine = new TestingDataRegionStateMachine ( false );
181183 final SequenceStatusPlanNode planNode =
182184 new SequenceStatusPlanNode (
183185 TSStatusCode .METADATA_LEASE_FENCED_RETRY_REQUIRED .getStatusCode (),
@@ -188,6 +190,51 @@ public void testMetadataLeaseFencedRetryRequiredRetriesAndSucceeds() {
188190
189191 Assert .assertEquals (TSStatusCode .SUCCESS_STATUS .getStatusCode (), status .getCode ());
190192 Assert .assertEquals (3 , planNode .getAcceptCount ());
193+ Assert .assertEquals (2 , stateMachine .getWaitCount ());
194+ }
195+
196+ @ Test
197+ public void testInterruptedWriteRetryStopsImmediately () {
198+ Thread .interrupted ();
199+ try {
200+ final TestingDataRegionStateMachine stateMachine = new TestingDataRegionStateMachine (true );
201+ final FixedStatusPlanNode planNode =
202+ new FixedStatusPlanNode (
203+ TSStatusCode .METADATA_LEASE_FENCED_RETRY_REQUIRED .getStatusCode ());
204+
205+ final TSStatus status = stateMachine .write (planNode );
206+
207+ Assert .assertEquals (
208+ TSStatusCode .METADATA_LEASE_FENCED_RETRY_REQUIRED .getStatusCode (), status .getCode ());
209+ Assert .assertEquals (1 , planNode .getAcceptCount ());
210+ Assert .assertEquals (1 , stateMachine .getWaitCount ());
211+ Assert .assertTrue (Thread .currentThread ().isInterrupted ());
212+ } finally {
213+ Thread .interrupted ();
214+ }
215+ }
216+
217+ private static class TestingDataRegionStateMachine extends DataRegionStateMachine {
218+
219+ private final boolean interruptOnWait ;
220+ private int waitCount ;
221+
222+ private TestingDataRegionStateMachine (final boolean interruptOnWait ) {
223+ super (null );
224+ this .interruptOnWait = interruptOnWait ;
225+ }
226+
227+ private int getWaitCount () {
228+ return waitCount ;
229+ }
230+
231+ @ Override
232+ protected void waitBeforeNextWriteRetry () throws InterruptedException {
233+ ++waitCount ;
234+ if (interruptOnWait ) {
235+ throw new InterruptedException ();
236+ }
237+ }
191238 }
192239
193240 private static class FixedStatusPlanNode extends PlanNode {
0 commit comments