MBL
Go / Проекты / Open-Source-PR / grafana/loki #21223 — забытый case
Go средний

grafana/loki #21223 — забытый case

projectsopensourceloki

Диаграмма: от бага до 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, а независимый минимальный пример того же класса бага:

на play.golang.org

Регрессионный тест — не просто "проверить, что баг ушёл"

PR добавляет Test_codec_DetectedLabelsResponseProtobufRoundTrip, который гоняет реальный цикл кодирование→декодирование через protobuf и явно ссылается в комментарии на номер issue. Это фиксирует инвариант навсегда, а не просто подтверждает разовое исправление — если кто-то в будущем сломает этот же путь, тест упадёт сразу.

Почему это ценно на собесе

Найти "забытую ветку" в чужом большом switch — это ровно то умение читать код внимательно, а не по диагонали, которое проверяют на код-ревью секции интервью: баг не в логике одной ветки, а в неполноте всего списка веток, и его не видно без проверки каждого места, где вообще упоминается этот тип.

Самопроверка 0 / 1
Понимаю, почему добавление нового типа запроса требует правки ВСЕХ switch по этому типу, а не только одного
Как усвоено?