diff options
author | Valerij Fredriksen <valerijf@oath.com> | 2019-01-11 13:31:30 +0100 |
---|---|---|
committer | Valerij Fredriksen <valerij92@gmail.com> | 2019-01-11 21:19:47 +0100 |
commit | 452785f75d4f477d974be7a2f175c8f91b87ec1c (patch) | |
tree | bc13dad9bb76a13ef6722bb290b1c69dcf7bf4ac /docker-api/src/main | |
parent | 48814afebb0b8a718b873d8bf9794837050a17d4 (diff) |
Use docker update for changing container resource allocation
Diffstat (limited to 'docker-api/src/main')
-rw-r--r-- | docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/Docker.java | 2 | ||||
-rw-r--r-- | docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerImpl.java | 25 |
2 files changed, 27 insertions, 0 deletions
diff --git a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/Docker.java b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/Docker.java index e422e633966..f4cd1d770fb 100644 --- a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/Docker.java +++ b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/Docker.java @@ -65,6 +65,8 @@ public interface Docker { void deleteContainer(ContainerName containerName); + void updateContainer(ContainerName containerName, ContainerResources containerResources); + List<Container> getAllContainersManagedBy(String manager); Optional<Container> getContainer(ContainerName containerName); diff --git a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerImpl.java b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerImpl.java index 7ea46b1e361..52824f6050c 100644 --- a/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerImpl.java +++ b/docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerImpl.java @@ -234,6 +234,31 @@ public class DockerImpl implements Docker { } @Override + public void updateContainer(ContainerName containerName, ContainerResources resources) { + try { + UpdateContainerCmd updateContainerCmd = dockerClient.updateContainerCmd(containerName.asString()) + .withCpuShares(resources.cpuShares()) + .withMemory(resources.memoryBytes()) + + // Command line argument `--cpus c` is sent over to docker daemon as "NanoCPUs", which is the + // value of `c * 1e9`. This however, is just a shorthand for `--cpu-period p` and `--cpu-quota q` + // where p = 100000 and q = c * 100000. + // See: https://docs.docker.com/config/containers/resource_constraints/#configure-the-default-cfs-scheduler + // --cpus requires API 1.25+ on create and 1.29+ on update + // NanoCPUs is supported in docker-java as of 3.1.0 on create and not at all on update + .withCpuPeriod(resources.cpus() > 0 ? CPU_PERIOD : null) + .withCpuQuota(resources.cpus() > 0 ? (int) (CPU_PERIOD * resources.cpus()) : null); + + updateContainerCmd.exec(); + } catch (NotFoundException e) { + throw new ContainerNotFoundException(containerName); + } catch (RuntimeException e) { + numberOfDockerDaemonFails.add(); + throw new DockerException("Failed to update container '" + containerName.asString() + "' to " + resources, e); + } + } + + @Override public List<Container> getAllContainersManagedBy(String manager) { return listAllContainers().stream() .filter(container -> isManagedBy(container, manager)) |