GitHub user tzulitai opened a pull request: https://github.com/apache/flink/pull/5189
[FLINK-8283] [kafka] Introduce KafkaOffsetCommitter interface ## What is the purpose of the change This PR is built upon the reworked `FlinkKafkaConsumerBaseTest` in #5188. The broken `FlinkKafkaConsumerBaseTest` is properly fixed only when both #5188 and this PR is merged. Prior to this PR, offset committing was coupled tightly with the `AbstractFetcher`, making unit tests for offset committing behaviours hard to compose concisely. For example, we had tests that required mocking the offset commit methods on `AbstractFetcher`, while ideally, it would be best that those methods are made final (thus, unable to be mocked) to prevent accidental overrides. This PR decouples offset committing as a separate service behind a new `KafkaOffsetCommitter` interface. For now, the `AbstractFetcher` is reused as an implementation of this service, so that this PR does not introduce any more change other than introducing a new layer of abstraction. Unit tests that verify offset committing behaviour now provide a dummy verifiable implementation of the `KafkaOffsetCommitter` (instead of using mocks on AbstractFetcher) and test against that. ## Brief change log - Migrate `AbstractFetcher::commitInternalOffsetsToKafka` method to the newly introduced `KafkaOffsetCommitter` interface. - Let `AbstractFetcher` implement `KafkaOffsetCommitter` - In the `FlinkKafkaConsumerBase`, let "offset committing" and "record fetching" be logically separated to be handled by two services, i.e. namely a `KafkaOffsetCommitter` and a `AbstractFetcher`. Physically, the fetcher instance sits behind both service abstractions. - In `FlinkKafkaConsumerBaseTest`, remove all mocks on `AbstractFetcher::commitInternalOffsetsToKafka`, and test against a `KafkaOffsetCommitter` instead. ## Verifying this change This PR does not add any new functionality. Reworked test also do not affect test coverage. `FlinkKafkaConsumerBaseTest` verifies all changes. ## Does this pull request potentially affect one of the following parts: - Dependencies (does it add or upgrade a dependency): no - The public API, i.e., is any changed class annotated with `@Public(Evolving)`: no - The serializers: no - The runtime per-record code paths (performance sensitive): no - Anything that affects deployment or recovery: no - The S3 file system connector: no ## Documentation - Does this pull request introduce a new feature? no - If yes, how is the feature documented? n/a You can merge this pull request into a Git repository by running: $ git pull https://github.com/tzulitai/flink FLINK-8283-KafkaOffsetCommitter Alternatively you can review and apply these changes as the patch at: https://github.com/apache/flink/pull/5189.patch To close this pull request, make a commit to your master/trunk branch with (at least) the following in the commit message: This closes #5189 ---- commit 620d500b1a14f8f5016e56fdc3d65d853ce8848d Author: Tzu-Li (Gordon) Tai <tzulitai@...> Date: 2017-12-20T00:10:44Z [FLINK-8296] [kafka] Rework FlinkKafkaConsumerBaseTest to not rely on Java reflection Reflection was mainly used to inject mocks into private fields of the FlinkKafkaConsumerBase, without the need to fully execute all operator life cycle methods. This, however, caused the unit tests to be too implementation-specific. This commit reworks the FlinkKafkaConsumerBaseTest to remove test consumer instantiation methods that rely on reflection for dependency injection. All tests now instantiate dummy test consumers normally, and let all tests properly execute all operator life cycle methods regardless of the tested logic. commit 0d19e99d3fb3359f43c2db91611257a5edb2e17f Author: Tzu-Li (Gordon) Tai <tzulitai@...> Date: 2017-12-19T19:55:16Z [FLINK-8283] [kafka] Introduce KafkaOffsetCommitter interface Prior to this commit, offset committing was coupled tightly with the AbstractFetcher, making unit tests for offset committing behaviours hard to compose concisely. For example, we had tests that mock the offset commit methods on AbstractFetcher, while ideally, it would be best that those methods are made final to prevent accidental overrides. This commit decouples offset committing as a separate service behind a new KafkaOffsetCommitter interface. For now, the AbstractFetcher is reused as an implementation of this service. Unit tests that verify offset committing behaviour now provide a dummy verifyable implementation of the KafkaOffsetCommitter, instead of using mocks on AbstractFetcher. ---- ---