firebase / firebase-admin-python

Firebase Admin Python SDK
https://firebase.google.com/docs/admin/setup
Apache License 2.0
987 stars 300 forks source link

Realtime Database Listener Crashes on Internet Disconnection #791

Open moussamoussa911 opened 2 weeks ago

moussamoussa911 commented 2 weeks ago

Description When the internet disconnects, the Firebase Realtime Database listener crashes, even with try and except statements. The application fails to recover and reconnect the listeners, resulting in the following error:

javascript Code kopieren google.api_core.exceptions.RetryError: Deadline of 120.0s exceeded while calling target function, last exception: HTTPSConnectionPool(host='storage.googleapis.com', port=443): Max retries exceeded with url: /storage/v1/b/villaduniatest.appspot.com/o?projection=noAcl&prefix=pdfstable%2F&prettyPrint=false (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x0000017C6BBE79D0>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed')) Reconnecting... Steps to Reproduce Start a Firebase Realtime Database listener in a Python application. Disconnect the internet. Observe the application crash with the above error. Expected Behavior The application should handle the disconnection gracefully, retrying the connection until the internet is restored, without crashing.

Actual Behavior The application crashes immediately upon internet disconnection, and does not recover.

Environment Firebase Admin SDK: Python Python Version: (your Python version) Operating System: (your OS version) Additional Context Here is the relevant portion of the code:

python Code kopieren import firebase_admin from firebase_admin import credentials, initialize_app, db from requests.exceptions import ConnectionError, Timeout import time

class DatabaseListener: def init(self, app_instance): self.app_instance = app_instance self.listeners = {}

def start_listener(self, path, callback):
    ref = db.reference(path, app=self.app_instance)
    while True:
        try:
            listener = ref.listen(callback)
            self.listeners[path] = listener
            print(f"Listener started for path: {path}")
            break
        except (ConnectionError, Timeout) as e:
            print(f"Connection error starting listener for {path}: {e}")
            time.sleep(5)  # Retry after a delay

def stop_listener(self, path):
    if path in self.listeners:
        listener = self.listeners[path]
        listener.close()
        del self.listeners[path]
        print(f"Listener stopped for path: {path}")

def stop_all_listeners(self):
    for path in list(self.listeners.keys()):
        self.stop_listener(path)
    print("All listeners stopped.")

Any guidance or solutions to ensure the listener can recover from network disconnections would be greatly appreciated

google-oss-bot commented 2 weeks ago

I couldn't figure out how to label this issue, so I've labeled it for a human to triage. Hang tight.