You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@flink.apache.org by "twalthr (via GitHub)" <gi...@apache.org> on 2025/12/01 15:27:08 UTC

[PR] [FLINK-38738][table] Fix UIDs for ScanTableSource with multiple transformations [flink]

twalthr opened a new pull request, #27294:
URL: https://github.com/apache/flink/pull/27294

   ## What is the purpose of the change
   
   This fixes a critical design flaw in the CompiledPlan.
   
   The planner guarantees that all operators receive a stable UID. It does this, by deriving the UIDs from the CompiledPlan. Thus, CompiledPlan and savepoint/checkpoint are closely linked. The planner does not control the operators and transformations in sources and sinks. From a planner’s perspective, sources and sinks are black boxes. Implementers must ensure that UIDs are assigned to all operators.
   
   This PR ensures that the UIDs assigned in the source are properly represented in the final JobGraph and savepoints. For backwards compatibility, we introduce a new version for `StreamExecTableSourceScan`. As a side effect, this is the first time that we use the versioning infrastructure of CompiledPlan for ExecNodes. Existing tests show that those work nicely.
   
   ## Brief change log
   
   New versions of CompiledPlan will correctly assign the UIDs to transformations that the source assigned, old versions will still overwrite the last transformation with the one provided by the planner.
   
   ## Verifying this change
   
   This change added tests and can be verified as follows: Unit tests in `TransformationsTest`, restore tests in `TableSourceScanRestoreTest`.
   
   ## Does this pull request potentially affect one of the following parts:
   
     - Dependencies (does it add or upgrade a dependency): no
     - The public API, i.e., is any changed class annotated with `@Public(Evolving)`: yes
     - The serializers: no
     - The runtime per-record code paths (performance sensitive): no
     - Anything that affects deployment or recovery: JobManager (and its components), Checkpointing, Kubernetes/Yarn, ZooKeeper: yes
     - The S3 file system connector: no
   
   ## Documentation
   
     - Does this pull request introduce a new feature? no
     - If yes, how is the feature documented? not applicable
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@flink.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [FLINK-38738][table] Fix UIDs for ScanTableSource with multiple transformations [flink]

Posted by "twalthr (via GitHub)" <gi...@apache.org>.
twalthr merged PR #27294:
URL: https://github.com/apache/flink/pull/27294


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@flink.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [FLINK-38738][table] Fix UIDs for ScanTableSource with multiple transformations [flink]

Posted by "davidradl (via GitHub)" <gi...@apache.org>.
davidradl commented on code in PR #27294:
URL: https://github.com/apache/flink/pull/27294#discussion_r2580321407


