I am using symfony2 and FOSElasticaBundle.
My elasticsearch service often gets killed or fails for a still unknown reason. I've put systemctl in place with restart always
as a temporary fix.
Still, if down, the elasticsearch listener which performs an update of the index when doctrine updates an entity gets me an error 52 :
Couldn't connect to host, Elasticsearch down?
So this happens at logging if also using FOSUserBundle which updates the last user connexion date. That's super annoying to have such a depedency on elasticsearch. I've put an exception listener on this error but I'd prefer to have the bundle keep the update for a later time when the service is available again.
Looking into the bundle files, I found :
vendor/friendsofsymfony/elastica-bundle/Persister/ObjectPersister.php
public function replaceMany(array $objects)
{
$documents = array();
foreach ($objects as $object) {
$document = $this->transformToElasticaDocument($object);
$document->setDocAsUpsert(true);
$documents[] = $document;
}
try {
$this->type->updateDocuments($documents);
} catch (BulkException $e) {
$this->log($e);
}
}
This is a service and I hopped in could be overwritten as follows but it is a class that another one inheritates and child ones are instantiated instead of called as a service so I don't see how to overwrite it. How could I ?
try {
$this->type->updateDocuments($documents);
} catch (\Exception $e) {
if ($e instanceof BulkException)
{
$this->log($e);
}
elseif ($e->getMessage() != "Couldn't connect to host, Elasticsearch down?")
{
throw $e;
}
}
Then, how can I make sure the document is updated next time the service is available ?
EDIT:
My trace when I get the error:
Stack Trace
in vendor/ruflin/elastica/lib/Elastica/Transport/Http.php at line 153 -
}
if ($errorNumber > 0) {
throw new HttpException($errorNumber, $request, $response);
}
return $response;
at Http ->exec (object(Request), array('connection' => array('config' => array('headers' => array()), 'host' => 'localhost', 'port' => '9200', 'logger' => 'fos_elastica.logger', 'enabled' => true)))
in vendor/ruflin/elastica/lib/Elastica/Request.php at line 167 +
at Request ->send ()
in vendor/ruflin/elastica/lib/Elastica/Client.php at line 587 +
at Client ->request ('_bulk', 'PUT', '{"update":{"_index":"foodmeup","_type":"user","_id":4}} {"doc":{"firstName":"Dominique","lastName":"Descamps","content":null,"username":"ddescamps","email":"ddescamps@ebp-paris.com","jobSeeker":{"skills":[],"experiences":[],"trainings":[]}},"doc_as_upsert":true} ', array())
in vendor/friendsofsymfony/elastica-bundle/Elastica/Client.php at line 47 +
at Client ->request ('_bulk', 'PUT', '{"update":{"_index":"foodmeup","_type":"user","_id":4}} {"doc":{"firstName":"Dominique","lastName":"Descamps","content":null,"username":"ddescamps","email":"ddescamps@ebp-paris.com","jobSeeker":{"skills":[],"experiences":[],"trainings":[]}},"doc_as_upsert":true} ', array())
in vendor/ruflin/elastica/lib/Elastica/Bulk.php at line 342 +
at Bulk ->send ()
in vendor/ruflin/elastica/lib/Elastica/Client.php at line 270 +
at Client ->updateDocuments (array(object(Document)))
in vendor/ruflin/elastica/lib/Elastica/Index.php at line 131 +
at Index ->updateDocuments (array(object(Document)))
in vendor/ruflin/elastica/lib/Elastica/Type.php at line 174 +
at Type ->updateDocuments (array(object(Document)))
in vendor/friendsofsymfony/elastica-bundle/Persister/ObjectPersister.php at line 144 +
at ObjectPersister ->replaceMany (array(object(User)))
in vendor/friendsofsymfony/elastica-bundle/Doctrine/Listener.php at line 151 +
at Listener ->persistScheduled ()
in vendor/friendsofsymfony/elastica-bundle/Doctrine/Listener.php at line 182 +
at Listener ->postFlush (object(PostFlushEventArgs))
in vendor/symfony/symfony/src/Symfony/Bridge/Doctrine/ContainerAwareEventManager.php at line 63 +
at ContainerAwareEventManager ->dispatchEvent ('postFlush', object(PostFlushEventArgs))
in vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php at line 3318 +
at UnitOfWork ->dispatchPostFlushEvent ()
in vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php at line 428 +
at UnitOfWork ->commit (null)
in vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php at line 357 +
at EntityManager ->flush (null)
in src/AppBundle/Model/Classes/CustomBaseController.php at line 61 +
at CustomBaseController ->flush ()
in src/AppBundle/Controller/Core/VoteController.php at line 68 +
at VoteController ->voteAction (object(Request), 'up', 'Post', 'permettre-le-partage-de-documents-avec-les-equipes')
at call_user_func_array (array(object(VoteController), 'voteAction'), array(object(Request), 'up', 'Post', 'permettre-le-partage-de-documents-avec-les-equipes'))
in app/bootstrap.php.cache at line 3029 +
at HttpKernel ->handleRaw (object(Request), '1')
in app/bootstrap.php.cache at line 2991 +
at HttpKernel ->handle (object(Request), '1', true)
in app/bootstrap.php.cache at line 3140 +
at ContainerAwareHttpKernel ->handle (object(Request), '1', true)
in app/bootstrap.php.cache at line 2384 +
at Kernel ->handle (object(Request))
in web/app_dev.php at line 36 +