본문으로 건너뛰기

[Grafana Loki] cmp.Diff 대신 cmp.Equal로 상태 비교를 단순화

PR 링크: grafana/loki#20725 상태: Merged | 변경: +3 / -3

들어가며

Grafana Loki의 Kubernetes Operator 컨트롤러에서 리소스 변경 감지를 위해 cmp.Diff()를 사용하고 있었습니다. Diff는 두 객체 간의 차이를 사람이 읽을 수 있는 문자열로 생성하는 함수인데, 실제로 필요한 것은 "다른지 여부"뿐이었습니다. 차이 문자열을 생성한 후 빈 문자열인지 비교하는 것은 불필요한 문자열 할당과 포맷팅 작업입니다.

핵심 코드 분석

Before: Diff 문자열 생성 후 비교

return (e.ObjectOld.GetGeneration() != e.ObjectNew.GetGeneration()) ||
    cmp.Diff(e.ObjectOld.GetAnnotations(), e.ObjectNew.GetAnnotations()) != ""

// 상태 비교에서도 동일
return cmp.Diff(old.Status, newObject.Status) != ""

After: Equal로 직접 비교

return (e.ObjectOld.GetGeneration() != e.ObjectNew.GetGeneration()) ||
    !cmp.Equal(e.ObjectOld.GetAnnotations(), e.ObjectNew.GetAnnotations())

// 상태 비교
return !cmp.Equal(old.Status, newObject.Status)

왜 이게 좋은가

  • 불필요한 할당 제거: cmp.Diff는 차이 텍스트를 포함한 문자열을 항상 생성합니다. cmp.Equal은 불일치를 발견하는 즉시 false를 반환하고, 일치하면 문자열 생성 없이 true를 반환합니다.
  • 조기 종료(Short-circuit): Equal은 첫 번째 차이점에서 즉시 반환하지만, Diff는 전체 차이를 모아 문자열로 포맷팅합니다.
  • 의미 명확성: "차이가 빈 문자열이 아니다"보다 "같지 않다"가 코드 의도를 더 직접적으로 표현합니다.
  • Kubernetes 이벤트 필터 핫 패스: 이 코드는 모든 Update 이벤트에서 실행되므로, 작은 최적화라도 누적 효과가 큽니다.

참고 자료

댓글

관련 포스트

PR Analysis 의 다른글