grafana/loki #21223 — забытый case
Диаграмма: от бага до PR (archify) →
Смердженный PR: grafana/loki #21223 — "fix: protobuf decoding for DetectedLabelsRequest". Мержен 30 марта 2026, +46/-0, файлы pkg/querier/queryrange/codec.go и codec_test.go.
Проблема
Когда query-frontend в Loki кэширует ответы и возвращает их в protobuf-формате (актуально в multi-tenant сетапах, где ответы разных тенантов мержатся), функция decodeResponseProtobuf() должна знать, как декодировать каждый тип запроса. Для DetectedLabelsRequest она этого не умела — запрос проваливался в default-ветку, которая не обрабатывает QueryResponse_DetectedLabels, и клиент получал generic internal-server-error вместо реального результата.
Причина — не логическая ошибка, а забытое место
switch req.(type) {
case *LokiSeriesRequest:
...
case *LabelRequest:
...
case *IndexStatsRequest:
...
case *ShardsRequest:
...
// не было case *DetectedLabelsRequest — новый тип запроса появился позже,
// и про этот switch при его добавлении забыли
default:
return nil, errInternal
}Это классический баг "расширили систему одним типом, но забыли одно из МЕСТ, которое делает switch по этому типу" — код в каждой отдельной ветке правильный, проблема именно в неполноте самого списка веток.
Иллюстрация того же паттерна
Ниже — не код Loki, а независимый минимальный пример того же класса бага:
Регрессионный тест — не просто "проверить, что баг ушёл"
PR добавляет Test_codec_DetectedLabelsResponseProtobufRoundTrip, который гоняет реальный цикл кодирование→декодирование через protobuf и явно ссылается в комментарии на номер issue. Это фиксирует инвариант навсегда, а не просто подтверждает разовое исправление — если кто-то в будущем сломает этот же путь, тест упадёт сразу.
Почему это ценно на собесе
Найти "забытую ветку" в чужом большом switch — это ровно то умение читать код внимательно, а не по диагонали, которое проверяют на код-ревью секции интервью: баг не в логике одной ветки, а в неполноте всего списка веток, и его не видно без проверки каждого места, где вообще упоминается этот тип.