1<?php
2/**
3 * Elasticsearch PHP client
4 *
5 * @link      https://github.com/elastic/elasticsearch-php/
6 * @copyright Copyright (c) Elasticsearch B.V (https://www.elastic.co)
7 * @license   http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
8 * @license   https://www.gnu.org/licenses/lgpl-2.1.html GNU Lesser General Public License, Version 2.1
9 *
10 * Licensed to Elasticsearch B.V under one or more agreements.
11 * Elasticsearch B.V licenses this file to you under the Apache 2.0 License or
12 * the GNU Lesser General Public License, Version 2.1, at your option.
13 * See the LICENSE file in the project root for more information.
14 */
15
16
17declare(strict_types = 1);
18
19namespace Elasticsearch\ConnectionPool;
20
21use Elasticsearch\Common\Exceptions\NoNodesAvailableException;
22use Elasticsearch\ConnectionPool\Selectors\SelectorInterface;
23use Elasticsearch\Connections\Connection;
24use Elasticsearch\Connections\ConnectionInterface;
25use Elasticsearch\Connections\ConnectionFactoryInterface;
26
27class StaticNoPingConnectionPool extends AbstractConnectionPool implements ConnectionPoolInterface
28{
29    /**
30     * @var int
31     */
32    private $pingTimeout    = 60;
33
34    /**
35     * @var int
36     */
37    private $maxPingTimeout = 3600;
38
39    /**
40     * {@inheritdoc}
41     */
42    public function __construct($connections, SelectorInterface $selector, ConnectionFactoryInterface $factory, $connectionPoolParams)
43    {
44        parent::__construct($connections, $selector, $factory, $connectionPoolParams);
45    }
46
47    public function nextConnection(bool $force = false): ConnectionInterface
48    {
49        $total = count($this->connections);
50        while ($total--) {
51            /**
52 * @var Connection $connection
53*/
54            $connection = $this->selector->select($this->connections);
55            if ($connection->isAlive() === true) {
56                return $connection;
57            }
58
59            if ($this->readyToRevive($connection) === true) {
60                return $connection;
61            }
62        }
63
64        throw new NoNodesAvailableException("No alive nodes found in your cluster");
65    }
66
67    public function scheduleCheck(): void
68    {
69    }
70
71    private function readyToRevive(Connection $connection): bool
72    {
73        $timeout = min(
74            $this->pingTimeout * pow(2, $connection->getPingFailures()),
75            $this->maxPingTimeout
76        );
77
78        if ($connection->getLastPing() + $timeout < time()) {
79            return true;
80        } else {
81            return false;
82        }
83    }
84}
85