New

The executive guide to generative AI

Read more
IMPORTANT: This documentation is no longer updated. Refer to Elastic's version policy and the latest documentation.

Request timeouts

edit

While you can specify Request time out globally, you can override this per request too.

We set up a 10 node cluster with a global time out of 20 seconds. Each call on a node takes 10 seconds. So we can only try this call on 2 nodes before the max request time out kills the client call.

var audit = new Auditor(() => VirtualClusterWith
    .Nodes(10)
    .ClientCalls(r => r.FailAlways().Takes(TimeSpan.FromSeconds(10)))
    .ClientCalls(r => r.OnPort(9209).SucceedAlways())
    .StaticConnectionPool()
    .Settings(s => s.DisablePing().RequestTimeout(TimeSpan.FromSeconds(20)))
);

audit = await audit.TraceCalls(
    new ClientCall {
        { BadResponse, 9200 },
        { BadResponse, 9201 },
        { MaxTimeoutReached }
    },
    /**
    * On the second request we specify a request timeout override to 80 seconds.
    * We should now see more nodes being tried.
    */
    new ClientCall(r => r.RequestTimeout(TimeSpan.FromSeconds(80)))
    {
        { BadResponse, 9203 },
        { BadResponse, 9204 },
        { BadResponse, 9205 },
        { BadResponse, 9206 },
        { BadResponse, 9207 },
        { BadResponse, 9208 },
        { HealthyResponse, 9209 },
    }
);

Connect timeouts

edit

Connect timeouts can be overridden on a per request basis.

Whilst the underlying WebRequest in the case of Desktop CLR and HttpClient in the case of Core CLR cannot distinguish between connect and retry timeouts, we use a separate configuration value for ping requests to allow ping to be configured independently.

We set up a 10 node cluster with a global time out of 20 seconds. Each call on a node takes 10 seconds. So we can only try this call on 2 nodes before the max request time out kills the client call.

var audit = new Auditor(() => VirtualClusterWith
    .Nodes(10)
    .Ping(p => p.SucceedAlways().Takes(TimeSpan.FromSeconds(20)))
    .ClientCalls(r => r.SucceedAlways())
    .StaticConnectionPool()
    .Settings(s => s.RequestTimeout(TimeSpan.FromSeconds(10)).PingTimeout(TimeSpan.FromSeconds(10)))
);

audit = await audit.TraceCalls(
    /**
    * The first call uses the configured global settings, request times out after 10 seconds and ping
    * calls always take 20, so we should see a single ping failure
    */
    new ClientCall {
        { PingFailure, 9200 },
        { MaxTimeoutReached }
    },
    /**
    * On the second request we set a request ping timeout override of 2 seconds
    * We should now see more nodes being tried before the request timeout is hit.
    */
    new ClientCall(r => r.PingTimeout(TimeSpan.FromSeconds(2)))
    {
        { PingFailure, 9202 },
        { PingFailure, 9203 },
        { PingFailure, 9204 },
        { PingFailure, 9205 },
        { PingFailure, 9206 },
        { MaxTimeoutReached }
    }
);

On this page

Was this helpful?
Feedback