Pymongo зависает на Recv_info для определенного запросаPython

Программы на Python
Ответить
Anonymous
 Pymongo зависает на Recv_info для определенного запроса

Сообщение Anonymous »

Я использовал pymongo для подключения к экземпляру mongodb. Это самостоятельный экземпляр mongodb, проблем с подключением нет, похоже, это программная проблема. Сервер mongodb нормально принимает команды, пока я не выполню вызов find_one для пустой коллекции (каждый раз одна и та же точка сценария). Я могу оставить скрипт открытым столько, сколько захочу (>10 минут), и он просто зависнет, без таймаутов или чего-то еще. Кажется, что сервер ничего не делает, и это приводит к тому, что клиент зависает на вызове Recv_into и в конечном итоге снова пытается установить соединение.
Примечание: я вызываю этот код с помощью функции, зарегистрированной в atexit, то есть до завершения программы, но в прошлом этот подход работал нормально, даже с пустыми коллекциями. Журналы Mongo сообщают, что соединение все еще активно, и только после того, как я принудительно завершу сценарий, появляются сообщения о закрытии соединения.
Вот код функции, которая зависает. Этот код поддерживает несколько коллекций, каждая ссылка находится в self.colref. У меня есть две коллекции, которые проходят без проблем, а когда я пытаюсь получить доступ к третьей (которая оказывается пустой), она зависает. Он делает это каждый раз.

Код: Выделить всё

# [class]
def dbcheck ( self, o: dict ):
hsh = self.hshfn( o )
# don't have to check to because that's checked when obj goes in
if hsh in self.in_refs:
return self.in_db[ self.in_refs[ hsh ] ]
dbo = self.colref.find_one( { # THIS HANGS
'storefront': o['storefront'],
'store_id': o['store_id'] } )
if dbo != None:
return dbo
return None
Когда скрипт переходит в это состояние, мне приходится вручную прервать его, открывая следующую трассировку стека:

Код: Выделить всё

  File "/usr/lib/python3.14/site-packages/pymongo/synchronous/collection.py", line 1755, in find_one
for result in cursor.limit(-1):
File "/usr/lib/python3.14/site-packages/pymongo/synchronous/cursor.py", line 1289, in __next__
return self.next()
File "/usr/lib/python3.14/site-packages/pymongo/synchronous/cursor.py", line 1265, in next
if len(self._data) or self._refresh():
File "/usr/lib/python3.14/site-packages/pymongo/synchronous/cursor.py", line 1213, in _refresh
self._send_message(q)
File "/usr/lib/python3.14/site-packages/pymongo/synchronous/cursor.py", line 1108, in _send_message
response = client._run_operation(
File "/usr/lib/python3.14/site-packages/pymongo/_csot.py", line 125, in csot_wrapper
return func(self, *args, **kwargs)
File "/usr/lib/python3.14/site-packages/pymongo/synchronous/mongo_client.py", line 1938, in _run_operation
return self._retryable_read(
File "/usr/lib/python3.14/site-packages/pymongo/synchronous/mongo_client.py", line 2048, in _retryable_read
return self._retry_internal(
File "/usr/lib/python3.14/site-packages/pymongo/_csot.py", line 125, in csot_wrapper
return func(self, *args, **kwargs)
File "/usr/lib/python3.14/site-packages/pymongo/synchronous/mongo_client.py", line 2014, in _retry_internal
).run()
File "/usr/lib/python3.14/site-packages/pymongo/synchronous/mongo_client.py", line 2763, in run
return self._read() if self._is_read else self._write()
File "/usr/lib/python3.14/site-packages/pymongo/synchronous/mongo_client.py", line 2924, in _read
return self._func(self._session, self._server, conn, read_pref)  # type:  ignore
File "/usr/lib/python3.14/site-packages/pymongo/synchronous/mongo_client.py", line 1929, in _cmd
return server.run_operation(
File "/usr/lib/python3.14/site-packages/pymongo/synchronous/helpers.py", line 47, in inner
return func(*args, **kwargs)
File "/usr/lib/python3.14/site-packages/pymongo/synchronous/server.py", line 208, in run_operation
reply = conn.receive_message(request_id)
File "/usr/lib/python3.14/site-packages/pymongo/synchronous/pool.py", line 454, in receive_message
self._raise_connection_failure(error)
File "/usr/lib/python3.14/site-packages/pymongo/synchronous/pool.py", line 451, in receive_message
return receive_message(self, request_id, self.max_message_size)
File "/usr/lib/python3.14/site-packages/pymongo/network_layer.py", line 759, in receive_message
length, _, response_to, op_code = _UNPACK_HEADER(receive_data(conn, 16, deadline))
File "/usr/lib/python3.14/site-packages/pymongo/network_layer.py", line 353, in receive_data
chunk_length = conn.conn.recv_into(mv[bytes_read:])
File "/usr/lib/python3.14/site-packages/pymongo/network_layer.py", line 469, in recv_into
return self.conn.recv_into(buffer)
KeyboardInterrupt:
А это журналы mongodb, соответствующие вызовам:

Код: Выделить всё

{"t":{"$date":"2026-01-21T17:26:40.218-05:00"},"s":"I",  "c":"NETWORK",  "id":22943,   "ctx":"listener","msg":"Connection accepted","attr":{"remote":"127.0.0.1:51862","uuid":{"uuid":{"$uuid":"eace0758-0084-403b-86a8-a1ae2626081c"}},"connectionId":1,"connectionCount":1}}
{"t":{"$date":"2026-01-21T17:26:40.219-05:00"},"s":"I",  "c":"NETWORK",  "id":51800,   "ctx":"conn1","msg":"client metadata","attr":{"remote":"127.0.0.1:51862","client":"conn1","negotiatedCompressors":[],"doc":{"driver":{"name":"PyMongo|c","version":"4.16.0"},"os":{"type":"Linux","name":"Linux","architecture":"x86_64","version":"6.18.5-arch1-1"},"platform":"CPython 3.14.2.final.0"}}}
{"t":{"$date":"2026-01-21T17:26:40.220-05:00"},"s":"I",  "c":"NETWORK",  "id":22943,   "ctx":"listener","msg":"Connection accepted","attr":{"remote":"127.0.0.1:51866","uuid":{"uuid":{"$uuid":"9bb0a301-7e0a-448a-a531-07f7dc346276"}},"connectionId":2,"connectionCount":2}}
{"t":{"$date":"2026-01-21T17:26:40.220-05:00"},"s":"I",  "c":"NETWORK",  "id":51800,   "ctx":"conn2","msg":"client metadata","attr":{"remote":"127.0.0.1:51866","client":"conn2","negotiatedCompressors":[],"doc":{"driver":{"name":"PyMongo|c","version":"4.16.0"},"os":{"type":"Linux","name":"Linux","architecture":"x86_64","version":"6.18.5-arch1-1"},"platform":"CPython 3.14.2.final.0"}}}
{"t":{"$date":"2026-01-21T17:26:48.121-05:00"},"s":"I",  "c":"NETWORK",  "id":22943,   "ctx":"listener","msg":"Connection accepted","attr":{"remote":"127.0.0.1:51870","uuid":{"uuid":{"$uuid":"4dda6292-865f-424a-b501-f9f9f1111f9a"}},"connectionId":3,"connectionCount":3}}
{"t":{"$date":"2026-01-21T17:26:48.121-05:00"},"s":"I",  "c":"NETWORK",  "id":51800,    "ctx":"conn3","msg":"client metadata","attr":{"remote":"127.0.0.1:51870","client":"conn3","negotiatedCompressors":[],"doc":{"driver":{"name":"PyMongo|c","version":"4.16.0"},"os":{"type":"Linux","name":"Linux","architecture":"x86_64","version":"6.18.5-arch1-1"},"platform":"CPython 3.14.2.final.0"}}}
{"t":{"$date":"2026-01-21T17:26:48.162-05:00"},"s":"I",  "c":"NETWORK",  "id":6788700, "ctx":"conn3","msg":"Received first command on ingress connection since session start or auth handshake","attr":{"elapsedMillis":41}}
[.....]
{"t":{"$date":"2026-01-21T17:32:46.550-05:00"},"s":"I",  "c":"-",        "id":20883,   "ctx":"conn1","msg":"Interrupted operation as its client disconnected","attr":{"opId":13349}}
{"t":{"$date":"2026-01-21T17:32:46.550-05:00"},"s":"I",  "c":"NETWORK",  "id":22944,   "ctx":"conn2","msg":"Connection ended","attr":{"remote":"127.0.0.1:51866","uuid":{"uuid":{"$uuid":"9bb0a301-7e0a-448a-a531-07f7dc346276"}},"connectionId":2,"connectionCount":2}}
{"t":{"$date":"2026-01-21T17:32:46.554-05:00"},"s":"I",  "c":"NETWORK",  "id":22944,   "ctx":"conn1","msg":"Connection ended","attr":{"remote":"127.0.0.1:51862","uuid":{"uuid":{"$uuid":"eace0758-0084-403b-86a8-a1ae2626081c"}},"connectionId":1,"connectionCount":1}}
{"t":{"$date":"2026-01-21T17:32:46.842-05:00"},"s":"I",  "c":"NETWORK",  "id":22944,   "ctx":"conn3","msg":"Connection ended","attr":{"remote":"127.0.0.1:51870","uuid":{"uuid":{"$uuid":"4dda6292-865f-424a-b501-f9f9f1111f9a"}},"connectionId":3,"connectionCount":0}}
Похоже, никаких ошибок нет, пропущенные журналы () примите следующую форму (их несколько, я не совсем уверен, что такое Wiredtiger, но, похоже, это не имеет никакого отношения к соединению):

Код: Выделить всё

{"t":{"$date":"2026-01-21T17:32:13.138-05:00"},"s":"I",  "c":"WTCHKPT",  "id":22430,   "ctx":"Checkpointer","msg":"WiredTiger message","attr":{"message":{"ts_sec":1769034733,"ts_usec":138452,"thread":"19402:0x7f969c0316c0","session_name":"WT_SESSION.checkpoint","category":"WT_VERB_CHECKPOINT_PROGRESS","category_id":7,"verbose_level":"DEBUG_1","verbose_level_id":1,"msg":"saving checkpoint snapshot min: 20, snapshot max: 20 snapshot count: 0, oldest timestamp: (0, 0) , meta checkpoint timestamp: (0, 0) base write gen: 452324"}}}
Я совершенно не понимаю, почему это происходит. Я только что попробовал ту же самую команду для той же коллекции в новой оболочке Python, и она работает нормально (не зависает, возвращает None). Я использую MongoDB версии 8.0.4. Я использую Arch Linux в личной системе; дайте мне знать, если какая-либо информация о моей конкретной системе будет полезна.
Я не пытался полностью переустанавливать mongodb, я бы предпочел не делать этого (особенно, если проблема не в этом), но если это неизбежно, тогда обязательно.

Подробнее здесь: https://stackoverflow.com/questions/798 ... ific-query
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»