[ 
https://issues.apache.org/jira/browse/FLINK-7784?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16224673#comment-16224673
 ] 

ASF GitHub Bot commented on FLINK-7784:
---------------------------------------

Github user pnowojski commented on a diff in the pull request:

    https://github.com/apache/flink/pull/4910#discussion_r147670239
  
    --- Diff: 
flink-streaming-java/src/test/java/org/apache/flink/streaming/api/functions/sink/TwoPhaseCommitSinkFunctionTest.java
 ---
    @@ -35,60 +42,101 @@
     import java.io.IOException;
     import java.nio.charset.Charset;
     import java.nio.file.Files;
    +import java.time.Clock;
     import java.util.ArrayList;
     import java.util.Arrays;
     import java.util.Collections;
     import java.util.List;
     import java.util.UUID;
    +import java.util.concurrent.atomic.AtomicBoolean;
     
     import static java.nio.file.StandardCopyOption.ATOMIC_MOVE;
    +import static org.hamcrest.CoreMatchers.containsString;
    +import static org.hamcrest.CoreMatchers.equalTo;
    +import static org.hamcrest.CoreMatchers.hasItem;
     import static org.junit.Assert.assertEquals;
    +import static org.junit.Assert.assertThat;
     import static org.junit.Assert.assertTrue;
     import static org.junit.Assert.fail;
    +import static org.mockito.Mockito.verify;
    +import static org.mockito.Mockito.when;
     
     /**
      * Tests for {@link TwoPhaseCommitSinkFunction}.
      */
     public class TwoPhaseCommitSinkFunctionTest {
    -   TestContext context;
    +
    +   @Rule
    +   public TemporaryFolder folder = new TemporaryFolder();
    +
    +   private FileBasedSinkFunction sinkFunction;
    +
    +   private OneInputStreamOperatorTestHarness<String, Object> harness;
    +
    +   private AtomicBoolean throwException = new AtomicBoolean();
    +
    +   private File targetDirectory;
    +
    +   private File tmpDirectory;
    +
    +   @Mock
    +   private Clock mockClock;
    +
    +   @Mock
    +   private Logger mockLogger;
    --- End diff --
    
    As above. Will all of those `mockLogger` tests fail, if you replace:
    ```
                        log.warn("Transaction {} has been open for {} ms. " +
                                        "This is close to or even exceeding the 
transaction timeout of {} ms.",
                                transactionHolder.handle,
                                elapsedTime,
                                transactionTimeout);
    ```
    with 
    ```
                        log.warn("Transaction {} has been open for too long. " +
                                        "This is close to or even exceeding the 
transaction timeout of {} ms.",
                                transactionHolder.handle,
                                transactionTimeout);
    ```
    or
    ```
                        log.warn(String.format("Transaction {} has been open 
for {} ms. " +
                                        "This is close to or even exceeding the 
transaction timeout of {} ms.",
                                transactionHolder.handle,
                                elapsedTime,
                                transactionTimeout));
    ```
    ?
    If so, then this is a perfect example my I consider mockito to be the 
definition of evil. Using mockito in tests in 99% cases is duplicating/copying 
productional code into tests, basically repeating the implementation, which is 
super fragile and brakes on even the tiniest refactors. While good tests 
instead should check/assert the actual effects - not whether specific method 
calls were called and how many times they were called.


> Don't fail TwoPhaseCommitSinkFunction when failing to commit
> ------------------------------------------------------------
>
>                 Key: FLINK-7784
>                 URL: https://issues.apache.org/jira/browse/FLINK-7784
>             Project: Flink
>          Issue Type: Bug
>          Components: DataStream API
>    Affects Versions: 1.4.0
>            Reporter: Aljoscha Krettek
>            Assignee: Gary Yao
>            Priority: Blocker
>             Fix For: 1.4.0
>
>
> Currently, {{TwoPhaseCommitSinkFunction}} will fail if committing fails 
> (either when doing it via the completed checkpoint notification or when 
> trying to commit after restoring after failure). This means that the job will 
> go into an infinite recovery loop because we will always keep failing.
> In some cases it might be better to ignore those failures and keep on 
> processing and this should be the default. We can provide an option that 
> allows failing the sink on failing commits.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to