]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: Drop invalid RGW client instances, improve logging 38584/head
authorVolker Theile <vtheile@suse.com>
Tue, 15 Dec 2020 09:40:48 +0000 (10:40 +0100)
committerVolker Theile <vtheile@suse.com>
Mon, 4 Jan 2021 10:21:36 +0000 (11:21 +0100)
* Log RGW settings for easier problem tracking.
* Drop RGW client instances that do not exist anymore. This happens when a RGW service is removed via the orchestrator. The Dashboard tries to access the RGW client using the previous settings which leads to an error which might be confusing. Without dropping the error message 'RGW REST API failed request ...' is displayed instead of the correct one 'No RGW found'. Dropping the RGW client instance will produce correct error messages the next time the backend tries to establish a new connection.

Fixes: https://tracker.ceph.com/issues/48586
Signed-off-by: Volker Theile <vtheile@suse.com>
(cherry picked from commit 495ff0a2cf1713312deba3b61da6d213019fc920)

Conflicts:
  Need to remove type hints.
  src/pybind/mgr/dashboard/services/rgw_client.py

src/pybind/mgr/dashboard/controllers/rgw.py
src/pybind/mgr/dashboard/services/rgw_client.py

index cc2e25c42adedd58d26d5cf592fdba1504cdb6d2..3434cfe791627c7e8312d741835e0cdcc5bdb5e4 100644 (file)
@@ -26,7 +26,19 @@ class Rgw(BaseController):
         try:
             instance = RgwClient.admin_instance()
             # Check if the service is online.
-            if not instance.is_service_online():
+            try:
+                is_online = instance.is_service_online()
+            except RequestException as e:
+                # Drop this instance because the RGW client seems not to
+                # exist anymore (maybe removed via orchestrator). Removing
+                # the instance from the cache will result in the correct
+                # error message next time when the backend tries to
+                # establish a new connection (-> 'No RGW found' instead
+                # of 'RGW REST API failed request ...').
+                # Note, this only applies to auto-detected RGW clients.
+                RgwClient.drop_instance(instance.userid)
+                raise e
+            if not is_online:
                 msg = 'Failed to connect to the Object Gateway\'s Admin Ops API.'
                 raise RequestException(msg)
             # Ensure the API user ID is known by the RGW.
index 36a942784bc163d52747ae28bbd0b8fca542a086..eef11794091b358f492a392bd460f5f8c9cbb2e8 100644 (file)
@@ -76,6 +76,9 @@ def _determine_rgw_addr():
     addr = _parse_addr(daemon['addr'])
     port, ssl = _parse_frontend_config(daemon['metadata']['frontend_config#0'])
 
+    logger.info('Auto-detected RGW configuration: addr=%s, port=%d, ssl=%s',
+                addr, port, str(ssl))
+
     return addr, port, ssl
 
 
@@ -240,7 +243,7 @@ class RgwClient(RestClient):
         # Discard all cached instances if any rgw setting has changed
         if RgwClient._rgw_settings_snapshot != RgwClient._rgw_settings():
             RgwClient._rgw_settings_snapshot = RgwClient._rgw_settings()
-            RgwClient._user_instances.clear()
+            RgwClient.drop_instance()
 
         if not RgwClient._user_instances:
             RgwClient._load_settings()
@@ -267,6 +270,16 @@ class RgwClient(RestClient):
     def admin_instance():
         return RgwClient.instance(RgwClient._SYSTEM_USERID)
 
+    @staticmethod
+    def drop_instance(userid=None):
+        """
+        Drop a cached instance by name or all.
+        """
+        if userid:
+            RgwClient._user_instances.pop(userid, None)
+        else:
+            RgwClient._user_instances.clear()
+
     def _reset_login(self):
         if self.userid != RgwClient._SYSTEM_USERID:
             logger.info("Fetching new keys for user: %s", self.userid)