{"record":{"id":"7426574ba0e14d51","repo":"sgl-project/sglang","slug":"self-transport-name-acknowledgements-support-one","errorCode":null,"errorMessage":"{self.transport_name} acknowledgements support one consumer or the complete consumer group, got {consumer_count}/{self.total_consumer_count}","messagePattern":"(.+?) acknowledgements support one consumer or the complete consumer group, got (.+?)/(.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/multimodal/transport/memory_pool.py","lineNumber":129,"sourceCode":"        base_address: int,\n        device_id: int,\n        consumer_count: int,\n        consumer_rank: Optional[int] = None,\n    ) -> None:\n        if self._consumer_acknowledged:\n            return\n        if consumer_count == self.total_consumer_count:\n            consumer_ranks = range(self.total_consumer_count)\n        elif consumer_count == 1:\n            consumer_ranks = (\n                resolve_consumer_rank(\n                    self.total_consumer_count,\n                    consumer_rank,\n                    self.transport_name,\n                ),\n            )\n        else:\n            raise ValueError(\n                f\"{self.transport_name} acknowledgements support one consumer \"\n                \"or the complete consumer group, got \"\n                f\"{consumer_count}/{self.total_consumer_count}\"\n            )\n\n        for rank in consumer_ranks:\n            stream_write_value32(\n                device_id,\n                base_address + self.ack_byte_offset + rank * CONTROL_WORD_BYTES,\n                self.generation,\n                self.transport_name,\n            )\n        self._consumer_acknowledged = True\n\n\n@dataclass(frozen=True)\nclass PoolLease:\n    start: int","sourceCodeStart":111,"sourceCodeEnd":147,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/multimodal/transport/memory_pool.py#L111-L147","documentation":"Transport acknowledgement supports exactly two modes: acknowledge a single consumer slot (consumer_rank set) or the whole group (all total_consumer_count slots). Any partial multi-rank set that is neither size 1 nor size total_consumer_count raises ValueError, since slot accounting would leak ready/ack generations.","triggerScenarios":"Calling acknowledge_consumption with a subset of ranks (e.g. 2 of 4 consumers) — consumer_count is neither 1 nor total_consumer_count — reproduced by test_complete_group_acknowledges_each_consumer_slot.","commonSituations":"Custom schedulers acknowledging per-subgroup; retry logic that re-acks a few ranks; passing a rank list where the API expects a single rank or None.","solutions":["Acknowledge one consumer at a time (single rank), or","Acknowledge the entire group (omit rank / pass full set)","Don't attempt partial-group acknowledgement — the protocol doesn't support it"],"exampleFix":"# before\nack(consumer_ranks=[0, 1])  # 2 of 4 -> error\n# after\nfor r in [0, 1]:\n    ack(consumer_rank=r)","handlingStrategy":"validation","validationCode":"assert consumer_rank is None or isinstance(consumer_rank, int), 'single rank or full group only'","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Acknowledge per-rank or for the whole group — never partial lists","Model the two acknowledgement modes explicitly in your caller API"],"tags":["cuda-ipc","acknowledgement","protocol-validation","multimodal-transport"],"backgroundTag":"unsupported-option-combination","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}