From a2b8ad2407cf5d6c48712de2b9066c58ff97ef63 Mon Sep 17 00:00:00 2001 From: kwy404 Date: Sat, 26 Sep 2026 17:34:06 -0300 Subject: [PATCH] fix(train): keep the timestamp when truncating long job names _get_unique_name appended the timestamp and then cut the whole name to max_length, so a base name longer than 48 characters lost part or all of the timestamp and repeated calls produced the same job name. Trim the base instead, like name_from_base in sagemaker-core, so the full timestamp is always kept. --- sagemaker-train/src/sagemaker/train/utils.py | 4 ++-- .../tests/unit/train/test_model_trainer.py | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/sagemaker-train/src/sagemaker/train/utils.py b/sagemaker-train/src/sagemaker/train/utils.py index 31d26daecd..bd82835294 100644 --- a/sagemaker-train/src/sagemaker/train/utils.py +++ b/sagemaker-train/src/sagemaker/train/utils.py @@ -137,9 +137,9 @@ def _get_unique_name(base, max_length=63): str: The unique name """ current_time = datetime.now().strftime("%Y%m%d%H%M%S") - base = base.replace("_", "-") + # Truncate the base, not the timestamp, so the name stays unique + base = base.replace("_", "-")[: max_length - len(current_time) - 1] unique_name = f"{base}-{current_time}" - unique_name = unique_name[:max_length] # Truncate to max_length return unique_name diff --git a/sagemaker-train/tests/unit/train/test_model_trainer.py b/sagemaker-train/tests/unit/train/test_model_trainer.py index a002b556b6..d1039107d3 100644 --- a/sagemaker-train/tests/unit/train/test_model_trainer.py +++ b/sagemaker-train/tests/unit/train/test_model_trainer.py @@ -2369,3 +2369,14 @@ def test_output_data_strips_trailing_slash_on_fallback(model_trainer): assert model_trainer.output_data == ( f"s3://{DEFAULT_BUCKET}/{DEFAULT_BUCKET_PREFIX}" "/my-training-job/output/output.tar.gz" ) + + +@patch("sagemaker.train.utils.datetime") +def test_get_unique_name_keeps_timestamp_for_long_base_name(mock_datetime): + from datetime import datetime + + from sagemaker.train.utils import _get_unique_name + + mock_datetime.now.return_value = datetime(2026, 9, 26, 12, 34, 56) + + assert _get_unique_name("a" * 60) == "a" * 48 + "-20260926123456"