summaryrefslogtreecommitdiffstats
path: root/docker-api
diff options
context:
space:
mode:
authorValerij Fredriksen <valerijf@oath.com>2019-01-11 13:31:30 +0100
committerValerij Fredriksen <valerij92@gmail.com>2019-01-11 21:19:47 +0100
commit452785f75d4f477d974be7a2f175c8f91b87ec1c (patch)
treebc13dad9bb76a13ef6722bb290b1c69dcf7bf4ac /docker-api
parent48814afebb0b8a718b873d8bf9794837050a17d4 (diff)
Use docker update for changing container resource allocation
Diffstat (limited to 'docker-api')
-rw-r--r--docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/Docker.java2
-rw-r--r--docker-api/src/main/java/com/yahoo/vespa/hosted/dockerapi/DockerImpl.java25
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))