Some projects have a lot of data and Solr indexation can be very long (on optimize for example).
By default, the socket timeout is set to 2 minutes (maybe it depends on the system configuration).
If we have the following error if the timeout is exceeded:
2020-02-18 00:31:58,335 ERROR [org.ametys.core.schedule.AmetysJob$org.ametys.cms.indexing.GlobalWorkspaceIndexerSchedulable] (AmetysRuntimeScheduler_Worker-4;) An exception occured during the execution of the Schedulable 'org.ametys.cms.indexing.GlobalWorkspaceIndexerSchedulable'
org.ametys.cms.indexing.IndexingException: Error indexing the workspace 'default'.
at org.ametys.cms.indexing.solr.SolrWorkspaceIndexer.doIndex(SolrWorkspaceIndexer.java:226)
at org.ametys.cms.indexing.solr.SolrWorkspaceIndexer._forceWorkspaceAndDoIndex(SolrWorkspaceIndexer.java:185)
at org.ametys.cms.indexing.solr.SolrWorkspaceIndexer._index(SolrWorkspaceIndexer.java:155)
at org.ametys.cms.indexing.solr.SolrWorkspaceIndexer.indexAllWorkspaces(SolrWorkspaceIndexer.java:111)
at org.ametys.cms.indexing.GlobalWorkspaceIndexerSchedulable.execute(GlobalWorkspaceIndexerSchedulable.java:43)
at org.ametys.core.schedule.AmetysJob.execute(AmetysJob.java:151)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
Caused by: org.apache.solr.client.solrj.SolrServerException: Timeout occurred while waiting response from server at: http: at org.apache.solr.client.solrj.impl.HttpSolrClient.executeMethod(HttpSolrClient.java:676)
at org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:265)
at org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:248)
at org.apache.solr.client.solrj.impl.ConcurrentUpdateSolrClient.request(ConcurrentUpdateSolrClient.java:497)
at org.ametys.cms.search.solr.NoAutoCommitUpdateClient.request(NoAutoCommitUpdateClient.java:52)
at org.apache.solr.client.solrj.SolrRequest.process(SolrRequest.java:211)
at org.apache.solr.client.solrj.SolrClient.optimize(SolrClient.java:675)
at org.ametys.cms.search.solr.AbstractAmetysConcurrentUpdateClient.optimize(AbstractAmetysConcurrentUpdateClient.java:325)
at org.apache.solr.client.solrj.SolrClient.optimize(SolrClient.java:595)
at org.ametys.cms.search.solr.AbstractAmetysConcurrentUpdateClient.optimize(AbstractAmetysConcurrentUpdateClient.java:297)
at org.ametys.cms.content.indexing.solr.SolrIndexer.optimize(SolrIndexer.java:2010)
at org.ametys.cms.indexing.solr.SolrWorkspaceIndexer.doIndex(SolrWorkspaceIndexer.java:221)
... 7 more
Caused by: java.net.SocketTimeoutException: Read timed out
at java.base/java.net.SocketInputStream.socketRead0(Native Method)
at java.base/java.net.SocketInputStream.socketRead(SocketInputStream.java:115)
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:168)
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:140)
at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137)
at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:153)
at org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:280)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:138)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)
at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163)
at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:157)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:272)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
at org.apache.solr.client.solrj.impl.HttpSolrClient.executeMethod(HttpSolrClient.java:564)
... 18 more
The solution could be to add a configuration parameter to set the socket timeout duration.
For that we have to modify two calls of SolrClient:
- DefaultSolrClientProvider#initialize()
_solrReadClient = new HttpSolrClient.Builder(url).build(); become _solrReadClient = new HttpSolrClient.Builder(url).withSocketTimeout(timeout).build();
- AbstractAmetysConcurrentUpdateClient#constructor
Add .withSocketTimeout(timeout) to the Builder while calling the super constructor.
But for this solution, it can't work for now because there is the following issue: SOLR-12550.