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 18d0f8a299..c78bf67441 100644 --- a/sagemaker-train/tests/unit/train/test_model_trainer.py +++ b/sagemaker-train/tests/unit/train/test_model_trainer.py @@ -2774,3 +2774,14 @@ def test_pipeline_and_interactive_emit_identical_tags(model_trainer): pipeline_tags = _pipeline_trainer([TAG])._create_training_job_args()["Tags"] assert pipeline_tags == _train_wire_tags(model_trainer) + + +@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"