[
https://issues.apache.org/jira/browse/BEAM-5308?focusedWorklogId=141542&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-141542
]
ASF GitHub Bot logged work on BEAM-5308:
----------------------------------------
Author: ASF GitHub Bot
Created on: 05/Sep/18 22:14
Start Date: 05/Sep/18 22:14
Worklog Time Spent: 10m
Work Description: tweise closed pull request #6335: [BEAM-5308]
Correct/cleanup DockerOnMac code in DockerJobBundleFactory
URL: https://github.com/apache/beam/pull/6335
This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:
As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):
diff --git
a/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/control/DockerJobBundleFactory.java
b/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/control/DockerJobBundleFactory.java
index 3178a2e2b3b..fec29231a97 100644
---
a/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/control/DockerJobBundleFactory.java
+++
b/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/control/DockerJobBundleFactory.java
@@ -43,11 +43,6 @@
public class DockerJobBundleFactory extends JobBundleFactoryBase {
private static final Logger LOG =
LoggerFactory.getLogger(DockerJobBundleFactory.class);
- // Port offset for MacOS since we don't have host networking and need to use
published ports
- private static final int MAC_PORT_START = 8100;
- private static final int MAC_PORT_END = 8200;
- private static final AtomicInteger MAC_PORT = new
AtomicInteger(MAC_PORT_START);
-
/** Factory that creates {@link JobBundleFactory} for the given {@link
JobInfo}. */
public interface JobBundleFactoryFactory {
JobBundleFactory create(JobInfo jobInfo) throws Exception;
@@ -63,10 +58,6 @@ public JobBundleFactory create(JobInfo jobInfo) throws
Exception {
}
});
- // TODO: This host name seems to change with every other Docker release. Do
we attempt to keep up
- // or attempt to document the supported Docker version(s)?
- private static final String DOCKER_FOR_MAC_HOST = "host.docker.internal";
-
public static JobBundleFactory create(JobInfo jobInfo) throws Exception {
return FACTORY.get().create(jobInfo);
}
@@ -113,21 +104,7 @@ protected ServerFactory getServerFactory() {
case LINUX:
return ServerFactory.createDefault();
case MAC:
- // NOTE: Deployment on Macs is intended for local development. As of
18.03, Docker-for-Mac
- // does not implement host networking (--networking=host is
effectively a no-op). Instead,
- // we use a special DNS entry that points to the host:
- //
https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
- // The special hostname has historically changed between versions, so
this is subject to
- // breakages and will likely only support the latest version at any
time.
-
- // We need to use a fixed port range due to non-existing host
networking in Docker-for-Mac.
- // The port range needs to be published when bringing up the Docker
container, see
- // DockerEnvironmentFactory.
-
- return ServerFactory.createWithUrlFactoryAndPortSupplier(
- (host, port) -> HostAndPort.fromParts(DOCKER_FOR_MAC_HOST,
port).toString(),
- // We only use the published Docker ports 8100-8200 in a
round-robin fashion
- () -> MAC_PORT.getAndUpdate(val -> val == MAC_PORT_END ?
MAC_PORT_START : val + 1));
+ return DockerOnMac.getServerFactory();
default:
LOG.warn("Unknown Docker platform. Falling back to default server
factory");
return ServerFactory.createDefault();
@@ -140,7 +117,7 @@ private static Platform getPlatform() {
// The DOCKER_MAC_CONTAINER environment variable is necessary to detect
whether we run on
// a container on MacOs. MacOs internally uses a Linux VM which makes it
indistinguishable from Linux.
// We still need to apply port mapping due to missing host networking.
- if (osName.startsWith("mac") ||
"1".equals(System.getenv("DOCKER_MAC_CONTAINER"))) {
+ if (osName.startsWith("mac") || DockerOnMac.RUNNING_INSIDE_DOCKER_ON_MAC) {
return Platform.MAC;
} else if (osName.startsWith("linux")) {
return Platform.LINUX;
@@ -154,6 +131,44 @@ private static Platform getPlatform() {
OTHER,
}
+ /**
+ * NOTE: Deployment on Macs is intended for local development. As of 18.03,
Docker-for-Mac does
+ * not implement host networking (--networking=host is effectively a no-op).
Instead, we use a
+ * special DNS entry that points to the host:
+ *
https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
The special
+ * hostname has historically changed between versions, so this is subject to
breakages and will
+ * likely only support the latest version at any time.
+ */
+ private static class DockerOnMac {
+ // TODO: This host name seems to change with every other Docker release.
Do we attempt to keep up
+ // or attempt to document the supported Docker version(s)?
+ private static final String DOCKER_FOR_MAC_HOST = "host.docker.internal";
+
+ // True if we're inside a container (i.e. job-server container) with MacOS
as the host system
+ private static final boolean RUNNING_INSIDE_DOCKER_ON_MAC =
+ "1".equals(System.getenv("DOCKER_MAC_CONTAINER"));
+ // Port offset for MacOS since we don't have host networking and need to
use published ports
+ private static final int MAC_PORT_START = 8100;
+ private static final int MAC_PORT_END = 8200;
+ private static final AtomicInteger MAC_PORT = new
AtomicInteger(MAC_PORT_START);
+
+ private static ServerFactory getServerFactory() {
+ ServerFactory.UrlFactory dockerUrlFactory =
+ (host, port) -> HostAndPort.fromParts(DOCKER_FOR_MAC_HOST,
port).toString();
+ if (RUNNING_INSIDE_DOCKER_ON_MAC) {
+ // If we're already running in a container, we need to use a fixed
port range due to
+ // non-existing host networking in Docker-for-Mac. The port range
needs to be published
+ // when bringing up the Docker container, see DockerEnvironmentFactory.
+ return ServerFactory.createWithUrlFactoryAndPortSupplier(
+ dockerUrlFactory,
+ // We only use the published Docker ports 8100-8200 in a
round-robin fashion
+ () -> MAC_PORT.getAndUpdate(val -> val == MAC_PORT_END ?
MAC_PORT_START : val + 1));
+ } else {
+ return ServerFactory.createWithUrlFactory(dockerUrlFactory);
+ }
+ }
+ }
+
/** Create {@link EnvironmentFactory} for the given services. */
@Override
protected EnvironmentFactory getEnvironmentFactory(
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
Issue Time Tracking
-------------------
Worklog Id: (was: 141542)
Time Spent: 0.5h (was: 20m)
> JobBundleFactory BindException with FlinkRunner and remote cluster
> ------------------------------------------------------------------
>
> Key: BEAM-5308
> URL: https://issues.apache.org/jira/browse/BEAM-5308
> Project: Beam
> Issue Type: Task
> Components: runner-flink
> Reporter: Thomas Weise
> Assignee: Maximilian Michels
> Priority: Major
> Labels: portability
> Time Spent: 0.5h
> Remaining Estimate: 0h
>
> Repeated execution of the same job on remote Flink cluster (not embedded in
> job server) fails with bind exception. There seem to be 2 issues:
> * Multiple instances of job bundle factory cannot be created (port conflict)
> * Job bundle factory is not released after job completes (and Docker
> container keeps on running). That's not the case in embedded mode).
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)