# SocketTimeoutException while retrieving or inserting data into Elastic Search by using Rest High Level Client

**URL:** <https://discuss.elastic.co/t/sockettimeoutexception-while-retrieving-or-inserting-data-into-elastic-search-by-using-rest-high-level-client/191943>\
**Category:** Elasticsearch\
**Created:** [July 24, 2019, 4:37am UTC](https://discuss.elastic.co/t/sockettimeoutexception-while-retrieving-or-inserting-data-into-elastic-search-by-using-rest-high-level-client/191943 "2019-07-24T04:37:13Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![iAshwinK](https://avatars.discourse-cdn.com/v4/letter/i/6bbea6/32.png) [@iAshwinK](https://discuss.elastic.co/u/iAshwinK)\
**Post date:** [July 24, 2019, 4:37am UTC](https://discuss.elastic.co/t/sockettimeoutexception-while-retrieving-or-inserting-data-into-elastic-search-by-using-rest-high-level-client/191943/1 "2019-07-24T04:37:13Z")

</div>

I'm facing `SocketTimeoutException` while retrieving/inserting data from/to elastic. This is happening when there are around `10-30 request/second`. These requests are combination of get/put.

Here is my elastic configuration(it's on azure):

- `3 master nodes` each of `4GB RAM`
- `2 data nodes` each of `8GM RAM`
- Azure load balancer which connects to above data node (seems only 9200 port is opened on it)
- Elastic Version: 7.2.0
- Rest High Level Client:

**Index Information:**

- Index shards: 2

- Index replica: 1

- Index total fields: 10000

- Size of index from kibana: Total-`27.2 MB` & `Primaries: 12.2MB`

- Index structure:

- Dynamic mapping is disabled.

Following is my `elastic Config` file. Here I've two connection bean, one is for read & another for write to elastic.

**ElasticConfig.java:**

```auto
@Configuration
public class ElasticConfig {

    
    private String elasticHost;
    private int elasticPort;
    private String elasticUser;
    private String elasticPass;
    private int timeout;
    @Bean(destroyMethod = "close")
    @Qualifier("readClient")
    public RestHighLevelClient readClient(){

        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(elasticUser, elasticPass));

        RestClientBuilder builder = RestClient
                .builder(new HttpHost(elasticHost, elasticPort))
                .setHttpClientConfigCallback(httpClientBuilder -> 
                        httpClientBuilder
                                .setDefaultCredentialsProvider(credentialsProvider)
                                .setDefaultIOReactorConfig(IOReactorConfig.custom().setIoThreadCount(5).build())
                );

        builder.setRequestConfigCallback(requestConfigBuilder -> 
                requestConfigBuilder
                        .setConnectTimeout(10000)
                        .setSocketTimeout(60000)
                        .setConnectionRequestTimeout(0)
        );

        RestHighLevelClient restClient = new RestHighLevelClient(builder);
        return restClient;
    }

    @Bean(destroyMethod = "close")
    @Qualifier("writeClient")
    public RestHighLevelClient writeClient(){

        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(elasticUser, elasticPass));

        RestClientBuilder builder = RestClient
                .builder(new HttpHost(elasticHost, elasticPort))
                .setHttpClientConfigCallback(httpClientBuilder -> 
                        httpClientBuilder
                                .setDefaultCredentialsProvider(credentialsProvider)
                                .setDefaultIOReactorConfig(IOReactorConfig.custom().setIoThreadCount(5).build())
                );

        builder.setRequestConfigCallback(requestConfigBuilder -> 
                requestConfigBuilder
                        .setConnectTimeout(10000)
                        .setSocketTimeout(60000)
                        .setConnectionRequestTimeout(0)
        );

        RestHighLevelClient restClient = new RestHighLevelClient(builder);
        return restClient;
    }

}

```

Here is the function which makes a call to elastic, if data is available in elastic it will take it else it will generate data & put into elastic.

```auto
public Object getData(Request request) {

	DataObj elasticResult = elasticService.getData(request);
	if(elasticResult!=null){
		return elasticResult;
	}
	else{
		//code to generate data
		DataObj generatedData = getData();//some function which will generated data
		//put above data into elastic by Async call.
		elasticAsync.putData(generatedData);
        return generatedData;
	}
}

```

**ElasticService.java getData Function:**

```auto
@Service
public class ElasticService {

    private String elasticIndex;

    @Autowired
    @Qualifier("readClient")
    private RestHighLevelClient readClient;

	public DataObj getData(Request request){
	    String generatedId = request.getGeneratedID();

	    GetRequest getRequest = new GetRequest()
	            .index(elasticIndex) //elastic index name
	            .id(generatedId); //retrieving by index id from elastic _id field (as key-value)

	    DataObj result = null;
	    try {
	        GetResponse response = readClient.get(getRequest, RequestOptions.DEFAULT);
	        if(response.isExists()) {
	            ObjectMapper objectMapper = new ObjectMapper();
	            result = objectMapper.readValue(response.getSourceAsString(), DataObj.class);
	        }
	    } catch (Exception e) {
	        LOGGER.error("Exception occurred during fetch from elastic !!!! " + ,e);
	    }
	    return result;
	}

}

```

**ElasticAsync.java Async Put Data Function:**

```auto
@Service
public class ElasticAsync {

    private static final Logger LOGGER = Logger.getLogger(ElasticAsync.class.getName());

    private String elasticIndex;

    @Autowired
    @Qualifier("writeClient")
    private RestHighLevelClient writeClient;

    @Async
    public void putData(DataObj generatedData){
     ElasticVO updatedRequest = toElasticVO(generatedData);//ElasticVO matches to the structure of index given above.

        try {
            ObjectMapper objectMapper = new ObjectMapper();
            String jsonString = objectMapper.writeValueAsString(updatedRequest);

            IndexRequest request = new IndexRequest(elasticIndex);
            request.id(generatedData.getGeneratedID());
            request.source(jsonString, XContentType.JSON);
            request.setRefreshPolicy(WriteRequest.RefreshPolicy.NONE);
            request.timeout(TimeValue.timeValueSeconds(5));
            IndexResponse indexResponse = writeClient.index(request, RequestOptions.DEFAULT);
            LOGGER.info("response id: " + indexResponse.getId());
            }
        } catch (Exception e) {
            LOGGER.error("Exception occurred during saving into elastic !!!!",e);
        }
    }

}

```

Here is the some part of the stack trace when exception is occurred during saving data into elastic:(will add in follow up comment)

I've gone through couple of `stackoverflow` & `elastic` related blogs where they have mentioned this issue could be due to `RAM` & `cluster` configuration of elastic. Then I've changed my shards from 5 to 2 as there were only two data nodes. Also increased ram of Data nodes from 4GB to 8GB, as I get to know that elastic will use only `50%` of total `RAM`. The occurrences of exception have decreased but problem still persist.

What I'm missing from java/elastic configuration point of view which frequently throwing this kind of `SocketTimeoutException` ?

---

<div class="post-metadata">

**Author:** ![iAshwinK](https://avatars.discourse-cdn.com/v4/letter/i/6bbea6/32.png) [@iAshwinK](https://discuss.elastic.co/u/iAshwinK)\
**Post date:** [July 24, 2019, 4:40am UTC](https://discuss.elastic.co/t/sockettimeoutexception-while-retrieving-or-inserting-data-into-elastic-search-by-using-rest-high-level-client/191943/2 "2019-07-24T04:40:46Z")

</div>

Due to limit to post, I have removed some information form OP. So here are the missing things from OP:  
Maven Dependency:

```auto
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
        <version>7.2.0</version>
    </dependency>
    
    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>7.2.0</version>
    </dependency>

```

Here is the some part of the stack trace when exception is occurred during saving data into elastic:

```auto
2019-07-19 07:32:19.997 ERROR [data-retrieval,341e6ecc5b10f3be,1eeb0722983062b2,true] 1 --- [askExecutor-894] a.c.s.a.service.impl.ElasticAsync : Exception occurred during saving into elastic !!!!

java.net.SocketTimeoutException: 60,000 milliseconds timeout on connection http-outgoing-34 [ACTIVE]
at org.elasticsearch.client.RestClient.extractAndWrapCause(RestClient.java:789) ~[elasticsearch-rest-client-7.2.0.jar!/:7.2.0]
	at org.elasticsearch.client.RestClient.performRequest(RestClient.java:225) ~[elasticsearch-rest-client-7.2.0.jar!/:7.2.0]
	at org.elasticsearch.client.RestClient.performRequest(RestClient.java:212) ~[elasticsearch-rest-client-7.2.0.jar!/:7.2.0]
	at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1448) ~[elasticsearch-rest-high-level-client-7.2.0.jar!/:7.2.0]
	at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1418) ~[elasticsearch-rest-high-level-client-7.2.0.jar!/:7.2.0]
	at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:1388) ~[elasticsearch-rest-high-level-client-7.2.0.jar!/:7.2.0]
	at org.elasticsearch.client.RestHighLevelClient.index(RestHighLevelClient.java:836) ~[elasticsearch-rest-high-level-client-7.2.0.jar!/:7.2.0]

	
Caused by: java.net.SocketTimeoutException: 60,000 milliseconds timeout on connection http-outgoing-34 [ACTIVE]
	at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.timeout(HttpAsyncRequestExecutor.java:387) ~[httpcore-nio-4.4.11.jar!/:4.4.11]
	at org.apache.http.impl.nio.client.InternalIODispatch.onTimeout(InternalIODispatch.java:92) ~[httpasyncclient-4.1.3.jar!/:4.1.3]
	at org.apache.http.impl.nio.client.InternalIODispatch.onTimeout(InternalIODispatch.java:39) ~[httpasyncclient-4.1.3.jar!/:4.1.3]
	at org.apache.http.impl.nio.reactor.AbstractIODispatch.timeout(AbstractIODispatch.java:175) ~[httpcore-nio-4.4.11.jar!/:4.4.11]
	at org.apache.http.impl.nio.reactor.BaseIOReactor.sessionTimedOut(BaseIOReactor.java:263) ~[httpcore-nio-4.4.11.jar!/:4.4.11]
	at org.apache.http.impl.nio.reactor.AbstractIOReactor.timeoutCheck(AbstractIOReactor.java:492) ~[httpcore-nio-4.4.11.jar!/:4.4.11]
	at org.apache.http.impl.nio.reactor.BaseIOReactor.validate(BaseIOReactor.java:213) ~[httpcore-nio-4.4.11.jar!/:4.4.11]
	at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:280) ~[httpcore-nio-4.4.11.jar!/:4.4.11]
	at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104) ~[httpcore-nio-4.4.11.jar!/:4.4.11]
	at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:591) ~[httpcore-nio-4.4.11.jar!/:4.4.11]
	... 1 common frames omitted

```

Here is the some part of the stack trace when exception is occurred during retrieving data into elastic:

```auto
2019-07-19 07:22:37.844 ERROR [data-retrieval,104cf6b2ab5b3349,b302d3d3cd7ebc84,true] 1 --- [o-8080-exec-346] a.c.s.a.service.impl.ElasticService : Exception occurred during fetch from elastic !!!! 

java.net.SocketTimeoutException: 60,000 milliseconds timeout on connection http-outgoing-30 [ACTIVE]
	at org.elasticsearch.client.RestClient.extractAndWrapCause(RestClient.java:789) ~[elasticsearch-rest-client-7.1.1.jar!/:7.1.1]
	at org.elasticsearch.client.RestClient.performRequest(RestClient.java:225) ~[elasticsearch-rest-client-7.1.1.jar!/:7.1.1]
	at org.elasticsearch.client.RestClient.performRequest(RestClient.java:212) ~[elasticsearch-rest-client-7.1.1.jar!/:7.1.1]
	at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1433) ~[elasticsearch-rest-high-level-client-7.1.1.jar!/:7.1.1]
	at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1403) ~[elasticsearch-rest-high-level-client-7.1.1.jar!/:7.1.1]
	at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:1373) ~[elasticsearch-rest-high-level-client-7.1.1.jar!/:7.1.1]
	at org.elasticsearch.client.RestHighLevelClient.get(RestHighLevelClient.java:699) ~[elasticsearch-rest-high-level-client-7.1.1.jar!/:7.1.1]
	

Caused by: java.net.SocketTimeoutException: 60,000 milliseconds timeout on connection http-outgoing-30 [ACTIVE]
		at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.timeout(HttpAsyncRequestExecutor.java:387) ~[httpcore-nio-4.4.11.jar!/:4.4.11]
	at org.apache.http.impl.nio.client.InternalIODispatch.onTimeout(InternalIODispatch.java:92) ~[httpasyncclient-4.1.3.jar!/:4.1.3]
	at org.apache.http.impl.nio.client.InternalIODispatch.onTimeout(InternalIODispatch.java:39) ~[httpasyncclient-4.1.3.jar!/:4.1.3]
	at org.apache.http.impl.nio.reactor.AbstractIODispatch.timeout(AbstractIODispatch.java:175) ~[httpcore-nio-4.4.11.jar!/:4.4.11]
	at org.apache.http.impl.nio.reactor.BaseIOReactor.sessionTimedOut(BaseIOReactor.java:263) ~[httpcore-nio-4.4.11.jar!/:4.4.11]
	at org.apache.http.impl.nio.reactor.AbstractIOReactor.timeoutCheck(AbstractIOReactor.java:492) ~[httpcore-nio-4.4.11.jar!/:4.4.11]
	at org.apache.http.impl.nio.reactor.BaseIOReactor.validate(BaseIOReactor.java:213) ~[httpcore-nio-4.4.11.jar!/:4.4.11]
	at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:280) ~[httpcore-nio-4.4.11.jar!/:4.4.11]
	at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104) ~[httpcore-nio-4.4.11.jar!/:4.4.11]
	at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:591) ~[httpcore-nio-4.4.11.jar!/:4.4.11]
	... 1 common frames omitted

```

The values of all global level variables of `ElasticConfig` are taken using `@Value` annotation & same is applied wherever i've used global variable `private String elasticIndex;`

Link to complete [stackoverflow post](https://stackoverflow.com/questions/57109948/sockettimeoutexception-while-retrieving-or-inserting-data-into-elastic-search-by).

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [August 21, 2019, 4:40am UTC](https://discuss.elastic.co/t/sockettimeoutexception-while-retrieving-or-inserting-data-into-elastic-search-by-using-rest-high-level-client/191943/3 "2019-08-21T04:40:50Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
