code: def fetch_routing_table(self, address):
          
          new_routing_info = self.fetch_routing_info(address)
          if new_routing_info is None:
              return None
  
          # Parse routing info and count the number of each type of server
          new_routing_table = RoutingTable.parse_routing_info(new_routing_info)
          num_routers = len(new_routing_table.routers)
          num_readers = len(new_routing_table.readers)
          num_writers = len(new_routing_table.writers)
  
          # No writers are available. This likely indicates a temporary state,
          # such as leader switching, so we should not signal an error.
          # When no writers available, then we flag we are reading in absence of writer
          self.missing_writer = (num_writers == 0)
  
          # No routers
          if num_routers == 0:
              raise RoutingProtocolError("No routing servers returned from server %r" % (address,))
  
          # No readers
          if num_readers == 0:
              raise RoutingProtocolError("No read servers returned from server %r" % (address,))
  
          # At least one of each is fine, so return this table
          return new_routing_table
docs: Fetch a routing table from a given router address.
  
          :param address: router address
          :return: a new RoutingTable instance or None if the given router is
                   currently unable to provide routing information
          :raise ServiceUnavailable: if no writers are available
          :raise ProtocolError: if the routing information received is unusable