Hi, Timo, +1 for the improvement too. Thanks for the great job. Looking forward to the next progress of the FLIP, I could help on the development of some of the specific improvements.
Best, Wenlong On Mon, 13 Dec 2021 at 14:43, godfrey he <godfre...@gmail.com> wrote: > Hi Timo, > > +1 for the improvement. > > Best, > Godfrey > > Timo Walther <twal...@apache.org> 于2021年12月10日周五 20:37写道: > > > > Hi Wenlong, > > > > yes it will. Sorry for the confusion. This is a logical consequence of > > the assumption: > > > > The JSON plan contains no implementation details (i.e. no classes) and > > is fully declarative. > > > > I will add a remark. > > > > Thanks, > > Timo > > > > > > On 10.12.21 11:43, wenlong.lwl wrote: > > > hi, Timo, thanks for the explanation. I totally agree with what you > said. > > > My actual question is: Will the version of an exec node be serialised > in > > > the Json Plan? In my understanding, it is not in the former design. If > it > > > is yes, my question is solved already. > > > > > > > > > Best, > > > Wenlong > > > > > > > > > On Fri, 10 Dec 2021 at 18:15, Timo Walther <twal...@apache.org> wrote: > > > > > >> Hi Wenlong, > > >> > > >> also thought about adding a `flinkVersion` field per ExecNode. But > this > > >> is not necessary, because the `version` of the ExecNode has the same > > >> purpose. > > >> > > >> The plan version just encodes that: > > >> "plan has been updated in Flink 1.17" / "plan is entirely valid for > > >> Flink 1.17" > > >> > > >> The ExecNode version maps to `minStateVersion` to verify state > > >> compatibility. > > >> > > >> So even if the plan version is 1.17, some ExecNodes use state layout > of > > >> 1.15. > > >> > > >> It is totally fine to only update the ExecNode to version 2 and not 3 > in > > >> your example. > > >> > > >> Regards, > > >> Timo > > >> > > >> > > >> > > >> On 10.12.21 06:02, wenlong.lwl wrote: > > >>> Hi, Timo, thanks for updating the doc. > > >>> > > >>> I have a comment on plan migration: > > >>> I think we may need to add a version field for every exec node when > > >>> serialising. In earlier discussions, I think we have a conclusion > that > > >>> treating the version of plan as the version of node, but in this > case it > > >>> would be broken. > > >>> Take the following example in FLIP into consideration, there is a bad > > >> case: > > >>> when in 1.17, we introduced an incompatible version 3 and dropped > version > > >>> 1, we can only update the version to 2, so the version should be per > exec > > >>> node. > > >>> > > >>> ExecNode version *1* is not supported anymore. Even though the state > is > > >>> actually compatible. The plan restore will fail with a helpful > exception > > >>> that forces users to perform plan migration. > > >>> > > >>> COMPILE PLAN '/mydir/plan_new.json' FROM '/mydir/plan_old.json'; > > >>> > > >>> The plan migration will safely replace the old version *1* with *2. > The > > >>> JSON plan flinkVersion changes to 1.17.* > > >>> > > >>> > > >>> Best, > > >>> > > >>> Wenlong > > >>> > > >>> On Thu, 9 Dec 2021 at 18:36, Timo Walther <twal...@apache.org> > wrote: > > >>> > > >>>> Hi Jing and Godfrey, > > >>>> > > >>>> I had another iteration over the document. There are two major > changes: > > >>>> > > >>>> 1. Supported Flink Upgrade Versions > > >>>> > > >>>> I got the feedback via various channels that a step size of one > minor > > >>>> version is not very convenient. As you said, "because upgrading to > a new > > >>>> version is a time-consuming process". I rephrased this section: > > >>>> > > >>>> Upgrading usually involves work which is why many users perform this > > >>>> task rarely (e.g. only once per year). Also skipping a versions is > > >>>> common until a new feature has been introduced for which is it > worth to > > >>>> upgrade. We will support the upgrade to the most recent Flink > version > > >>>> from a set of previous versions. We aim to support upgrades from the > > >>>> last 2-3 releases on a best-effort basis; maybe even more depending > on > > >>>> the maintenance overhead. However, in order to not grow the testing > > >>>> matrix infinitely and to perform important refactoring if > necessary, we > > >>>> only guarantee upgrades with a step size of a single minor version > (i.e. > > >>>> a cascade of upgrades). > > >>>> > > >>>> 2. Annotation Design > > >>>> > > >>>> I also adopted the multiple annotations design for the previous > > >>>> supportPlanFormat. So no array of versions anymore. I reworked the > > >>>> section, please have a look with updated examples: > > >>>> > > >>>> > > >>>> > > >> > https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=191336489#FLIP190:SupportVersionUpgradesforTableAPI&SQLPrograms-ExecNodeTests > > >>>> > > >>>> I also got the feedback offline that `savepoint` might not be the > right > > >>>> terminology for the annotation. I changed that to minPlanVersion and > > >>>> minStateVersion. > > >>>> > > >>>> Let me know what you think. > > >>>> > > >>>> Regards, > > >>>> Timo > > >>>> > > >>>> > > >>>> > > >>>> On 09.12.21 08:44, Jing Zhang wrote: > > >>>>> Hi Timo, > > >>>>> Thanks a lot for driving this discussion. > > >>>>> I believe it could solve many problems what we are suffering in > > >>>> upgrading. > > >>>>> > > >>>>> I only have a little complain on the following point. > > >>>>> > > >>>>>> For simplification of the design, we assume that upgrades use a > step > > >>>> size > > >>>>> of a single minor version. We don't guarantee skipping minor > versions > > >>>> (e.g. > > >>>>> 1.11 to > > >>>>> 1.14). > > >>>>> > > >>>>> In our internal production environment, we follow up with the > > >> community's > > >>>>> latest stable release version almost once a year because upgrading > to a > > >>>> new > > >>>>> version is a time-consuming process. > > >>>>> So we might missed 1~3 version after we upgrade to the latest > version. > > >>>> This > > >>>>> might also appears in other company too. > > >>>>> Could we guarantee FLIP-190 work if we skip minor versions less > than > > >>>>> specified threshold? > > >>>>> Then we could know which version is good for us when prepare > upgrading. > > >>>>> > > >>>>> Best, > > >>>>> Jing Zhang > > >>>>> > > >>>>> godfrey he <godfre...@gmail.com> 于2021年12月8日周三 22:16写道: > > >>>>> > > >>>>>> Hi Timo, > > >>>>>> > > >>>>>> Thanks for the explanation, it's much clearer now. > > >>>>>> > > >>>>>> One thing I want to confirm about `supportedPlanFormat ` > > >>>>>> and `supportedSavepointFormat `: > > >>>>>> `supportedPlanFormat ` supports multiple versions, > > >>>>>> while `supportedSavepointFormat ` supports only one version ? > > >>>>>> A json plan can be deserialized by multiple versions > > >>>>>> because default value will be set for new fields. > > >>>>>> In theory, a Savepoint can be restored by more than one version > > >>>>>> of the operators even if a state layout is changed, > > >>>>>> such as deleting a whole state and starting job with > > >>>>>> `allowNonRestoredState`=true. > > >>>>>> I think this is a corner case, and it's hard to understand > comparing > > >>>>>> to `supportedPlanFormat ` supporting multiple versions. > > >>>>>> So, for most cases, when the state layout is changed, the > savepoint is > > >>>>>> incompatible, > > >>>>>> and `supportedSavepointFormat` and version need to be changed. > > >>>>>> > > >>>>>> I think we need a detail explanation about the annotations change > > >> story > > >>>> in > > >>>>>> the java doc of `ExecNodeMetadata` class for all developers > > >>>>>> (esp. those unfamiliar with this part). > > >>>>>> > > >>>>>> Best, > > >>>>>> Godfrey > > >>>>>> > > >>>>>> Timo Walther <twal...@apache.org> 于2021年12月8日周三 下午4:57写道: > > >>>>>>> > > >>>>>>> Hi Wenlong, > > >>>>>>> > > >>>>>>> thanks for the feedback. Great that we reached consensus here. I > will > > >>>>>>> update the entire document with my previous example shortly. > > >>>>>>> > > >>>>>>> > if we don't update the version when plan format changes, we > > >> can't > > >>>>>>> find that the plan can't not be deserialized in 1.15 > > >>>>>>> > > >>>>>>> This should not be a problem as the entire plan file has a > version as > > >>>>>>> well. We should not allow reading a 1.16 plan in 1.15. We can > throw a > > >>>>>>> helpful exception early. > > >>>>>>> > > >>>>>>> Reading a 1.15 plan in 1.16 is possible until we drop the old > > >>>>>>> `supportedPlanFormat` from one of used ExecNodes. Afterwards all > > >>>>>>> `supportedPlanFormat` of ExecNodes must be equal or higher then > the > > >>>> plan > > >>>>>>> version. > > >>>>>>> > > >>>>>>> Regards, > > >>>>>>> Timo > > >>>>>>> > > >>>>>>> On 08.12.21 03:07, wenlong.lwl wrote: > > >>>>>>>> Hi, Timo, +1 for multi metadata. > > >>>>>>>> > > >>>>>>>> The compatible change I mean in the last email is the slight > state > > >>>>>> change > > >>>>>>>> example you gave, so we have got consensus on this actually, > IMO. > > >>>>>>>> > > >>>>>>>> Another question based on the example you gave: > > >>>>>>>> In the example "JSON node gets an additional property in 1.16", > if > > >> we > > >>>>>> don't > > >>>>>>>> update the version when plan format changes, we can't find that > the > > >>>>>> plan > > >>>>>>>> can't not be deserialized in 1.15, although the savepoint state > is > > >>>>>>>> compatible. > > >>>>>>>> The error message may be not so friendly if we just throw > > >>>>>> deserialization > > >>>>>>>> failure. > > >>>>>>>> > > >>>>>>>> On Tue, 7 Dec 2021 at 16:49, Timo Walther <twal...@apache.org> > > >> wrote: > > >>>>>>>> > > >>>>>>>>> Hi Wenlong, > > >>>>>>>>> > > >>>>>>>>> > First, we add a newStateLayout because of some > improvement > > >> in > > >>>>>> state, in > > >>>>>>>>> > order to keep compatibility we may still keep the old > state > > >> for > > >>>>>> the > > >>>>>>>>> first > > >>>>>>>>> > version. We need to update the version, so that we can > > >> generate > > >>>> a > > >>>>>> new > > >>>>>>>>> > version plan for the new job and keep the exec node > > >> compatible > > >>>>>> with > > >>>>>>>>> the old > > >>>>>>>>> > version plan. > > >>>>>>>>> > > >>>>>>>>> The problem that I see here for contributors is that the actual > > >>>> update > > >>>>>>>>> of a version is more complicated than just updating an integer > > >> value. > > >>>>>> It > > >>>>>>>>> means copying a lot of ExecNode code for a change that happens > > >>>> locally > > >>>>>>>>> in an operator. Let's assume multiple ExecNodes use a similar > > >>>>>> operator. > > >>>>>>>>> Why do we need to update all ExecNode versions, if the operator > > >>>> itself > > >>>>>>>>> can deal with the incompatibility. The ExecNode version is > meant > > >> for > > >>>>>>>>> topology changes or fundamental state changes. > > >>>>>>>>> > > >>>>>>>>> If we don't find consensus on this topic, I would at least > vote for > > >>>>>>>>> supporting multiple annotations for an ExecNode class. This > way we > > >>>>>> don't > > >>>>>>>>> need to copy code but only add two ExecNode annotations with > > >>>> different > > >>>>>>>>> ExecNode versions. > > >>>>>>>>> > > >>>>>>>>> > Maybe we can add support for this case : > > >>>>>>>>> > when an exec node is changed in 1.16, but is compatible > with > > >>>> 1.15, > > >>>>>>>>> > we can use the node of 1.16 to deserialize the plan of > 1.15. > > >>>>>>>>> > > >>>>>>>>> If the ExecNode is compatible, there is no reason to increase > the > > >>>>>>>>> ExecNode version. > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> I tried to come up with a reworked solution to make all parties > > >>>> happy: > > >>>>>>>>> > > >>>>>>>>> 1. Let's assume the following annotations: > > >>>>>>>>> > > >>>>>>>>> supportedPlanFormat = [1.15] > > >>>>>>>>> > > >>>>>>>>> supportedSavepointFormat = 1.15 > > >>>>>>>>> > > >>>>>>>>> we drop `added` as it is equal to `supportedSavepointFormat` > > >>>>>>>>> > > >>>>>>>>> 2. Multiple annotations over ExecNodes are possible: > > >>>>>>>>> > > >>>>>>>>> // operator state changes > > >>>>>>>>> > > >>>>>>>>> // initial introduction in 1.15 > > >>>>>>>>> @ExecNodeMetadata(name=A, version=1, supportedPlanFormat=1.15, > > >>>>>>>>> supportedSavepointFormat=1.15) > > >>>>>>>>> > > >>>>>>>>> // state layout changed slightly in 1.16 > > >>>>>>>>> // - operator migration is possible > > >>>>>>>>> // - operator supports state of both versions and will perform > > >>>>>> operator > > >>>>>>>>> state migration > > >>>>>>>>> // - new plans will get new ExecNode version > > >>>>>>>>> @ExecNodeMetadata(name=A, version=1, supportedPlanFormat=1.15, > > >>>>>>>>> supportedSavepointFormat=1.15) > > >>>>>>>>> @ExecNodeMetadata(name=A, version=2, supportedPlanFormat=1.15, > > >>>>>>>>> supportedSavepointFormat=1.16) > > >>>>>>>>> > > >>>>>>>>> // we force a plan migration in 1.17 > > >>>>>>>>> // - we assume that all operator states have been migrated in > the > > >>>>>>>>> previous version > > >>>>>>>>> // - we can safely replace the old version `1` with `2` and > only > > >> keep > > >>>>>>>>> the new savepoint format > > >>>>>>>>> @ExecNodeMetadata(name=A, version=2, supportedPlanFormat=1.15, > > >>>>>>>>> supportedSavepointFormat=1.16) > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> // plan changes > > >>>>>>>>> > > >>>>>>>>> // initial introduction in 1.15 > > >>>>>>>>> @ExecNodeMetadata(name=A, version=1, supportedPlanFormat=1.15, > > >>>>>>>>> supportedSavepointFormat=1.15) > > >>>>>>>>> > > >>>>>>>>> // JSON node gets an additional property in 1.16 > > >>>>>>>>> // e.g. { some-prop: 42 } -> { some-prop: 42, some-flag: false} > > >>>>>>>>> // - ExecNode version does not change > > >>>>>>>>> // - ExecNode version only changes when topology or state is > > >> affected > > >>>>>>>>> // - we support both JSON plan formats, the old and the newest > one > > >>>>>>>>> @ExecNodeMetadata(name=A, version=1, supportedPlanFormat=[1.15, > > >>>> 1.16], > > >>>>>>>>> supportedSavepointFormat=1.15) > > >>>>>>>>> > > >>>>>>>>> // we force a plan migration in 1.17 > > >>>>>>>>> // - now we only support 1.16 plan format > > >>>>>>>>> @ExecNodeMetadata(name=A, version=1, supportedPlanFormat=1.16, > > >>>>>>>>> supportedSavepointFormat=1.15) > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> // topology change > > >>>>>>>>> > > >>>>>>>>> // initial introduction in 1.15 > > >>>>>>>>> @ExecNodeMetadata(name=A, version=1, supportedPlanFormat=1.15, > > >>>>>>>>> supportedSavepointFormat=1.15) > > >>>>>>>>> > > >>>>>>>>> // complete new class structure in 1.16 annotated with > > >>>>>>>>> @ExecNodeMetadata(name=A, version=2, supportedPlanFormat=1.15, > > >>>>>>>>> supportedSavepointFormat=1.16) > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> What do you think? > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> Regards, > > >>>>>>>>> Timo > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> On 07.12.21 08:20, wenlong.lwl wrote: > > >>>>>>>>>> Maybe we can add support for this case : > > >>>>>>>>>> when an exec node is changed in 1.16, but is > > >> compatible > > >>>>>> with > > >>>>>>>>> 1.15, > > >>>>>>>>>> we can use the node of 1.16 to deserialize the plan of 1.15. > > >>>>>>>>>> By this way, we don't need to fork the code if the change is > > >>>>>> compatible, > > >>>>>>>>>> and can avoid fork code frequently. > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> Best, > > >>>>>>>>>> Wenlong > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> On Tue, 7 Dec 2021 at 15:08, wenlong.lwl < > wenlong88....@gmail.com > > >>> > > >>>>>>>>> wrote: > > >>>>>>>>>> > > >>>>>>>>>>> hi, Timo, I would prefer to update the version every time we > > >> change > > >>>>>> the > > >>>>>>>>>>> state layer too. > > >>>>>>>>>>> > > >>>>>>>>>>> It could be possible that we change the exec node in 2 steps: > > >>>>>>>>>>> First, we add a newStateLayout because of some improvement > in > > >>>>>> state, in > > >>>>>>>>>>> order to keep compatibility we may still keep the old state > for > > >> the > > >>>>>>>>> first > > >>>>>>>>>>> version. We need to update the version, so that we can > generate a > > >>>>>> new > > >>>>>>>>>>> version plan for the new job and keep the exec node > compatible > > >> with > > >>>>>> the > > >>>>>>>>> old > > >>>>>>>>>>> version plan. > > >>>>>>>>>>> After some versions, we may remove the old version state > layout > > >> and > > >>>>>>>>> clean > > >>>>>>>>>>> up the deprecated code. We still need to update the version, > so > > >>>>>> that we > > >>>>>>>>> can > > >>>>>>>>>>> verify that we are compatible with the plan after the first > > >> change, > > >>>>>> but > > >>>>>>>>> not > > >>>>>>>>>>> compatible with the plan earlier. > > >>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>>>> Best, > > >>>>>>>>>>> Wenlong > > >>>>>>>>>>> > > >>>>>>>>>>> On Mon, 6 Dec 2021 at 21:27, Timo Walther < > twal...@apache.org> > > >>>>>> wrote: > > >>>>>>>>>>> > > >>>>>>>>>>>> Hi Godfrey, > > >>>>>>>>>>>> > > >>>>>>>>>>>> > design makes thing more complex. > > >>>>>>>>>>>> > > >>>>>>>>>>>> Yes, the design might be a bit more complex. But operator > > >>>>>> migration is > > >>>>>>>>>>>> way easier than ExecNode migration at a later point in time > for > > >>>>>> code > > >>>>>>>>>>>> maintenance. We know that ExecNodes can become pretty > complex. > > >>>> Even > > >>>>>>>>>>>> though we have put a lot of code into `CommonXXExecNode` it > will > > >>>>>> be a > > >>>>>>>>>>>> lot of work to maintain multiple versions of ExecNodes. If > we > > >> can > > >>>>>> avoid > > >>>>>>>>>>>> this with operator state migration, this should always be > > >>>> preferred > > >>>>>>>>> over > > >>>>>>>>>>>> a new ExecNode version. > > >>>>>>>>>>>> > > >>>>>>>>>>>> I'm aware that operator state migration might only be > important > > >>>> for > > >>>>>>>>>>>> roughly 10 % of all changes. A new ExecNode version will be > used > > >>>>>> for > > >>>>>>>>> 90% > > >>>>>>>>>>>> of all changes. > > >>>>>>>>>>>> > > >>>>>>>>>>>> > If there are multiple state layouts, which layout > the > > >>>> ExecNode > > >>>>>>>>> should > > >>>>>>>>>>>> use? > > >>>>>>>>>>>> > > >>>>>>>>>>>> It is not the responsibility of the ExecNode to decide this > but > > >>>> the > > >>>>>>>>>>>> operator. Something like: > > >>>>>>>>>>>> > > >>>>>>>>>>>> class X extends ProcessFunction { > > >>>>>>>>>>>> ValueState<A> oldStateLayout; > > >>>>>>>>>>>> ValueState<B> newStateLayout; > > >>>>>>>>>>>> > > >>>>>>>>>>>> open() { > > >>>>>>>>>>>> if (oldStateLayout.get() != null) { > > >>>>>>>>>>>> performOperatorMigration(); > > >>>>>>>>>>>> } > > >>>>>>>>>>>> useNewStateLayout(); > > >>>>>>>>>>>> } > > >>>>>>>>>>>> } > > >>>>>>>>>>>> > > >>>>>>>>>>>> Operator migration is meant for smaller "more local" changes > > >>>>>> without > > >>>>>>>>>>>> touching the ExecNode layer. The CEP library and DataStream > API > > >>>>>> sources > > >>>>>>>>>>>> are performing operator migration for years already. > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>>> > `supportedPlanChanges ` and > `supportedSavepointChanges ` > > >> are > > >>>>>> a bit > > >>>>>>>>>>>> obscure. > > >>>>>>>>>>>> > > >>>>>>>>>>>> Let me try to come up with more examples why I think both > > >>>>>> annotation > > >>>>>>>>>>>> make sense and are esp. important *for test coverage*. > > >>>>>>>>>>>> > > >>>>>>>>>>>> supportedPlanChanges: > > >>>>>>>>>>>> > > >>>>>>>>>>>> Let's assume we have some JSON in Flink 1.15: > > >>>>>>>>>>>> > > >>>>>>>>>>>> { > > >>>>>>>>>>>> some-prop: 42 > > >>>>>>>>>>>> } > > >>>>>>>>>>>> > > >>>>>>>>>>>> And we want to extend the JSON in Flink 1.16: > > >>>>>>>>>>>> > > >>>>>>>>>>>> { > > >>>>>>>>>>>> some-prop: 42, > > >>>>>>>>>>>> some-flag: false > > >>>>>>>>>>>> } > > >>>>>>>>>>>> > > >>>>>>>>>>>> Maybe we don't need to increase the ExecNode version but > only > > >>>>>> ensure > > >>>>>>>>>>>> that the flag is set to `false` by default for the older > > >> versions. > > >>>>>>>>>>>> > > >>>>>>>>>>>> We need a location to track changes and document the > changelog. > > >>>>>> With > > >>>>>>>>> the > > >>>>>>>>>>>> help of the annotation supportedPlanChanges = [1.15, 1.16] > we > > >> can > > >>>>>>>>> verify > > >>>>>>>>>>>> that we have tests for both JSON formats. > > >>>>>>>>>>>> > > >>>>>>>>>>>> And once we decide to drop the 1.15 format, we enforce plan > > >>>>>> migration > > >>>>>>>>>>>> and fill-in the default value `false` into the old plans and > > >> bump > > >>>>>> their > > >>>>>>>>>>>> JSON plan version to 1.16 or higher. > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>>> > once the state layout is changed, the ExecNode > version > > >> needs > > >>>>>> also > > >>>>>>>>> be > > >>>>>>>>>>>> updated > > >>>>>>>>>>>> > > >>>>>>>>>>>> This will still be the majority of cases. But if we can > avoid > > >>>>>> this, we > > >>>>>>>>>>>> should do it for not having too much duplicate code to > maintain. > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>>> Thanks, > > >>>>>>>>>>>> Timo > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>>> On 06.12.21 09:58, godfrey he wrote: > > >>>>>>>>>>>>> Hi, Timo, > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> Thanks for the detailed explanation. > > >>>>>>>>>>>>> > > >>>>>>>>>>>>>> We change an operator state of B in Flink 1.16. We > perform the > > >>>>>> change > > >>>>>>>>>>>> in the operator of B in a way to support both state layouts. > > >> Thus, > > >>>>>> no > > >>>>>>>>> need > > >>>>>>>>>>>> for a new ExecNode version. > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> I think this design makes thing more complex. > > >>>>>>>>>>>>> 1. If there are multiple state layouts, which layout the > > >> ExecNode > > >>>>>>>>>>>> should use ? > > >>>>>>>>>>>>> It increases the cost of understanding for developers > > >> (especially > > >>>>>> for > > >>>>>>>>>>>>> Flink newer), > > >>>>>>>>>>>>> making them prone to mistakes. > > >>>>>>>>>>>>> 2. `supportedPlanChanges ` and `supportedSavepointChanges ` > > >> are a > > >>>>>> bit > > >>>>>>>>>>>> obscure. > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> The purpose of ExecNode annotations are not only to support > > >>>>>> powerful > > >>>>>>>>>>>> validation, > > >>>>>>>>>>>>> but more importantly to make it easy for developers to > > >> understand > > >>>>>>>>>>>>> to ensure that every modification is easy and state > compatible. > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> I prefer, once the state layout is changed, the ExecNode > > >> version > > >>>>>> needs > > >>>>>>>>>>>>> also be updated. > > >>>>>>>>>>>>> which could make thing simple. How about > > >>>>>>>>>>>>> rename `supportedPlanChanges ` to `planCompatibleVersion` > > >>>>>>>>>>>>> (which means the plan is compatible with the plan > generated by > > >>>> the > > >>>>>>>>>>>>> given version node) > > >>>>>>>>>>>>> and rename `supportedSavepointChanges` to > > >>>>>>>>> `savepointCompatibleVersion > > >>>>>>>>>>>> ` > > >>>>>>>>>>>>> (which means the state is compatible with the state > generated > > >> by > > >>>>>> the > > >>>>>>>>>>>>> given version node) ? > > >>>>>>>>>>>>> The names also indicate that only one version value can be > set. > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> WDYT? > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> Best, > > >>>>>>>>>>>>> Godfrey > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> Timo Walther <twal...@apache.org> 于2021年12月2日周四 下午11:42写道: > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Response to Marios's feedback: > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > there should be some good logging in place when > the > > >>>>>> upgrade is > > >>>>>>>>>>>> taking > > >>>>>>>>>>>>>> place > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Yes, I agree. I added this part to the FLIP. > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > config option instead that doesn't provide the > > >>>> flexibility > > >>>>>> to > > >>>>>>>>>>>>>> overwrite certain plans > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> One can set the config option also around sections of the > > >>>>>>>>>>>>>> multi-statement SQL script. > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> SET 'table.plan.force-recompile'='true'; > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> COMPILE ... > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> SET 'table.plan.force-recompile'='false'; > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> But the question is why a user wants to run COMPILE > multiple > > >>>>>> times. > > >>>>>>>>> If > > >>>>>>>>>>>>>> it is during development, then running EXECUTE (or just > the > > >>>>>> statement > > >>>>>>>>>>>>>> itself) without calling COMPILE should be sufficient. The > file > > >>>>>> can > > >>>>>>>>> also > > >>>>>>>>>>>>>> manually be deleted if necessary. > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> What do you think? > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Regards, > > >>>>>>>>>>>>>> Timo > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> On 02.12.21 16:09, Timo Walther wrote: > > >>>>>>>>>>>>>>> Hi Till, > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> Yes, you might have to. But not a new plan from the SQL > query > > >>>>>> but a > > >>>>>>>>>>>>>>> migration from the old plan to the new plan. This will > not > > >>>>>> happen > > >>>>>>>>>>>> often. > > >>>>>>>>>>>>>>> But we need a way to evolve the format of the JSON plan > > >> itself. > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> Maybe this confuses a bit, so let me clarify it again: > Mostly > > >>>>>>>>> ExecNode > > >>>>>>>>>>>>>>> versions and operator state layouts will evolve. Not the > plan > > >>>>>> files, > > >>>>>>>>>>>>>>> those will be pretty stable. But also not infinitely. > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> Regards, > > >>>>>>>>>>>>>>> Timo > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> On 02.12.21 16:01, Till Rohrmann wrote: > > >>>>>>>>>>>>>>>> Then for migrating from Flink 1.10 to 1.12, I might > have to > > >>>>>> create > > >>>>>>>>> a > > >>>>>>>>>>>> new > > >>>>>>>>>>>>>>>> plan using Flink 1.11 in order to migrate from Flink > 1.11 to > > >>>>>> 1.12, > > >>>>>>>>>>>> right? > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> Cheers, > > >>>>>>>>>>>>>>>> Till > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> On Thu, Dec 2, 2021 at 3:39 PM Timo Walther < > > >>>>>> twal...@apache.org> > > >>>>>>>>>>>> wrote: > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> Response to Till's feedback: > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> > compiled plan won't be changed after being > written > > >>>>>> initially > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> This is not entirely correct. We give guarantees for > > >> keeping > > >>>>>> the > > >>>>>>>>>>>> query > > >>>>>>>>>>>>>>>>> up and running. We reserve us the right to force plan > > >>>>>> migrations. > > >>>>>>>>> In > > >>>>>>>>>>>>>>>>> this case, the plan might not be created from the SQL > > >>>>>> statement > > >>>>>>>>> but > > >>>>>>>>>>>> from > > >>>>>>>>>>>>>>>>> the old plan. I have added an example in section > 10.1.1. In > > >>>>>>>>> general, > > >>>>>>>>>>>>>>>>> both persisted entities "plan" and "savepoint" can > evolve > > >>>>>>>>>>>> independently > > >>>>>>>>>>>>>>>>> from each other. > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> Thanks, > > >>>>>>>>>>>>>>>>> Timo > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> On 02.12.21 15:10, Timo Walther wrote: > > >>>>>>>>>>>>>>>>>> Response to Godfrey's feedback: > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> > "EXPLAIN PLAN EXECUTE STATEMENT SET BEGIN > ... > > >> END" > > >>>> is > > >>>>>>>>> missing. > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> Thanks for the hint. I added a dedicated section > 7.1.3. > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> > it's hard to maintain the supported > versions for > > >>>>>>>>>>>>>>>>>> "supportedPlanChanges" and "supportedSavepointChanges" > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> Actually, I think we are mostly on the same page. > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> The annotation does not need to be updated for every > Flink > > >>>>>>>>>>>> version. As > > >>>>>>>>>>>>>>>>>> the name suggests it is about "Changes" (in other > words: > > >>>>>>>>>>>>>>>>>> incompatibilities) that require some kind of > migration. > > >>>>>> Either > > >>>>>>>>> plan > > >>>>>>>>>>>>>>>>>> migration (= PlanChanges) or savepoint migration > > >>>>>>>>>>>> (=SavepointChanges, > > >>>>>>>>>>>>>>>>>> using operator migration or savepoint migration). > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> Let's assume we introduced two ExecNodes A and B in > Flink > > >>>>>> 1.15. > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> The annotations are: > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> @ExecNodeMetadata(name=A, supportedPlanChanges=1.15, > > >>>>>>>>>>>>>>>>>> supportedSavepointChanges=1.15) > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> @ExecNodeMetadata(name=B, supportedPlanChanges=1.15, > > >>>>>>>>>>>>>>>>>> supportedSavepointChanges=1.15) > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> We change an operator state of B in Flink 1.16. > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> We perform the change in the operator of B in a way to > > >>>>>> support > > >>>>>>>>> both > > >>>>>>>>>>>>>>>>>> state layouts. Thus, no need for a new ExecNode > version. > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> The annotations in 1.16 are: > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> @ExecNodeMetadata(name=A, supportedPlanChanges=1.15, > > >>>>>>>>>>>>>>>>>> supportedSavepointChanges=1.15) > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> @ExecNodeMetadata(name=B, supportedPlanChanges=1.15, > > >>>>>>>>>>>>>>>>>> supportedSavepointChanges=1.15, 1.16) > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> So the versions in the annotations are "start > version"s. > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> I don't think we need end versions? End version would > mean > > >>>>>> that > > >>>>>>>>> we > > >>>>>>>>>>>> drop > > >>>>>>>>>>>>>>>>>> the ExecNode from the code base? > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> Please check the section 10.1.1 again. I added a more > > >>>> complex > > >>>>>>>>>>>> example. > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> Thanks, > > >>>>>>>>>>>>>>>>>> Timo > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> On 01.12.21 16:29, Timo Walther wrote: > > >>>>>>>>>>>>>>>>>>> Response to Francesco's feedback: > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> > *Proposed changes #6*: Other than defining > this > > >>>> rule > > >>>>>> of > > >>>>>>>>>>>> thumb, we > > >>>>>>>>>>>>>>>>>>> must also make sure that compiling plans with these > > >> objects > > >>>>>> that > > >>>>>>>>>>>>>>>>>>> cannot be serialized in the plan must fail hard > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> Yes, I totally agree. We will fail hard with a > helpful > > >>>>>>>>> exception. > > >>>>>>>>>>>> Any > > >>>>>>>>>>>>>>>>>>> mistake e.g. using a inline object in Table API or an > > >>>>>> invalid > > >>>>>>>>>>>>>>>>>>> DataStream API source without uid should immediately > > >> fail a > > >>>>>> plan > > >>>>>>>>>>>>>>>>>>> compilation step. I added a remark to the FLIP again. > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> > What worries me is breaking changes, in > > >> particular > > >>>>>>>>>>>> behavioural > > >>>>>>>>>>>>>>>>>>> changes that might happen in connectors/formats > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> Breaking changes in connectors and formats need to be > > >>>>>> encoded in > > >>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>> options. I could also imagine to versioning in the > > >> factory > > >>>>>>>>>>>> identifier > > >>>>>>>>>>>>>>>>>>> `connector=kafka` and `connector=kafka-2`. If this is > > >>>>>> necessary. > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> After thinking about your question again, I think we > will > > >>>>>> also > > >>>>>>>>>>>> need > > >>>>>>>>>>>>>>>>>>> the same testing infrastructure for our connectors > and > > >>>>>> formats. > > >>>>>>>>>>>> Esp. > > >>>>>>>>>>>>>>>>>>> restore tests and completeness test. I updated the > > >> document > > >>>>>>>>>>>>>>>>>>> accordingly. Also I added a way to generate UIDs for > > >>>>>> DataStream > > >>>>>>>>>>>> API > > >>>>>>>>>>>>>>>>>>> providers. > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> > *Functions:* Are we talking about the > function > > >> name > > >>>>>> or the > > >>>>>>>>>>>>>>>>>>> function > > >>>>>>>>>>>>>>>>>>> complete signature? > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> For catalog functions, the identifier contains > catalog > > >> name > > >>>>>> and > > >>>>>>>>>>>>>>>>>>> database name. For system functions, identifier > contains > > >>>>>> only a > > >>>>>>>>>>>> name > > >>>>>>>>>>>>>>>>>>> which make function name and identifier identical. I > > >>>>>> reworked > > >>>>>>>>> the > > >>>>>>>>>>>>>>>>>>> section again and also fixed some of the naming > conflicts > > >>>>>> you > > >>>>>>>>>>>>>>>>>>> mentioned. > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> > we should perhaps use a logically defined > > >> unique id > > >>>>>> like > > >>>>>>>>>>>>>>>>>>> /bigIntToTimestamp/ > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> I added a concrete example for the resolution and > > >>>>>> restoration. > > >>>>>>>>> The > > >>>>>>>>>>>>>>>>>>> unique id is composed of name + version. Internally, > this > > >>>> is > > >>>>>>>>>>>>>>>>>>> represented as `$TO_TIMESTAMP_LTZ$1`. > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> > I think we should rather keep JSON out of > the > > >>>> concept > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> Sounds ok to me. In SQL we also just call it "plan". > I > > >> will > > >>>>>>>>>>>> change the > > >>>>>>>>>>>>>>>>>>> file sections. But would suggest to keep the > > >> fromJsonString > > >>>>>>>>>>>> method. > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> > write it back in the original plan file > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> I updated the terminology section for what we > consider an > > >>>>>>>>>>>> "upgrade". > > >>>>>>>>>>>>>>>>>>> We might need to update the orginal plan file. This > is > > >>>>>> already > > >>>>>>>>>>>>>>>>>>> considered in the COMPILE PLAN ... FROM ... even > though > > >>>>>> this is > > >>>>>>>>>>>> future > > >>>>>>>>>>>>>>>>>>> work. Also savepoint migration. > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> Thanks for all the feedback! > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> Timo > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> On 30.11.21 14:28, Timo Walther wrote: > > >>>>>>>>>>>>>>>>>>>> Response to Wenlongs's feedback: > > >>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> > I would prefer not to provide such a > shortcut, > > >> let > > >>>>>> users > > >>>>>>>>> use > > >>>>>>>>>>>>>>>>>>>> COMPILE PLAN IF NOT EXISTS and EXECUTE explicitly, > which > > >>>>>> can be > > >>>>>>>>>>>>>>>>>>>> understood by new users even without inferring the > docs. > > >>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> I would like to hear more opinions on this topic. > > >>>>>> Personally, I > > >>>>>>>>>>>> find > > >>>>>>>>>>>>>>>>>>>> a combined statement very useful. Not only for > quicker > > >>>>>>>>>>>> development > > >>>>>>>>>>>>>>>>>>>> and debugging but also for readability. It helps in > > >>>>>> keeping the > > >>>>>>>>>>>> JSON > > >>>>>>>>>>>>>>>>>>>> path and the query close to each other in order to > know > > >>>> the > > >>>>>>>>>>>> origin of > > >>>>>>>>>>>>>>>>>>>> the plan. > > >>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> > but the plan and SQL are not matched. The > > >> result > > >>>>>> would be > > >>>>>>>>>>>> quite > > >>>>>>>>>>>>>>>>>>>> confusing if we still execute the plan directly, we > may > > >>>>>> need to > > >>>>>>>>>>>> add a > > >>>>>>>>>>>>>>>>>>>> validation. > > >>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> You are right that there could be a mismatch. But we > > >> have > > >>>> a > > >>>>>>>>>>>> similar > > >>>>>>>>>>>>>>>>>>>> problem when executing CREATE TABLE IF NOT EXISTS. > The > > >>>>>> schema > > >>>>>>>>> or > > >>>>>>>>>>>>>>>>>>>> options of a table could have changed completely in > the > > >>>>>> catalog > > >>>>>>>>>>>> but > > >>>>>>>>>>>>>>>>>>>> the CREATE TABLE IF NOT EXISTS is not executed > again. > > >> So a > > >>>>>>>>>>>> mismatch > > >>>>>>>>>>>>>>>>>>>> could also occur there. > > >>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> Regards, > > >>>>>>>>>>>>>>>>>>>> Timo > > >>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> On 30.11.21 14:17, Timo Walther wrote: > > >>>>>>>>>>>>>>>>>>>>> Hi everyone, > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> thanks for the feedback so far. Let me answer each > > >> email > > >>>>>>>>>>>>>>>>>>>>> indvidually. > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> I will start with a response to Ingo's feedback: > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> > Will the JSON plan's schema be > considered an > > >> API? > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> No, not in the first version. This is explicitly > > >>>>>> mentioned in > > >>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>> `General JSON Plan Assumptions`. I tried to > improve the > > >>>>>>>>> section > > >>>>>>>>>>>> once > > >>>>>>>>>>>>>>>>>>>>> more to make it clearer. However, the JSON plan is > > >>>>>> definitely > > >>>>>>>>>>>> stable > > >>>>>>>>>>>>>>>>>>>>> per minor version. And since the plan is versioned > by > > >>>>>> Flink > > >>>>>>>>>>>> version, > > >>>>>>>>>>>>>>>>>>>>> external tooling could be build around it. We might > > >> make > > >>>>>> it > > >>>>>>>>>>>> public > > >>>>>>>>>>>>>>>>>>>>> API once the design has settled. > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> > Given that upgrades across multiple > versions > > >> at > > >>>>>> once are > > >>>>>>>>>>>>>>>>>>>>> unsupported, do we verify this somehow? > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> Good question. I extended the `General JSON Plan > > >>>>>> Assumptions`. > > >>>>>>>>>>>> Now > > >>>>>>>>>>>>>>>>>>>>> yes: the Flink version is part of the JSON plan and > > >> will > > >>>>>> be > > >>>>>>>>>>>> verified > > >>>>>>>>>>>>>>>>>>>>> during restore. But keep in mind that we might > support > > >>>>>> more > > >>>>>>>>> that > > >>>>>>>>>>>>>>>>>>>>> just the last version at least until the JSON plan > has > > >>>>>> been > > >>>>>>>>>>>>>>>>>>>>> migrated. > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> Regards, > > >>>>>>>>>>>>>>>>>>>>> Timo > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> On 30.11.21 09:39, Marios Trivyzas wrote: > > >>>>>>>>>>>>>>>>>>>>>> I have a question regarding the `COMPILE PLAN > > >> OVEWRITE`. > > >>>>>> If > > >>>>>>>>> we > > >>>>>>>>>>>>>>>>>>>>>> choose to go > > >>>>>>>>>>>>>>>>>>>>>> with the config option instead, > > >>>>>>>>>>>>>>>>>>>>>> that doesn't provide the flexibility to overwrite > > >>>> certain > > >>>>>>>>>>>> plans but > > >>>>>>>>>>>>>>>>>>>>>> not > > >>>>>>>>>>>>>>>>>>>>>> others, since the config applies globally, isn't > that > > >>>>>>>>>>>>>>>>>>>>>> something to consider? > > >>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>> On Mon, Nov 29, 2021 at 10:15 AM Marios Trivyzas < > > >>>>>>>>>>>> mat...@gmail.com> > > >>>>>>>>>>>>>>>>>>>>>> wrote: > > >>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> Hi Timo! > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> Thanks a lot for taking all that time and effort > to > > >> put > > >>>>>>>>>>>> together > > >>>>>>>>>>>>>>>>> this > > >>>>>>>>>>>>>>>>>>>>>>> proposal! > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> Regarding: > > >>>>>>>>>>>>>>>>>>>>>>>> For simplification of the design, we assume that > > >>>>>> upgrades > > >>>>>>>>>>>> use a > > >>>>>>>>>>>>>>>>>>>>>>>> step size > > >>>>>>>>>>>>>>>>>>>>>>> of a single > > >>>>>>>>>>>>>>>>>>>>>>> minor version. We don't guarantee skipping minor > > >>>>>> versions > > >>>>>>>>>>>> (e.g. > > >>>>>>>>>>>>>>>>>>>>>>> 1.11 to > > >>>>>>>>>>>>>>>>>>>>>>> 1.14). > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> I think that for this first step we should make > it > > >>>>>>>>> absolutely > > >>>>>>>>>>>>>>>>>>>>>>> clear to the > > >>>>>>>>>>>>>>>>>>>>>>> users that they would need to go through all > > >>>>>> intermediate > > >>>>>>>>>>>> versions > > >>>>>>>>>>>>>>>>>>>>>>> to end up with the target version they wish. If > we > > >> are > > >>>>>> to > > >>>>>>>>>>>> support > > >>>>>>>>>>>>>>>>>>>>>>> skipping > > >>>>>>>>>>>>>>>>>>>>>>> versions in the future, i.e. upgrade from 1.14 to > > >> 1.17, > > >>>>>> this > > >>>>>>>>>>>> means > > >>>>>>>>>>>>>>>>>>>>>>> that we need to have a testing infrastructure in > > >> place > > >>>>>> that > > >>>>>>>>>>>> would > > >>>>>>>>>>>>>>>>>>>>>>> test all > > >>>>>>>>>>>>>>>>>>>>>>> possible combinations of version upgrades, i.e. > from > > >>>>>> 1.14 to > > >>>>>>>>>>>> 1.15, > > >>>>>>>>>>>>>>>>>>>>>>> from 1.14 to 1.16 and so forth, while still > testing > > >> and > > >>>>>> of > > >>>>>>>>>>>> course > > >>>>>>>>>>>>>>>>>>>>>>> supporting all the upgrades from the previous > minor > > >>>>>> version. > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> I like a lot the idea of introducing HINTS to > define > > >>>>>> some > > >>>>>>>>>>>>>>>>>>>>>>> behaviour in the > > >>>>>>>>>>>>>>>>>>>>>>> programs! > > >>>>>>>>>>>>>>>>>>>>>>> - the hints live together with the sql > statements and > > >>>>>>>>>>>> consequently > > >>>>>>>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>> (JSON) plans. > > >>>>>>>>>>>>>>>>>>>>>>> - If multiple queries are involved in a program, > each > > >>>>>> one of > > >>>>>>>>>>>> them > > >>>>>>>>>>>>>>>>> can > > >>>>>>>>>>>>>>>>>>>>>>> define its own config (regarding plan > optimisation, > > >> not > > >>>>>> null > > >>>>>>>>>>>>>>>>>>>>>>> enforcement, > > >>>>>>>>>>>>>>>>>>>>>>> etc) > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> I agree with Francesco on his argument regarding > the > > >>>>>> *JSON* > > >>>>>>>>>>>>>>>>>>>>>>> plan. I > > >>>>>>>>>>>>>>>>>>>>>>> believe we should already provide flexibility > here, > > >>>>>> since > > >>>>>>>>> (who > > >>>>>>>>>>>>>>>>>>>>>>> knows) in > > >>>>>>>>>>>>>>>>>>>>>>> the future > > >>>>>>>>>>>>>>>>>>>>>>> a JSON plan might not fulfil the desired > > >> functionality. > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> I also agree that we need some very obvious way > (i.e. > > >>>>>> not > > >>>>>>>>> log > > >>>>>>>>>>>>>>>>>>>>>>> entry) to > > >>>>>>>>>>>>>>>>>>>>>>> show the users that their program doesn't support > > >>>>>> version > > >>>>>>>>>>>>>>>>>>>>>>> upgrades, and > > >>>>>>>>>>>>>>>>>>>>>>> prevent them from being negatively surprised in > the > > >>>>>> future, > > >>>>>>>>>>>> when > > >>>>>>>>>>>>>>>>>>>>>>> trying to > > >>>>>>>>>>>>>>>>>>>>>>> upgrade their production pipelines. > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> This is an implementation detail, but I'd like > to add > > >>>>>> that > > >>>>>>>>>>>> there > > >>>>>>>>>>>>>>>>>>>>>>> should be > > >>>>>>>>>>>>>>>>>>>>>>> some good logging in place when the upgrade is > taking > > >>>>>> place, > > >>>>>>>>>>>> to be > > >>>>>>>>>>>>>>>>>>>>>>> able to track every restoration action, and help > > >> debug > > >>>>>> any > > >>>>>>>>>>>>>>>>>>>>>>> potential > > >>>>>>>>>>>>>>>>>>>>>>> issues arising from that. > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> On Fri, Nov 26, 2021 at 2:54 PM Till Rohrmann > > >>>>>>>>>>>>>>>>>>>>>>> <trohrm...@apache.org > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> wrote: > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>> Thanks for writing this FLIP Timo. I think this > will > > >>>>>> be a > > >>>>>>>>>>>> very > > >>>>>>>>>>>>>>>>>>>>>>>> important > > >>>>>>>>>>>>>>>>>>>>>>>> improvement for Flink and our SQL user :-) > > >>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>> Similar to Francesco I would like to understand > the > > >>>>>>>>> statement > > >>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>> For simplification of the design, we assume > that > > >>>>>> upgrades > > >>>>>>>>>>>> use a > > >>>>>>>>>>>>>>>>>>>>>>>>> step > > >>>>>>>>>>>>>>>>>>>>>>>> size > > >>>>>>>>>>>>>>>>>>>>>>>> of a single > > >>>>>>>>>>>>>>>>>>>>>>>> minor version. We don't guarantee skipping minor > > >>>>>> versions > > >>>>>>>>>>>> (e.g. > > >>>>>>>>>>>>>>>>>>>>>>>> 1.11 to > > >>>>>>>>>>>>>>>>>>>>>>>> 1.14). > > >>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>> a bit better. Is it because Flink does not > guarantee > > >>>>>> that a > > >>>>>>>>>>>>>>>>>>>>>>>> savepoint > > >>>>>>>>>>>>>>>>>>>>>>>> created by version 1.x can be directly > recovered by > > >>>>>> version > > >>>>>>>>>>>> 1.y > > >>>>>>>>>>>>>>>>>>>>>>>> with x + 1 > > >>>>>>>>>>>>>>>>>>>>>>>> < y but users might have to go through a > cascade of > > >>>>>>>>> upgrades? > > >>>>>>>>>>>>>>>>>>>>>>>> From how I > > >>>>>>>>>>>>>>>>>>>>>>>> understand your proposal, the compiled plan > won't be > > >>>>>>>>> changed > > >>>>>>>>>>>>>>>>>>>>>>>> after being > > >>>>>>>>>>>>>>>>>>>>>>>> written initially. Hence, I would assume that > for > > >> the > > >>>>>> plan > > >>>>>>>>>>>> alone > > >>>>>>>>>>>>>>>>>>>>>>>> Flink > > >>>>>>>>>>>>>>>>>>>>>>>> will > > >>>>>>>>>>>>>>>>>>>>>>>> have to give backwards compatibility guarantees > for > > >>>> all > > >>>>>>>>>>>> versions. > > >>>>>>>>>>>>>>>>>>>>>>>> Am I > > >>>>>>>>>>>>>>>>>>>>>>>> understanding this part correctly? > > >>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>> Cheers, > > >>>>>>>>>>>>>>>>>>>>>>>> Till > > >>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>> On Thu, Nov 25, 2021 at 4:55 PM Francesco > Guardiani > > >> < > > >>>>>>>>>>>>>>>>>>>>>>>> france...@ververica.com> > > >>>>>>>>>>>>>>>>>>>>>>>> wrote: > > >>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>> Hi Timo, > > >>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>> Thanks for putting this amazing work together, > I > > >> have > > >>>>>> some > > >>>>>>>>>>>>>>>>>>>>>>>>> considerations/questions > > >>>>>>>>>>>>>>>>>>>>>>>>> about the FLIP: > > >>>>>>>>>>>>>>>>>>>>>>>>> *Proposed changes #6*: Other than defining this > > >> rule > > >>>>>> of > > >>>>>>>>>>>> thumb, > > >>>>>>>>>>>>>>>>>>>>>>>>> we must > > >>>>>>>>>>>>>>>>>>>>>>>>> also make sure > > >>>>>>>>>>>>>>>>>>>>>>>>> that compiling plans with these objects that > cannot > > >>>> be > > >>>>>>>>>>>>>>>>>>>>>>>>> serialized in the > > >>>>>>>>>>>>>>>>>>>>>>>>> plan must fail hard, > > >>>>>>>>>>>>>>>>>>>>>>>>> so users don't bite themselves with such > issues, or > > >>>> at > > >>>>>>>>>>>> least we > > >>>>>>>>>>>>>>>>>>>>>>>>> need to > > >>>>>>>>>>>>>>>>>>>>>>>>> output warning > > >>>>>>>>>>>>>>>>>>>>>>>>> logs. In general, whenever the user is trying > to > > >> use > > >>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>>>> CompiledPlan > > >>>>>>>>>>>>>>>>>>>>>>>> APIs > > >>>>>>>>>>>>>>>>>>>>>>>>> and at the same > > >>>>>>>>>>>>>>>>>>>>>>>>> time, they're trying to do something "illegal" > for > > >>>> the > > >>>>>>>>>>>> plan, we > > >>>>>>>>>>>>>>>>>>>>>>>>> should > > >>>>>>>>>>>>>>>>>>>>>>>>> immediately either > > >>>>>>>>>>>>>>>>>>>>>>>>> log or fail depending on the issue, in order to > > >> avoid > > >>>>>> any > > >>>>>>>>>>>>>>>>>>>>>>>>> surprises once > > >>>>>>>>>>>>>>>>>>>>>>>>> the user upgrades. > > >>>>>>>>>>>>>>>>>>>>>>>>> I would also say the same for things like > > >> registering > > >>>>>> a > > >>>>>>>>>>>>>>>>>>>>>>>>> function, > > >>>>>>>>>>>>>>>>>>>>>>>>> registering a DataStream, > > >>>>>>>>>>>>>>>>>>>>>>>>> and for every other thing which won't end up > in the > > >>>>>> plan, > > >>>>>>>>> we > > >>>>>>>>>>>>>>>>>>>>>>>>> should log > > >>>>>>>>>>>>>>>>>>>>>>>>> such info to the > > >>>>>>>>>>>>>>>>>>>>>>>>> user by default. > > >>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>> *General JSON Plan Assumptions #9:* When > thinking > > >> to > > >>>>>>>>>>>> connectors > > >>>>>>>>>>>>>>>>> and > > >>>>>>>>>>>>>>>>>>>>>>>>> formats, I think > > >>>>>>>>>>>>>>>>>>>>>>>>> it's reasonable to assume and keep out of the > > >> feature > > >>>>>>>>> design > > >>>>>>>>>>>>>>>>>>>>>>>>> that no > > >>>>>>>>>>>>>>>>>>>>>>>>> feature/ability can > > >>>>>>>>>>>>>>>>>>>>>>>>> deleted from a connector/format. I also don't > think > > >>>>>> new > > >>>>>>>>>>>>>>>>>>>>>>>> features/abilities > > >>>>>>>>>>>>>>>>>>>>>>>>> can influence > > >>>>>>>>>>>>>>>>>>>>>>>>> this FLIP as well, given the plan is static, > so if > > >>>> for > > >>>>>>>>>>>> example, > > >>>>>>>>>>>>>>>>>>>>>>>>> MyCoolTableSink in the next > > >>>>>>>>>>>>>>>>>>>>>>>>> flink version implements > > >> SupportsProjectionsPushDown, > > >>>>>> then > > >>>>>>>>>>>> it > > >>>>>>>>>>>>>>>>>>>>>>>>> shouldn't > > >>>>>>>>>>>>>>>>>>>>>>>> be > > >>>>>>>>>>>>>>>>>>>>>>>>> a problem > > >>>>>>>>>>>>>>>>>>>>>>>>> for the upgrade story since the plan is still > > >>>>>> configured > > >>>>>>>>> as > > >>>>>>>>>>>>>>>>>>>>>>>>> computed > > >>>>>>>>>>>>>>>>>>>>>>>> from > > >>>>>>>>>>>>>>>>>>>>>>>>> the previous flink > > >>>>>>>>>>>>>>>>>>>>>>>>> version. What worries me is breaking changes, > in > > >>>>>>>>> particular > > >>>>>>>>>>>>>>>>>>>>>>>>> behavioural > > >>>>>>>>>>>>>>>>>>>>>>>>> changes that > > >>>>>>>>>>>>>>>>>>>>>>>>> might happen in connectors/formats. Although > this > > >>>>>> argument > > >>>>>>>>>>>>>>>>>>>>>>>>> doesn't seem > > >>>>>>>>>>>>>>>>>>>>>>>>> relevant for > > >>>>>>>>>>>>>>>>>>>>>>>>> the connectors shipped by the flink project > itself, > > >>>>>>>>> because > > >>>>>>>>>>>> we > > >>>>>>>>>>>>>>>>>>>>>>>>> try to > > >>>>>>>>>>>>>>>>>>>>>>>> keep > > >>>>>>>>>>>>>>>>>>>>>>>>> them as stable as > > >>>>>>>>>>>>>>>>>>>>>>>>> possible and avoid eventual breaking changes, > it's > > >>>>>>>>>>>> compelling to > > >>>>>>>>>>>>>>>>>>>>>>>> external > > >>>>>>>>>>>>>>>>>>>>>>>>> connectors and > > >>>>>>>>>>>>>>>>>>>>>>>>> formats, which might be decoupled from the > flink > > >>>>>> release > > >>>>>>>>>>>> cycle > > >>>>>>>>>>>>>>>>>>>>>>>>> and might > > >>>>>>>>>>>>>>>>>>>>>>>>> have different > > >>>>>>>>>>>>>>>>>>>>>>>>> backward compatibility guarantees. It's totally > > >>>>>> reasonable > > >>>>>>>>>>>> if we > > >>>>>>>>>>>>>>>>>>>>>>>>> don't > > >>>>>>>>>>>>>>>>>>>>>>>>> want to tackle it in > > >>>>>>>>>>>>>>>>>>>>>>>>> this first iteration of the feature, but it's > > >>>>>> something we > > >>>>>>>>>>>> need > > >>>>>>>>>>>>>>>>>>>>>>>>> to keep > > >>>>>>>>>>>>>>>>>>>>>>>> in > > >>>>>>>>>>>>>>>>>>>>>>>>> mind for the future. > > >>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>> *Functions:* It's not clear to me what you > mean for > > >>>>>>>>>>>>>>>>>>>>>>>>> "identifier", > > >>>>>>>>>>>>>>>>>>>>>>>> because > > >>>>>>>>>>>>>>>>>>>>>>>>> then somewhere > > >>>>>>>>>>>>>>>>>>>>>>>>> else in the same context you talk about > "name". Are > > >>>> we > > >>>>>>>>>>>> talking > > >>>>>>>>>>>>>>>>>>>>>>>>> about the > > >>>>>>>>>>>>>>>>>>>>>>>>> function name > > >>>>>>>>>>>>>>>>>>>>>>>>> or the function complete signature? Let's > assume > > >> for > > >>>>>>>>>>>> example we > > >>>>>>>>>>>>>>>>>>>>>>>>> have > > >>>>>>>>>>>>>>>>>>>>>>>> these > > >>>>>>>>>>>>>>>>>>>>>>>>> function > > >>>>>>>>>>>>>>>>>>>>>>>>> definitions: > > >>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>> * TO_TIMESTAMP_LTZ(BIGINT) > > >>>>>>>>>>>>>>>>>>>>>>>>> * TO_TIMESTAMP_LTZ(STRING) > > >>>>>>>>>>>>>>>>>>>>>>>>> * TO_TIMESTAMP_LTZ(STRING, STRING) > > >>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>> These for me are very different functions with > > >>>>>> different > > >>>>>>>>>>>>>>>>>>>>>>>> implementations, > > >>>>>>>>>>>>>>>>>>>>>>>>> where each of > > >>>>>>>>>>>>>>>>>>>>>>>>> them might evolve separately at a different > pace. > > >>>>>> Hence > > >>>>>>>>>>>> when we > > >>>>>>>>>>>>>>>>>>>>>>>>> store > > >>>>>>>>>>>>>>>>>>>>>>>> them > > >>>>>>>>>>>>>>>>>>>>>>>>> in the json > > >>>>>>>>>>>>>>>>>>>>>>>>> plan we should perhaps use a logically defined > > >> unique > > >>>>>> id > > >>>>>>>>>>>> like > > >>>>>>>>>>>>>>>>>>>>>>>>> /bigIntToTimestamp/, / > > >>>>>>>>>>>>>>>>>>>>>>>>> stringToTimestamp/ and > > >> /stringToTimestampWithFormat/. > > >>>>>> This > > >>>>>>>>>>>> also > > >>>>>>>>>>>>>>>>>>>>>>>>> solves > > >>>>>>>>>>>>>>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>>>> issue of > > >>>>>>>>>>>>>>>>>>>>>>>>> correctly referencing the functions when > restoring > > >>>> the > > >>>>>>>>> plan, > > >>>>>>>>>>>>>>>>>>>>>>>>> without > > >>>>>>>>>>>>>>>>>>>>>>>>> running again the > > >>>>>>>>>>>>>>>>>>>>>>>>> inference logic (which might have been changed > in > > >> the > > >>>>>>>>>>>> meantime) > > >>>>>>>>>>>>>>>>>>>>>>>>> and it > > >>>>>>>>>>>>>>>>>>>>>>>>> might also solve > > >>>>>>>>>>>>>>>>>>>>>>>>> the versioning, that is the function > identifier can > > >>>>>>>>> contain > > >>>>>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>>>> function > > >>>>>>>>>>>>>>>>>>>>>>>>> version like / > > >>>>>>>>>>>>>>>>>>>>>>>>> stringToTimestampWithFormat_1_1 /or > > >>>>>>>>>>>>>>>>>>>>>>>>> /stringToTimestampWithFormat_1_2/. > > >>>>>>>>>>>>>>>>>>>>>>>> An > > >>>>>>>>>>>>>>>>>>>>>>>>> alternative could be to use the string > signature > > >>>>>>>>>>>> representation, > > >>>>>>>>>>>>>>>>>>>>>>>>> which > > >>>>>>>>>>>>>>>>>>>>>>>>> might not be trivial > > >>>>>>>>>>>>>>>>>>>>>>>>> to compute, given the complexity of our type > > >>>> inference > > >>>>>>>>>>>> logic. > > >>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>> *The term "JSON plan"*: I think we should > rather > > >> keep > > >>>>>> JSON > > >>>>>>>>>>>> out > > >>>>>>>>>>>>>>>>>>>>>>>>> of the > > >>>>>>>>>>>>>>>>>>>>>>>>> concept and just > > >>>>>>>>>>>>>>>>>>>>>>>>> name it "Compiled Plan" (like the proposed > API) or > > >>>>>>>>> something > > >>>>>>>>>>>>>>>>>>>>>>>>> similar, > > >>>>>>>>>>>>>>>>>>>>>>>> as I > > >>>>>>>>>>>>>>>>>>>>>>>>> see how in > > >>>>>>>>>>>>>>>>>>>>>>>>> future we might decide to support/modify our > > >>>>>> persistence > > >>>>>>>>>>>>>>>>>>>>>>>>> format to > > >>>>>>>>>>>>>>>>>>>>>>>>> something more > > >>>>>>>>>>>>>>>>>>>>>>>>> efficient storage wise like BSON. For example, > I > > >>>> would > > >>>>>>>>>>>> rename / > > >>>>>>>>>>>>>>>>>>>>>>>>> CompiledPlan.fromJsonFile/ to simply > > >>>>>>>>>>>> /CompiledPlan.fromFile/. > > >>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>> *Who is the owner of the plan file?* I asked > myself > > >>>>>> this > > >>>>>>>>>>>>>>>>>>>>>>>>> question when > > >>>>>>>>>>>>>>>>>>>>>>>>> reading this: > > >>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>>> For simplification of the design, we assume > that > > >>>>>> upgrades > > >>>>>>>>>>>> use a > > >>>>>>>>>>>>>>>>>>>>>>>>>> step > > >>>>>>>>>>>>>>>>>>>>>>>>> size of a single > > >>>>>>>>>>>>>>>>>>>>>>>>> minor version. We don't guarantee skipping > minor > > >>>>>> versions > > >>>>>>>>>>>> (e.g. > > >>>>>>>>>>>>>>>>>>>>>>>>> 1.11 to > > >>>>>>>>>>>>>>>>>>>>>>>>> 1.14). > > >>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>> My understanding of this statement is that a > user > > >> can > > >>>>>>>>>>>> upgrade > > >>>>>>>>>>>>>>>>>>>>>>>>> between > > >>>>>>>>>>>>>>>>>>>>>>>>> minors but then > > >>>>>>>>>>>>>>>>>>>>>>>>> following all the minors, the same query can > remain > > >>>>>> up and > > >>>>>>>>>>>>>>>>> running. > > >>>>>>>>>>>>>>>>>>>>>>>> E.g. I > > >>>>>>>>>>>>>>>>>>>>>>>>> upgrade from > > >>>>>>>>>>>>>>>>>>>>>>>>> 1.15 to 1.16, and then from 1.16 to 1.17 and I > > >> still > > >>>>>>>>> expect > > >>>>>>>>>>>> my > > >>>>>>>>>>>>>>>>>>>>>>>>> original > > >>>>>>>>>>>>>>>>>>>>>>>>> query to work > > >>>>>>>>>>>>>>>>>>>>>>>>> without recomputing the plan. This necessarily > > >> means > > >>>>>> that > > >>>>>>>>> at > > >>>>>>>>>>>>>>>>>>>>>>>>> some point > > >>>>>>>>>>>>>>>>>>>>>>>> in > > >>>>>>>>>>>>>>>>>>>>>>>>> future > > >>>>>>>>>>>>>>>>>>>>>>>>> releases we'll need some basic "migration" > tool to > > >>>>>> keep > > >>>>>>>>> the > > >>>>>>>>>>>>>>>>>>>>>>>>> queries up > > >>>>>>>>>>>>>>>>>>>>>>>> and > > >>>>>>>>>>>>>>>>>>>>>>>>> running, > > >>>>>>>>>>>>>>>>>>>>>>>>> ending up modifying the compiled plan. So I > guess > > >>>>>> flink > > >>>>>>>>>>>> should > > >>>>>>>>>>>>>>>>>>>>>>>>> write it > > >>>>>>>>>>>>>>>>>>>>>>>>> back in the original > > >>>>>>>>>>>>>>>>>>>>>>>>> plan file, perhaps doing a backup of the > previous > > >>>>>> one? Can > > >>>>>>>>>>>> you > > >>>>>>>>>>>>>>>>>>>>>>>>> please > > >>>>>>>>>>>>>>>>>>>>>>>>> clarify this aspect? > > >>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>> Except these considerations, the proposal looks > > >> good > > >>>>>> to me > > >>>>>>>>>>>>>>>>>>>>>>>>> and I'm > > >>>>>>>>>>>>>>>>>>>>>>>> eagerly > > >>>>>>>>>>>>>>>>>>>>>>>>> waiting to see > > >>>>>>>>>>>>>>>>>>>>>>>>> it in play. > > >>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>> Thanks, > > >>>>>>>>>>>>>>>>>>>>>>>>> FG > > >>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>> -- > > >>>>>>>>>>>>>>>>>>>>>>>>> Francesco Guardiani | Software Engineer > > >>>>>>>>>>>>>>>>>>>>>>>>> france...@ververica.com[1] > > >>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>> Follow us @VervericaData > > >>>>>>>>>>>>>>>>>>>>>>>>> -- > > >>>>>>>>>>>>>>>>>>>>>>>>> Join Flink Forward[2] - The Apache Flink > Conference > > >>>>>>>>>>>>>>>>>>>>>>>>> Stream Processing | Event Driven | Real Time > > >>>>>>>>>>>>>>>>>>>>>>>>> -- > > >>>>>>>>>>>>>>>>>>>>>>>>> Ververica GmbH | Invalidenstrasse 115, 10115 > > >> Berlin, > > >>>>>>>>> Germany > > >>>>>>>>>>>>>>>>>>>>>>>>> -- > > >>>>>>>>>>>>>>>>>>>>>>>>> Ververica GmbH > > >>>>>>>>>>>>>>>>>>>>>>>>> Registered at Amtsgericht Charlottenburg: HRB > > >> 158244 > > >>>> B > > >>>>>>>>>>>>>>>>>>>>>>>>> Managing Directors: Karl Anton Wehner, Holger > > >> Temme, > > >>>>>> Yip > > >>>>>>>>>>>> Park > > >>>>>>>>>>>>>>>>>>>>>>>>> Tung > > >>>>>>>>>>>>>>>>>>>>>>>> Jason, > > >>>>>>>>>>>>>>>>>>>>>>>>> Jinwei (Kevin) > > >>>>>>>>>>>>>>>>>>>>>>>>> Zhang > > >>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>>> -------- > > >>>>>>>>>>>>>>>>>>>>>>>>> [1] mailto:france...@ververica.com > > >>>>>>>>>>>>>>>>>>>>>>>>> [2] https://flink-forward.org/ > > >>>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>>> -- > > >>>>>>>>>>>>>>>>>>>>>>> Marios > > >>>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>> > > >>>>>>> > > >>>>>> > > >>>>>> > > >>>>> > > >>>> > > >>>> > > >>> > > >> > > >> > > > > > >