File size: 3,937 Bytes
ad552a7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#!/usr/bin/env bash
# Source inside a Slurm batch allocation, then call start_study_docker ROOT.
set -euo pipefail

start_study_docker() {
    local root="${1:?study root required}"
    : "${SLURM_JOB_ID:?Rootless Docker must run inside a Slurm allocation}"
    export PATH="$root/runtime/bin:$root/runtime/node-v22.21.0-linux-x64/bin:$PATH"
    study_docker_tmp="$(mktemp -d "/tmp/beam-pb-${SLURM_JOB_ID}.XXXXXXXX")"
    export XDG_RUNTIME_DIR="$study_docker_tmp/run"
    export XDG_CONFIG_HOME="$study_docker_tmp/config"
    export DOCKER_CONFIG="$study_docker_tmp/docker-config"
    export DOCKER_HOST="unix://$XDG_RUNTIME_DIR/docker.sock"
    if [[ -f "$root/runtime/evaluator-wheelhouse/manifest.json" ]]; then
        export PROGRAMBENCH_EVALUATOR_WHEELHOUSE="$root/runtime/evaluator-wheelhouse"
    fi
    mkdir -p "$XDG_RUNTIME_DIR" "$XDG_CONFIG_HOME" "$DOCKER_CONFIG" "$study_docker_tmp/data" "$root/logs"
    chmod 700 "$study_docker_tmp" "$XDG_RUNTIME_DIR" "$DOCKER_CONFIG"
    export DOCKERD_ROOTLESS_ROOTLESSKIT_NET=slirp4netns
    export DOCKERD_ROOTLESS_ROOTLESSKIT_PORT_DRIVER=slirp4netns
    dockerd-rootless.sh --host="$DOCKER_HOST" --data-root="$study_docker_tmp/data" \
      --exec-root="$study_docker_tmp/exec" --pidfile="$study_docker_tmp/dockerd.pid" \
      --exec-opt native.cgroupdriver=cgroupfs --storage-driver=fuse-overlayfs \
      --iptables=false --bridge=none > "$root/logs/rootless-daemon-$SLURM_JOB_ID.log" 2>&1 &
    study_docker_pid=$!
    for ((attempt=0; attempt<90; attempt++)); do
        if docker info >/dev/null 2>&1; then
            docker info --format '{{json .}}' > "$root/logs/docker-info-$SLURM_JOB_ID.json"
            printf 'Docker ready: job=%s node=%s socket=%s\n' "$SLURM_JOB_ID" "$(hostname)" "$DOCKER_HOST"
            return 0
        fi
        if ! kill -0 "$study_docker_pid" 2>/dev/null; then
            tail -60 "$root/logs/rootless-daemon-$SLURM_JOB_ID.log"
            return 1
        fi
        sleep 1
    done
    tail -60 "$root/logs/rootless-daemon-$SLURM_JOB_ID.log"
    return 1
}

stop_study_docker() {
    if [[ -n "${study_docker_pid:-}" ]]; then
        kill "$study_docker_pid" 2>/dev/null || true
        wait "$study_docker_pid" 2>/dev/null || true
    fi
    # The job-scoped /tmp data holds shifted UID files. Slurm/node cleanup owns it;
    # do not invoke a privileged cleanup or remove unrelated runtime directories.
}

ensure_study_images() {
    local root="${1:?study root required}"
    local python="$root/runtime/programbench-venv/bin/python"
    local cache="$root/runtime/programbench-images.tar.gz"
    local -a image_refs image_aliases
    mapfile -t image_refs < <("$python" -c 'import json,sys; print("\n".join(t["task_cleanroom_image"]["immutable_reference"] for t in json.load(open(sys.argv[1]))["tasks"]))' "$root/docs/programbench-five-task-manifest.json")
    if [[ -s "$cache" ]]; then
        printf 'Loading cached ProgramBench image layers\n'
        gzip -dc "$cache" | docker image load > "$root/logs/image-load-$SLURM_JOB_ID.log"
    fi
    image_aliases=()
    local index=0
    for image in "${image_refs[@]}"; do
        printf 'Ensuring pinned ProgramBench image %s/%s\n' "$((index + 1))" "${#image_refs[@]}"
        # Docker save/load does not preserve repository digest associations. This pull
        # restores them; loaded layers are reused and the requested digest is immutable.
        docker pull "$image" >> "$root/logs/image-pull-$SLURM_JOB_ID.log" 2>&1
        local alias="study-pb-cache/task$index:${image##*:}"
        docker tag "$image" "$alias"
        image_aliases+=("$alias")
        index=$((index + 1))
    done
    if [[ ! -s "$cache" ]]; then
        printf 'Caching image layers for the study allocation\n'
        docker image save "${image_aliases[@]}" | gzip -1 > "$cache.tmp-$SLURM_JOB_ID"
        mv "$cache.tmp-$SLURM_JOB_ID" "$cache"
        sha256sum "$cache" > "$cache.sha256"
    fi
}