[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)
}
왜 이게 좋은가
- CI 시간 15% 단축: 두 엔진의 쿼리 실행 시간이 겹치므로, 전체 실행 시간이
sum(A, B)에서max(A, B)로 줄어듭니다. - errgroup의 적절한 활용:
errgroup.WithContext를 사용하여 한쪽이 실패하면 다른 쪽도 컨텍스트 취소를 통해 빠르게 종료됩니다. - 에러 처리 통합: 기존에 흩어져 있던 에러 검사를
g.Wait()후 한 곳에서 처리하여 코드가 더 깔끔해졌습니다. - 논리적으로 당연한 변경: 정합성 테스트에서 두 엔진의 쿼리 결과는 서로 독립적이므로, 병렬 실행이 자연스럽습니다.
참고 자료
관련 포스트
PR Analysis 의 다른글
- 이전글 [Ray] 다중 입력 연산자의 메모리 귀속 오류 수정으로 데드락 해결
- 현재글 : [Loki] 쿼리 엔진 정합성 테스트 병렬 실행으로 CI 시간 15% 단축
- 다음글 [Ray] 다중 gRPC 연결로 오브젝트 전송 처리량 향상
댓글