This is an automated email from the ASF dual-hosted git repository.
1996fanrui pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git
The following commit(s) were added to refs/heads/master by this push:
new 823d9d509f2 [FLINK-39776][runtime][core] Expose JobInfo on
SourceOperators
823d9d509f2 is described below
commit 823d9d509f2f0b83394dfa7958ff4fea44b94e41
Author: Aleksandr Savonin <[email protected]>
AuthorDate: Wed May 27 21:08:12 2026 +0200
[FLINK-39776][runtime][core] Expose JobInfo on SourceOperators
---
.../source/hybrid/HybridSourceSplitEnumerator.java | 6 ++
.../connector/source/RichSourceReaderContext.java | 6 ++
.../api/connector/source/SourceReaderContext.java | 12 +++
.../connector/source/SplitEnumeratorContext.java | 11 +++
.../source/mocks/MockSplitEnumeratorContext.java | 10 +++
.../InternalExecutionGraphAccessor.java | 2 +
.../coordination/OperatorCoordinator.java | 4 +
.../coordination/OperatorCoordinatorHolder.java | 23 ++++--
.../RecreateOnResetOperatorCoordinator.java | 6 ++
.../coordinator/SourceCoordinatorContext.java | 6 ++
.../source/RichSourceReaderContextTest.java | 89 ++++++++++++++++++++++
.../MockOperatorCoordinatorContext.java | 8 ++
.../OperatorCoordinatorHolderTest.java | 2 +
.../runtime/scheduler/adaptive/ExecutingTest.java | 5 ++
.../coordinator/SourceCoordinatorContextTest.java | 11 +++
.../source/reader/TestingReaderContext.java | 10 +++
.../reader/TestingSplitEnumeratorContext.java | 10 +++
17 files changed, 216 insertions(+), 5 deletions(-)
diff --git
a/flink-connectors/flink-connector-base/src/main/java/org/apache/flink/connector/base/source/hybrid/HybridSourceSplitEnumerator.java
b/flink-connectors/flink-connector-base/src/main/java/org/apache/flink/connector/base/source/hybrid/HybridSourceSplitEnumerator.java
index 48bec9753c5..3e316c4f548 100644
---
a/flink-connectors/flink-connector-base/src/main/java/org/apache/flink/connector/base/source/hybrid/HybridSourceSplitEnumerator.java
+++
b/flink-connectors/flink-connector-base/src/main/java/org/apache/flink/connector/base/source/hybrid/HybridSourceSplitEnumerator.java
@@ -18,6 +18,7 @@
package org.apache.flink.connector.base.source.hybrid;
+import org.apache.flink.api.common.JobInfo;
import org.apache.flink.api.connector.source.ReaderInfo;
import org.apache.flink.api.connector.source.Source;
import org.apache.flink.api.connector.source.SourceEvent;
@@ -340,6 +341,11 @@ public class HybridSourceSplitEnumerator
this.sourceSize = sourceSize;
}
+ @Override
+ public JobInfo getJobInfo() {
+ return realContext.getJobInfo();
+ }
+
@Override
public SplitEnumeratorMetricGroup metricGroup() {
return realContext.metricGroup();
diff --git
a/flink-core/src/main/java/org/apache/flink/api/connector/source/RichSourceReaderContext.java
b/flink-core/src/main/java/org/apache/flink/api/connector/source/RichSourceReaderContext.java
index c398cf80c8a..51ba524673b 100644
---
a/flink-core/src/main/java/org/apache/flink/api/connector/source/RichSourceReaderContext.java
+++
b/flink-core/src/main/java/org/apache/flink/api/connector/source/RichSourceReaderContext.java
@@ -19,6 +19,7 @@
package org.apache.flink.api.connector.source;
import org.apache.flink.annotation.Experimental;
+import org.apache.flink.api.common.JobInfo;
import org.apache.flink.api.common.functions.RuntimeContext;
import org.apache.flink.util.Preconditions;
@@ -39,4 +40,9 @@ public abstract class RichSourceReaderContext implements
SourceReaderContext {
Preconditions.checkNotNull(runtimeContext, "The runtime context must
not be null.");
return runtimeContext;
}
+
+ @Override
+ public JobInfo getJobInfo() {
+ return getRuntimeContext().getJobInfo();
+ }
}
diff --git
a/flink-core/src/main/java/org/apache/flink/api/connector/source/SourceReaderContext.java
b/flink-core/src/main/java/org/apache/flink/api/connector/source/SourceReaderContext.java
index 0973350de81..be0f85d9aba 100644
---
a/flink-core/src/main/java/org/apache/flink/api/connector/source/SourceReaderContext.java
+++
b/flink-core/src/main/java/org/apache/flink/api/connector/source/SourceReaderContext.java
@@ -19,6 +19,8 @@
package org.apache.flink.api.connector.source;
import org.apache.flink.annotation.Public;
+import org.apache.flink.annotation.PublicEvolving;
+import org.apache.flink.api.common.JobInfo;
import org.apache.flink.api.common.watermark.Watermark;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.metrics.groups.SourceReaderMetricGroup;
@@ -28,6 +30,16 @@ import org.apache.flink.util.UserCodeClassLoader;
@Public
public interface SourceReaderContext {
+ /**
+ * Get the meta information of the current job.
+ *
+ * @return the job meta information.
+ */
+ @PublicEvolving
+ default JobInfo getJobInfo() {
+ throw new UnsupportedOperationException();
+ }
+
/**
* @return The metric group this source belongs to.
*/
diff --git
a/flink-core/src/main/java/org/apache/flink/api/connector/source/SplitEnumeratorContext.java
b/flink-core/src/main/java/org/apache/flink/api/connector/source/SplitEnumeratorContext.java
index 6c3637b2772..5a0b99020fd 100644
---
a/flink-core/src/main/java/org/apache/flink/api/connector/source/SplitEnumeratorContext.java
+++
b/flink-core/src/main/java/org/apache/flink/api/connector/source/SplitEnumeratorContext.java
@@ -20,6 +20,7 @@ package org.apache.flink.api.connector.source;
import org.apache.flink.annotation.Public;
import org.apache.flink.annotation.PublicEvolving;
+import org.apache.flink.api.common.JobInfo;
import org.apache.flink.metrics.groups.SplitEnumeratorMetricGroup;
import java.util.Map;
@@ -41,6 +42,16 @@ import java.util.function.BiConsumer;
@Public
public interface SplitEnumeratorContext<SplitT extends SourceSplit> {
+ /**
+ * Get the meta information of the current job.
+ *
+ * @return the job meta information.
+ */
+ @PublicEvolving
+ default JobInfo getJobInfo() {
+ throw new UnsupportedOperationException();
+ }
+
SplitEnumeratorMetricGroup metricGroup();
/**
diff --git
a/flink-core/src/test/java/org/apache/flink/api/connector/source/mocks/MockSplitEnumeratorContext.java
b/flink-core/src/test/java/org/apache/flink/api/connector/source/mocks/MockSplitEnumeratorContext.java
index a09cb28869e..385cad14a90 100644
---
a/flink-core/src/test/java/org/apache/flink/api/connector/source/mocks/MockSplitEnumeratorContext.java
+++
b/flink-core/src/test/java/org/apache/flink/api/connector/source/mocks/MockSplitEnumeratorContext.java
@@ -18,6 +18,9 @@ limitations under the License.
package org.apache.flink.api.connector.source.mocks;
+import org.apache.flink.api.common.JobID;
+import org.apache.flink.api.common.JobInfo;
+import org.apache.flink.api.common.JobInfoImpl;
import org.apache.flink.api.connector.source.ReaderInfo;
import org.apache.flink.api.connector.source.SourceEvent;
import org.apache.flink.api.connector.source.SourceSplit;
@@ -66,6 +69,8 @@ public class MockSplitEnumeratorContext<SplitT extends
SourceSplit>
private final int parallelism;
+ private final JobInfo jobInfo = new JobInfoImpl(new JobID(), "mock-job");
+
public MockSplitEnumeratorContext(int parallelism) {
this.sentSourceEvent = new HashMap<>();
this.registeredReaders = new ConcurrentHashMap<>();
@@ -83,6 +88,11 @@ public class MockSplitEnumeratorContext<SplitT extends
SourceSplit>
this.subtaskHasNoMoreSplits = new boolean[parallelism];
}
+ @Override
+ public JobInfo getJobInfo() {
+ return jobInfo;
+ }
+
@Override
public SplitEnumeratorMetricGroup metricGroup() {
return UnregisteredMetricsGroup.createSplitEnumeratorMetricGroup();
diff --git
a/flink-runtime/src/main/java/org/apache/flink/runtime/executiongraph/InternalExecutionGraphAccessor.java
b/flink-runtime/src/main/java/org/apache/flink/runtime/executiongraph/InternalExecutionGraphAccessor.java
index 364aa4008bd..6802b052596 100644
---
a/flink-runtime/src/main/java/org/apache/flink/runtime/executiongraph/InternalExecutionGraphAccessor.java
+++
b/flink-runtime/src/main/java/org/apache/flink/runtime/executiongraph/InternalExecutionGraphAccessor.java
@@ -48,6 +48,8 @@ public interface InternalExecutionGraphAccessor {
JobID getJobID();
+ String getJobName();
+
BlobWriter getBlobWriter();
/**
diff --git
a/flink-runtime/src/main/java/org/apache/flink/runtime/operators/coordination/OperatorCoordinator.java
b/flink-runtime/src/main/java/org/apache/flink/runtime/operators/coordination/OperatorCoordinator.java
index 2f07f9a639a..ea0798dc5f9 100644
---
a/flink-runtime/src/main/java/org/apache/flink/runtime/operators/coordination/OperatorCoordinator.java
+++
b/flink-runtime/src/main/java/org/apache/flink/runtime/operators/coordination/OperatorCoordinator.java
@@ -20,6 +20,7 @@ package org.apache.flink.runtime.operators.coordination;
import org.apache.flink.annotation.Internal;
import org.apache.flink.api.common.JobID;
+import org.apache.flink.api.common.JobInfo;
import org.apache.flink.api.common.state.CheckpointListener;
import org.apache.flink.metrics.groups.OperatorCoordinatorMetricGroup;
import org.apache.flink.runtime.checkpoint.CheckpointCoordinator;
@@ -261,6 +262,9 @@ public interface OperatorCoordinator extends
CheckpointListener, AutoCloseable {
/** Gets the {@link JobID} of the job to which the coordinator
belongs. */
JobID getJobID();
+ /** Gets the {@link JobInfo} of the job to which the coordinator
belongs. */
+ JobInfo getJobInfo();
+
/** Gets the ID of the operator to which the coordinator belongs. */
OperatorID getOperatorId();
diff --git
a/flink-runtime/src/main/java/org/apache/flink/runtime/operators/coordination/OperatorCoordinatorHolder.java
b/flink-runtime/src/main/java/org/apache/flink/runtime/operators/coordination/OperatorCoordinatorHolder.java
index 99ce26f0d34..192aacd0f56 100644
---
a/flink-runtime/src/main/java/org/apache/flink/runtime/operators/coordination/OperatorCoordinatorHolder.java
+++
b/flink-runtime/src/main/java/org/apache/flink/runtime/operators/coordination/OperatorCoordinatorHolder.java
@@ -21,6 +21,8 @@ package org.apache.flink.runtime.operators.coordination;
import org.apache.flink.annotation.VisibleForTesting;
import org.apache.flink.api.common.ExecutionConfig;
import org.apache.flink.api.common.JobID;
+import org.apache.flink.api.common.JobInfo;
+import org.apache.flink.api.common.JobInfoImpl;
import org.apache.flink.metrics.MetricGroup;
import org.apache.flink.metrics.groups.OperatorCoordinatorMetricGroup;
import org.apache.flink.runtime.checkpoint.CheckpointCoordinator;
@@ -500,6 +502,10 @@ public class OperatorCoordinatorHolder
final SubtaskAccess.SubtaskAccessFactory taskAccesses =
new
ExecutionSubtaskAccess.ExecutionJobVertexSubtaskAccess(jobVertex, opId);
+ final JobInfo jobInfo =
+ new JobInfoImpl(
+ jobVertex.getGraph().getJobID(),
jobVertex.getGraph().getJobName());
+
return create(
opId,
provider,
@@ -511,6 +517,7 @@ public class OperatorCoordinatorHolder
taskAccesses,
supportsConcurrentExecutionAttempts,
taskInformation,
+ jobInfo,
metricGroup);
}
}
@@ -527,6 +534,7 @@ public class OperatorCoordinatorHolder
final SubtaskAccess.SubtaskAccessFactory taskAccesses,
final boolean supportsConcurrentExecutionAttempts,
final TaskInformation taskInformation,
+ final JobInfo jobInfo,
final JobManagerJobMetricGroup jobManagerJobMetricGroup)
throws Exception {
final MetricGroup parentMetricGroup =
@@ -537,7 +545,7 @@ public class OperatorCoordinatorHolder
operatorName);
final LazyInitializedCoordinatorContext context =
new LazyInitializedCoordinatorContext(
- jobManagerJobMetricGroup.jobId(),
+ jobInfo,
opId,
operatorName,
userCodeClassLoader,
@@ -576,7 +584,7 @@ public class OperatorCoordinatorHolder
private static final Logger LOG =
LoggerFactory.getLogger(LazyInitializedCoordinatorContext.class);
- private final JobID jobID;
+ private final JobInfo jobInfo;
private final OperatorID operatorId;
private final String operatorName;
private final ClassLoader userCodeClassLoader;
@@ -592,7 +600,7 @@ public class OperatorCoordinatorHolder
private volatile boolean failed;
public LazyInitializedCoordinatorContext(
- JobID jobID,
+ JobInfo jobInfo,
final OperatorID operatorId,
final String operatorName,
final ClassLoader userCodeClassLoader,
@@ -600,7 +608,7 @@ public class OperatorCoordinatorHolder
final CoordinatorStore coordinatorStore,
final boolean supportsConcurrentExecutionAttempts,
final OperatorCoordinatorMetricGroup metricGroup) {
- this.jobID = jobID;
+ this.jobInfo = checkNotNull(jobInfo);
this.operatorId = checkNotNull(operatorId);
this.operatorName = checkNotNull(operatorName);
this.userCodeClassLoader = checkNotNull(userCodeClassLoader);
@@ -641,7 +649,12 @@ public class OperatorCoordinatorHolder
@Override
public JobID getJobID() {
- return jobID;
+ return jobInfo.getJobId();
+ }
+
+ @Override
+ public JobInfo getJobInfo() {
+ return jobInfo;
}
@Override
diff --git
a/flink-runtime/src/main/java/org/apache/flink/runtime/operators/coordination/RecreateOnResetOperatorCoordinator.java
b/flink-runtime/src/main/java/org/apache/flink/runtime/operators/coordination/RecreateOnResetOperatorCoordinator.java
index 98718fe3ba8..b92009422ee 100644
---
a/flink-runtime/src/main/java/org/apache/flink/runtime/operators/coordination/RecreateOnResetOperatorCoordinator.java
+++
b/flink-runtime/src/main/java/org/apache/flink/runtime/operators/coordination/RecreateOnResetOperatorCoordinator.java
@@ -20,6 +20,7 @@ package org.apache.flink.runtime.operators.coordination;
import org.apache.flink.annotation.VisibleForTesting;
import org.apache.flink.api.common.JobID;
+import org.apache.flink.api.common.JobInfo;
import org.apache.flink.metrics.groups.OperatorCoordinatorMetricGroup;
import org.apache.flink.runtime.checkpoint.CheckpointCoordinator;
import org.apache.flink.runtime.jobgraph.OperatorID;
@@ -249,6 +250,11 @@ public class RecreateOnResetOperatorCoordinator implements
OperatorCoordinator {
return context.getJobID();
}
+ @Override
+ public JobInfo getJobInfo() {
+ return context.getJobInfo();
+ }
+
@Override
public OperatorID getOperatorId() {
return context.getOperatorId();
diff --git
a/flink-runtime/src/main/java/org/apache/flink/runtime/source/coordinator/SourceCoordinatorContext.java
b/flink-runtime/src/main/java/org/apache/flink/runtime/source/coordinator/SourceCoordinatorContext.java
index 3f9d78b5864..bb2d6a30050 100644
---
a/flink-runtime/src/main/java/org/apache/flink/runtime/source/coordinator/SourceCoordinatorContext.java
+++
b/flink-runtime/src/main/java/org/apache/flink/runtime/source/coordinator/SourceCoordinatorContext.java
@@ -22,6 +22,7 @@ import org.apache.flink.annotation.Internal;
import org.apache.flink.annotation.VisibleForTesting;
import org.apache.flink.api.common.ExecutionConfig;
import org.apache.flink.api.common.JobID;
+import org.apache.flink.api.common.JobInfo;
import org.apache.flink.api.connector.source.ReaderInfo;
import org.apache.flink.api.connector.source.SourceEvent;
import org.apache.flink.api.connector.source.SourceSplit;
@@ -181,6 +182,11 @@ public class SourceCoordinatorContext<SplitT extends
SourceSplit>
return new
InternalSplitEnumeratorMetricGroup(operatorCoordinatorContext.metricGroup());
}
+ @Override
+ public JobInfo getJobInfo() {
+ return operatorCoordinatorContext.getJobInfo();
+ }
+
@Override
public void sendEventToSourceReader(int subtaskId, SourceEvent event) {
checkAndLazyInitialize();
diff --git
a/flink-runtime/src/test/java/org/apache/flink/api/connector/source/RichSourceReaderContextTest.java
b/flink-runtime/src/test/java/org/apache/flink/api/connector/source/RichSourceReaderContextTest.java
new file mode 100644
index 00000000000..79a9d125c14
--- /dev/null
+++
b/flink-runtime/src/test/java/org/apache/flink/api/connector/source/RichSourceReaderContextTest.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.flink.api.connector.source;
+
+import org.apache.flink.api.common.JobInfo;
+import org.apache.flink.configuration.Configuration;
+import org.apache.flink.metrics.groups.SourceReaderMetricGroup;
+import org.apache.flink.streaming.util.MockStreamingRuntimeContext;
+import org.apache.flink.util.UserCodeClassLoader;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+/** Unit test for {@link RichSourceReaderContext}. */
+class RichSourceReaderContextTest {
+
+ @Test
+ void testGetJobInfoReturnsRuntimeContextJobInfo() {
+ MockStreamingRuntimeContext runtimeContext = new
MockStreamingRuntimeContext(1, 0);
+ StubRichSourceReaderContext context = new
StubRichSourceReaderContext();
+ context.setRuntimeContext(runtimeContext);
+
+ JobInfo jobInfo = context.getJobInfo();
+
+ assertThat(jobInfo).isSameAs(runtimeContext.getJobInfo());
+ }
+
+ @Test
+ void testGetJobInfoFailsWhenRuntimeContextNotSet() {
+ StubRichSourceReaderContext context = new
StubRichSourceReaderContext();
+ assertThatThrownBy(context::getJobInfo)
+ .hasMessageContaining("runtime context must not be null");
+ }
+
+ private static class StubRichSourceReaderContext extends
RichSourceReaderContext {
+ @Override
+ public SourceReaderMetricGroup metricGroup() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public Configuration getConfiguration() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public String getLocalHostName() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public int getIndexOfSubtask() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void sendSplitRequest() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void sendSourceEventToCoordinator(SourceEvent sourceEvent) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public UserCodeClassLoader getUserCodeClassLoader() {
+ throw new UnsupportedOperationException();
+ }
+ }
+}
diff --git
a/flink-runtime/src/test/java/org/apache/flink/runtime/operators/coordination/MockOperatorCoordinatorContext.java
b/flink-runtime/src/test/java/org/apache/flink/runtime/operators/coordination/MockOperatorCoordinatorContext.java
index 71732d8cc7d..6f01ee65629 100644
---
a/flink-runtime/src/test/java/org/apache/flink/runtime/operators/coordination/MockOperatorCoordinatorContext.java
+++
b/flink-runtime/src/test/java/org/apache/flink/runtime/operators/coordination/MockOperatorCoordinatorContext.java
@@ -19,6 +19,8 @@ limitations under the License.
package org.apache.flink.runtime.operators.coordination;
import org.apache.flink.api.common.JobID;
+import org.apache.flink.api.common.JobInfo;
+import org.apache.flink.api.common.JobInfoImpl;
import org.apache.flink.metrics.groups.OperatorCoordinatorMetricGroup;
import org.apache.flink.runtime.checkpoint.CheckpointCoordinator;
import org.apache.flink.runtime.jobgraph.OperatorID;
@@ -31,6 +33,7 @@ import java.util.concurrent.CompletableFuture;
public class MockOperatorCoordinatorContext implements
OperatorCoordinator.Context {
private final JobID jobID = new JobID();
+ private final JobInfo jobInfo = new JobInfoImpl(jobID, "mock-job");
private final OperatorID operatorID;
private final ClassLoader userCodeClassLoader;
private final int numSubtasks;
@@ -62,6 +65,11 @@ public class MockOperatorCoordinatorContext implements
OperatorCoordinator.Conte
return jobID;
}
+ @Override
+ public JobInfo getJobInfo() {
+ return jobInfo;
+ }
+
@Override
public OperatorID getOperatorId() {
return operatorID;
diff --git
a/flink-runtime/src/test/java/org/apache/flink/runtime/operators/coordination/OperatorCoordinatorHolderTest.java
b/flink-runtime/src/test/java/org/apache/flink/runtime/operators/coordination/OperatorCoordinatorHolderTest.java
index 8014532c340..d99cc194630 100644
---
a/flink-runtime/src/test/java/org/apache/flink/runtime/operators/coordination/OperatorCoordinatorHolderTest.java
+++
b/flink-runtime/src/test/java/org/apache/flink/runtime/operators/coordination/OperatorCoordinatorHolderTest.java
@@ -19,6 +19,7 @@
package org.apache.flink.runtime.operators.coordination;
import org.apache.flink.api.common.JobID;
+import org.apache.flink.api.common.JobInfoImpl;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.core.testutils.OneShotLatch;
import org.apache.flink.runtime.checkpoint.CheckpointCoordinator;
@@ -541,6 +542,7 @@ class OperatorCoordinatorHolderTest {
1,
NoOpInvokable.class.getName(),
new Configuration()),
+ new JobInfoImpl(new JobID(), "test-job"),
UnregisteredMetricGroups.createUnregisteredJobManagerJobMetricGroup());
JobID jobId = new JobID();
diff --git
a/flink-runtime/src/test/java/org/apache/flink/runtime/scheduler/adaptive/ExecutingTest.java
b/flink-runtime/src/test/java/org/apache/flink/runtime/scheduler/adaptive/ExecutingTest.java
index f593082f6c7..b9ff24d7c58 100644
---
a/flink-runtime/src/test/java/org/apache/flink/runtime/scheduler/adaptive/ExecutingTest.java
+++
b/flink-runtime/src/test/java/org/apache/flink/runtime/scheduler/adaptive/ExecutingTest.java
@@ -1194,6 +1194,11 @@ class ExecutingTest {
return null;
}
+ @Override
+ public String getJobName() {
+ return null;
+ }
+
@Override
public BlobWriter getBlobWriter() {
return null;
diff --git
a/flink-runtime/src/test/java/org/apache/flink/runtime/source/coordinator/SourceCoordinatorContextTest.java
b/flink-runtime/src/test/java/org/apache/flink/runtime/source/coordinator/SourceCoordinatorContextTest.java
index c4fb85bedce..f6db6e5bb8e 100644
---
a/flink-runtime/src/test/java/org/apache/flink/runtime/source/coordinator/SourceCoordinatorContextTest.java
+++
b/flink-runtime/src/test/java/org/apache/flink/runtime/source/coordinator/SourceCoordinatorContextTest.java
@@ -19,6 +19,7 @@
package org.apache.flink.runtime.source.coordinator;
import org.apache.flink.api.common.JobID;
+import org.apache.flink.api.common.JobInfo;
import org.apache.flink.api.connector.source.ReaderInfo;
import org.apache.flink.api.connector.source.SplitsAssignment;
import org.apache.flink.api.connector.source.mocks.MockSourceSplit;
@@ -45,6 +46,16 @@ import static org.assertj.core.api.Assertions.assertThat;
/** Unit test for {@link SourceCoordinatorContext}. */
class SourceCoordinatorContextTest extends SourceCoordinatorTestBase {
+ @Test
+ void testGetJobInfo() {
+ // Compare on JobID (and JobName) rather than full JobInfo because
JobInfoImpl is
+ // @Internal and does not override equals().
+ JobInfo expected = operatorCoordinatorContext.getJobInfo();
+ JobInfo actual = context.getJobInfo();
+ assertThat(actual.getJobId()).isEqualTo(expected.getJobId());
+ assertThat(actual.getJobName()).isEqualTo(expected.getJobName());
+ }
+
@Test
void testRegisterReader() throws Exception {
sourceReady();
diff --git
a/flink-test-utils-parent/flink-connector-test-utils/src/main/java/org/apache/flink/connector/testutils/source/reader/TestingReaderContext.java
b/flink-test-utils-parent/flink-connector-test-utils/src/main/java/org/apache/flink/connector/testutils/source/reader/TestingReaderContext.java
index 4855ced967b..47a9b54b553 100644
---
a/flink-test-utils-parent/flink-connector-test-utils/src/main/java/org/apache/flink/connector/testutils/source/reader/TestingReaderContext.java
+++
b/flink-test-utils-parent/flink-connector-test-utils/src/main/java/org/apache/flink/connector/testutils/source/reader/TestingReaderContext.java
@@ -18,6 +18,9 @@
package org.apache.flink.connector.testutils.source.reader;
+import org.apache.flink.api.common.JobID;
+import org.apache.flink.api.common.JobInfo;
+import org.apache.flink.api.common.JobInfoImpl;
import org.apache.flink.api.connector.source.SourceEvent;
import org.apache.flink.api.connector.source.SourceReaderContext;
import org.apache.flink.configuration.Configuration;
@@ -36,6 +39,8 @@ public class TestingReaderContext implements
SourceReaderContext {
private final Configuration config;
+ private final JobInfo jobInfo = new JobInfoImpl(new JobID(), "test-job");
+
private final ArrayList<SourceEvent> sentEvents = new ArrayList<>();
private int numSplitRequests;
@@ -51,6 +56,11 @@ public class TestingReaderContext implements
SourceReaderContext {
// ------------------------------------------------------------------------
+ @Override
+ public JobInfo getJobInfo() {
+ return jobInfo;
+ }
+
@Override
public SourceReaderMetricGroup metricGroup() {
return metrics;
diff --git
a/flink-test-utils-parent/flink-connector-test-utils/src/main/java/org/apache/flink/connector/testutils/source/reader/TestingSplitEnumeratorContext.java
b/flink-test-utils-parent/flink-connector-test-utils/src/main/java/org/apache/flink/connector/testutils/source/reader/TestingSplitEnumeratorContext.java
index 8b4997f78f1..10e560f72c0 100644
---
a/flink-test-utils-parent/flink-connector-test-utils/src/main/java/org/apache/flink/connector/testutils/source/reader/TestingSplitEnumeratorContext.java
+++
b/flink-test-utils-parent/flink-connector-test-utils/src/main/java/org/apache/flink/connector/testutils/source/reader/TestingSplitEnumeratorContext.java
@@ -18,6 +18,9 @@
package org.apache.flink.connector.testutils.source.reader;
+import org.apache.flink.api.common.JobID;
+import org.apache.flink.api.common.JobInfo;
+import org.apache.flink.api.common.JobInfoImpl;
import org.apache.flink.api.connector.source.ReaderInfo;
import org.apache.flink.api.connector.source.SourceEvent;
import org.apache.flink.api.connector.source.SourceSplit;
@@ -57,6 +60,8 @@ public class TestingSplitEnumeratorContext<SplitT extends
SourceSplit>
private final int parallelism;
+ private final JobInfo jobInfo = new JobInfoImpl(new JobID(), "test-job");
+
public TestingSplitEnumeratorContext(int parallelism) {
this.parallelism = parallelism;
}
@@ -91,6 +96,11 @@ public class TestingSplitEnumeratorContext<SplitT extends
SourceSplit>
// SplitEnumeratorContext methods
// ------------------------------------------------------------------------
+ @Override
+ public JobInfo getJobInfo() {
+ return jobInfo;
+ }
+
@Override
public SplitEnumeratorMetricGroup metricGroup() {
return UnregisteredMetricsGroup.createSplitEnumeratorMetricGroup();