Just wanted to clarify that I am on board with adding the overloaded put(...) method.
Thanks, Aakash On Fri, May 15, 2020 at 7:00 PM Aakash Shah <as...@confluent.io> wrote: > Hi Randall and Konstantine, > > As Chris and Arjun mentioned, I think the main concern is the potential > gap in which developers don't implement the deprecated method due to a > misunderstanding of use cases. Using the setter method approach ensures > that the developer won't break backwards compatibility when using the new > method due to a mistake. That being said, I think the value added in > clarity of contract of when the error reporter will be invoked and overall > aesthetic while maintaining backwards compatibility outweighs the potential > mistake of a developer in not implementing the original put(...) method. > > With respect to synchrony, I agree with Konstantine's point, that we > should make it an opt-in feature of making the reporter only synchronous. > At the same time, I believe it is important to relieve as much of the > burden of implementation as possible from the developer in this case, and > thus I think using a Callback rather than a Future would be easier on the > developer, while adding asynchronous functionality with the ability to > opt-in synchronous functionality. I also believe making it opt-in > synchronous vs. the other way simplifies implementation for the developer > (blocking vs creating a new thread). > > Please let me know your thoughts. I would like to come to a consensus soon > due to the AK 2.6 deadlines; I will then shortly update the KIP and start a > vote. > > Thanks, > Aakash > > On Fri, May 15, 2020 at 2:24 PM Randall Hauch <rha...@gmail.com> wrote: > >> On Fri, May 15, 2020 at 3:13 PM Arjun Satish <arjun.sat...@gmail.com> >> wrote: >> >> > Couple of thoughts: >> > >> > 1. If we add new parameters to put(..), and new connectors implement >> only >> > this method, it makes them backward incompatible with older workers. I >> > think newer connectors may only choose to only implement the latest >> method, >> > and we are passing the compatibility problems back to the connector >> > developers. >> > >> >> New connectors would have to implement both if they want to run in older >> runtimes. >> >> >> > 2. if we deprecate the older put() method and eventually remove it, then >> > old connectors are forward incompatible. If we are not going to remove >> it, >> > then maybe we should not deprecate it? >> > >> >> I don't think we'll ever remove deprecated methods -- there's no reason to >> cut off older connectors. >> >> >> > 3. if a record is realized to be erroneous outside put() (say, in flush >> or >> > preCommit), how will it be reported? >> > >> >> This is a concern no matter how the reporter is passed to the task. >> Actually, I think it's more clear that the reporter passed through >> `put(...)` should be used to record errors on the SinkRecords passed in >> the >> same method call. >> >> >> > >> > I do think the concern over aesthetics is an important one, but the >> > trade-off here is to exclude many connectors that are out there from >> > running on worker versions. there may be production deployments that >> need >> > one old and one new connector that now cannot work on any version of a >> > single worker. Building connectors is complex, and it's kinda unfair to >> > expect folks to make changes over aesthetic reasons alone. This is >> probably >> > the reason why popular framework APIs very rarely (and probably never) >> > change. >> > >> >> I don't see how passing the reporter through an overloaded `put(...)` is >> less backward compatible. Because the runtime provides the SinkTask base >> class, the runtime has control over what the methods do by default. >> >> >> > >> > Overall, yes, the "public void >> errantRecordReporter(BiConsumer<SinkRecord, >> > Throwable> reporter) {}" proposal in the original KIP is somewhat of a >> > mouthful, but are there are any simpler alternatives that do not exclude >> > existing connectors, adding operational burdens and yet provide a clean >> > contract? >> > >> >> IMO, overloading `put(...)` is cleaner and easier to understand -- plus >> the >> other benefits in my earlier email. >> >> >> > >> > Best, >> > >> > PS: Apologies if the language is incorrect or some points are unclear. >> > >> > On Fri, May 15, 2020 at 12:02 PM Randall Hauch <rha...@gmail.com> >> wrote: >> > >> > > On Fri, May 15, 2020 at 1:45 PM Konstantine Karantasis < >> > > konstant...@confluent.io> wrote: >> > > >> > > > Thanks for the quick response Aakash. >> > > > >> > > > To your last point, modern APIs like this tend to be asynchronous >> (see >> > > > admin, producer in Kafka) and such definition results in more >> > expressive >> > > > and well defined APIs. >> > > > >> > > >> > > +1 >> > > >> > > >> > > > What you describe is easily an opt-in feature for the connector >> > > developer. >> > > > At the same time, the latest description above, gives us better >> chances >> > > for >> > > > this API to remain like this for longer, because it covers both the >> > sync >> > > > and async per `put` user cases. >> > > >> > > >> > > +1 >> > > >> > > >> > > > Given how simple the sync implementation >> > > > is, just by complying with the return type of the method, I still >> think >> > > the >> > > > BiFunction definition that returns a Future makes sense. >> > > > >> > > > Konstantine >> > > > >> > > > >> > > > >> > > > On Fri, May 15, 2020 at 11:27 AM Aakash Shah <as...@confluent.io> >> > wrote: >> > > > >> > > > > Thanks for the additional feedback. >> > > > > >> > > > > I see the benefits of adding an overloaded put(...) over >> alternatives >> > > > and I >> > > > > am on board going forward with this approach. It will definitely >> set >> > > > forth >> > > > > a contract of where the reporter will be used with better >> aesthetics. >> > > > > >> > > > > The original idea of going with a synchronous approach for the >> error >> > > > > reporter was to ease the connector developer's job interacting >> with >> > and >> > > > > handling the error reporter. The tradeoff for having a >> > synchronous-only >> > > > > reporter would be lower throughput on the reporter; this was >> thought >> > to >> > > > be >> > > > > fine since arguably most circumstances would not include >> consistently >> > > > large >> > > > > amounts of records being sent to the error reporter. Even if this >> was >> > > the >> > > > > case, an argument can be made that the lower throughput would be >> of >> > > > > assistance in this case, as it would allow more time for the user >> to >> > > > > realize the connector is having records sent to the error reporter >> > > before >> > > > > many are sent. However, if we are strongly in favor of having the >> > > option >> > > > of >> > > > > asynchronous functionality available for the developer, then I am >> > fine >> > > > with >> > > > > that as well. >> > > > > >> > > > > Lastly, I am on board with changing the name to >> failedRecordReporter, >> > > > > >> > > > > Please let me know your thoughts. >> > > > > >> > > > > Thanks, >> > > > > Aakash >> > > > > >> > > > > On Fri, May 15, 2020 at 9:10 AM Randall Hauch <rha...@gmail.com> >> > > wrote: >> > > > > >> > > > > > Konstantine said: >> > > > > > >> > > > > > > I notice Randall also used BiFunction in his example, I >> wonder if >> > > > it's >> > > > > > for >> > > > > > > similar reasons. >> > > > > > > >> > > > > > >> > > > > > Nope. Just a typo on my part. >> > > > > > >> > > > > > There appear to be three outstanding questions. >> > > > > > >> > > > > > First, Konstantine suggested calling this >> "failedRecordReporter". I >> > > > think >> > > > > > this is minor, but using this new name may be a bit more precise >> > and >> > > > I'd >> > > > > be >> > > > > > fine with this. >> > > > > > >> > > > > > Second, should the reporter method be synchronous? I think the >> two >> > > > > options >> > > > > > are: >> > > > > > >> > > > > > 2a. Use `BiConsumer<SinkRecord, Throwable>` that returns nothing >> > and >> > > > > blocks >> > > > > > (at this time). >> > > > > > 2b. Use `BiFunction<SinkRecord, Throwable, Future<Void>>` that >> > > returns >> > > > a >> > > > > > future that the user can optionally use to be synchronous. >> > > > > > >> > > > > > I do agree with Konstantine that option 2b gives us more room >> for >> > > > future >> > > > > > semantic changes, and since the producer write is already >> > > asynchronous >> > > > > this >> > > > > > should be straightforward to implement. I think the concern >> here is >> > > > that >> > > > > if >> > > > > > the sink task does not *use* the future to make this >> synchronous, >> > it >> > > is >> > > > > > very possible that the error records could be written out of >> order >> > > (due >> > > > > to >> > > > > > retries). But this won't be an issue if the implementation uses >> > > > > > `max.in.flight.requests.per.connection=1` for writing the error >> > > > records. >> > > > > > It's a little less clear, but honestly IMO passing the reporter >> in >> > > the >> > > > > > `put(...)` method helps make this lambda easier to understand, >> for >> > > some >> > > > > > strange reason. So unless there are good reasons to avoid this, >> I'd >> > > be >> > > > in >> > > > > > favor of 2b and returning a Future. >> > > > > > >> > > > > > Third, how do we pass the reporter lambda / method reference to >> the >> > > > task? >> > > > > > My proposal to pass the reporter via an overload `put(...)` >> still >> > is >> > > > the >> > > > > > most attractive to me, for several reasons: >> > > > > > >> > > > > > 3a. There's no need to pass the reporter separately *and* to >> > describe >> > > > the >> > > > > > changes in method call ordering. >> > > > > > 3b. As mentioned above, for some reason passing it via >> `put(...)` >> > > makes >> > > > > the >> > > > > > intent more clear that it be used when processing the >> SinkRecord, >> > and >> > > > > that >> > > > > > it shouldn't be used in `start(...)`, `preCommit(...)`, >> > > > > > `onPartitionsAssigned(...)`, or any of the other task methods. >> As >> > > > Andrew >> > > > > > pointed out earlier, *describing* this in the KIP and in JavaDoc >> > will >> > > > be >> > > > > > tough to be exact yet succinct. >> > > > > > 3c. There is already precedence for evolving >> > > > > > `SourceTask.commitRecord(...)`, and the pattern is identical. >> > > > > > 3d. Backward compatibility is easy to understand, and at the >> same >> > > time >> > > > > it's >> > > > > > pretty easy to describe what implementations that want to take >> > > > advantage >> > > > > of >> > > > > > this feature should do. >> > > > > > 3e. Minimal changes to the interface: we're just *adding* one >> > default >> > > > > > method that calls the existing method and deprecating the >> existing >> > > > > > `put(...)`. >> > > > > > 3f. Deprecating the existing `put(...)` makes it more clear in a >> > > > > > programmatic sense that new sink implementations should use the >> > > > reporter, >> > > > > > and that we recommend old sinks evolve to use it. >> > > > > > >> > > > > > Some of these benefits apply to some of the other suggestions, >> but >> > I >> > > > > think >> > > > > > none of the other suggestions have all of these benefits. For >> > > example, >> > > > > > overloading `initialize(...)` is more difficult since most sink >> > > > > connectors >> > > > > > don't override it and therefore would be less subject to >> > deprecations >> > > > > > warnings. Overloading `start(...)` is less attractive. Adding a >> > > method >> > > > > IMO >> > > > > > shares the fewest of these benefits. >> > > > > > >> > > > > > The one disadvantage of this approach is that sink task >> > > implementations >> > > > > > can't rely upon the reporter upon startup. IMO that's an >> acceptable >> > > > > > tradeoff to get the cleaner and more explicit API, especially if >> > the >> > > > API >> > > > > > contract is that Connect will pass the same reporter instance to >> > each >> > > > > call >> > > > > > to `put(...)` on a single task instance. >> > > > > > >> > > > > > Best regards, >> > > > > > >> > > > > > Randall >> > > > > > >> > > > > > On Fri, May 15, 2020 at 6:59 AM Andrew Schofield < >> > > > > > andrew_schofi...@live.com> >> > > > > > wrote: >> > > > > > >> > > > > > > Hi, >> > > > > > > Randall's suggestion is really good. I think it gives the >> > > flexibility >> > > > > > > required and also >> > > > > > > keeps the interface the right way round. >> > > > > > > >> > > > > > > Thanks, >> > > > > > > Andrew Schofield >> > > > > > > >> > > > > > > On 15/05/2020, 02:07, "Aakash Shah" <as...@confluent.io> >> wrote: >> > > > > > > >> > > > > > > > Hi Randall, >> > > > > > > > >> > > > > > > > Thanks for the feedback. >> > > > > > > > >> > > > > > > > 1. This is a great suggestion, but I find that adding an >> > > overloaded >> > > > > > > > put(...) which essentially deprecates the old put(...) to >> only >> > be >> > > > > used >> > > > > > > when >> > > > > > > > a connector is deployed on older versions of Connect adds >> > enough >> > > > of a >> > > > > > > > complication that could cause connectors to break if the old >> > > > put(...) >> > > > > > > > doesn't correctly invoke the overloaded put(...); either >> that, >> > or >> > > > it >> > > > > > will >> > > > > > > > add duplication of functionality across the two put(...) >> > > methods. I >> > > > > > think >> > > > > > > > the older method simplifies things with the idea that a >> > DLQ/error >> > > > > > > reporter >> > > > > > > > will or will not be passed into the method depending on the >> > > version >> > > > > of >> > > > > > > AK. >> > > > > > > > However, I also understand the aesthetic advantage of this >> > method >> > > > vs >> > > > > > the >> > > > > > > > setter method, so I am okay with going in this direction if >> > > others >> > > > > > agree >> > > > > > > > with adding the overloaded put(...). >> > > > > > > > >> > > > > > > > 2. Yes, your assumption is correct. Yes, we can remove the >> > "Order >> > > > of >> > > > > > > > Operations" if we go with the overloaded put(...) direction. >> > > > > > > > >> > > > > > > > 3. Great point, I will remove them from the KIP. >> > > > > > > > >> > > > > > > > 4. Yeah, accept(...) will be synchronous. I will change it >> to >> > be >> > > > > > clearer, >> > > > > > > > thanks. >> > > > > > > > >> > > > > > > > 5. This KIP will use existing metrics as well introduce new >> > > > metrics. >> > > > > I >> > > > > > > will >> > > > > > > > update this section to fully specify the metrics. >> > > > > > > > >> > > > > > > > Please let me know what you think. >> > > > > > > > >> > > > > > > > Thanks, >> > > > > > > > Aakash >> > > > > > > > >> > > > > > > > On Thu, May 14, 2020 at 3:52 PM Randall Hauch < >> > rha...@gmail.com> >> > > > > > wrote: >> > > > > > > > >> > > > > > > > > Hi, Aakash. >> > > > > > > > > >> > > > > > > > > Thanks for the KIP. Connect does need an improved ability >> for >> > > > sink >> > > > > > > > > connectors to report individual records as being >> problematic, >> > > and >> > > > > > this >> > > > > > > > > integrates nicely with the existing DLQ feature. >> > > > > > > > > >> > > > > > > > > I also appreciate the desire to maintain compatibility so >> > that >> > > > > > > connectors >> > > > > > > > > can take advantage of this feature when deployed in a >> runtime >> > > > that >> > > > > > > supports >> > > > > > > > > this feature, but can safely and easily do without the >> > feature >> > > > when >> > > > > > > > > deployed to an older runtime. But I do understand Andrew's >> > > > concern >> > > > > > > about >> > > > > > > > > the aesthetics. Have you considered overloading the >> > `put(...)` >> > > > > method >> > > > > > > and >> > > > > > > > > adding the `reporter` as a second parameter? Essentially >> it >> > > would >> > > > > add >> > > > > > > the >> > > > > > > > > one method (with proper JavaDoc) to `SinkTask` only: >> > > > > > > > > >> > > > > > > > > ``` >> > > > > > > > > public void put(Collection<SinkRecord> records, >> > > > > > > BiFunction<SinkRecord, >> > > > > > > > > Throwable> reporter) { >> > > > > > > > > put(records); >> > > > > > > > > } >> > > > > > > > > ``` >> > > > > > > > > and the WorkerSinkTask would be changed to call >> > > `put(Collection, >> > > > > > > > > BiFunction)` instead. >> > > > > > > > > >> > > > > > > > > Sink connector implementations that don't do anything >> > different >> > > > can >> > > > > > > still >> > > > > > > > > override `put(Collection)`, and it still works as before. >> > > > > Developers >> > > > > > > that >> > > > > > > > > want to change their sink connector implementations to >> > support >> > > > this >> > > > > > new >> > > > > > > > > feature would do the following, which would work in older >> and >> > > > newer >> > > > > > > Connect >> > > > > > > > > runtimes: >> > > > > > > > > ``` >> > > > > > > > > public void put(Collection<SinkRecord> records) { >> > > > > > > > > put(records, null); >> > > > > > > > > } >> > > > > > > > > public void put(Collection<SinkRecord> records, >> > > > > > > BiFunction<SinkRecord, >> > > > > > > > > Throwable> reporter) { >> > > > > > > > > // the normal `put(Collection)` logic goes here, >> but >> > > can >> > > > > > > optionally >> > > > > > > > > use `reporter` if non-null >> > > > > > > > > } >> > > > > > > > > ``` >> > > > > > > > > >> > > > > > > > > I think this has all the same benefits of the current KIP, >> > but >> > > > > > > > > it's noticeably simpler and hopefully more aesthetically >> > > > pleasing. >> > > > > > > > > >> > > > > > > > > As for Andrew's second concern about "the task can send >> > errant >> > > > > > records >> > > > > > > to >> > > > > > > > > it within put(...)" being too restrictive. My guess is >> that >> > > this >> > > > > was >> > > > > > > more >> > > > > > > > > an attempt at describing the basic behavior, and less >> about >> > > > > requiring >> > > > > > > the >> > > > > > > > > reporter only being called within the `put(...)` method >> and >> > not >> > > > by >> > > > > > > methods >> > > > > > > > > to which `put(...)` synchronously or asynchronously >> > delegates. >> > > > Can >> > > > > > you >> > > > > > > > > confirm whether my assumption is correct? If so, then >> perhaps >> > > my >> > > > > > > suggestion >> > > > > > > > > helps work around this issue as well, since there would >> be no >> > > > > > > restriction >> > > > > > > > > on when the reporter is called, and the whole "Order of >> > > > Operations" >> > > > > > > section >> > > > > > > > > could potentially be removed. >> > > > > > > > > >> > > > > > > > > Third, it's not clear to me why the "Error Reporter >> Object" >> > > > > > subsection >> > > > > > > in >> > > > > > > > > the "Proposal" section lists the worker configuration >> > > properties >> > > > > that >> > > > > > > were >> > > > > > > > > previously introduced with >> > > > > > > > > >> > > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > >> > >> https://cwiki.apache.org/confluence/display/KAFKA/KIP-298%3A+Error+Handling+in+Connect >> > > > > > > > > . >> > > > > > > > > Maybe it's worth mentioning that the error reporter >> > > functionality >> > > > > > will >> > > > > > > > > reuse or build upon KIP-298, including reusing the >> > > configuration >> > > > > > > properties >> > > > > > > > > defined in KIP-298. But IIUC, the KIP does not propose >> > changing >> > > > any >> > > > > > > > > technical or semantic aspect of these configuration >> > properties, >> > > > and >> > > > > > > > > therefore the KIP would be more clear and succinct without >> > > them. >> > > > > > > *That* the >> > > > > > > > > error reporter will use these properties is part of the UX >> > and >> > > > > > > therefore >> > > > > > > > > necessary to mention, but *how* it uses those properties >> is >> > > > really >> > > > > up >> > > > > > > to >> > > > > > > > > the implementation. >> > > > > > > > > >> > > > > > > > > Fourth, the "Synchrony" section has a sentence that is >> > > confusing, >> > > > > or >> > > > > > > not as >> > > > > > > > > clear as it could be. >> > > > > > > > > >> > > > > > > > > "If a record is sent to the error reporter, >> processing of >> > > the >> > > > > > next >> > > > > > > > > errant record in accept(...) will not begin until the >> > producer >> > > > > > > successfully >> > > > > > > > > sends the errant record to Kafka." >> > > > > > > > > >> > > > > > > > > This sentence is a bit difficult to understand, but IIUC >> this >> > > > > really >> > > > > > > just >> > > > > > > > > means that "accept(...)" will be synchronous and will >> block >> > > until >> > > > > the >> > > > > > > > > errant record has been successfully written to Kafka. If >> so, >> > > > let's >> > > > > > say >> > > > > > > > > that. The rest of the paragraph is fine. >> > > > > > > > > >> > > > > > > > > Finally, is this KIP proposing new metrics, or that >> existing >> > > > > metrics >> > > > > > > would >> > > > > > > > > be used to track the error reporter usage? If the former, >> > then >> > > > > please >> > > > > > > > > fully-specify what these metrics will be, similarly to how >> > > > metrics >> > > > > > are >> > > > > > > > > specified in >> > > > > > > > > >> > > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > >> > >> https://cwiki.apache.org/confluence/display/KAFKA/KIP-196%3A+Add+metrics+to+Kafka+Connect+framework >> > > > > > > > > . >> > > > > > > > > >> > > > > > > > > Thoughts? >> > > > > > > > > >> > > > > > > > > Best regards, >> > > > > > > > > >> > > > > > > > > Randall >> > > > > > > > > >> > > > > > > > > On Mon, May 11, 2020 at 4:49 PM Andrew Schofield < >> > > > > > > > > andrew_schofi...@live.com> >> > > > > > > > > wrote: >> > > > > > > > > >> > > > > > > > > > Hi Aakash, >> > > > > > > > > > Thanks for sorting out the replies to the mailing list. >> > > > > > > > > > >> > > > > > > > > > First, I do like the idea of improving error reporting >> in >> > > sink >> > > > > > > > > connectors. >> > > > > > > > > > I'd like a simple >> > > > > > > > > > way to put bad records onto the DLQ. >> > > > > > > > > > >> > > > > > > > > > I think this KIP is considerably more complicated than >> it >> > > > seems. >> > > > > > The >> > > > > > > > > > guidance on the >> > > > > > > > > > SinkTask.put() method is that it should send the records >> > > > > > > asynchronously >> > > > > > > > > > and immediately >> > > > > > > > > > return, so the task is likely to want to report errors >> > > > > > asynchronously >> > > > > > > > > > too. Currently the KIP >> > > > > > > > > > states that "the task can send errant records to it >> within >> > > > > > put(...)" >> > > > > > > and >> > > > > > > > > > that's too restrictive. >> > > > > > > > > > The task ought to be able to report any unflushed >> records, >> > > but >> > > > > the >> > > > > > > > > > synchronisation of this is going >> > > > > > > > > > to be tricky. I suppose the connector author needs to >> make >> > > sure >> > > > > > that >> > > > > > > all >> > > > > > > > > > errant records have >> > > > > > > > > > been reported before returning control from >> > > SinkTask.flush(...) >> > > > > or >> > > > > > > > > perhaps >> > > > > > > > > > SinkTask.preCommit(...). >> > > > > > > > > > >> > > > > > > > > > I think the interface is a little strange too. I can see >> > that >> > > > > this >> > > > > > > was >> > > > > > > > > > done so it's possible to deliver a connector >> > > > > > > > > > that supports error reporting but it can also work in >> > earlier >> > > > > > > versions of >> > > > > > > > > > the KC runtime. But, the >> > > > > > > > > > pattern so far is that the task uses the methods of >> > > > > SinkTaskContext >> > > > > > > to >> > > > > > > > > > access utilities in the Kafka >> > > > > > > > > > Connect runtime, and I suggest that reporting a bad >> record >> > is >> > > > > such >> > > > > > a >> > > > > > > > > > utility. SinkTaskContext has >> > > > > > > > > > changed before when the configs() methods was added, so >> I >> > > think >> > > > > > > there is >> > > > > > > > > > precedent for adding a method. >> > > > > > > > > > The way the KIP adds a method to SinkTask that the KC >> > runtime >> > > > > calls >> > > > > > > to >> > > > > > > > > > provide the error reporting utility >> > > > > > > > > > seems not to match what has gone before. >> > > > > > > > > > >> > > > > > > > > > Thanks, >> > > > > > > > > > Andrew >> > > > > > > > > > >> > > > > > > > > > On 11/05/2020, 19:05, "Aakash Shah" <as...@confluent.io >> > >> > > > wrote: >> > > > > > > > > > >> > > > > > > > > > I wasn't previously added to the dev mailing list, >> so >> > I'd >> > > > > like >> > > > > > to >> > > > > > > > > post >> > > > > > > > > > my >> > > > > > > > > > discussion with Andrew Schofield below for >> visibility >> > and >> > > > > > further >> > > > > > > > > > discussion: >> > > > > > > > > > >> > > > > > > > > > Hi Andrew, >> > > > > > > > > > >> > > > > > > > > > Thanks for the reply. The main concern with this >> > approach >> > > > > would >> > > > > > > be >> > > > > > > > > its >> > > > > > > > > > backward compatibility. I’ve highlighted the >> thoughts >> > > > around >> > > > > > the >> > > > > > > > > > backwards >> > > > > > > > > > compatibility of the initial approach, please let me >> > know >> > > > > what >> > > > > > > you >> > > > > > > > > > think. >> > > > > > > > > > >> > > > > > > > > > Thanks, >> > > > > > > > > > Aakash >> > > > > > > > > > >> > > > > > > > > > >> > > > > > > > > > >> > > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > >> > >> ____________________________________________________________________________________________________________________________ >> > > > > > > > > > >> > > > > > > > > > Hi, >> > > > > > > > > > By adding a new method to the SinkContext interface >> in >> > > say >> > > > > > Kafka >> > > > > > > > > 2.6, a >> > > > > > > > > > connector that calls it would require a Kafka 2.6 >> > connect >> > > > > > > runtime. I >> > > > > > > > > > don't >> > > > > > > > > > quite see how that's a backward compatibility >> problem. >> > > It's >> > > > > > just >> > > > > > > that >> > > > > > > > > > new >> > > > > > > > > > connectors need the latest interface. I might not >> quite >> > > be >> > > > > > > > > > understanding, >> > > > > > > > > > but I think it would be fine. >> > > > > > > > > > >> > > > > > > > > > Thanks, >> > > > > > > > > > Andrew >> > > > > > > > > > >> > > > > > > > > > >> > > > > > > > > > >> > > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > >> > >> ____________________________________________________________________________________________________________________________ >> > > > > > > > > > >> > > > > > > > > > Hi Andrew, >> > > > > > > > > > >> > > > > > > > > > I apologize for the way the reply was sent. I just >> > > > subscribed >> > > > > > to >> > > > > > > the >> > > > > > > > > > dev >> > > > > > > > > > mailing list so it should be resolved now. >> > > > > > > > > > >> > > > > > > > > > You are correct, new connectors would simply require >> > the >> > > > > latest >> > > > > > > > > > interface. >> > > > > > > > > > However, we want to remove that requirement - in >> other >> > > > words, >> > > > > > we >> > > > > > > want >> > > > > > > > > > to >> > > > > > > > > > allow the possibility that someone wants the latest >> > > > > > connector/to >> > > > > > > > > > upgrade to >> > > > > > > > > > the latest version, but deploys it on an older >> version >> > of >> > > > AK. >> > > > > > > > > > Basically, we >> > > > > > > > > > don't want to enforce the necessity of upgrading AK >> to >> > > get >> > > > > the >> > > > > > > latest >> > > > > > > > > > interface. In the current approach, there would be >> no >> > > issue >> > > > > of >> > > > > > > > > > deploying a >> > > > > > > > > > new connector on an older version of AK, as the >> Connect >> > > > > > framework >> > > > > > > > > would >> > > > > > > > > > simply not invoke the new method. >> > > > > > > > > > >> > > > > > > > > > Please let me know what you think and if I need to >> > > clarify >> > > > > > > anything. >> > > > > > > > > > >> > > > > > > > > > Thanks, >> > > > > > > > > > Aakash >> > > > > > > > > > >> > > > > > > > > > >> > > > > > > > > >> > > > > > > > >> > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > >> > >> >