본문으로 건너뛰기

[Loki] 쿼리 엔진 정합성 테스트 병렬 실행으로 CI 시간 15% 단축

PR 링크: grafana/loki#20811 상태: Merged | 변경: +112 / -82

들어가며

Grafana Loki는 새로운 쿼리 엔진(Thor)을 개발하면서, 기존 엔진과 결과가 동일한지 검증하는 정합성 테스트를 실행합니다. 기존에는 새 엔진 쿼리를 먼저 실행하고, 기준 엔진 쿼리를 순차적으로 실행한 뒤 결과를 비교했습니다. 두 쿼리는 서로 독립적이므로 병렬로 실행할 수 있습니다. 이 PR은 errgroup을 활용하여 두 쿼리를 동시에 실행하고, 전체 테스트 시간을 15% 단축합니다.

핵심 코드 분석

errgroup을 활용한 병렬 쿼리

Before:

actual, err := store.Engine.Query(params).Exec(ctx)
if err != nil && errors.Is(err, engine.ErrNotSupported) {
    t.Skipf("Store %s does not support ...", store.Name, baseCase.Name())
}
require.NoError(t, err)

// ... 로그 출력 ...

expected, err := baseStore.Engine.Query(params).Exec(ctx)
require.NoError(t, err)

After:

var (
    actual, expected logqlmodel.Result
)

g, ctx := errgroup.WithContext(ctx)

g.Go(func() error {
    result, err := store.Engine.Query(params).Exec(ctx)
    actual = result
    return err
})

g.Go(func() error {
    result, err := baseStore.Engine.Query(params).Exec(ctx)
    expected = result
    return err
})

err = g.Wait()

if err != nil {
    if errors.Is(err, engine.ErrNotSupported) {
        t.Skipf("Store %s does not support ...", store.Name, baseCase.Name())
    }
    t.Fatal(err)
}

왜 이게 좋은가

  1. CI 시간 15% 단축: 두 엔진의 쿼리 실행 시간이 겹치므로, 전체 실행 시간이 sum(A, B)에서 max(A, B)로 줄어듭니다.
  2. errgroup의 적절한 활용: errgroup.WithContext를 사용하여 한쪽이 실패하면 다른 쪽도 컨텍스트 취소를 통해 빠르게 종료됩니다.
  3. 에러 처리 통합: 기존에 흩어져 있던 에러 검사를 g.Wait() 후 한 곳에서 처리하여 코드가 더 깔끔해졌습니다.
  4. 논리적으로 당연한 변경: 정합성 테스트에서 두 엔진의 쿼리 결과는 서로 독립적이므로, 병렬 실행이 자연스럽습니다.

참고 자료

댓글

관련 포스트

PR Analysis 의 다른글