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

Freegle / Iznik / 23548
72%

Build:
DEFAULT BRANCH: master
Ran 26 Jun 2026 08:57AM UTC
Jobs 3
Files 1321
Run time 2min
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

26 Jun 2026 08:41AM UTC coverage: 71.605% (+0.2%) from 71.409%
23548

push

circleci

invalid-email-address
ripple: split lock-hogging messages_groups INSERT...SELECT + hard single-instance lock

The scoped ripple:expand experiment caused a prod-wide 1205 lock-wait storm and a
background_tasks backlog on 2026-06-26. Two root causes, both fixed here.

1) rippleIntoNewGroups ran one `INSERT IGNORE INTO messages_groups ... SELECT ...
   ST_Intersects(...) ... NOT EXISTS(logs ...)`. Under REPEATABLE READ an INSERT...SELECT
   takes shared next-key locks on EVERY source row it reads - the groups scan, the
   messages_groups dup check and the triple-nested `logs` "rippled-then-left" scan
   (100k-2.6M rows observed) - and holds them for the whole 5-430s statement. Run
   concurrently those locks collided on the messages_groups msgid index and on `logs`,
   starving the serial background worker's audit inserts (Sentry 1205 on INSERT INTO logs).
   Now resolve the target groups with a plain, non-locking snapshot SELECT, then INSERT each
   row on its own (Galera-safe, locks only the row written, briefly) - mirroring the existing
   addPosterMembershipToRippledGroups idiom. Behaviour is unchanged (same filters, collection,
   rippled_in); EXPLAIN confirms the existing logs(user)/(group) indexes are sufficient, so no
   new composite index is needed.

2) The scheduler's withoutOverlapping() is unreliable for runInBackground() jobs: the overlap
   mutex is freed as soon as the foreground tick forks, so a fresh run launched every minute
   even while the previous was still going (~90 piled up). ExpandCommand now takes a DB-backed,
   auto-expiring Cache lock ('ripple:expand:run') for the whole run and exits cleanly if another
   holds it, so at most one bulk run executes at a time. --msgid / --dry-run one-offs are exempt.

Verified live against prod (--within-group --limit 1/3): rippled_in inserts succeed with zero
lock waits and sub-second per-row inserts; new lock tests cover the single-instance guard.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.... (continued)

10741 of 12323 branches covered (87.16%)

Branch coverage included in aggregate %.

21 of 22 new or added lines in 2 files covered. (95.45%)

1384 existing lines in 43 files now uncovered.

123865 of 175661 relevant lines covered (70.51%)

36.9 hits per line

Uncovered Changes

Lines Coverage ∆ File
1
83.67
0.1% iznik-batch/app/Services/Ripple/ExpandService.php

Coverage Regressions

Lines Coverage ∆ File
274
63.44
-17.05% iznik-nuxt3/components/LoginModal.vue
150
61.34
-8.58% iznik-nuxt3/components/OurUploader.vue
135
74.76
6.18% iznik-nuxt3/components/VolunteerOpportunityModal.vue
113
77.79
8.17% iznik-nuxt3/components/CommunityEventModal.vue
85
64.53
-5.72% iznik-nuxt3/components/AddressModal.vue
74
79.33
0.29% iznik-nuxt3/components/MicroVolunteering.vue
70
44.91
-19.74% iznik-nuxt3/components/AddToCalendar.vue
64
81.21
3.5% iznik-nuxt3/components/AutoComplete.vue
56
68.1
-10.87% iznik-nuxt3/components/PostCode.vue
36
68.55
-2.52% iznik-nuxt3/components/ChatButton.vue
31
0.67
0.32% iznik-nuxt3/pages/partnerships.vue
25
81.82
-14.5% iznik-nuxt3/components/InfiniteLoading.vue
25
79.71
-14.45% iznik-nuxt3/components/SpinButton.vue
24
0.27
-0.0% iznik-nuxt3/components/LayoutCommon.vue
23
82.83
6.01% iznik-nuxt3/components/SomethingWentWrong.vue
19
87.36
-3.39% iznik-nuxt3/components/EmailValidator.vue
19
86.89
-0.85% iznik-nuxt3/components/MessageHistory.vue
18
86.32
1.63% iznik-nuxt3/components/ChatMessageText.vue
16
81.95
1.13% iznik-nuxt3/components/PostPhoto.vue
14
83.1
-1.15% iznik-nuxt3/components/GoogleOneTap.vue
13
90.26
2.98% iznik-nuxt3/components/UserRatings.vue
12
90.27
19.74% iznik-nuxt3/components/ChatMessage.vue
11
94.59
16.16% iznik-nuxt3/components/ChatMessageInterested.vue
10
94.77
8.21% iznik-nuxt3/components/ActivityGraph.vue
9
80.0
2.89% iznik-nuxt3/components/AutoHeightTextarea.vue
9
92.83
16.93% iznik-nuxt3/components/VolunteerOpportunity.vue
8
72.31
-2.36% iznik-nuxt3/components/ProxyImage.vue
7
88.0
-0.1% iznik-nuxt3/components/PasswordEntry.vue
5
92.44
5.39% iznik-nuxt3/components/ChatListEntry.vue
5
64.52
-8.21% iznik-nuxt3/components/ExternalLink.vue
5
94.31
1.59% iznik-nuxt3/components/ProfileImage.vue
3
96.88
17.31% iznik-nuxt3/components/GroupSelect.vue
2
92.0
-4.0% iznik-batch/app/Console/Commands/Mail/SendModNotifsCommand.php
2
95.92
16.93% iznik-nuxt3/components/ChatMessageSummary.vue
2
87.5
-7.95% iznik-nuxt3/components/OurDatePicker.vue
2
93.55
-6.45% iznik-nuxt3/components/OurToggle.vue
2
96.85
5.94% iznik-nuxt3/components/OurUploadedImage.vue
1
97.42
14.89% iznik-nuxt3/components/ChatMessageAddress.vue
1
98.44
18.69% iznik-nuxt3/components/ChatMessageCompleted.vue
1
98.11
25.35% iznik-nuxt3/components/ChatMessagePromised.vue
1
99.5
20.53% iznik-nuxt3/components/CommunityEvent.vue
1
95.45
4.15% iznik-nuxt3/components/ProfileModal.vue
1
96.3
15.05% iznik-nuxt3/components/SupporterInfo.vue
Jobs
ID Job ID Ran Files Coverage
23548 go - 23548 26 Jun 2026 08:56AM UTC 141
83.79
CircleCI Job 23548
23548 vitest - 23548 26 Jun 2026 08:57AM UTC 718
69.02
CircleCI Job 23548
23548 laravel - 23548 26 Jun 2026 08:57AM UTC 462
68.54
CircleCI Job 23548
Source Files on build 23548
  • Tree
  • List 1321
  • Changed 6
  • Source Changed 0
  • Coverage Changed 6
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • CircleCI Build #23548
  • 7be2ef89 on github
  • Prev Build on master (#23520)
  • Next Build on master (#23552)
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