##########
flink-table/flink-table-common/src/main/java/org/apache/flink/table/connector/ProviderContext.java:
##########
@@ -41,4 +41,26 @@ public interface ProviderContext {
      * in batch mode, or UIDs cannot be guaranteed to be unique.
      */
     Optional<String> generateUid(String name);
+
+    /**
+     * Returns the name provided by the framework to label the connector.
+     *
+     * <p>If multiple transformations are present, the implementer decides which one is the
+     * connector. To distinguish between transformations, each transformation should have a unique
+     * name; do not reuse the same name for more than one transformation.
+     */
+    default String getName() {

Review Comment:
   I am curious why this is default, if best practises are for the implementer to provide a unique name, would it not be better to force them to give a name? 



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@flink.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [FLINK-38738][table] Fix UIDs for ScanTableSource with multiple transformations [flink]

Posted by "twalthr (via GitHub)" <gi...@apache.org>.
twalthr commented on code in PR #27294:
URL: https://github.com/apache/flink/pull/27294#discussion_r2581153282


##########
flink-table/flink-table-common/src/main/java/org/apache/flink/table/connector/ProviderContext.java:
##########
@@ -41,4 +41,26 @@ public interface ProviderContext {
      * in batch mode, or UIDs cannot be guaranteed to be unique.
      */
     Optional<String> generateUid(String name);
+
+    /**
+     * Returns the name provided by the framework to label the connector.
+     *
+     * <p>If multiple transformations are present, the implementer decides which one is the
+     * connector. To distinguish between transformations, each transformation should have a unique
+     * name; do not reuse the same name for more than one transformation.
+     */
+    default String getName() {

Review Comment:
   The doc says `should` not `must`. Having duplicate names or description will only confuse human readability, not machine readability. For machine readability, the `uid` counts and we have checks that validate uniqueness.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@flink.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [FLINK-38738][table] Fix UIDs for ScanTableSource with multiple transformations [flink]

Posted by "twalthr (via GitHub)" <gi...@apache.org>.
twalthr commented on code in PR #27294:
URL: https://github.com/apache/flink/pull/27294#discussion_r2581450829


##########
flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/nodes/exec/ExecNodeMetadata.java:
##########
@@ -33,14 +34,14 @@
 
 /**
  * Annotation to be used for {@link ExecNode}s to keep necessary metadata when
- * serializing/deserializing them in a plan. It's used for internal bookkeeping across Flink
- * versions, and to provide necessary information to the testing infrastructure.
+ * serializing/deserializing them into a {@link CompiledPlan}. It's used for internal bookkeeping
+ * across Flink versions, and to provide necessary information to the testing infrastructure.
  *
  * <p>Each {@link ExecNode} needs to be annotated and provide the necessary metadata info so that it
- * can be correctly serialized and later on instantiated from a string (JSON) plan.
+ * can be correctly serialized and later on instantiated from a JSON plan.
  *
- * <p>It's possible for one {@link ExecNode} class to use multiple annotations to denote ability to
- * upgrade to more versions. an {@link ExecNode} class can be annotated directly with multiple
+ * <p>It's possible for one {@link ExecNode} class to use multiple annotations to denote the ability
+ * to upgrade to more versions. an {@link ExecNode} class can be annotated directly with multiple

Review Comment:
   You are right, this sentence makes no sense. I will try to improve it as part of this PR. 



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@flink.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [FLINK-38738][table] Fix UIDs for ScanTableSource with multiple transformations [flink]

Posted by "davidradl (via GitHub)" <gi...@apache.org>.
davidradl commented on code in PR #27294:
URL: https://github.com/apache/flink/pull/27294#discussion_r2580357585


##########
flink-table/flink-table-common/src/main/java/org/apache/flink/table/connector/ProviderContext.java:
##########
@@ -41,4 +41,26 @@ public interface ProviderContext {
      * in batch mode, or UIDs cannot be guaranteed to be unique.
      */
     Optional<String> generateUid(String name);
+
+    /**
+     * Returns the name provided by the framework to label the connector.
+     *
+     * <p>If multiple transformations are present, the implementer decides which one is the
+     * connector. To distinguish between transformations, each transformation should have a unique
+     * name; do not reuse the same name for more than one transformation.
+     */
+    default String getName() {
+        return "";
+    }
+
+    /**
+     * Returns the description provided by the framework to label the connector.
+     *
+     * <p>If multiple transformations are present, the implementer decides which one is the
+     * connector. To distinguish between transformations, each transformation should have a unique
+     * description; do not reuse the same description for more than one transformation.
+     */
+    default String getDescription() {

Review Comment:
   I would think the name/identifier would be the unique identifier. Is the implication here that we reasonably expect names not to be unique so are relying on descriptions for uniqueness. As with the name, I would expect 1 formal identifier, then human readable attributes like description or displayName. This allows the description and label to change and the object to remain the same because the identifier has not changed.  
    



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@flink.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [FLINK-38738][table] Fix UIDs for ScanTableSource with multiple transformations [flink]

Posted by "davidradl (via GitHub)" <gi...@apache.org>.
davidradl commented on code in PR #27294:
URL: https://github.com/apache/flink/pull/27294#discussion_r2580379909


##########
flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/nodes/exec/ExecNodeMetadata.java:
##########
@@ -33,14 +34,14 @@
 
 /**
  * Annotation to be used for {@link ExecNode}s to keep necessary metadata when
- * serializing/deserializing them in a plan. It's used for internal bookkeeping across Flink
- * versions, and to provide necessary information to the testing infrastructure.
+ * serializing/deserializing them into a {@link CompiledPlan}. It's used for internal bookkeeping
+ * across Flink versions, and to provide necessary information to the testing infrastructure.
  *
  * <p>Each {@link ExecNode} needs to be annotated and provide the necessary metadata info so that it
- * can be correctly serialized and later on instantiated from a string (JSON) plan.
+ * can be correctly serialized and later on instantiated from a JSON plan.
  *
- * <p>It's possible for one {@link ExecNode} class to use multiple annotations to denote ability to
- * upgrade to more versions. an {@link ExecNode} class can be annotated directly with multiple
+ * <p>It's possible for one {@link ExecNode} class to use multiple annotations to denote the ability
+ * to upgrade to more versions. an {@link ExecNode} class can be annotated directly with multiple

Review Comment:
   I do not understand this bit. When we say 
   ```
   use multiple annotations to denote the ability to upgrade to more versions
   ```
   I am not sure how the annotations relate to the ability to upgrade. There appears to be an implication that having multiple annotations means we could go to multiple Flink versions. But these Fink versions (I assume) are ones that may not have have been released yet. I wonder if we could reword this sentence to make it clearer, maybe including example annotations and versions. I see later in the fix, reference to  `FlinkVersion.v2_3`, which does not look a like a Flink version (e.g. 2.0.1 or 2.1.1).   
   
   



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@flink.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [FLINK-38738][table] Fix UIDs for ScanTableSource with multiple transformations [flink]

Posted by "snuyanzin (via GitHub)" <gi...@apache.org>.
snuyanzin commented on code in PR #27294:
URL: https://github.com/apache/flink/pull/27294#discussion_r2580260604


##########
flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/plan/nodes/exec/TransformationsTest.java:
##########
@@ -143,19 +153,135 @@ public void testLegacyBatchValues() {
 
     @Test
     public void testUidGeneration() {
-        checkUids(c -> c.set(TABLE_EXEC_UID_GENERATION, PLAN_ONLY), true, false);
-        checkUids(c -> c.set(TABLE_EXEC_UID_GENERATION, ALWAYS), true, true);
-        checkUids(c -> c.set(TABLE_EXEC_UID_GENERATION, DISABLED), false, false);
+        testUidGeneration(c -> c.set(TABLE_EXEC_UID_GENERATION, PLAN_ONLY), true, false);
+        testUidGeneration(c -> c.set(TABLE_EXEC_UID_GENERATION, ALWAYS), true, true);
+        testUidGeneration(c -> c.set(TABLE_EXEC_UID_GENERATION, DISABLED), false, false);
     }
 
-    private static void checkUids(
+    @Test
+    public void testUidDefaults() throws IOException {
+        assertTransformations(
+                config -> {},
+                json -> {},
+                env -> planFromCurrentFlinkValues(env).asJsonString(),
+                "\\d+_sink",
+                "\\d+_constraint-validator",
+                "\\d+_values");
+    }
+
+    @Test
+    public void testUidFlink1_15() throws IOException {
+        assertTransformations(
+                config ->
+                        config.set(TABLE_EXEC_UID_FORMAT, "<id>_<type>_<version>_<transformation>"),
+                json -> {},
+                env -> planFromFlink1_15Values(env).asJsonString(),
+                "\\d+_stream-exec-sink_1_sink",
+                "\\d+_stream-exec-sink_1_constraint-validator",
+                "\\d+_stream-exec-values_1_values");
+    }
+
+    @Test
+    public void testUidFlink1_18() throws IOException {
+        assertTransformations(
+                config ->
+                        config.set(TABLE_EXEC_UID_FORMAT, "<id>_<type>_<version>_<transformation>"),
+                json -> {},
+                env -> planFromCurrentFlinkValues(env).asJsonString(),
+                "\\d+_stream-exec-sink_1_sink",
+                "\\d+_stream-exec-sink_1_constraint-validator",
+                "\\d+_stream-exec-values_1_values");
+    }
+
+    @Test
+    public void testPerNodeCustomUid() throws IOException {

Review Comment:
   ```suggestion
       void testPerNodeCustomUid() throws IOException {
   ```
   nit: no need for `public` modifier for junit5



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@flink.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [FLINK-38738][table] Fix UIDs for ScanTableSource with multiple transformations [flink]

Posted by "flinkbot (via GitHub)" <gi...@apache.org>.
flinkbot commented on PR #27294:
URL: https://github.com/apache/flink/pull/27294#issuecomment-3597212742

   <!--
   Meta data
   {
     "version" : 1,
     "metaDataEntries" : [ {
       "hash" : "7f23c39aeb5e97d041215ea06f45b2efe069296a",
       "status" : "UNKNOWN",
       "url" : "TBD",
       "triggerID" : "7f23c39aeb5e97d041215ea06f45b2efe069296a",
       "triggerType" : "PUSH"
     } ]
   }-->
   ## CI report:
   
   * 7f23c39aeb5e97d041215ea06f45b2efe069296a UNKNOWN
   
   <details>
   <summary>Bot commands</summary>
     The @flinkbot bot supports the following commands:
   
    - `@flinkbot run azure` re-run the last Azure build
   </details>


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@flink.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [FLINK-38738][table] Fix UIDs for ScanTableSource with multiple transformations [flink]

Posted by "davidradl (via GitHub)" <gi...@apache.org>.
davidradl commented on code in PR #27294:
URL: https://github.com/apache/flink/pull/27294#discussion_r2580421049


##########
flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/nodes/exec/common/CommonExecTableSourceScan.java:
##########
@@ -179,22 +177,26 @@ protected Transformation<RowData> translateToPlanInternal(
                     env.fromSource(
                                     source,
                                     WatermarkStrategy.noWatermarks(),
-                                    meta.getName(),
+                                    metadata.getName(),
                                     outputTypeInfo)
                             .getTransformation();
-            meta.fill(sourceTransform);
+            metadata.fill(sourceTransform);
         } else if (provider instanceof DataStreamScanProvider) {
             sourceTransform =
                     ((DataStreamScanProvider) provider)
-                            .produceDataStream(createProviderContext(config), env)
+                            .produceDataStream(createProviderContext(metadata, config), env)
                             .getTransformation();
-            meta.fill(sourceTransform);
+            if (legacyUidsEnabled) {
+                metadata.fill(sourceTransform);
+            }
             sourceTransform.setOutputType(outputTypeInfo);
         } else if (provider instanceof TransformationScanProvider) {
             sourceTransform =
                     ((TransformationScanProvider) provider)
-                            .createTransformation(createProviderContext(config));
-            meta.fill(sourceTransform);
+                            .createTransformation(createProviderContext(metadata, config));
+            if (legacyUidsEnabled) {

Review Comment:
   nit: this is purely an observation - no need to change. I see 
   ```
   if (legacyUidsEnabled) {
                   metadata.fill(sourceTransform);
               }
               sourceTransform.setOutputType(outputTypeInfo);
   ```
   duplicated - I wonder if we could refactor this logic out so there i not a duplication. 



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@flink.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [FLINK-38738][table] Fix UIDs for ScanTableSource with multiple transformations [flink]

Posted by "davidradl (via GitHub)" <gi...@apache.org>.
davidradl commented on code in PR #27294:
URL: https://github.com/apache/flink/pull/27294#discussion_r2580343601


##########
flink-table/flink-table-common/src/main/java/org/apache/flink/table/connector/ProviderContext.java:
##########
@@ -41,4 +41,26 @@ public interface ProviderContext {
      * in batch mode, or UIDs cannot be guaranteed to be unique.
      */
     Optional<String> generateUid(String name);

Review Comment:
   Is this name the same as the name in getName()? If the getName is different and a label - maybe call that name label or displayName. 
   
   I suggest: Either:
   - separating the 2 names ;one as an identifier, one as label - or equivalent words. Labels could be duplicates ,but are not ideal, but having the identifiers unique is the important part.
   - use one name and have generateUid call getName() to obtain the name it works with.
      
   I prefer the first option , so you could have a namespaced identifier and a human readable label. The identifier then corresponds with 1 Uid.  WDYT?
   



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@flink.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [FLINK-38738][table] Fix UIDs for ScanTableSource with multiple transformations [flink]

Posted by "davidradl (via GitHub)" <gi...@apache.org>.
davidradl commented on code in PR #27294:
URL: https://github.com/apache/flink/pull/27294#discussion_r2580343601


##########
flink-table/flink-table-common/src/main/java/org/apache/flink/table/connector/ProviderContext.java:
##########
@@ -41,4 +41,26 @@ public interface ProviderContext {
      * in batch mode, or UIDs cannot be guaranteed to be unique.
      */
     Optional<String> generateUid(String name);

Review Comment:
   Is this name the same as the name in getName()? If the getName is different and a label - maybe call that name label or displayName. 
   
   I suggest: Either:
   - separating the 2 names ;one as an identifier, one as label - or equivalent words. Labels could be duplicates ,but are not ideal, but having the identifiers unique is the important part.
   - use one name and have generateUid call getName() to obtain the name it works with.
      
   I prefer the first option , so you could have a namespaced identifier and a human readable label.  WDYT?
   



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@flink.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [FLINK-38738][table] Fix UIDs for ScanTableSource with multiple transformations [flink]

Posted by "davidradl (via GitHub)" <gi...@apache.org>.
davidradl commented on code in PR #27294:
URL: https://github.com/apache/flink/pull/27294#discussion_r2580379909


##########
flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/nodes/exec/ExecNodeMetadata.java:
##########
@@ -33,14 +34,14 @@
 
 /**
  * Annotation to be used for {@link ExecNode}s to keep necessary metadata when
- * serializing/deserializing them in a plan. It's used for internal bookkeeping across Flink
- * versions, and to provide necessary information to the testing infrastructure.
+ * serializing/deserializing them into a {@link CompiledPlan}. It's used for internal bookkeeping
+ * across Flink versions, and to provide necessary information to the testing infrastructure.
  *
  * <p>Each {@link ExecNode} needs to be annotated and provide the necessary metadata info so that it
- * can be correctly serialized and later on instantiated from a string (JSON) plan.
+ * can be correctly serialized and later on instantiated from a JSON plan.
  *
- * <p>It's possible for one {@link ExecNode} class to use multiple annotations to denote ability to
- * upgrade to more versions. an {@link ExecNode} class can be annotated directly with multiple
+ * <p>It's possible for one {@link ExecNode} class to use multiple annotations to denote the ability
+ * to upgrade to more versions. an {@link ExecNode} class can be annotated directly with multiple

Review Comment:
   I do not understand this bit. When we say 
   ```
   use multiple annotations to denote the ability to upgrade to more versions
   ```
   I am not sure how the annotations relate to the ability to upgrade. There appears to be an implication that having multiple annotations means we could go to multiple Flink versions. But these Fink versions (I assume) are ones that may not have have been released yet. I wonder if we could reword this sentence to make it clearer, maybe including example annotations and versions. 



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@flink.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [FLINK-38738][table] Fix UIDs for ScanTableSource with multiple transformations [flink]

Posted by "twalthr (via GitHub)" <gi...@apache.org>.
twalthr commented on code in PR #27294:
URL: https://github.com/apache/flink/pull/27294#discussion_r2581161470


##########
flink-table/flink-table-common/src/main/java/org/apache/flink/table/connector/ProviderContext.java:
##########
@@ -41,4 +41,26 @@ public interface ProviderContext {
      * in batch mode, or UIDs cannot be guaranteed to be unique.
      */
     Optional<String> generateUid(String name);

Review Comment:
   Thanks for the feedback. I will reiterate on the docs to make them easier to consume. In general, the terminology comes from the core's `Transformation` interface. But I agree that name, uid, and description can be confusioning for implementers.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@flink.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [FLINK-38738][table] Fix UIDs for ScanTableSource with multiple transformations [flink]

Posted by "davidradl (via GitHub)" <gi...@apache.org>.
davidradl commented on code in PR #27294:
URL: https://github.com/apache/flink/pull/27294#discussion_r2580379909


##########
flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/nodes/exec/ExecNodeMetadata.java:
##########
@@ -33,14 +34,14 @@
 
 /**
  * Annotation to be used for {@link ExecNode}s to keep necessary metadata when
- * serializing/deserializing them in a plan. It's used for internal bookkeeping across Flink
- * versions, and to provide necessary information to the testing infrastructure.
+ * serializing/deserializing them into a {@link CompiledPlan}. It's used for internal bookkeeping
+ * across Flink versions, and to provide necessary information to the testing infrastructure.
  *
  * <p>Each {@link ExecNode} needs to be annotated and provide the necessary metadata info so that it
- * can be correctly serialized and later on instantiated from a string (JSON) plan.
+ * can be correctly serialized and later on instantiated from a JSON plan.
  *
- * <p>It's possible for one {@link ExecNode} class to use multiple annotations to denote ability to
- * upgrade to more versions. an {@link ExecNode} class can be annotated directly with multiple
+ * <p>It's possible for one {@link ExecNode} class to use multiple annotations to denote the ability
+ * to upgrade to more versions. an {@link ExecNode} class can be annotated directly with multiple

Review Comment:
   I do not understand this bit. When we say 
   ```
   use multiple annotations to denote the ability to upgrade to more versions
   ```
   I am not sure how the annotations relate to the ability to upgrade. There appears to be an implication that having multiple annotations means we could go to multiple Flink versions. But these Fink versions (I assume) are ones that may not have have been released yet. I wonder if we could reword this sentence to make it clearer, maybe including example annotations and versions. 
   
   



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@flink.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org