From f01f1f83ade36f48d623ea8d117f6d79f8e8ffb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=A2=81=E9=B9=8F=E5=A0=83?= Date: Mon, 21 Apr 2025 08:24:21 +0000 Subject: [PATCH] added parameter pool_maxsize to Connection. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 张梁鹏堃 --- ...parameter-pool_maxsize-to-Connection.patch | 234 ++++++++++++++++++ pyArango.spec | 6 +- 2 files changed, 239 insertions(+), 1 deletion(-) create mode 100644 added-parameter-pool_maxsize-to-Connection.patch diff --git a/added-parameter-pool_maxsize-to-Connection.patch b/added-parameter-pool_maxsize-to-Connection.patch new file mode 100644 index 0000000..e93d2a2 --- /dev/null +++ b/added-parameter-pool_maxsize-to-Connection.patch @@ -0,0 +1,234 @@ +From feaac0364f113b7989531e8080d49bb11dce8a6c Mon Sep 17 00:00:00 2001 +From: Cristian Steib +Date: Wed, 27 Oct 2021 10:09:31 -0300 +Subject: [PATCH] added parameter `pool_maxsize` to `Connection`. + +--- + CHANGELOG.rst | 7 ++- + pyArango/connection.py | 122 ++++++++++++++++++++++++++++------------- + 2 files changed, 90 insertions(+), 39 deletions(-) + +diff --git a/CHANGELOG.rst b/CHANGELOG.rst +index f58597a..849264a 100644 +--- a/CHANGELOG.rst ++++ b/CHANGELOG.rst +@@ -1,3 +1,8 @@ ++Unreleased ++===== ++ ++* Added parameter ``pool_maxsize`` on class ``Connection`` to allow user configure the http pool size. ++ + 2.0.1 + ===== + +@@ -10,7 +15,7 @@ + * added to_default function to reset a document to its default values + * fixed bug in default documents where default values could be overwritten + * default value for fields is now None +-* defaual value for fields can now be a callable ++* default value for fields can now be a callable + + 1.3.5 + ===== +diff --git a/pyArango/connection.py b/pyArango/connection.py +index ac6927d..0df8688 100644 +--- a/pyArango/connection.py ++++ b/pyArango/connection.py +@@ -3,9 +3,6 @@ + from datetime import datetime + + import requests +-import base64 +-import tempfile +-import shutil + + from .action import ConnectionAction + from .database import Database, DBHandle +@@ -29,8 +26,10 @@ def __call__(self, *args, **kwargs): + print( "Unable to get json for request: %s. Content: %s" % (self.ret.url, self.ret.content) ) + raise e + +-class AikidoSession(object): +- """Magical Aikido being that you probably do not need to access directly that deflects every http request to requests in the most graceful way. ++ ++class AikidoSession: ++ """Magical Aikido being that you probably do not need to access directly ++ that deflects every http request to requests in the most graceful way. + It will also save basic stats on requests in it's attribute '.log'. + """ + +@@ -76,12 +75,22 @@ def __call__(self, *args, **kwargs): + ret.json = JsonHook(ret) + return ret + +- def __init__(self, username, password, verify=True, max_conflict_retries=5, max_retries=5, single_session=True, log_requests=False): ++ def __init__( ++ self, ++ username, ++ password, ++ verify=True, ++ max_conflict_retries=5, ++ max_retries=5, ++ single_session=True, ++ log_requests=False, ++ pool_maxsize=10 ++ ): + if username: + self.auth = (username, password) + else: + self.auth = None +- ++ self.pool_maxsize = pool_maxsize + self.verify = verify + self.max_retries = max_retries + self.log_requests = log_requests +@@ -98,8 +107,14 @@ def __init__(self, username, password, verify=True, max_conflict_retries=5, max_ + + def _make_session(self): + session = requests.Session() +- http = requests.adapters.HTTPAdapter(max_retries=self.max_retries) +- https = requests.adapters.HTTPAdapter(max_retries=self.max_retries) ++ kwargs = { ++ 'max_retries': self.max_retries, ++ 'pool_connections': self.pool_maxsize, ++ 'pool_maxsize': self.pool_maxsize, ++ #'pool_block': True # We don't want to lose connections ++ } ++ http = requests.adapters.HTTPAdapter(**kwargs) ++ https = requests.adapters.HTTPAdapter(**kwargs) + session.mount('http://', http) + session.mount('https://', https) + +@@ -108,7 +123,7 @@ def _make_session(self): + def __getattr__(self, request_function_name): + if self.session is not None: + session = self.session +- else : ++ else: + session = self._make_session() + + try: +@@ -128,6 +143,7 @@ def __getattr__(self, request_function_name): + def disconnect(self): + pass + ++ + class Connection(object): + """This is the entry point in pyArango and directly handles databases. + @param arangoURL: can be either a string url or a list of string urls to different coordinators +@@ -162,29 +178,34 @@ class Connection(object): + max number of retries for a request + max_conflict_retries: int + max number of requests for a conflict error (1200 arangodb error). Does not work with gevents (grequests), ++ pool_maxsize: int ++ max number of open connections. (Not intended for grequest) + """ + + LOAD_BLANCING_METHODS = {'round-robin', 'random'} + +- def __init__(self, +- arangoURL = 'http://127.0.0.1:8529', +- username = None, +- password = None, +- verify = True, +- verbose = False, +- statsdClient = None, +- reportFileName = None, +- loadBalancing = "round-robin", +- use_grequests = False, +- use_jwt_authentication=False, +- use_lock_for_reseting_jwt=True, +- max_retries=5, +- max_conflict_retries=5 ++ def __init__( ++ self, ++ arangoURL='http://127.0.0.1:8529', ++ username=None, ++ password=None, ++ verify=True, ++ verbose=False, ++ statsdClient=None, ++ reportFileName=None, ++ loadBalancing="round-robin", ++ use_grequests=False, ++ use_jwt_authentication=False, ++ use_lock_for_reseting_jwt=True, ++ max_retries=5, ++ max_conflict_retries=5, ++ pool_maxsize=10 + ): + + if loadBalancing not in Connection.LOAD_BLANCING_METHODS: + raise ValueError("loadBalancing should be one of : %s, got %s" % (Connection.LOAD_BLANCING_METHODS, loadBalancing) ) + ++ self.pool_maxsize = pool_maxsize + self.loadBalancing = loadBalancing + self.currentURLId = 0 + self.username = username +@@ -260,27 +281,52 @@ def getVersion(self): + else: + raise CreationError(data["errorMessage"], data) + ++ def create_aikido_session( ++ self, ++ username, ++ password, ++ verify ++ ) -> AikidoSession: ++ return AikidoSession( ++ username=username, ++ password=password, ++ verify=verify, ++ single_session=True, ++ max_conflict_retries=self.max_conflict_retries, ++ max_retries=self.max_retries, ++ log_requests=False, ++ pool_maxsize=self.pool_maxsize ++ ) ++ ++ def create_grequest_session( ++ self, ++ username, ++ password, ++ verify ++ ): ++ from .gevent_session import AikidoSession_GRequests ++ return AikidoSession_GRequests( ++ username, password, self.arangoURL, ++ self.use_jwt_authentication, ++ self.use_lock_for_reseting_jwt, ++ self.max_retries, ++ verify ++ ) ++ + def resetSession(self, username=None, password=None, verify=True): + """resets the session""" + self.disconnectSession() + if self.use_grequests: +- from .gevent_session import AikidoSession_GRequests +- self.session = AikidoSession_GRequests( +- username, password, self.arangoURL, +- self.use_jwt_authentication, +- self.use_lock_for_reseting_jwt, self.max_retries, ++ self.session = self.create_grequest_session( ++ username, ++ password, + verify + ) + else: +- # self.session = AikidoSession(username, password, verify, self.max_retries) +- self.session = AikidoSession( +- username=username, +- password=password, +- verify=verify, +- single_session=True, +- max_conflict_retries=self.max_conflict_retries, +- max_retries=self.max_retries, +- log_requests=False ++ self.session = self.create_aikido_session( ++ username, ++ password, ++ verify + ) + + def reload(self): diff --git a/pyArango.spec b/pyArango.spec index 61ecfd5..f16b270 100644 --- a/pyArango.spec +++ b/pyArango.spec @@ -2,7 +2,7 @@ Name: pyarango Version: 2.0.1 -Release: 3 +Release: 4 Summary: Python Driver for ArangoDB with built-in validation License: Apache-2.0 URL: https://github.com/ArangoDB-Community/pyArango @@ -11,6 +11,7 @@ BuildArch: noarch Patch0001: 0001-remove-unused-install-require.patch Patch0002: Fix-bad-error-check-causing-bulk-import-methods-to-fail.patch +Patch0003: added-parameter-pool_maxsize-to-Connection.patch BuildRequires: python3-setuptools python3-devel @@ -58,6 +59,9 @@ pyArango supports graphs, indexes and probably everything that arangodb can do. %changelog +* Mon Apr 21 2025 zhangliangpengkun - 2.0.1-4 +- DESC:added parameter pool_maxsize to Connection. + * Mon Apr 21 2025 zhangliangpengkun - 2.0.1-3 - DESC:Fix bad error check causing bulk import methods to fail -- Gitee