Examples
_See Gitar in Action
Subtle bugs Gitar caught on popular open source repositories
#7807High
Race condition in IWRR cleanup
In a PR implementing a hierarchical weighted round-robin task scheduler, Gitar spotted that executeAtPath() released the parent write lock before calling childrenItemCount.Add(delta). This created a race window where cleanup() could delete the child node between the unlock and the counter update, leaving a permanently stale positive counter that caused tryChildren() to spin infinitely. The maintainer confirmed the bug and fixed it by adding a reference count to prevent premature cleanup.
#7792Medium
10x timeout mismatch
A PR to limit RecordTaskStarted RPC calls during matching service overload explicitly stated “1s per attempt and 3s total” in its description. Gitar cross-referenced the description against the code and found recordTaskStartedExpirationInterval was set to 30 * time.Second — 10x the intended value. This copy-paste error would have defeated the entire purpose of the blast-radius reduction. The developer acknowledged and fixed it.
#7834Medium
Rollup metrics not independently gated
In a PR adding GaugeMigration and CounterMigration frameworks, Gitar noticed that rollup metric emission for counters and gauges was nested inside the primary metric’s EmitCounter/EmitGauge gate check. This meant suppressing a primary metric would silently suppress its rollup too, and configuring rollup names in the migration config would have no effect. This was inconsistent with histograms, which correctly gate rollups independently.
#26753High
USER before pip install breaks Docker build
A PR fixing runtime spacy model loading for non-root containers added a USER openmetadata directive before the pip install commands. Gitar flagged that since the base image (python:3.10-bookworm) owns /usr/local/lib/python3.10/site-packages/ as root, running pip install as a non-root user would fail with Permission denied errors during docker build. The PR was merged but had to be reverted shortly after, confirming Gitar’s warning was correct.
#26808Medium
API method rename breaks test assertion
In a code cleanup PR addressing IDE warnings, a call was changed from .withPlatform(message) to .withReason(message) in the K8s pipeline client. Gitar traced the impact across the codebase and found that an existing test asserts response.getPlatform().contains("openmetadata-pipelines"), which would now fail since the platform field would return "Kubernetes" instead. It also noted that withReason() is semantically reserved for error context on unhealthy statuses.
#26808Low
volatile to final breaks code sample
In the same cleanup PR, an IDE warning prompted changing private static volatile boolean initialized = false to private static final in a documentation file. Gitar caught that a final field initialized to false can never be set to true, making the documented thread-safe lazy-initialization pattern logically impossible. The volatile keyword was intentional to demonstrate correct concurrent access.