Hi Qingsheng,

I agree with you that it would be clearer to have a new interface that
extracts the SplitFetcher creation and management logic from the current
SplitFetcherManager. However, extensive modifications to the interface may
influence a lot and cause compatibility issues. Perhaps we can consider
doing it later, rather than in this FLIP.


Adding a new internal method, SplitFetcherManager#getQueue(), to
SourceReaderBase seems to be a better option than exposing methods like poll
and notifyAvailable on SplitFetcherManager.


I have taken this valuable suggestion and updated the FLIP accordingly.


Thanks,

Hongshun

On Thu, Jan 11, 2024 at 2:09 PM Qingsheng Ren <renqs...@gmail.com> wrote:

> Hi Hongshun and Becket,
>
> Sorry for being late in the discussion! I went through the entire FLIP but
> I still have some concerns about the new SplitFetcherManager.
>
> First of all I agree that we should hide the elementQueue from connector
> developers. This could simplify the interface exposed to developers so that
> they can focus on the interaction with external systems.
>
> However in the current FLIP, SplitFetcherManager exposes 4 more methods,
> poll / getAvailabilityFuture / notifyAvailable / noAvailableElement, which
> are tightly coupled with the implementation of the elementQueue. The naming
> of these methods look weird to me, like what does it mean to "poll from a
> SplitFetcherManager" / "notify a SplitFetcherManager available"? To clarify
> these methods we have to explain to developers that "well we hide a queue
> inside SplitFetcherMamager and the poll method is actually polling from the
> queue". I'm afraid these methods will implicitly expose the concept and the
> implementation of the queue to developers.
>
> I think a cleaner solution would be having a new interface that extracts
> SplitFetcher creating and managing logic from the current
> SplitFetcherManager, but having too many concepts might make the entire
> Source API even harder to understand. To make a compromise, I'm considering
> only exposing constructors of SplitFetcherManager as public APIs, and
> adding a new internal method SplitFetcherManager#getQueue() for
> SourceReaderBase (well it's a bit hacky I admit but I think exposing
> methods like poll and notifyAvailable on SplitFetcherManager is even
> worth). WDTY?
>
> Thanks,
> Qingsheng
>
> On Thu, Dec 21, 2023 at 8:36 AM Becket Qin <becket....@gmail.com> wrote:
>
>> Hi Hongshun,
>>
>> I think the proposal in the FLIP is basically fine. A few minor comments:
>>
>> 1. In FLIPs, we define all the user-sensible changes as public interfaces.
>> The public interface section should list all of them. So, the code blocks
>> currently in the proposed changes section should be put into the public
>> interface section instead.
>>
>> 2. It would be good to put all the changes of one class together. For
>> example, for SplitFetcherManager, we can say:
>>     - Change SplitFetcherManager from Internal to PublicEvolving.
>>     - Deprecate the old constructor exposing the
>> FutureCompletingBlockingQueue, and add new constructors as replacements
>> which creates the FutureCompletingBlockingQueue instance internally.
>>     - Add a few new methods to expose the functionality of the internal
>> FutureCompletingBlockingQueue via the SplitFetcherManager.
>>    And then follows the code block containing all the changes above.
>> Ideally, the changes should come with something like "// <------ New", so
>> that it is. easier to be found.
>>
>> 3. In the proposed changes section, it would be good to add some more
>> detailed explanation of the idea behind the public interface changes. So
>> even people new to Flink can understand better how exactly the interface
>> changes will help fulfill the motivation. For example, regarding the
>> constructor signature change, we can say the following. We can mention a
>> few things in this section:
>>     - By exposing the SplitFetcherManager / SingleThreadFetcheManager, by
>> implementing addSplits() and removeSplits(), connector developers can
>> easily create their own threading models in the SourceReaderBase.
>>     - Note that the SplitFetcher constructor is package private, so users
>> can only create SplitFetchers via
>> SplitFetcherManager.createSplitFetcher().
>> This ensures each SplitFetcher is always owned by the SplitFetcherManager.
>>     - This FLIP essentially embedded the element queue (a
>> FutureCompletingBlockingQueue) instance into the SplitFetcherManager. This
>> hides the element queue from the connector developers and simplifies the
>> SourceReaderBase to consist of only SplitFetcherManager and RecordEmitter
>> as major components.
>>
>> In short, the public interface section answers the question of "what". We
>> should list all the user-sensible changes in the public interface section,
>> without verbose explanation. The proposed changes section answers "how",
>> where we can add more details to explain the changes listed in the public
>> interface section.
>>
>> Thanks,
>>
>> Jiangjie (Becket) Qin
>>
>>
>>
>> On Wed, Dec 20, 2023 at 10:07 AM Hongshun Wang <loserwang1...@gmail.com>
>> wrote:
>>
>> > Hi Becket,
>> >
>> >
>> > It has been a long time since we last discussed. Are there any other
>> > problems with this Flip from your side? I am looking forward to hearing
>> > from you.
>> >
>> >
>> > Thanks,
>> > Hongshun Wang
>> >
>>
>

Reply via email to