Я использовал pymongo для подключения к экземпляру mongodb. Это самостоятельный экземпляр mongodb, проблем с подключением нет, похоже, это программная проблема. Сервер mongodb нормально принимает команды, пока я не выполню вызов find_one для пустой коллекции (каждый раз одна и та же точка сценария). Я могу оставить скрипт открытым столько, сколько захочу (>10 минут), и он просто зависнет, без таймаутов или чего-то еще. Кажется, что сервер ничего не делает, и это приводит к тому, что клиент зависает на вызове Recv_into и в конечном итоге снова пытается установить соединение.
Примечание: я вызываю этот код с помощью функции, зарегистрированной в atexit, то есть до завершения программы, но в прошлом этот подход работал нормально, даже с пустыми коллекциями. Журналы Mongo сообщают, что соединение все еще активно, и только после того, как я принудительно завершу сценарий, появляются сообщения о закрытии соединения.
Вот код функции, которая зависает. Этот код поддерживает несколько коллекций, каждая ссылка находится в self.colref. У меня есть две коллекции, которые проходят без проблем, а когда я пытаюсь получить доступ к третьей (которая оказывается пустой), она зависает. Он делает это каждый раз.
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:
Я совершенно не понимаю, почему это происходит. Я только что попробовал ту же самую команду для той же коллекции в новой оболочке Python, и она работает нормально (не зависает, возвращает None). Я использую MongoDB версии 8.0.4. Я использую Arch Linux в личной системе; дайте мне знать, если какая-либо информация о моей конкретной системе будет полезна.
Я не пытался полностью переустанавливать mongodb, я бы предпочел не делать этого (особенно, если проблема не в этом), но если это неизбежно, тогда обязательно.
Я использовал pymongo для подключения к экземпляру mongodb. Это самостоятельный экземпляр mongodb, проблем с подключением нет, похоже, это программная проблема. Сервер mongodb нормально принимает команды, пока я не выполню вызов find_one для пустой коллекции (каждый раз одна и та же точка сценария). Я могу оставить скрипт открытым столько, сколько захочу (>10 минут), и он просто зависнет, без таймаутов или чего-то еще. Кажется, что сервер ничего не делает, и это приводит к тому, что клиент зависает на вызове Recv_into и в конечном итоге снова пытается установить соединение. Примечание: я вызываю этот код с помощью функции, зарегистрированной в atexit, то есть до завершения программы, но в прошлом этот подход работал нормально, даже с пустыми коллекциями. Журналы Mongo сообщают, что соединение все еще активно, и только после того, как я принудительно завершу сценарий, появляются сообщения о закрытии соединения. Вот код функции, которая зависает. Этот код поддерживает несколько коллекций, каждая ссылка находится в self.colref. У меня есть две коллекции, которые проходят без проблем, а когда я пытаюсь получить доступ к третьей (которая оказывается пустой), она зависает. Он делает это каждый раз. [code]# [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 [/code] Когда скрипт переходит в это состояние, мне приходится вручную прервать его, открывая следующую трассировку стека: [code] 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: [/code] А это журналы mongodb, соответствующие вызовам: [code]{"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}} [/code] Похоже, никаких ошибок нет, пропущенные журналы ([code][.....][/code]) примите следующую форму (их несколько, я не совсем уверен, что такое Wiredtiger, но, похоже, это не имеет никакого отношения к соединению): [code]{"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"}}} [/code] Я совершенно не понимаю, почему это происходит. Я только что попробовал ту же самую команду для той же коллекции в новой оболочке Python, и она работает нормально (не зависает, возвращает None). Я использую MongoDB версии 8.0.4. Я использую Arch Linux в личной системе; дайте мне знать, если какая-либо информация о моей конкретной системе будет полезна. Я не пытался полностью переустанавливать mongodb, я бы предпочел не делать этого (особенно, если проблема не в этом), но если это неизбежно, тогда обязательно.