1: <?php
2:
3: declare(strict_types=1);
4:
5: /**
6: * Copyright OpenSearch Contributors
7: * SPDX-License-Identifier: Apache-2.0
8: *
9: * OpenSearch PHP client
10: *
11: * @link https://github.com/opensearch-project/opensearch-php/
12: * @copyright Copyright (c) Elasticsearch B.V (https://www.elastic.co)
13: * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
14: * @license https://www.gnu.org/licenses/lgpl-2.1.html GNU Lesser General Public License, Version 2.1
15: *
16: * Licensed to Elasticsearch B.V under one or more agreements.
17: * Elasticsearch B.V licenses this file to you under the Apache 2.0 License or
18: * the GNU Lesser General Public License, Version 2.1, at your option.
19: * See the LICENSE file in the project root for more information.
20: */
21:
22: namespace OpenSearch\ConnectionPool;
23:
24: use OpenSearch\Common\Exceptions\InvalidArgumentException;
25: use OpenSearch\ConnectionPool\Selectors\SelectorInterface;
26: use OpenSearch\Connections\ConnectionFactoryInterface;
27: use OpenSearch\Connections\ConnectionInterface;
28:
29: abstract class AbstractConnectionPool implements ConnectionPoolInterface
30: {
31: /**
32: * Array of connections
33: *
34: * @var ConnectionInterface[]
35: */
36: protected $connections;
37:
38: /**
39: * Array of initial seed connections
40: *
41: * @var ConnectionInterface[]
42: */
43: protected $seedConnections;
44:
45: /**
46: * Selector object, used to select a connection on each request
47: *
48: * @var SelectorInterface
49: */
50: protected $selector;
51:
52: /**
53: * @var array<string, mixed>
54: */
55: protected $connectionPoolParams;
56:
57: /**
58: * @var ConnectionFactoryInterface
59: */
60: protected $connectionFactory;
61:
62: /**
63: * Constructor
64: *
65: * @param ConnectionInterface[] $connections The Connections to choose from
66: * @param SelectorInterface $selector A Selector instance to perform the selection logic for the available connections
67: * @param ConnectionFactoryInterface $factory ConnectionFactory instance
68: * @param array<string, mixed> $connectionPoolParams
69: */
70: public function __construct(array $connections, SelectorInterface $selector, ConnectionFactoryInterface $factory, array $connectionPoolParams)
71: {
72: $paramList = array('connections', 'selector', 'connectionPoolParams');
73: foreach ($paramList as $param) {
74: if (isset($$param) === false) {
75: throw new InvalidArgumentException('`' . $param . '` parameter must not be null');
76: }
77: }
78:
79: if (isset($connectionPoolParams['randomizeHosts']) === true
80: && $connectionPoolParams['randomizeHosts'] === true
81: ) {
82: shuffle($connections);
83: }
84:
85: $this->connections = $connections;
86: $this->seedConnections = $connections;
87: $this->selector = $selector;
88: $this->connectionPoolParams = $connectionPoolParams;
89: $this->connectionFactory = $factory;
90: }
91:
92: abstract public function nextConnection(bool $force = false): ConnectionInterface;
93:
94: abstract public function scheduleCheck(): void;
95: }
96: