Skip to content

Redis Cluster CROSS SLOT Key issue #594

@RyanWyse

Description

@RyanWyse

Describe the bug
When using a Redis cluster and saving a model with the Cacheable trait a CROSSSLOT Keys in request don't hash to the same slot error is thrown.

Eloquent Query
Please provide the complete eloquent query that caused the bug, for example:


250            // let's log that that it was attempted.
251            $schema = $this->modelInspector->inspect($entity::class);
252            $attribute = collect($schema['attributes'])->where('name', $relationship->getForeignKeyName())->first();
253            if ($attribute && $attribute['nullable']) {
254                $relationship->dissociate();
255                $entity->save();
256
257                return;
258            }

Stack Trace
staging.ERROR: CROSSSLOT Keys in request don't hash to the same slot {"userId":4,"exception":"[object] (RedisException(code: 0): CROSSSLOT Keys in request don't hash to the same slot at /var/www/html/vendor/laravel/framework/src/Illuminate/Redis/Connections/Connection.php:119)
[stacktrace]
#0 /var/www/html/vendor/laravel/framework/src/Illuminate/Redis/Connections/Connection.php(119): Redis->eval()
#1 /var/www/html/vendor/laravel/framework/src/Illuminate/Redis/Connections/PhpRedisConnection.php(531): Illuminate\Redis\Connections\Connection->command()
#2 /var/www/html/vendor/laravel/framework/src/Illuminate/Redis/Connections/PhpRedisConnection.php(448): Illuminate\Redis\Connections\PhpRedisConnection->command()
#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Cache/RedisTaggedCache.php(155): Illuminate\Redis\Connections\PhpRedisConnection->eval()
#4 /var/www/html/vendor/genealabs/laravel-model-caching/src/Cache/ModelCacheRepository.php(116): Illuminate\Cache\RedisTaggedCache->flush()
#5 /var/www/html/vendor/genealabs/laravel-model-caching/src/Traits/Caching.php(158): GeneaLabs\LaravelModelCaching\Cache\ModelCacheRepository->invalidateTags()
#6 /var/www/html/vendor/genealabs/laravel-model-caching/src/Traits/Caching.php(542): App\Models\BaseModel->GeneaLabs\LaravelModelCaching\Traits\{closure}()
#7 /var/www/html/vendor/genealabs/laravel-model-caching/src/Traits/Caching.php(153): App\Models\BaseModel->withCacheFallback()
#8 /var/www/html/vendor/genealabs/laravel-model-caching/src/Traits/Caching.php(324): App\Models\BaseModel->flushCache()
#9 /var/www/html/vendor/genealabs/laravel-model-caching/src/Traits/Caching.php(542): App\Models\BaseModel->GeneaLabs\LaravelModelCaching\Traits\{closure}()
#10 /var/www/html/vendor/genealabs/laravel-model-caching/src/Traits/Caching.php(320): App\Models\BaseModel->withCacheFallback()
#11 /var/www/html/vendor/genealabs/laravel-model-caching/src/Traits/ModelCaching.php(90): App\Models\BaseModel->checkCooldownAndFlushAfterPersisting()
#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php(492): App\Models\BaseModel::GeneaLabs\LaravelModelCaching\Traits\{closure}()
#13 /var/www/html/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php(319): Illuminate\Events\Dispatcher->Illuminate\Events\{closure}()
#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php(299): Illuminate\Events\Dispatcher->invokeListeners()
#15 /var/www/html/vendor/mikebronner/laravel-pivot-events/src/Traits/ExtendFireModelEventTrait.php(50): Illuminate\Events\Dispatcher->dispatch()
#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(1279): App\Models\BaseModel->fireModelEvent()
#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(1252): Illuminate\Database\Eloquent\Model->finishSave()
#18 /var/www/html/app/Services/Relationships/ModelRelationshipService.php(255): Illuminate\Database\Eloquent\Model->save()
#19 /var/www/html/app/Services/Relationships/ModelRelationshipService.php(59): App\Services\Relationships\ModelRelationshipService->syncBelongsTo()
#20 /var/www/html/app/Http/Controllers/BaseModelController.php(525): App\Services\Relationships\ModelRelationshipService->sync()
#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php(35): App\Http\Controllers\BaseModelController->App\Http\Controllers\{closure}()
#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php(491): Illuminate\Database\Connection->transaction()
#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php(363): Illuminate\Database\DatabaseManager->__call()
#24 /var/www/html/app/Http/Controllers/BaseModelController.php(504): Illuminate\Support\Facades\Facade::__callStatic()
#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\Http\Controllers\BaseModelController->update()
#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(43): Illuminate\Routing\Controller->callAction()
#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php(265): Illuminate\Routing\ControllerDispatcher->dispatch()
#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php(211): Illuminate\Routing\Route->runController()
#29 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(822): Illuminate\Routing\Route->run()
#30 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Routing\Router->Illuminate\Routing\{closure}()
#31 /var/www/html/vendor/stancl/tenancy/src/Middleware/ScopeSessions.php(29): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#32 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Stancl\Tenancy\Middleware\ScopeSessions->handle()
#33 /var/www/html/vendor/inertiajs/inertia-laravel/src/Middleware.php(122): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#34 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Inertia\Middleware->handle()
#35 /var/www/html/app/Http/Middleware/HandleAppearance.php(32): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#36 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): App\Http\Middleware\HandleAppearance->handle()
#37 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#38 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\Routing\Middleware\SubstituteBindings->handle()
#39 /var/www/html/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(63): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#40 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\Auth\Middleware\Authenticate->handle()
#41 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(87): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#42 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle()
#43 /var/www/html/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(48): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#44 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\View\Middleware\ShareErrorsFromSession->handle()
#45 /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(120): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#46 /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(63): Illuminate\Session\Middleware\StartSession->handleStatefulRequest()
#47 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\Session\Middleware\StartSession->handle()
#48 /var/www/html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(36): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#49 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle()
#50 /var/www/html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(74): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#51 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\Cookie\Middleware\EncryptCookies->handle()
#52 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(36): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#53 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyBySubdomain.php(51): Stancl\Tenancy\Middleware\IdentificationMiddleware->initializeTenancy()
#54 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Stancl\Tenancy\Middleware\InitializeTenancyBySubdomain->handle()
#55 /var/www/html/vendor/stancl/tenancy/src/Middleware/PreventAccessFromCentralDomains.php(29): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#56 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Stancl\Tenancy\Middleware\PreventAccessFromCentralDomains->handle()
#57 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(137): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#58 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(821): Illuminate\Pipeline\Pipeline->then()
#59 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(800): Illuminate\Routing\Router->runRouteWithinStack()
#60 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(764): Illuminate\Routing\Router->runRoute()
#61 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(753): Illuminate\Routing\Router->dispatchToRoute()
#62 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\Routing\Router->dispatch()
#63 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}()
#64 /var/www/html/vendor/livewire/livewire/src/Features/SupportDisablingBackButtonCache/DisableBackButtonCacheMiddleware.php(19): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#65 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Livewire\Features\SupportDisablingBackButtonCache\DisableBackButtonCacheMiddleware->handle()
#66 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#67 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#68 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle()
#69 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#70 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(51): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#71 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\Foundation\Http\Middleware\TrimStrings->handle()
#72 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#73 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\Http\Middleware\ValidatePostSize->handle()
#74 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(109): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#75 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle()
#76 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(61): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#77 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\Http\Middleware\HandleCors->handle()
#78 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(58): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#79 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\Http\Middleware\TrustProxies->handle()
#80 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/InvokeDeferredCallbacks.php(22): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#81 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\Foundation\Http\Middleware\InvokeDeferredCallbacks->handle()
#82 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/ValidatePathEncoding.php(26): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#83 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\Http\Middleware\ValidatePathEncoding->handle()
#84 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(137): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#85 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\Pipeline\Pipeline->then()
#86 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter()
#87 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(1220): Illuminate\Foundation\Http\Kernel->handle()
#88 /var/www/html/public/index.php(24): Illuminate\Foundation\Application->handleRequest()
#89 {main}
"}

Environment

  • PHP: 8.3.3
  • OS: Alpine Linux 3.23
  • Laravel: 12.56
  • Model Caching: 13.1.1

Additional context
We do have a BaseModel which is where we've set the Cacheable trait, that most of our models extend from. It also seems like the error is occurring when saving/syncing relationships.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions