Description
Scout Version
10.9.0
Scout Driver
Typesense
Laravel Version
10.48.10
PHP Version
8.3.9
Database Driver & Version
Typesense 0.25.2
SDK Version
Typesense PHP 4.9.3
Meilisearch CLI Version
No response
Description
When deleting the index and afterwards importing all models, we can reach a race condition, where the import fails because some jobs run in parallel and all try to create or access the index.
Only one succeeds and the others will, for example, throw this error:
Typesense\Exceptions\ObjectNotFound: Not Found
or interestingly, only rarely, Typesense\Exceptions\ObjectAlreadyExists: A collection with name
already exists.
.
This happens when using queued imports. I don't exactly understand why it returns Not Found instead of the more rare collection already exists error, which is logical, but this might be some technical detail in the typesense engine.
E.g. using Horizon with minProcesses = 5
and running the following command on a table with enough entries e.g. ~ 40.000 will sometimes result in those exceptions on some of the jobs.
We should try to make the import more robust and maybe ensure that the index is created before the documents are imported? I'm happy to hear your solutions on this, but i think we should fix this flaw in scout directly.
Steps To Reproduce
In any scout repository with Horizon or some queue workers and a table with enough elements such that chunking happens, run:
php artisan scout:delete-index "App\Models\User" && php artisan scout:import "App\Models\User"
And sometimes the race condition will cause some jobs to fail.