• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

ben-manes / caffeine / #5511
100%
master: 100%

Build:
Build:
LAST BUILD BRANCH: v3.dev
DEFAULT BRANCH: master
Ran 09 Jun 2026 12:22AM UTC
Jobs 1
Files 78
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

08 Jun 2026 11:41PM UTC coverage: 100.0%. Remained the same
#5511

push

github

ben-manes
Fix JCache zero update-expiry divergence across the write paths

Per ExpiryPolicy.getExpiryForUpdate (JSR-107 1.1.1), a Duration.ZERO update means
the entry "is considered immediately expired" -- it is updated, then expires --
unlike a zero creation expiry, where it "will not be added to the Cache". The
put-family paths (putNoCopyOrAwait, used by put/putAll/getAndPut) folded the update
case into the creation guard: they suppressed the UPDATED event and the put
statistic and removed the entry, while replace/getAndReplace/invoke correctly
published UPDATED, counted the put, and stored an immediately-expired entry. Split
the guard to suppress only on creation (expirable == null); a zero update-expiry now
stores the entry already expired (reaped on the next access, which publishes
EXPIRED), matching replace/getAndReplace/invoke.

Resolved against the live 1.1.1 spec, the reference implementation, and the
ecosystem: the side-effect behavior splits RI/Coherence/cache2k/Ehcache3 (store
immediately-expired, fire UPDATED, count the put) against Infinispan/Ehcache2/
Hazelcast (remove/suppress), 4-3, and the spec text plus the RI settle it. The TCK
passes either way -- it asserts only the end-state, not the event stream or the
statistics -- so a parity test (JCacheUpdateExpiryTest.writeOp_present_zeroUpdateExpiry
over put/putAll/getAndPut/replace/replaceConditionally/getAndReplace/invoke) pins
every update path to fire one UPDATED, count one put, and leave the entry absent.

Add /audit-jcache-conformance and .claude/docs/jsr107-conformance.md to make this
repeatable: fetch the spec (a Google Doc) live, map the RI/ecosystem sources, and
run the spec -> TCK -> RI -> ecosystem differential that catches the TCK-invisible
event/statistics divergences this class of bug lives in.

4032 of 4040 branches covered (99.8%)

4 of 4 new or added lines in 2 files covered. (100.0%)

8219 of 8219 relevant lines covered (100.0%)

1.0 hits per line

Jobs
ID Job ID Ran Files Coverage
1 #5511.1 09 Jun 2026 12:22AM UTC 78
100.0
Source Files on build #5511
  • Tree
  • List 78
  • Changed 4
  • Source Changed 4
  • Coverage Changed 3
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • 4bdad918 on github
  • Prev Build on master
  • Next Build on v3.dev
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc