[Bugfix][TieredOffloading] : Return HIT_PENDING when KV promotion is triggered (#51840)

Signed-off-by: <> Co-authored-by: Varun Sundar Rabindranath <varun-sundar-rabindranath@h100-01.nemg-001.lab.rdu2.dc.redhat.com>

Varun Sundar Rabindranath committed Aug 11, 2026 at 22:07 UTC f067737b2a4ba4385f30256baa297200d06300c1
2 files changed +15 -15
tests/v1/kv_offload/tiering/test_tiering_offloading.py
+14 -14
@@ -481,7 +481,7 @@ class TestTieringOffloadingManager:
481 # Lookup each block to initiate promotion for all of them
482 for block in blocks:
483 result = self.manager.lookup(block, _CTX)
484 - assert result is LookupResult.RETRY # promotion initiated
484 + assert result is LookupResult.HIT_PENDING # promotion initiated
485
486 # End of step 1: flushes deferred submit_load() calls
487 self._simulate_on_schedule_end()
@@ -533,7 +533,7 @@ class TestTieringOffloadingManager:
533 self.secondary_tier1.submit_load = submit_partial
534
535 for block in blocks:
536 - assert self.manager.lookup(block, _CTX) is LookupResult.RETRY
536 + assert self.manager.lookup(block, _CTX) is LookupResult.HIT_PENDING
537
538 self._simulate_on_schedule_end()
539 self._simulate_on_schedule_end()
@@ -589,7 +589,7 @@ class TestTieringOffloadingManager:
589 self.secondary_tier1.blocks[block] = True
590
591 # First lookup finds the block in a secondary tier and defers.
592 - assert self.manager.lookup(block, _CTX) is LookupResult.RETRY
592 + assert self.manager.lookup(block, _CTX) is LookupResult.HIT_PENDING
593
594 # Promotion is not treated as unresolved secondary lookup time.
595 self._simulate_on_schedule_end(new_req_ids=[_CTX.req_id])
@@ -648,7 +648,7 @@ class TestTieringOffloadingManager:
648 stats.reduce(), TieringOffloadingMetrics.LOOKUP_ASYNC_DELAY
649 )
650
651 - assert self.manager.lookup(block, ctx) is LookupResult.RETRY
651 + assert self.manager.lookup(block, ctx) is LookupResult.HIT_PENDING
652
653 stats = self.manager.get_stats()
654 assert stats is not None
@@ -771,11 +771,11 @@ class TestTieringOffloadingManager:
771 ctx_a = ReqContext(req_id="req_a")
772 ctx_b = ReqContext(req_id="req_b")
773
774 - # All lookups return RETRY: secondary hit triggers promotion
775 - assert self.manager.lookup(blocks[0], ctx_a) is LookupResult.RETRY
776 - assert self.manager.lookup(blocks[1], ctx_a) is LookupResult.RETRY
777 - assert self.manager.lookup(blocks[2], ctx_b) is LookupResult.RETRY
778 - assert self.manager.lookup(blocks[3], ctx_b) is LookupResult.RETRY
774 + # All lookups return HIT_PENDING: secondary hit triggers promotion
775 + assert self.manager.lookup(blocks[0], ctx_a) is LookupResult.HIT_PENDING
776 + assert self.manager.lookup(blocks[1], ctx_a) is LookupResult.HIT_PENDING
777 + assert self.manager.lookup(blocks[2], ctx_b) is LookupResult.HIT_PENDING
778 + assert self.manager.lookup(blocks[3], ctx_b) is LookupResult.HIT_PENDING
779
780 # submit_load must not fire during lookup - only at end of step
781 self.secondary_tier1.submit_load.assert_not_called()
@@ -812,9 +812,9 @@ class TestTieringOffloadingManager:
812 result_a = self.manager.lookup(shared_block, ctx_a)
813 result_b = self.manager.lookup(shared_block, ctx_b)
814
815 - # First lookup triggers promotion (RETRY), second finds block
816 - # already in primary with write in-flight (HIT_PENDING).
817 - assert result_a is LookupResult.RETRY
815 + # Both lookups find the shared_block and trigger promotion
816 + # returning HIT_PENDING.
817 + assert result_a is LookupResult.HIT_PENDING
818 assert result_b is LookupResult.HIT_PENDING
819
820 self._simulate_on_schedule_end()
@@ -1098,7 +1098,7 @@ class TestTieringOffloadingManager:
1098 self.secondary_tier1.blocks[promo_block] = True
1099 assert (
1100 self.manager.lookup(promo_block, ReqContext(req_id="pending"))
1101 - is LookupResult.RETRY
1101 + is LookupResult.HIT_PENDING
1102 )
1103 assert self.manager._pending_load_submissions
1104
@@ -1209,7 +1209,7 @@ class TestTieringOffloadingManager:
1209 self.secondary_tier1.lookup = MagicMock(wraps=self.secondary_tier1.lookup)
1210
1211 ctx = ReqContext(req_id="r2", load_tier_filter=load_tier_filter)
1212 - assert self.manager.lookup(blocks[0], ctx) is LookupResult.RETRY
1212 + assert self.manager.lookup(blocks[0], ctx) is LookupResult.HIT_PENDING
1213 self.secondary_tier1.lookup.assert_called()
1214
1215
vllm/v1/kv_offload/tiering/manager.py
+1 -1
@@ -401,7 +401,7 @@ class TieringOffloadingManager(OffloadingManager):
401 lookup_duration,
402 )
403 promoted = self._initiate_promotion(i, key, req_context)
404 - return LookupResult.MISS if not promoted else LookupResult.RETRY
404 + return LookupResult.MISS if not promoted else LookupResult.HIT_PENDING
405 if result is LookupResult.RETRY:
406 any_retry = True
407 self._metrics.on_lookup(