Thanks Panagiotis for the update, 

the updated FLIP looks good to me.


Best,
Leonard


> On Apr 13, 2023, at 7:42 AM, Panagiotis Garefalakis <pga...@apache.org> wrote:
> 
> Hello there,
> 
> Zhu: agree with the config option, great suggestion
> Hong: global timeout is also interesting and a good addition -- only
> downside I see is just another config option
> 
> If everyone is happy, I suggest we keep the discussion open until Friday
> and start a Vote shortly after.
> 
> Cheers,
> Panagiotis
> 
> On Tue, Apr 11, 2023 at 12:58 AM Teoh, Hong <lian...@amazon.co.uk.invalid>
> wrote:
> 
>> Hi Panagiotis,
>> 
>> Thank you for the update. Looks great! Just one suggestion below:
>> 
>> 1. We seem to be waiting for the future(s) to complete before restarting
>> the job - should we add a configurable timeout for the enrichment? Since
>> each failure enricher are run in parallel, we could probably settle for 1
>> timeout for all failure handlers.
>> 2. +1 to Zhu’s comment on adding a comma separated list of FailureHandlers
>> instead of boolean toggle!
>> 
>> Other than the above, the FLIP looks great! Thank you for your efforts.
>> 
>> Regards,
>> Hong
>> 
>> 
>> 
>>> On 11 Apr 2023, at 08:01, Zhu Zhu <reed...@gmail.com> wrote:
>>> 
>>> CAUTION: This email originated from outside of the organization. Do not
>> click links or open attachments unless you can confirm the sender and know
>> the content is safe.
>>> 
>>> 
>>> 
>>> Hi Panagiotis,
>>> 
>>> Thanks for updating the FLIP.
>>> 
>>>> Regarding the config option
>> `jobmanager.failure-enricher-plugins.enabled`
>>> I think a config option `jobmanager.failure-enrichers`, which accepts
>>> the names of enrichers to use, may be better. It allows the users to
>>> deploy and use the plugins in a more flexible way. The default value
>>> of the config can be none, which means failure enrichment will be
>>> disabled by default.
>>> A reference can be the config option `metrics.reporters` which helps
>>> to load metric reporter plugins.
>>> 
>>> Thanks,
>>> Zhu
>>> 
>>> Panagiotis Garefalakis <pga...@apache.org> 于2023年4月10日周一 03:47写道:
>>>> 
>>>> Hello again everyone,
>>>> 
>>>> FLIP is now updated based on our discussion!
>>>> In short, FLIP-304 [1] proposes the addition of a pluggable interface
>> that
>>>> will allow users to add custom logic and enrich failures with custom
>>>> metadata labels.
>>>> While as discussed, custom restart strategies will be part of a
>> different
>>>> effort. Every pluggable FaulireEnricher:
>>>> 
>>>>  - Is triggered on every global/non-global failure
>>>>  - Receives a Throwable cause and an immutable Context
>>>>  - Performs asynchronous execution (separate IoExecutor) to avoid
>>>>  blocking the main thread for RPCs
>>>>  - Is completely independent from other Enrichers
>>>>  - Emits failure labels/tags for its unique, pre-defined keys (defined
>> at
>>>>  startup time)
>>>> 
>>>> 
>>>> Check the link for implementation details and please let me know what
>> you
>>>> think :)
>>>> 
>>>> 
>>>> [1]
>>>> 
>> https://cwiki.apache.org/confluence/display/FLINK/FLIP-304%3A+Pluggable+Failure+Enrichers
>>>> 
>>>> 
>>>> Panagiotis
>>>> 
>>>> 
>>>> On Tue, Mar 28, 2023 at 5:01 AM Zhu Zhu <reed...@gmail.com> wrote:
>>>> 
>>>>> Hi Panagiotis,
>>>>> 
>>>>> How about to introduce a config option to control which error handling
>>>>> plugins should be used? It is more flexible for deployments.
>> Additionally,
>>>>> it can also enable users to explicitly specify the order that the
>> plugins
>>>>> take effects.
>>>>> 
>>>>> Thanks,
>>>>> Zhu
>>>>> 
>>>>> Gen Luo <luogen...@gmail.com> 于2023年3月27日周一 15:02写道:
>>>>>> 
>>>>>> Thanks for the summary!
>>>>>> 
>>>>>> Also +1 to support custom restart strategies in a different FLIP,
>>>>>> as long as we can make sure that the plugin interface won't be
>>>>>> changed when the restart strategy interface is introduced.
>>>>>> 
>>>>>> To achieve this, maybe we should think well how the handler
>>>>>> would cooperate with the restart strategy, like would it executes b
>>>>>> efore the strategy (e.g. some strategy may use the tag), or after
>>>>>> it (e.g. some metric reporting handler may use the handling result).
>>>>>> Though we can implement in one way, and extend if the other is
>>>>>> really necessary by someone.
>>>>>> 
>>>>>> Besides, instead of using either of the names, shall we just make
>>>>>> them two subclasses named FailureEnricher and FailureListener?
>>>>>> The former executes synchronously and can modify the context,
>>>>>> while the latter executes asynchronously and has a read-only view
>>>>>> of context. In this way we can make sure a handler behaves in
>>>>>> the expected way.
>>>>>> 
>>>>>> 
>>>>>> On Thu, Mar 23, 2023 at 5:19 PM Zhu Zhu <reed...@gmail.com> wrote:
>>>>>> 
>>>>>>> +1 to support custom restart strategies in a different FLIP.
>>>>>>> 
>>>>>>> It's fine to have a different plugin for custom restart strategy.
>>>>>>> If so, since we do not treat the FLIP-304 plugin as a common failure
>>>>>>> handler, but instead mainly targets to add labels to errors, I would
>>>>>>> +1 for the name `FailureEnricher`.
>>>>>>> 
>>>>>>> Thanks,
>>>>>>> Zhu
>>>>>>> 
>>>>>>> David Morávek <d...@apache.org> 于2023年3月23日周四 15:51写道:
>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> One additional remark on introducing it as an async operation: We
>>>>> would
>>>>>>>>> need a new configuration parameter to define the timeout for such a
>>>>>>>>> listener call, wouldn't we?
>>>>>>>>> 
>>>>>>>> 
>>>>>>>> This could be left up to the implementor to handle.
>>>>>>>> 
>>>>>>>> What about adding an extra method getNamespace() to the Listener
>>>>>>> interface
>>>>>>>>> which returns an Optional<String>.
>>>>>>>>> 
>>>>>>>> 
>>>>>>>> I'd avoid mixing an additional concept into this. We can simply have
>>>>> a
>>>>>>> new
>>>>>>>> method that returns a set of keys the listener can output. We can
>>>>>>> validate
>>>>>>>> this at the JM startup time and fail fast (since it's a
>> configuration
>>>>>>>> error) if there is an overlap. If the listener outputs the key that
>>>>> is
>>>>>>> not
>>>>>>>> allowed to, I wouldn't be afraid to call into a fatal error handler
>>>>> since
>>>>>>>> it's an invalid implementation.
>>>>>>>> 
>>>>>>>> Best,
>>>>>>>> D.
>>>>>>>> 
>>>>>>>> On Thu, Mar 23, 2023 at 8:34 AM Matthias Pohl
>>>>>>>> <matthias.p...@aiven.io.invalid> wrote:
>>>>>>>> 
>>>>>>>>> Sounds good. Two points I want to add:
>>>>>>>>> 
>>>>>>>>>  - Listener execution should be independent — however we need a
>>>>> way
>>>>>>> to
>>>>>>>>>> enforce a Label key/key-prefix is only assigned to a single
>>>>> Listener,
>>>>>>>>>> thinking of a validation step both at Listener init and runtime
>>>>>>> stages
>>>>>>>>>> 
>>>>>>>>> What about adding an extra method getNamespace() to the Listener
>>>>>>> interface
>>>>>>>>> which returns an Optional<String>. Therefore, the
>>>>> implementation/the
>>>>>>> user
>>>>>>>>> can decide depending on the use case whether it's necessary to have
>>>>>>>>> separate namespaces for the key/value pairs or not. On the Flink
>>>>> side,
>>>>>>> we
>>>>>>>>> would just merge the different maps considering their namespaces.
>>>>>>>>> 
>>>>>>>>> A flaw of this approach is that if a user decides to use the same
>>>>>>> namespace
>>>>>>>>> for multiple listeners, how is an error in one of the listeners
>>>>>>> represented
>>>>>>>>> in the outcome? We would have to overwrite either the successful
>>>>>>> listener's
>>>>>>>>> result or the failed ones. I wanted to share it, anyway.
>>>>>>>>> 
>>>>>>>>> One additional remark on introducing it as an async operation: We
>>>>> would
>>>>>>>>> need a new configuration parameter to define the timeout for such a
>>>>>>>>> listener call, wouldn't we?
>>>>>>>>> 
>>>>>>>>> Matthias
>>>>>>>>> 
>>>>>>>>> On Wed, Mar 22, 2023 at 4:56 PM Panagiotis Garefalakis <
>>>>>>> pga...@apache.org>
>>>>>>>>> wrote:
>>>>>>>>> 
>>>>>>>>>> Hi everyone,
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> Thanks for the valuable comments!
>>>>>>>>>> Excited to see this is an area of interest for the community!
>>>>>>>>>> 
>>>>>>>>>> Summarizing some of the main points raised along with my
>>>>> thoughts:
>>>>>>>>>> 
>>>>>>>>>>  - Labels (Key/Value) pairs are more expressive than Tags
>>>>>>> (Strings) so
>>>>>>>>>>  using the former is a good idea — I am also debating if we
>>>>> want to
>>>>>>>>>> return
>>>>>>>>>>  multiple KV pairs per Listener (one could argue that we could
>>>>>>> split
>>>>>>>>> the
>>>>>>>>>>  logic in multiple Listeners to support that)
>>>>>>>>>>  - An immutable context along with data returned using the
>>>>>>> interface
>>>>>>>>>>  method implementations is a better approach than a mutable
>>>>>>> Collection
>>>>>>>>>>  - Listener execution should be independent — however we need a
>>>>>>> way to
>>>>>>>>>>  enforce a Label key/key-prefix is only assigned to a single
>>>>>>> Listener,
>>>>>>>>>>  thinking of a validation step both at Listener init and
>>>>> runtime
>>>>>>> stages
>>>>>>>>>>  - We want to perform async Listener operations as sync could
>>>>>>> block the
>>>>>>>>>>  main thread — exposing an ioExecutor pool through the context
>>>>>>> could be
>>>>>>>>>> an
>>>>>>>>>>  elegant solution here
>>>>>>>>>>  - Make sure Listener errors are not failing jobs — make sure
>>>>> to
>>>>>>> log
>>>>>>>>> and
>>>>>>>>>>  keep the job alive
>>>>>>>>>>  - We need better naming / public interface
>>>>> separation/description
>>>>>>>>>> 
>>>>>>>>>>       -  Even though custom restart strategies share some
>>>>>>> properties
>>>>>>>>> with
>>>>>>>>>> Listeners, they would probably need a separate interface with a
>>>>>>> different
>>>>>>>>>> return type anyway (restart strategy not labels) and in general
>>>>> they
>>>>>>> are
>>>>>>>>>> different and complex enough to justify their own FLIP (that can
>>>>>>> also be
>>>>>>>>> a
>>>>>>>>>> follow-up).
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> What do people think? I am planning to modify the FLIP to reflect
>>>>>>> these
>>>>>>>>>> changes if they make sense to everyone.
>>>>>>>>>> 
>>>>>>>>>> Cheers,
>>>>>>>>>> Panagiotis
>>>>>>>>>> 
>>>>>>>>>> On Wed, Mar 22, 2023 at 6:28 AM Hong Teoh <hlteo...@gmail.com>
>>>>>>> wrote:
>>>>>>>>>> 
>>>>>>>>>>> Hi all,
>>>>>>>>>>> 
>>>>>>>>>>> Thank you Panagiotis for proposing this. From the size of the
>>>>>>> thread,
>>>>>>>>>> this
>>>>>>>>>>> is a much needed feature in Flink!
>>>>>>>>>>> Some thoughts, to extend those already adeptly summarised by
>>>>> Piotr,
>>>>>>>>>>> Matthias and Jing.
>>>>>>>>>>> 
>>>>>>>>>>> - scope of FLIP: +1 to scoping this FLIP to observability
>>>>> around a
>>>>>>>>>>> restart. That would include adding metadata + exposing
>>>>> metadata to
>>>>>>>>>> external
>>>>>>>>>>> systems. IMO, introducing a new restart strategy solves
>>>>> different
>>>>>>>>>> problems,
>>>>>>>>>>> is much larger scope and should be covered in a separate FLIP.
>>>>>>>>>>> 
>>>>>>>>>>> - failure handling: At the moment, we propose transitioning the
>>>>>>> Flink
>>>>>>>>> job
>>>>>>>>>>> to a terminal FAILED state when JobListener fails, when the job
>>>>>>> could
>>>>>>>>>> have
>>>>>>>>>>> transitioned to RESTARTING->RUNNING. If we are keeping in line
>>>>>>> with the
>>>>>>>>>>> scope to add metadata/observability around job restarts, we
>>>>> should
>>>>>>> not
>>>>>>>>> be
>>>>>>>>>>> affecting the running of the Flink job itself. Could I propose
>>>>> we
>>>>>>>>> instead
>>>>>>>>>>> log WARN/ERROR.
>>>>>>>>>>> 
>>>>>>>>>>> - immutable context: +1 to keeping the contract clear via
>>>>> return
>>>>>>> types.
>>>>>>>>>>> - async operation: +1 to adding ioexecutor to context, however,
>>>>>>> given
>>>>>>>>> we
>>>>>>>>>>> don’t want to block the actual job restart on adding metadata /
>>>>>>> calling
>>>>>>>>>>> external services, should we consider returning and letting
>>>>> futures
>>>>>>>>>>> complete independently?
>>>>>>>>>>> 
>>>>>>>>>>> - independent vs ordered execution: Should we consider making
>>>>> the
>>>>>>> order
>>>>>>>>>> of
>>>>>>>>>>> execution deterministic (use a List instead of Set)?
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> Once again, thank you for working on this.
>>>>>>>>>>> 
>>>>>>>>>>> Regards,
>>>>>>>>>>> Hong
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>>> On 21 Mar 2023, at 21:07, Jing Ge <j...@ververica.com.INVALID
>>>>>> 
>>>>>>>>> wrote:
>>>>>>>>>>>> 
>>>>>>>>>>>> Hi,
>>>>>>>>>>>> 
>>>>>>>>>>>> Thanks Panagiotis for this FLIP and thanks for all valuable
>>>>>>>>>> discussions.
>>>>>>>>>>>> I'd like to share my two cents:
>>>>>>>>>>>> 
>>>>>>>>>>>> - FailureListenerContext#addTag and
>>>>>>> FailureListenerContext#getTags.
>>>>>>>>> It
>>>>>>>>>>>> seems that we have to call getTags() and then do remove
>>>>>>> activities if
>>>>>>>>>> we
>>>>>>>>>>>> want to delete any tags (according to the javadoc in the
>>>>> FLIP).
>>>>>>> It
>>>>>>>>> is
>>>>>>>>>>>> inconsistent for me too. Either offer addTag(), deleteTag(),
>>>>> and
>>>>>>> let
>>>>>>>>>>>> getTags() return immutable collection, or offer getTags()
>>>>> only to
>>>>>>>>>> return
>>>>>>>>>>>> mutable collection.
>>>>>>>>>>>> 
>>>>>>>>>>>> - label vs tag. Label is a great idea +1. AFAIC, tag could
>>>>> be a
>>>>>>>>> special
>>>>>>>>>>>> case of label, i.e. key="tag". It is convenient to offer the
>>>>>>> xxxTag()
>>>>>>>>>>>> method if the user only needs one label. I would love to have
>>>>>>> both of
>>>>>>>>>>> them.
>>>>>>>>>>>> Another thought is that tag implicitly contains the meaning
>>>>> of
>>>>>>>>>>> "immutable".
>>>>>>>>>>>> 
>>>>>>>>>>>> - +1 for a separate FLIP of customized restart strategy.
>>>>>>> Attention
>>>>>>>>>> should
>>>>>>>>>>>> be taken to make sure it works well with Flink built-in
>>>>>>>>> restartStrategy
>>>>>>>>>>> in
>>>>>>>>>>>> order to have the single source of truth.
>>>>>>>>>>>> 
>>>>>>>>>>>> - execution order. The default independent execution should
>>>>> be
>>>>>>> fine.
>>>>>>>>>>>> According to the FailureListener interface definition in the
>>>>>>> FLIP,
>>>>>>>>>> users
>>>>>>>>>>>> should be able to easily build a listener chain[1] to offer
>>>>>>>>> sequential
>>>>>>>>>>>> execution, e.g. public FailureListener(FailureListener
>>>>>>> nextListener).
>>>>>>>>>>>> Another option is to modify the interface or provide another
>>>>>>>>> interface
>>>>>>>>>>>> alongside the current one to extend the method to support
>>>>>>>>>> ListenerChain,
>>>>>>>>>>>> i.e. void onFailure(Throwable cause, FailureListenerContext
>>>>>>> context,
>>>>>>>>>>>> ListenerChain listenerChain). Users can also mix them up.
>>>>>>>>>>>> 
>>>>>>>>>>>> - naming. Afaiu, the pluggable extension is not limited to
>>>>>>> failure
>>>>>>>>>>>> enrichment. Conceptually it can do everything for the given
>>>>>>> failure,
>>>>>>>>>> e.g.
>>>>>>>>>>>> start counting metric as the FLIP described, calling an
>>>>> external
>>>>>>>>>> system,
>>>>>>>>>>>> sending notification to slack channel, etc. you name it. It
>>>>>>> sounds to
>>>>>>>>>> me
>>>>>>>>>>>> more like a FailureActionListener - it can trigger actions
>>>>> based
>>>>>>> on
>>>>>>>>>>>> failure. Failure enrichment is one type of action.
>>>>>>>>>>>> 
>>>>>>>>>>>> Best regards,
>>>>>>>>>>>> Jing
>>>>>>>>>>>> 
>>>>>>>>>>>> [1]
>>>>>>> https://en.wikipedia.org/wiki/Chain-of-responsibility_pattern
>>>>>>>>>>>> 
>>>>>>>>>>>> On Tue, Mar 21, 2023 at 3:39 PM Matthias Pohl
>>>>>>>>>>>> <matthias.p...@aiven.io.invalid> wrote:
>>>>>>>>>>>> 
>>>>>>>>>>>>> Thanks for the proposal, Panagiotis. A lot of good points
>>>>> have
>>>>>>> been
>>>>>>>>>>> already
>>>>>>>>>>>>> shared. I just want to add my view on some of the items:
>>>>>>>>>>>>> 
>>>>>>>>>>>>> - independent execution vs ordered execution: I prefer the
>>>>>>> listeners
>>>>>>>>>>> being
>>>>>>>>>>>>> processed independently from each other because it adds less
>>>>>>>>>> complexity
>>>>>>>>>>>>> code-wise. The use case Piotr described (where you want to
>>>>> reuse
>>>>>>>>> some
>>>>>>>>>>> other
>>>>>>>>>>>>> classifier) is the only one I can think of where we actually
>>>>>>> need
>>>>>>>>>>>>> classifiers depending on each other. Supporting such a use
>>>>> case
>>>>>>>>> right
>>>>>>>>>>> from
>>>>>>>>>>>>> the start feels a bit over-engineered and could be covered
>>>>> in a
>>>>>>>>>>> follow-up
>>>>>>>>>>>>> FLIP if we really come to that point where such a feature is
>>>>>>>>> requested
>>>>>>>>>>> by
>>>>>>>>>>>>> users.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> - key/value pairs instead of plain labels: I think that's a
>>>>> good
>>>>>>>>> idea.
>>>>>>>>>>>>> key/value pairs are more expressive. +1
>>>>>>>>>>>>> 
>>>>>>>>>>>>> - extending the FLIP to cover restart strategy: I understand
>>>>>>> Gen's
>>>>>>>>>>> concern
>>>>>>>>>>>>> about introducing too many different types of plugins. But I
>>>>>>> would
>>>>>>>>>> still
>>>>>>>>>>>>> favor not extending the FLIP in this regard. A pluggable
>>>>> restart
>>>>>>>>>>> strategy
>>>>>>>>>>>>> sounds reasonable. But an error classifier and a restart
>>>>>>> strategy
>>>>>>>>> are
>>>>>>>>>>> still
>>>>>>>>>>>>> different enough to justify separate plugins, IMHO. And
>>>>>>> therefore, I
>>>>>>>>>>> would
>>>>>>>>>>>>> think that covering the restart strategy in a separate FLIP
>>>>> is
>>>>>>> the
>>>>>>>>>>> better
>>>>>>>>>>>>> option for the sake of simplicity.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> - immutable context: Passing in an immutable context and
>>>>>>> returning
>>>>>>>>>> data
>>>>>>>>>>>>> through the interface method's return value sounds like a
>>>>> better
>>>>>>>>>>> approach
>>>>>>>>>>>>> to harden the contract of the interface. +1 for that
>>>>> proposal
>>>>>>>>>>>>> 
>>>>>>>>>>>>> - async operation: I think David is right. An async
>>>>> interface
>>>>>>> makes
>>>>>>>>>> the
>>>>>>>>>>>>> listener implementations more robust when it comes to heavy
>>>>> IO
>>>>>>>>>>> operations.
>>>>>>>>>>>>> The ioExecutor can be passed through the context object. +1
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Matthias
>>>>>>>>>>>>> 
>>>>>>>>>>>>> On Tue, Mar 21, 2023 at 2:09 PM David Morávek <
>>>>>>>>>> david.mora...@gmail.com>
>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>> 
>>>>>>>>>>>>>> *@Piotr*
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> I was thinking about actually defining the order of the
>>>>>>>>>>>>>>> classifiers/handlers and not allowing them to be
>>>>> asynchronous.
>>>>>>>>>>>>>>> Asynchronousity would create some problems: when to
>>>>> actually
>>>>>>>>> return
>>>>>>>>>>> the
>>>>>>>>>>>>>>> error to the user? After all async responses will get
>>>>> back?
>>>>>>>>> Before,
>>>>>>>>>>> but
>>>>>>>>>>>>>>> without classified exception? It would also add
>>>>> implementation
>>>>>>>>>>>>> complexity
>>>>>>>>>>>>>>> and I think we can always expand the API with async
>>>>> version
>>>>>>> in the
>>>>>>>>>>>>> future
>>>>>>>>>>>>>>> if needed.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> As long as the classifiers need to talk to an external
>>>>> system,
>>>>>>> we
>>>>>>>>> by
>>>>>>>>>>>>>> definition need to allow them to be asynchronous to
>>>>> unblock the
>>>>>>>>> main
>>>>>>>>>>>>> thread
>>>>>>>>>>>>>> for handling other RPCs. Exposing ioExecutor via the
>>>>> context
>>>>>>>>> proposed
>>>>>>>>>>>>> above
>>>>>>>>>>>>>> would be great.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> After all async responses will get back
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> This would be the same if we trigger them synchronously
>>>>> one by
>>>>>>> one,
>>>>>>>>>>> with
>>>>>>>>>>>>> a
>>>>>>>>>>>>>> caveat that synchronous execution might take significantly
>>>>>>> longer
>>>>>>>>> and
>>>>>>>>>>>>>> introduce unnecessary downtime to a job.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> D.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> On Tue, Mar 21, 2023 at 1:12 PM Zhu Zhu <reed...@gmail.com
>>>>>> 
>>>>>>> wrote:
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> Hi Piotr,
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> It's fine to me to have a separate FLIP to extend this
>>>>>>>>>>>>> `FailureListener`
>>>>>>>>>>>>>>> to support custom restart strategy.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> What I was a bit concerned is that if we just treat the
>>>>>>>>>>>>> `FailureListener`
>>>>>>>>>>>>>>> as an error classifier which is not crucial to Flink
>>>>> framework
>>>>>>>>>>> process,
>>>>>>>>>>>>>>> we may design it to run asynchronously and not trigger
>>>>> Flink
>>>>>>>>>> failures.
>>>>>>>>>>>>>>> This may be a blocker if later we want to enable it to
>>>>> support
>>>>>>>>>> custom
>>>>>>>>>>>>>>> restart strategy.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>> Zhu
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> Dian Fu <dian0511...@gmail.com> 于2023年3月21日周二 19:53写道:
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Hi Panagiotis,
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Thanks for the proposal. This is a very valuable feature
>>>>> and
>>>>>>> will
>>>>>>>>>> be
>>>>>>>>>>>>> a
>>>>>>>>>>>>>>> good
>>>>>>>>>>>>>>>> add-on for Flink.
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> I also think that it will be great if we can consider
>>>>> how to
>>>>>>> make
>>>>>>>>>> it
>>>>>>>>>>>>>>>> possible for users to customize the failure handling in
>>>>> this
>>>>>>>>> FLIP.
>>>>>>>>>>>>> It's
>>>>>>>>>>>>>>>> highly related to the problem we want to address in this
>>>>>>> FLIP and
>>>>>>>>>>>>> could
>>>>>>>>>>>>>>>> avoid refactoring the interfaces proposed in this FLIP
>>>>> too
>>>>>>>>> quickly.
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Currently it treats all kinds of exceptions the same.
>>>>>>> However,
>>>>>>>>> some
>>>>>>>>>>>>>> kinds
>>>>>>>>>>>>>>>> of exceptions are actually not recoverable at all. It
>>>>> could
>>>>>>> let
>>>>>>>>>> users
>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>> customize the failure handling logic to fail fast for
>>>>> certain
>>>>>>>>> known
>>>>>>>>>>>>>>>> unrecoverable exceptions and finally make these kinds of
>>>>>>> jobs get
>>>>>>>>>>>>>> noticed
>>>>>>>>>>>>>>>> and recoveried more quickly.
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Regards,
>>>>>>>>>>>>>>>> Dian
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> On Tue, Mar 21, 2023 at 4:36 PM Gen Luo <
>>>>> luogen...@gmail.com
>>>>>>>> 
>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> Hi Panagiotis,
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> Thanks for the proposal.
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> It's useful to enrich the information so that users can
>>>>> be
>>>>>>> more
>>>>>>>>>>>>>>>>> clear why the job is failing, especially platform
>>>>>>> developers who
>>>>>>>>>>>>>>>>> need to provide the information to their end users.
>>>>>>>>>>>>>>>>> And for the very FLIP, I'd prefer the naming
>>>>>>> `FailureEnricher`
>>>>>>>>>>>>>>>>> proposed by David, as the plugin doesn't really handle
>>>>> the
>>>>>>>>>> failure.
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> However, like Zhu and Lijie said, I also joined a
>>>>> discussion
>>>>>>>>>>>>>>>>> recently about customized failure handling, e.g.
>>>>> counting
>>>>>>> the
>>>>>>>>>>>>>>>>> failure rate of pipeline regions separately, and failing
>>>>>>> the job
>>>>>>>>>>>>>>>>> when a specific error occurs, and so on.
>>>>>>>>>>>>>>>>> I suppose a custom restart strategy, or I'd call it a
>>>>> custom
>>>>>>>>>>>>>>>>> failure "handler", is indeed necessary. It can also
>>>>> enrich
>>>>>>> the
>>>>>>>>>>>>>>>>> information as the current proposed handler does.
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> To avoid adding too many plugin interfaces which may
>>>>> confuse
>>>>>>>>> users
>>>>>>>>>>>>>>>>> and make the ExecutionFailureHandler more complex,
>>>>>>>>>>>>>>>>> I think it'd be better to consider the requirements at
>>>>> the
>>>>>>> same
>>>>>>>>>>>>> time.
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> IMO, we can add a handler interface, then make the
>>>>> current
>>>>>>>>> restart
>>>>>>>>>>>>>>>>> strategy and the enricher both types of the handler. The
>>>>>>>>> handlers
>>>>>>>>>>>>>>>>> execute in sequence, and the failure is considered
>>>>>>> unrecoverable
>>>>>>>>>> if
>>>>>>>>>>>>>>>>> any of the handlers decides.
>>>>>>>>>>>>>>>>> In this way, users can also implement a handler using
>>>>> the
>>>>>>>>> enriched
>>>>>>>>>>>>>>>>> information provided by the previous handlers, e.g. fail
>>>>>>> the job
>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>> send a notification if too many failures are caused by
>>>>> the
>>>>>>> end
>>>>>>>>>>>>> users.
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>> Gen
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> On Tue, Mar 21, 2023 at 11:38 AM Weihua Hu <
>>>>>>>>>> huweihua....@gmail.com
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> Hi Panagiotis,
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> Thanks for your proposal. It is valuable to analyze the
>>>>>>> reason
>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>> failure with the user plug-in.
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> Making the context immutable could make the contract
>>>>>>> stronger.
>>>>>>>>>>>>>>>>>> Letting the listener return an enriching result may be
>>>>> a
>>>>>>> better
>>>>>>>>>>>>>> way.
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> IIUC, listeners could do two things, enrich more
>>>>>>> information
>>>>>>>>>>>>>>>>> (tags/labels)
>>>>>>>>>>>>>>>>>> to FailureHandlingResult, and push data out of Flink
>>>>>>> (metrics
>>>>>>>>> or
>>>>>>>>>>>>>>>>>> something).
>>>>>>>>>>>>>>>>>> IMO, we could split these two types into Listener and
>>>>>>> Advisor
>>>>>>>>>>>>>> (maybe
>>>>>>>>>>>>>>>>>> other names). The Listener just pushes the data out and
>>>>>>> returns
>>>>>>>>>>>>>>> nothing
>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>> Flink, so we can run these async and don't have to
>>>>> wait for
>>>>>>>>>>>>>>> Listener's
>>>>>>>>>>>>>>>>>> result.
>>>>>>>>>>>>>>>>>> The Advisor returns rich information to the
>>>>>>>>> FailureHadingResult,
>>>>>>>>>>>>>>> and it
>>>>>>>>>>>>>>>>>> should
>>>>>>>>>>>>>>>>>> have a lighter logic.
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> Supporting a custom restart strategy is also valuable.
>>>>> In
>>>>>>> this
>>>>>>>>>>>>>>> design, we
>>>>>>>>>>>>>>>>>> use
>>>>>>>>>>>>>>>>>> RestartStrategy to construct a FailureHandingResult,
>>>>> and
>>>>>>> then
>>>>>>>>>>>>> pass
>>>>>>>>>>>>>>> it to
>>>>>>>>>>>>>>>>>> Listener.
>>>>>>>>>>>>>>>>>> My question is, should we change the restart strategy
>>>>>>> interface
>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>> support
>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>> custom restart strategy, or keep the current restart
>>>>>>> strategy
>>>>>>>>> and
>>>>>>>>>>>>>>> let the
>>>>>>>>>>>>>>>>>> later
>>>>>>>>>>>>>>>>>> Listener enrich the restartable information to
>>>>>>>>>>>>>> FailureHandingResult?
>>>>>>>>>>>>>>> The
>>>>>>>>>>>>>>>>>> latter
>>>>>>>>>>>>>>>>>> may cause some confusion when we use a custom restart
>>>>>>> strategy.
>>>>>>>>>>>>>>>>>> The default flink restart strategy also runs but does
>>>>> not
>>>>>>> take
>>>>>>>>>>>>>>> effect.
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>> Weihua
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> On Mon, Mar 20, 2023 at 11:42 PM Lijie Wang <
>>>>>>>>>>>>>>> wangdachui9...@gmail.com>
>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> Hi Panagiotis,
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> Thanks for driving this.
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> +1 for supporting custom restart strategy, we did
>>>>> receive
>>>>>>> such
>>>>>>>>>>>>>>> requests
>>>>>>>>>>>>>>>>>>> from the user mailing list [1][2].
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> Besides, in current design, the plugin will only do
>>>>> some
>>>>>>>>>>>>>>> statistical
>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>> classification work, and will not affect the
>>>>>>>>>>>>>>> *FailureHandlingResult*.
>>>>>>>>>>>>>>>>>> Just
>>>>>>>>>>>>>>>>>>> listening, no handling, it doesn't quite match the
>>>>> title.
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> [1]
>>>>>>>>>>>>>>> 
>>>>>>> https://lists.apache.org/thread/ch3s4jhh09wnff3tscqnb6btp2zlp2r1
>>>>>>>>>>>>>>>>>>> [2]
>>>>>>>>>>>>>>> 
>>>>>>> https://lists.apache.org/thread/lwjfdr7c1ypo77r4rwojdk7kxx2sw4sx
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>> Lijie
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> Zhu Zhu <reed...@gmail.com> 于2023年3月20日周一 21:39写道:
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> Hi Panagiotis,
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> Thanks for creating this proposal! It's good to
>>>>> enable
>>>>>>> Flink
>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>> handle
>>>>>>>>>>>>>>>>>>>> different errors in different ways, through a
>>>>> pluggable
>>>>>>> way.
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> There are requests for flexible restart strategies
>>>>> from
>>>>>>> time
>>>>>>>>>>>>> to
>>>>>>>>>>>>>>> time,
>>>>>>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>> different strategies of restart backoff time, or to
>>>>>>> suppress
>>>>>>>>>>>>>>>>> restarting
>>>>>>>>>>>>>>>>>>>> on certain errors. Therefore, I think it's better
>>>>> that
>>>>>>> the
>>>>>>>>>>>>>>> proposed
>>>>>>>>>>>>>>>>>>>> failure handling plugin can also support custom
>>>>> restart
>>>>>>>>>>>>>>> strategies.
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> Maybe we can call it FailureHandlingAdvisor which
>>>>>>> provides
>>>>>>>>>>>>> more
>>>>>>>>>>>>>>>>>>>> information (labels) and gives advice (restart
>>>>> backoff
>>>>>>> time,
>>>>>>>>>>>>>>> whether
>>>>>>>>>>>>>>>>>>>> to restart)? I do not have a strong opinion though,
>>>>> any
>>>>>>>>>>>>>>> explanatory
>>>>>>>>>>>>>>>>>>>> name would be good.
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> To avoid unexpected mutation, how about to make the
>>>>>>> context
>>>>>>>>>>>>>>> immutable
>>>>>>>>>>>>>>>>>>>> and let the plugin return an immutable result? i.e.
>>>>>>> remove
>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>> setters
>>>>>>>>>>>>>>>>>>>> from the context, and let the plugin method return a
>>>>>>> result
>>>>>>>>>>>>>> which
>>>>>>>>>>>>>>>>>>>> contains `labels`, `canRestart` and
>>>>> `restartBackoffTime`.
>>>>>>>>>>>>> Flink
>>>>>>>>>>>>>>>>> should
>>>>>>>>>>>>>>>>>>>> apply the result to the context before invoking the
>>>>> next
>>>>>>>>>>>>>> plugin,
>>>>>>>>>>>>>>> so
>>>>>>>>>>>>>>>>>>>> that the next plugin will see the updated context.
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> The plugin should avoid taking too much time to
>>>>> return
>>>>>>> the
>>>>>>>>>>>>>>> result,
>>>>>>>>>>>>>>>>>>> because
>>>>>>>>>>>>>>>>>>>> it will block the RPC and result in instability.
>>>>>>> However, it
>>>>>>>>>>>>>> can
>>>>>>>>>>>>>>>>> still
>>>>>>>>>>>>>>>>>>>> perform heavy actions in a different thread. The
>>>>> context
>>>>>>> can
>>>>>>>>>>>>>>> provide
>>>>>>>>>>>>>>>>> an
>>>>>>>>>>>>>>>>>>>> `ioExecutor` to the plugins for reuse.
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>>> Zhu
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> Shammon FY <zjur...@gmail.com> 于2023年3月20日周一
>>>>> 20:21写道:
>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> Hi Panagiotis
>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> Thank you for your answer. I agree that
>>>>>>> `FailureListener`
>>>>>>>>>>>>>>> could be
>>>>>>>>>>>>>>>>>>>>> stateless, then I have some thoughts as follows
>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> 1. I see that listeners and tag collections are
>>>>>>> associated.
>>>>>>>>>>>>>>> When
>>>>>>>>>>>>>>>>>>>> JobManager
>>>>>>>>>>>>>>>>>>>>> fails and restarts, how can the new listener be
>>>>>>> associated
>>>>>>>>>>>>>>> with the
>>>>>>>>>>>>>>>>>> tag
>>>>>>>>>>>>>>>>>>>>> collection before failover? Is the listener loading
>>>>>>> order?
>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> 2. The tag collection may be too large, resulting
>>>>> in the
>>>>>>>>>>>>>>> JobManager
>>>>>>>>>>>>>>>>>>> OOM,
>>>>>>>>>>>>>>>>>>>> do
>>>>>>>>>>>>>>>>>>>>> we need to provide a management class that supports
>>>>> some
>>>>>>>>>>>>>>>>> obsolescence
>>>>>>>>>>>>>>>>>>>>> strategies instead of a direct Collection?
>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> 3. Is it possible to provide a more complex data
>>>>>>> structure
>>>>>>>>>>>>>>> than a
>>>>>>>>>>>>>>>>>>> simple
>>>>>>>>>>>>>>>>>>>>> string collection for tags in listeners, such as
>>>>>>> key-value?
>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>> Shammon FY
>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> On Mon, Mar 20, 2023 at 7:48 PM Leonard Xu <
>>>>>>>>>>>>>> xbjt...@gmail.com>
>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> Hi,Panagiotis
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> Thank you for kicking off this discussion.
>>>>> Overall, the
>>>>>>>>>>>>>>> proposed
>>>>>>>>>>>>>>>>>>>> feature of
>>>>>>>>>>>>>>>>>>>>>> this FLIP makes sense to me. We have also discussed
>>>>>>>>>>>>> similar
>>>>>>>>>>>>>>>>>>>> requirements
>>>>>>>>>>>>>>>>>>>>>> with our users and developers, and I believe it
>>>>> will
>>>>>>> help
>>>>>>>>>>>>>>> many
>>>>>>>>>>>>>>>>>> users.
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> In terms of FLIP content, I have some thoughts:
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> (1) For the FailureListenerContextget interface,
>>>>> the
>>>>>>>>>>>>>> methods
>>>>>>>>>>>>>>>>>>>>>> FailureListenerContext#addTag and
>>>>>>>>>>>>>>> FailureListenerContextgetTags
>>>>>>>>>>>>>>>>>> looks
>>>>>>>>>>>>>>>>>>>> very
>>>>>>>>>>>>>>>>>>>>>> inconsistent because they imply specific
>>>>> implementation
>>>>>>>>>>>>>>> details,
>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>> not
>>>>>>>>>>>>>>>>>>>>>> all FailureListeners need to handle them, we
>>>>> shouldn't
>>>>>>>>>>>>> put
>>>>>>>>>>>>>>> them
>>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>> interface. Minor: The comment "UDF loading" in the
>>>>>>>>>>>>>>>>>>> getUserClassLoader()
>>>>>>>>>>>>>>>>>>>>>> method looks like a typo, IIUC it should return the
>>>>>>>>>>>>>>> classloader
>>>>>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>> current job.
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> (2) Regarding the implementation in
>>>>>>>>>>>>>>>>>>>> ExecutionFailureHandler#handleFailure,
>>>>>>>>>>>>>>>>>>>>>> some custom listeners may have heavy IO operations,
>>>>>>> such
>>>>>>>>>>>>> as
>>>>>>>>>>>>>>>>>> reporting
>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>> their monitoring system. The current logic appears
>>>>> to
>>>>>>> be
>>>>>>>>>>>>>>>>> processing
>>>>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>> JobMaster's main thread, and it is recommended not
>>>>> to
>>>>>>> do
>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>> kind
>>>>>>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>>>>> processing in the main thread.
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> (3) The results of FailureListener's processing
>>>>> and the
>>>>>>>>>>>>>>>>>>>>>> FailureHandlingResult returned by
>>>>>>> ExecutionFailureHandler
>>>>>>>>>>>>>>> are not
>>>>>>>>>>>>>>>>>>>> related.
>>>>>>>>>>>>>>>>>>>>>> I think these two are closely related, the
>>>>> motivation
>>>>>>> of
>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>> FLIP
>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>> make current failure handling more flexible. From
>>>>> this
>>>>>>>>>>>>>>>>> perspective,
>>>>>>>>>>>>>>>>>>>>>> different listeners should have the opportunity to
>>>>>>> affect
>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>> job's
>>>>>>>>>>>>>>>>>>>> failure
>>>>>>>>>>>>>>>>>>>>>> handling flow. For example, a Flink job is
>>>>> configured
>>>>>>>>>>>>> with
>>>>>>>>>>>>>> a
>>>>>>>>>>>>>>>>>>>>>> RestartStrategy with huge numbers retry , but the
>>>>> Kafka
>>>>>>>>>>>>>>> topic of
>>>>>>>>>>>>>>>>>>>> Source has
>>>>>>>>>>>>>>>>>>>>>> been deleted, the job will failover continuously.
>>>>> In
>>>>>>> this
>>>>>>>>>>>>>>> case,
>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>> user
>>>>>>>>>>>>>>>>>>>>>> should have their listener to determine whether
>>>>> this
>>>>>>>>>>>>>> failure
>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>> recoverable
>>>>>>>>>>>>>>>>>>>>>> or unrecoverable, and then wrap the processing
>>>>> result
>>>>>>>>>>>>> into
>>>>>>>>>>>>>>>>>>>>>> FailureHandlingResult.unrecoverable(xx) and pass
>>>>> it to
>>>>>>>>>>>>>>> JobMaster,
>>>>>>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>>>>> approach will be more flexible.
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> (4) All FLIPs have an important section named
>>>>> Public
>>>>>>>>>>>>>>> Interfaces.
>>>>>>>>>>>>>>>>>>>> Current
>>>>>>>>>>>>>>>>>>>>>> FLIP mixes the interface section and the
>>>>> implementation
>>>>>>>>>>>>>>> section
>>>>>>>>>>>>>>>>>>>> together.
>>>>>>>>>>>>>>>>>>>>>> It is better for us to refer to the FLIP
>>>>> template[1]
>>>>>>> and
>>>>>>>>>>>>>>> separate
>>>>>>>>>>>>>>>>>>> them,
>>>>>>>>>>>>>>>>>>>>>> this will make the entire FLIP clearer.
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> In addition, regarding the FLIP process, there is a
>>>>>>> small
>>>>>>>>>>>>>>>>>> suggestion:
>>>>>>>>>>>>>>>>>>>> The
>>>>>>>>>>>>>>>>>>>>>> community generally creates a JIRA issue after the
>>>>> FLIP
>>>>>>>>>>>>>> vote
>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>> passed,
>>>>>>>>>>>>>>>>>>>>>> instead of during the FLIP preparation phase
>>>>> because
>>>>>>> the
>>>>>>>>>>>>>>> FLIP may
>>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>>> rejected. Although this FLIP is very reasonable,
>>>>> it's
>>>>>>>>>>>>>> better
>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>> follow
>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>> process.
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> Leonard
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> [1]
>>>>>>>>>>>>>>>>>> 
>>>>>>>>> https://cwiki.apache.org/confluence/display/FLINK/FLIP+Template
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> On Mon, Mar 20, 2023 at 7:04 PM David Morávek <
>>>>>>>>>>>>>>> d...@apache.org>
>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> however listeners can use previous state
>>>>>>>>>>>>> (tags/labels)
>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>> make
>>>>>>>>>>>>>>>>>>>>>> decisions
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> That sounds like a very fragile contract. We
>>>>> should
>>>>>>>>>>>>>> either
>>>>>>>>>>>>>>>>> allow
>>>>>>>>>>>>>>>>>>>> passing
>>>>>>>>>>>>>>>>>>>>>>> tags between listeners and then need to define
>>>>>>> ordering
>>>>>>>>>>>>>> or
>>>>>>>>>>>>>>> make
>>>>>>>>>>>>>>>>>> all
>>>>>>>>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>>>>> them
>>>>>>>>>>>>>>>>>>>>>>> independent. I prefer the latter because it
>>>>> allows us
>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>> parallelize
>>>>>>>>>>>>>>>>>>>>>> things
>>>>>>>>>>>>>>>>>>>>>>> if needed (if all listeners trigger an RCP to the
>>>>>>>>>>>>>> external
>>>>>>>>>>>>>>>>>> system,
>>>>>>>>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>>>>> example).
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> Can you expand on why we need more than one
>>>>> classifier
>>>>>>>>>>>>> to
>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>> able
>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>> output
>>>>>>>>>>>>>>>>>>>>>>> the same tag?
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> system ones come first and then the ones loaded
>>>>> from
>>>>>>>>>>>>> the
>>>>>>>>>>>>>>> plugin
>>>>>>>>>>>>>>>>>>>> manager
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> Since they're returned as a Set, the order is
>>>>>>>>>>>>> completely
>>>>>>>>>>>>>>>>>>>>>> non-deterministic,
>>>>>>>>>>>>>>>>>>>>>>> no matter in which order they're loaded.
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> just communicating with external
>>>>> monitoring/alerting
>>>>>>>>>>>>>>> systems
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> That makes the need for pushing things out of the
>>>>> main
>>>>>>>>>>>>>>> thread
>>>>>>>>>>>>>>>>>> even
>>>>>>>>>>>>>>>>>>>>>>> stronger. This almost sounds like we need to
>>>>> return a
>>>>>>>>>>>>>>>>>>>> CompletableFuture
>>>>>>>>>>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>>>>> the per-throwable classification because an
>>>>> external
>>>>>>>>>>>>>> system
>>>>>>>>>>>>>>>>> might
>>>>>>>>>>>>>>>>>>>> take a
>>>>>>>>>>>>>>>>>>>>>>> significant time to respond. We need to unblock
>>>>> the
>>>>>>>>>>>>> main
>>>>>>>>>>>>>>> thread
>>>>>>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>> other
>>>>>>>>>>>>>>>>>>>>>>> RPCs.
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> Also, in the proposal, this happens in the failure
>>>>>>>>>>>>>>> handler. If
>>>>>>>>>>>>>>>>>>>> that's the
>>>>>>>>>>>>>>>>>>>>>>> case, this might block the job from being
>>>>> restarted
>>>>>>> (if
>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>> restart
>>>>>>>>>>>>>>>>>>>>>>> strategy allows for another restart), which would
>>>>> be
>>>>>>>>>>>>>> great
>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>> avoid
>>>>>>>>>>>>>>>>>>>>>> because
>>>>>>>>>>>>>>>>>>>>>>> it can introduce extra downtime.
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> This raises another question: what should happen
>>>>> if
>>>>>>> the
>>>>>>>>>>>>>>>>>>>> classification
>>>>>>>>>>>>>>>>>>>>>>> fails? Crashing the job (which is what's currently
>>>>>>>>>>>>>>> proposed)
>>>>>>>>>>>>>>>>>> seems
>>>>>>>>>>>>>>>>>>>> very
>>>>>>>>>>>>>>>>>>>>>>> dangerous if this might depend on an external
>>>>> system.
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> Thats a valid point, passing the JobGraph
>>>>> containing
>>>>>>>>>>>>> all
>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>> above
>>>>>>>>>>>>>>>>>>>>>>>> information is also something to consider
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> We should avoid passing JG around because it's
>>>>> mutable
>>>>>>>>>>>>>>> (which
>>>>>>>>>>>>>>>>> we
>>>>>>>>>>>>>>>>>>>> must fix
>>>>>>>>>>>>>>>>>>>>>>> in the long term), and letting users change it
>>>>> might
>>>>>>>>>>>>> have
>>>>>>>>>>>>>>>>>>>> consequences.
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>> D.
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> On Mon, Mar 20, 2023 at 7:23 AM Panagiotis
>>>>> Garefalakis
>>>>>>>>>>>>> <
>>>>>>>>>>>>>>>>>>>>>> pga...@apache.org>
>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> Hey David, Shammon,
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> Thanks for the valuable comments!
>>>>>>>>>>>>>>>>>>>>>>>> I am glad you find this proposal useful, some
>>>>>>>>>>>>> thoughts:
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> @Shammon
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 1. How about adding more job information in
>>>>>>>>>>>>>>>>>>>> FailureListenerContext? For
>>>>>>>>>>>>>>>>>>>>>>>>> example, job vertext, subtask, taskmanager
>>>>>>>>>>>>> location.
>>>>>>>>>>>>>>> And
>>>>>>>>>>>>>>>>> then
>>>>>>>>>>>>>>>>>>>> user
>>>>>>>>>>>>>>>>>>>>>> can
>>>>>>>>>>>>>>>>>>>>>>> do
>>>>>>>>>>>>>>>>>>>>>>>>> more statistics according to different
>>>>> dimensions.
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> Thats a valid point, passing the JobGraph
>>>>> containing
>>>>>>>>>>>>>> all
>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>> above
>>>>>>>>>>>>>>>>>>>>>>>> information
>>>>>>>>>>>>>>>>>>>>>>>> is also something to consider, I was mostly
>>>>> trying to
>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>> conservative:
>>>>>>>>>>>>>>>>>>>>>>>> i.e., passingly only the information we need, and
>>>>>>>>>>>>>> extend
>>>>>>>>>>>>>>> as
>>>>>>>>>>>>>>>>> we
>>>>>>>>>>>>>>>>>>> see
>>>>>>>>>>>>>>>>>>>> fit
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 2. Users may want to save results in listener,
>>>>> and
>>>>>>>>>>>>> then
>>>>>>>>>>>>>>> they
>>>>>>>>>>>>>>>>>> can
>>>>>>>>>>>>>>>>>>>> get
>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>> historical results even jabmanager failover.
>>>>> Can we
>>>>>>>>>>>>>>>>> provide a
>>>>>>>>>>>>>>>>>>>> unified
>>>>>>>>>>>>>>>>>>>>>>>>> implementation for data storage requirements?
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> The idea is to store only the output of the
>>>>> Listeners
>>>>>>>>>>>>>>> (tags)
>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>> treat
>>>>>>>>>>>>>>>>>>>>>>> them
>>>>>>>>>>>>>>>>>>>>>>>> as stateless.
>>>>>>>>>>>>>>>>>>>>>>>> Tags are be stored along with HistoryEntries, and
>>>>>>>>>>>>> will
>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>> available
>>>>>>>>>>>>>>>>>>>>>>> through
>>>>>>>>>>>>>>>>>>>>>>>> the HistoryServer
>>>>>>>>>>>>>>>>>>>>>>>> even after a JM dies.
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> @David
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 1) Should we also consider adding labels? The
>>>>>>>>>>>>>>> combination of
>>>>>>>>>>>>>>>>>> tags
>>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>>> labels seems to be what most systems offer;
>>>>>>>>>>>>>> sometimes,
>>>>>>>>>>>>>>> they
>>>>>>>>>>>>>>>>>>> offer
>>>>>>>>>>>>>>>>>>>>>>> labels
>>>>>>>>>>>>>>>>>>>>>>>>> only (key=value pairs) because tags can be
>>>>>>>>>>>>>> implemented
>>>>>>>>>>>>>>>>> using
>>>>>>>>>>>>>>>>>>>> those,
>>>>>>>>>>>>>>>>>>>>>> but
>>>>>>>>>>>>>>>>>>>>>>>> not
>>>>>>>>>>>>>>>>>>>>>>>>> the other way around.
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> Indeed changing tags to k:v labels could be more
>>>>>>>>>>>>>>> expressive,
>>>>>>>>>>>>>>>>> I
>>>>>>>>>>>>>>>>>>>> like it!
>>>>>>>>>>>>>>>>>>>>>>>> Let's see what others think.
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 2) Since we can not predict how heavy
>>>>> user-defined
>>>>>>>>>>>>>> models
>>>>>>>>>>>>>>>>>>>> ("listeners")
>>>>>>>>>>>>>>>>>>>>>>> are
>>>>>>>>>>>>>>>>>>>>>>>>> going to be, it would be great to keep the
>>>>>>>>>>>>>>> interfaces/data
>>>>>>>>>>>>>>>>>>>> structures
>>>>>>>>>>>>>>>>>>>>>>>>> immutable so we can push things over to the I/O
>>>>>>>>>>>>>>> threads.
>>>>>>>>>>>>>>>>>> Also,
>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>>>> sounds
>>>>>>>>>>>>>>>>>>>>>>>>> off to call the main interface a Listener since
>>>>>>>>>>>>> it's
>>>>>>>>>>>>>>>>> supposed
>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>> enhance
>>>>>>>>>>>>>>>>>>>>>>>>> the original throwable with additional metadata.
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> The idea was for the name to be generic as there
>>>>>>>>>>>>> could
>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>> Listener
>>>>>>>>>>>>>>>>>>>>>>>> implementations
>>>>>>>>>>>>>>>>>>>>>>>> just communicating with external
>>>>> monitoring/alerting
>>>>>>>>>>>>>>> systems
>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>> no
>>>>>>>>>>>>>>>>>>>>>>>> metadata output
>>>>>>>>>>>>>>>>>>>>>>>> -- but lets rethink that. For immutability, see
>>>>>>>>>>>>> below:
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 3) You're proposing to support a set of
>>>>> listeners.
>>>>>>>>>>>>>> Since
>>>>>>>>>>>>>>>>> you're
>>>>>>>>>>>>>>>>>>>> passing
>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>> mutable context around, which includes tags set
>>>>> by
>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>> previous
>>>>>>>>>>>>>>>>>>>>>>> listener,
>>>>>>>>>>>>>>>>>>>>>>>>> do you expect users to make any assumptions
>>>>> about
>>>>>>>>>>>>> the
>>>>>>>>>>>>>>> order
>>>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>>> which
>>>>>>>>>>>>>>>>>>>>>>>>> listeners are executed?
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> In the existing proposal we are not making any
>>>>>>>>>>>>>>> assumptions
>>>>>>>>>>>>>>>>>> about
>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>> order
>>>>>>>>>>>>>>>>>>>>>>>> of listeners,
>>>>>>>>>>>>>>>>>>>>>>>> (system ones come first and then the ones loaded
>>>>> from
>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>> plugin
>>>>>>>>>>>>>>>>>>>>>> manager)
>>>>>>>>>>>>>>>>>>>>>>>> however listeners can use previous state
>>>>>>>>>>>>> (tags/labels)
>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>> make
>>>>>>>>>>>>>>>>>>>>>> decisions:
>>>>>>>>>>>>>>>>>>>>>>>> e.g., wont assign *UNKNOWN* failureType when we
>>>>> have
>>>>>>>>>>>>>>> already
>>>>>>>>>>>>>>>>>> seen
>>>>>>>>>>>>>>>>>>>> *USER
>>>>>>>>>>>>>>>>>>>>>>> *or
>>>>>>>>>>>>>>>>>>>>>>>> the other way around -- when we have seen
>>>>> *UNKNOWN*
>>>>>>>>>>>>>>> remove in
>>>>>>>>>>>>>>>>>>>> favor of
>>>>>>>>>>>>>>>>>>>>>>>> *USER*
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> Cheers,
>>>>>>>>>>>>>>>>>>>>>>>> Panagiotis
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> On Sun, Mar 19, 2023 at 10:42 AM David Morávek <
>>>>>>>>>>>>>>>>>> d...@apache.org>
>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> Hi Panagiotis,
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> This is an excellent proposal and something
>>>>>>>>>>>>> everyone
>>>>>>>>>>>>>>> trying
>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>> provide
>>>>>>>>>>>>>>>>>>>>>>>>> "Flink as a service" needs to solve at some
>>>>> point.
>>>>>>>>>>>>> I
>>>>>>>>>>>>>>> have a
>>>>>>>>>>>>>>>>>>>> couple of
>>>>>>>>>>>>>>>>>>>>>>>>> questions:
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> If I understand the proposal correctly, this is
>>>>>>>>>>>>> just
>>>>>>>>>>>>>>> about
>>>>>>>>>>>>>>>>>>> adding
>>>>>>>>>>>>>>>>>>>>>> tags
>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>> the Throwable by running a tuple of (Throwable,
>>>>>>>>>>>>>>>>>> FailureContext)
>>>>>>>>>>>>>>>>>>>>>>> through a
>>>>>>>>>>>>>>>>>>>>>>>>> user-defined model.
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> 1) Should we also consider adding labels? The
>>>>>>>>>>>>>>> combination
>>>>>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>>> tags and
>>>>>>>>>>>>>>>>>>>>>>>>> labels seems to be what most systems offer;
>>>>>>>>>>>>>> sometimes,
>>>>>>>>>>>>>>> they
>>>>>>>>>>>>>>>>>>> offer
>>>>>>>>>>>>>>>>>>>>>>> labels
>>>>>>>>>>>>>>>>>>>>>>>>> only (key=value pairs) because tags can be
>>>>>>>>>>>>>> implemented
>>>>>>>>>>>>>>>>> using
>>>>>>>>>>>>>>>>>>>> those,
>>>>>>>>>>>>>>>>>>>>>> but
>>>>>>>>>>>>>>>>>>>>>>>> not
>>>>>>>>>>>>>>>>>>>>>>>>> the other way around.
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> 2) Since we can not predict how heavy
>>>>> user-defined
>>>>>>>>>>>>>>> models
>>>>>>>>>>>>>>>>>>>>>> ("listeners")
>>>>>>>>>>>>>>>>>>>>>>>> are
>>>>>>>>>>>>>>>>>>>>>>>>> going to be, it would be great to keep the
>>>>>>>>>>>>>>> interfaces/data
>>>>>>>>>>>>>>>>>>>> structures
>>>>>>>>>>>>>>>>>>>>>>>>> immutable so we can push things over to the I/O
>>>>>>>>>>>>>>> threads.
>>>>>>>>>>>>>>>>>> Also,
>>>>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>>>>>>>>> sounds
>>>>>>>>>>>>>>>>>>>>>>>>> off to call the main interface a Listener since
>>>>>>>>>>>>> it's
>>>>>>>>>>>>>>>>> supposed
>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>> enhance
>>>>>>>>>>>>>>>>>>>>>>>>> the original throwable with additional metadata.
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> I'd propose something along the lines of (we
>>>>> should
>>>>>>>>>>>>>>> have
>>>>>>>>>>>>>>>>>> better
>>>>>>>>>>>>>>>>>>>>>> names,
>>>>>>>>>>>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>>>>>>>> is just to outline the idea):
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> interface FailureEnricher {
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> ThrowableWithTagsAndLabels
>>>>>>>>>>>>> enrichFailure(Throwable
>>>>>>>>>>>>>>> cause,
>>>>>>>>>>>>>>>>>>>>>>>>> ImmutableContextualMetadataAboutTheThrowable
>>>>>>>>>>>>>> context);
>>>>>>>>>>>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> The names should change; this is just to outline
>>>>>>>>>>>>> the
>>>>>>>>>>>>>>> idea.
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> 3) You're proposing to support a set of
>>>>> listeners.
>>>>>>>>>>>>>>> Since
>>>>>>>>>>>>>>>>>> you're
>>>>>>>>>>>>>>>>>>>>>> passing
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>> mutable context around, which includes tags set
>>>>> by
>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>> previous
>>>>>>>>>>>>>>>>>>>>>>> listener,
>>>>>>>>>>>>>>>>>>>>>>>>> do you expect users to make any assumptions
>>>>> about
>>>>>>>>>>>>> the
>>>>>>>>>>>>>>> order
>>>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>>>>>> which
>>>>>>>>>>>>>>>>>>>>>>>>> listeners are executed?
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> *@Shammon*
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> Users may want to save results in listener, and
>>>>>>>>>>>>> then
>>>>>>>>>>>>>>> they
>>>>>>>>>>>>>>>>> can
>>>>>>>>>>>>>>>>>>>> get the
>>>>>>>>>>>>>>>>>>>>>>>>>> historical results even jabmanager failover.
>>>>> Can
>>>>>>>>>>>>> we
>>>>>>>>>>>>>>>>>> provide a
>>>>>>>>>>>>>>>>>>>>>> unified
>>>>>>>>>>>>>>>>>>>>>>>>>> implementation for data storage requirements?
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> I think we should explicitly state that all
>>>>>>>>>>>>>>> "listeners" are
>>>>>>>>>>>>>>>>>>>> treated
>>>>>>>>>>>>>>>>>>>>>> as
>>>>>>>>>>>>>>>>>>>>>>>>> stateless. I don't see any strong reason for
>>>>>>>>>>>>>>> snapshotting
>>>>>>>>>>>>>>>>>> them.
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>>>> D.
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> On Sat, Mar 18, 2023 at 1:00 AM Shammon FY <
>>>>>>>>>>>>>>>>>> zjur...@gmail.com>
>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> Hi Panagiotis
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> Thank you for starting this discussion. I think
>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>> FLIP
>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>> valuable
>>>>>>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>>>> can help user to analyze the causes of job
>>>>>>>>>>>>> failover
>>>>>>>>>>>>>>>>> better!
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> I have two comments as follows
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> 1. How about adding more job information in
>>>>>>>>>>>>>>>>>>>> FailureListenerContext?
>>>>>>>>>>>>>>>>>>>>>>> For
>>>>>>>>>>>>>>>>>>>>>>>>>> example, job vertext, subtask, taskmanager
>>>>>>>>>>>>>> location.
>>>>>>>>>>>>>>> And
>>>>>>>>>>>>>>>>>> then
>>>>>>>>>>>>>>>>>>>> user
>>>>>>>>>>>>>>>>>>>>>>> can
>>>>>>>>>>>>>>>>>>>>>>>> do
>>>>>>>>>>>>>>>>>>>>>>>>>> more statistics according to different
>>>>>>>>>>>>> dimensions.
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> 2. Users may want to save results in listener,
>>>>>>>>>>>>> and
>>>>>>>>>>>>>>> then
>>>>>>>>>>>>>>>>>> they
>>>>>>>>>>>>>>>>>>>> can
>>>>>>>>>>>>>>>>>>>>>> get
>>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>> historical results even jabmanager failover.
>>>>> Can
>>>>>>>>>>>>> we
>>>>>>>>>>>>>>>>>> provide a
>>>>>>>>>>>>>>>>>>>>>> unified
>>>>>>>>>>>>>>>>>>>>>>>>>> implementation for data storage requirements?
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> Best,
>>>>>>>>>>>>>>>>>>>>>>>>>> shammon FY
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> On Saturday, March 18, 2023, Panagiotis
>>>>>>>>>>>>>> Garefalakis <
>>>>>>>>>>>>>>>>>>>>>>> pga...@apache.org
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>> Hi everyone,
>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>> This FLIP [1] proposes a pluggable interface
>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>> failure
>>>>>>>>>>>>>>>>>>>> handling
>>>>>>>>>>>>>>>>>>>>>>>>>> allowing
>>>>>>>>>>>>>>>>>>>>>>>>>>> users to implement custom failure logic using
>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>> plugin
>>>>>>>>>>>>>>>>>>>>>> framework.
>>>>>>>>>>>>>>>>>>>>>>>>>>> Motivated by existing proposals [2] and
>>>>> tickets
>>>>>>>>>>>>>>> [3],
>>>>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>>> enables
>>>>>>>>>>>>>>>>>>>>>>>>>> use-cases
>>>>>>>>>>>>>>>>>>>>>>>>>>> like: assigning particular types to failures
>>>>>>>>>>>>>> (e.g.,
>>>>>>>>>>>>>>>>> User
>>>>>>>>>>>>>>>>>> or
>>>>>>>>>>>>>>>>>>>>>>> System),
>>>>>>>>>>>>>>>>>>>>>>>>>>> emitting custom metrics per type (e.g.,
>>>>>>>>>>>>>>> application or
>>>>>>>>>>>>>>>>>>>> platform),
>>>>>>>>>>>>>>>>>>>>>>>> even
>>>>>>>>>>>>>>>>>>>>>>>>>>> exposing errors to downstream consumers (e.g.,
>>>>>>>>>>>>>>>>>> notification
>>>>>>>>>>>>>>>>>>>>>>> systems).
>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>> Thanks to Piotr and Anton for the initial
>>>>>>>>>>>>> reviews
>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>> discussions!
>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>> For anyone interested, the starting point
>>>>> would
>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>> FLIP
>>>>>>>>>>>>>>>>>>>> [1]
>>>>>>>>>>>>>>>>>>>>>>> that
>>>>>>>>>>>>>>>>>>>>>>>> I
>>>>>>>>>>>>>>>>>>>>>>>>>>> created,
>>>>>>>>>>>>>>>>>>>>>>>>>>> describing the motivation and the proposed
>>>>>>>>>>>>>> changes
>>>>>>>>>>>>>>>>> (part
>>>>>>>>>>>>>>>>>> of
>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>> core,
>>>>>>>>>>>>>>>>>>>>>>>>>>> runtime and web).
>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>> The intuition behind this FLIP is being able
>>>>> to
>>>>>>>>>>>>>>> execute
>>>>>>>>>>>>>>>>>>>> custom
>>>>>>>>>>>>>>>>>>>>>>> logic
>>>>>>>>>>>>>>>>>>>>>>>> on
>>>>>>>>>>>>>>>>>>>>>>>>>>> failures by exposing a FailureListener
>>>>>>>>>>>>> interface.
>>>>>>>>>>>>>>>>>>>> Implementation
>>>>>>>>>>>>>>>>>>>>>> by
>>>>>>>>>>>>>>>>>>>>>>>>> users
>>>>>>>>>>>>>>>>>>>>>>>>>>> can be simply loaded to the system as Jar
>>>>>>>>>>>>> files.
>>>>>>>>>>>>>>>>>>>> FailureListeners
>>>>>>>>>>>>>>>>>>>>>>> may
>>>>>>>>>>>>>>>>>>>>>>>>>> also
>>>>>>>>>>>>>>>>>>>>>>>>>>> decide to assign failure tags to errors
>>>>>>>>>>>>>> (expressed
>>>>>>>>>>>>>>> as
>>>>>>>>>>>>>>>>>>>> strings),
>>>>>>>>>>>>>>>>>>>>>>>>>>> that will then be exposed as metadata by the
>>>>>>>>>>>>>>> UI/Rest
>>>>>>>>>>>>>>>>>>>> interfaces.
>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>> Feedback is always appreciated! Looking
>>>>> forward
>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>> your
>>>>>>>>>>>>>>>>>>>> thoughts!
>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>> [1]
>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>> https://cwiki.apache.org/confluence/display/FLINK/FLIP-304%
>>>>>>>>>>>>>>>>>>>>>>>>>>> 3A+Pluggable+failure+handling+for+Apache+Flink
>>>>>>>>>>>>>>>>>>>>>>>>>>> [2]
>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>> https://docs.google.com/document/d/1pcHg9F3GoDDeVD5GIIo2wO67
>>>>>>>>>>>>>>>>>>>>>>>>>>> Hmjgy0-hRDeuFnrMgT4
>>>>>>>>>>>>>>>>>>>>>>>>>>> [3]
>>>>>>>>>>>>>>> https://issues.apache.org/jira/browse/FLINK-20833
>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>>> Cheers,
>>>>>>>>>>>>>>>>>>>>>>>>>>> Panagiotis
>>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>> 
>> 
>> 

Reply via email to