- Notifications
You must be signed in to change notification settings - Fork 11.7k
Description
Laravel Version
12.10.2
PHP Version
8.3.20
Database Driver & Version
No response
Description
Context
In config/cache.php you can define a separate connection to use for locks:
https://github.com/laravel/laravel/blob/f6e4638ee6ca1cd40aa7c56311d89ea3d91a24f8/config/cache.php#L74-L78
This makes it possible to run cache:clear without losing mutexes and atomic locks.
The lock_connection is used when calling
Cache::lock(...)->get()Schedule::command(...)->withoutOverlapping()
It might be used in other contexts too, but those are the ones I'm aware of.
The problem
Schedule::command(...)->onOneServer() creates the lock on the regular cache connection via
framework/src/Illuminate/Console/Scheduling/CacheSchedulingMutex.php
Lines 41 to 46 in bcc9220
| public function create(Event $event, DateTimeInterface $time) | |
| { | |
| return $this->cache->store($this->store)->add( | |
| $event->mutexName().$time->format('Hi'), true, 3600 | |
| ); | |
| } |
Which means that cache:clear will wipe those locks and allow another server to pick up the task.
Thoughts
I'm not familiar enough with the source to send a PR, and I don't know if there's a good reason for this behavior. Naively I would assume that onOneServer() should use CacheEventMutex in stead of CacheSchedulingMutex(which is apparently only used in this context).
Steps To Reproduce
- Use a cache driver with a separate lock_connection
- Configure a scheduled job with
onOneServer(), which calls sleep(60). - Run
schedule:run - Observe where the lock is stored.