container universe: fix container_image selector truncation (holds every ILE job on OSPool) - #165
Open
oshaughnessy-junior wants to merge 1 commit into
Conversation
… on a live OSPool match)
The container-universe mode (RIFT_CONTAINER_UNIVERSE=1) holds every GPU worker
job on OSPool. condor_submit parses container_image BEFORE any $$ expansion and
derives the job ad's ContainerImage -- the name the image gets in the job scratch
dir -- as the text after the LAST '/'. build_container_image_select() emitted
full osdf:// URLs inside the $$([...]) selector, so it was cut in half and the
surviving fragment is not a valid image name:
ContainerImage="rift_o4d_cc60-90_cuda118_20260717.sif\") ])"
ContainerImageFullPath keeps the $$ and expands correctly at match time;
ContainerImage does not, and the OSG glidein PREPARE_JOB prepare-hook is what
reads it. Three trivial jobs on the IGWN pool settled it (3 MB sif images staged
on OSDF, keyed on TARGET.Memory so they match a CPU slot immediately;
condor_submit derives ContainerImage identically either way):
5926098 plain single osdf image -> ran, exit 0
5926099 the form emitted here -> HELD: "PREPARE_JOB (prepare-hook) failed
(reported status 001): Unable to download or build singularity
image cutest_busybox_20260810.sif\") ])"
5926100 this fix -> ran, exit 0,
MATCH_EXP_ContainerImage = "cutest_alpine_20260810.sif"
Fix:
- build_container_image_select() emits BASENAMES, so the selector holds no '/',
condor_submit's derivation is a no-op, the whole $$ token reaches the job ad,
and the schedd expands it at match time.
- The matched image is delivered by the comma-free $$() transfer token, which
container universe previously skipped (it assumed container_image would fetch).
Applied in both write_ILE_sub_simple and write_calpilot_sub.
- MY.TransferInput is pinned to the same list so condor_submit does not append
the basename selector to TransferInput as a bogus extra input file.
- A family containing an in-place (CVMFS/local) image now raises
ContainerManifestError under container universe: such an image can only be
named by its full path, which reintroduces the truncation. Stage it at a URL,
or use RIFT_CONTAINER_RUNTIME_SELECT=1. The shipped example manifest is
updated to all-URL accordingly.
CIP is untouched -- CPU-only, already a single plain image, which condor_submit
handles correctly.
Also documents the three delivery modes (legacy / container universe /
runtime-select) in docs/source/containers.rst and containers/README.md, which
never covered them, and corrects the stale claim that the selection falls back on
an undefined capability (it does not -- a Requirements clause excludes those
slots, and CIP collapses to the single fallback image).
Tests 26/26.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Author
|
Focused review at
Please update these touched docs so the public delivery guidance has one consistent contract. Focused gate otherwise passed: both changed ILE/CALPILOT submit paths were accepted by HTCondor 25.8.2 dry-run with intact basename |
This was referenced Aug 11, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes the container-universe mode (
RIFT_CONTAINER_UNIVERSE=1), which today holds every GPU worker job on OSPool.The bug
condor_submitparsescontainer_imagebefore any$$expansion and derives the job ad'sContainerImage— the name the image will have in the job scratch dir — as the text after the last/.build_container_image_select()puts fullosdf://URLs inside the$$([...])selector, so it gets cut in half and what survives is not a valid image name:ContainerImageFullPathkeeps the$$and expands correctly at match time.ContainerImageno longer contains a$$, so nothing repairs it — and the OSG glidein'sPREPARE_JOBprepare-hook is what reads it.Evidence
Three trivial jobs on the IGWN pool, using two 3 MB
.siffiles staged on OSDF and keyed onTARGET.Memoryinstead ofGPUs_Capabilityso they match a CPU slot immediately —condor_submitderivesContainerImageidentically either way (checked with-dry-run), so the mechanism under test is unchanged.osdf://…sifThe hold, verbatim from the execute point:
The held job's ad shows the
$$machinery working perfectly — onlyContainerImagewas already broken before expansion ran:and the fixed job's:
Confirmed on
$CondorVersion: 25.11.1 2026-07-07.The fix
build_container_image_select()emits basenames, so the selector holds no/, condor_submit's derivation is a no-op, the whole$$token reaches the job ad, and the schedd expands it at match time.$$()transfer token, which container universe previously skipped (it assumedcontainer_imagewould fetch it). Applied in bothwrite_ILE_sub_simpleandwrite_calpilot_sub— CALPILOT runs ILE on a GPU and emits the same selector.MY.TransferInputis pinned to the same list, so condor_submit does not append the basename selector toTransferInputas a bogus extra input file.ContainerManifestErrorunder container universe — such an image can only be named by its full path, which reintroduces the truncation. Stage it at a URL, or useRIFT_CONTAINER_RUNTIME_SELECT=1. The shipped example manifest is updated to all-URL accordingly.CIP is untouched: CPU-only, already a single plain image, which condor_submit handles correctly.
Before / after on this branch's own code
Rebuilding the S240426s OSG DAG (real inputs from an existing asimov project, same pseudo_pipe command line from its
asimov.log) withdag_utils_genericatHEAD~1vsHEAD:Unit tests 26/26. A 28-assertion submit-file check over the rebuilt DAG passes on
HEADand fails 9 onHEAD~1. Harness and captured logs:~/LVK/IR1/demo_multi_container(validate_build.sh,check_condor_expansion.sh,live_check/).Also in this PR
docs/source/containers.rstandcontainers/README.mdnever documented the container-universe or runtime-select modes — the docs predate those commits. Added a delivery-mode section covering all three, plus the truncation invariant. Also corrected a stale claim that the capability selection falls back on an undefined capability: it does not (aRequirementsclause excludes those slots, and CIP collapses to the single fallback image).The same fix is in #164, which ports the container-family feature to
master.🤖 Generated with Claude Code