1

What is this error, I have no idea what to do... (PyMongo).

Traceback (most recent call last):
  File "C:/Users/aatif/Documents/Projects/Games with pygame/Space Invader/Game with DB.py", line 248, in <module>
    play()
  File "C:/Users/aatif/Documents/Projects/Games with pygame/Space Invader/Game with DB.py", line 23, in play
    c.insert_one({'Score': 3})
  File "C:\Users\aatif\PycharmProjects\pythonProject6\venv\lib\site-packages\pymongo\collection.py", line 698, in insert_one
    self._insert(document,
  File "C:\Users\aatif\PycharmProjects\pythonProject6\venv\lib\site-packages\pymongo\collection.py", line 613, in _insert
    return self._insert_one(
  File "C:\Users\aatif\PycharmProjects\pythonProject6\venv\lib\site-packages\pymongo\collection.py", line 602, in _insert_one
    self.__database.client._retryable_write(
  File "C:\Users\aatif\PycharmProjects\pythonProject6\venv\lib\site-packages\pymongo\mongo_client.py", line 1497, in _retryable_write
    with self._tmp_session(session) as s:
  File "C:\Users\aatif\AppData\Local\Programs\Python\Python38-32\lib\contextlib.py", line 113, in __enter__
    return next(self.gen)
  File "C:\Users\aatif\PycharmProjects\pythonProject6\venv\lib\site-packages\pymongo\mongo_client.py", line 1829, in _tmp_session
    s = self._ensure_session(session)
  File "C:\Users\aatif\PycharmProjects\pythonProject6\venv\lib\site-packages\pymongo\mongo_client.py", line 1816, in _ensure_session
    return self.__start_session(True, causal_consistency=False)
  File "C:\Users\aatif\PycharmProjects\pythonProject6\venv\lib\site-packages\pymongo\mongo_client.py", line 1766, in __start_session
    server_session = self._get_server_session()
  File "C:\Users\aatif\PycharmProjects\pythonProject6\venv\lib\site-packages\pymongo\mongo_client.py", line 1802, in _get_server_session
    return self._topology.get_server_session()
  File "C:\Users\aatif\PycharmProjects\pythonProject6\venv\lib\site-packages\pymongo\topology.py", line 490, in get_server_session
    self._select_servers_loop(
  File "C:\Users\aatif\PycharmProjects\pythonProject6\venv\lib\site-packages\pymongo\topology.py", line 215, in _select_servers_loop
    raise ServerSelectionTimeoutError(
pymongo.errors.ServerSelectionTimeoutError: connection closed,connection closed,connection closed, Timeout: 30s, Topology Description: <TopologyDescription id: 600999bd9735fa26e13f796f, topology_type: ReplicaSetNoPrimary, servers: [<ServerDescription ('firstproject-shard-00-00.wy4pd.mongodb.net', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('connection closed')>, <ServerDescription ('firstproject-shard-00-01.wy4pd.mongodb.net', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('connection closed')>, <ServerDescription ('firstproject-shard-00-02.wy4pd.mongodb.net', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('connection closed')>]>

Is my server offline or did I do something wrong setting up? Here is an example (very shortened but same problem occurs)

import pygame
from pymongo import MongoClient
# Eisa -> Username, LolLol65 -> Password
pygame.init()
win = pygame.display.set_mode((1000, 400))
run = True
cluster = MongoClient(
    'mongodb+srv://USER:PASSWORD@firstproject.wy4pd.mongodb.net/Calculator?retryWrites=true&w=majority')
db = cluster['Game']
c = db['Scores']
score = 0
while run:
    score += 1
    win.fill((0, 0, 0))
    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            run = False
        if e.type == pygame.KEYDOWN:
            c.insert_one({'Score': score})
    pygame.display.update()

(I added the code due to a comment asking me to. This code reproduces the same problem but i could also add the full code if it is better)

Wonder
  • 13
  • 4
  • Welcome to Stack Overflow! Please edit your question to show the [code you have so far](https://mattgemmell.com/what-have-you-tried/). You should include at least an outline (but preferably a [Minimal, Complete, and Verifiable example](https://stackoverflow.com/help/mcve)) of the code that you are having problems with, then we can try to help. You should also read [How to Ask](https://stackoverflow.com/help/how-to-ask). – import random Jan 21 '21 at 23:52
  • it's done. I added some code that reproduces the same error – Wonder Jan 22 '21 at 17:38
  • This [question](https://stackoverflow.com/questions/31030307/why-is-pymongo-3-giving-serverselectiontimeouterror) has some solutions to the `pymongo.errors.ServerSelectionTimeoutError` exception you're encountering that might help. – import random Jan 25 '21 at 01:55

1 Answers1

0

The specific exception you're encountering seems to be relating to your mongo connection. Are you able to connect to your database in MongDB Compass?

In any case, your current architecture will make your game loop dependent on the database writes, which could take significant time.

I've created an example that uses a separate thread to manage the MongoDB connection and communicates with the main thread using a queue. This example also includes the frame rate in the title bar, and limits the game loop to sixty FPS. If you add that to your existing script, you should see the frame rate drop whenever a database insert happens.

import time
import threading
import queue
import pygame
import pymongo

# Thread for Database storage
class MongoThread(threading.Thread):
    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue
        self.daemon = True

    def run(self):
        t_running = True
        client = pymongo.MongoClient("mongodb+srv://<insert-your-connection-string-here>")
        db = client.test
        c = db.scores
        while t_running:
            if self.queue.empty():
                time.sleep(0.1)
                pass
            else:
                data = self.queue.get()
                if data == "exit":
                    t_running = False
                else:
                    # do something with the queud data
                    c.insert_one(data)
                    print(c.count_documents({}))  # for debugging


WIDTH, HEIGHT = 1000, 400
FPS = 60

# create a queue to send commands from the main thread
q = queue.Queue()
# create and then start the thread
mongo_thread = MongoThread(q) 
mongo_thread.start()

pygame.init()
win = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()
run = True
score = 0
while run:
    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            run = False
            q.put("exit")
        if e.type == pygame.KEYDOWN:
            # c.insert_one({"Score": score})
            q.put({"Score": score})

    score += 1
    win.fill((0, 0, 0))
    pygame.display.update()
    pygame.display.set_caption(f"FPS: {clock.get_fps():.1f}")
    clock.tick(FPS)
pygame.quit()
import random
  • 3,054
  • 1
  • 17
  • 22