docs: def reelect_app(self, request, app):
          """tries to connect to the same app on differnet host from dist-info"""
  
          # disconnect app explicitly to break possibly existing connection
          app.disconnect()
          endpoints_size = len(app.locator.endpoints)
  
          # try x times, where x is the number of different endpoints in app locator.
          for _ in xrange(0, endpoints_size + 1):
              # last chance to take app from common pool
              if len(app.locator.endpoints) == 0:
                  request.logger.info(
                      "giving up on connecting to dist-info hosts, falling back to common pool processing")
                  app = yield self.proxy.reelect_app(request, app)
                  raise gen.Return(app)
  
              try:
                  # always create new locator to prevent locking as we do connect with timeout
                  # however lock can be still held during TCP timeout
                  locator = Locator(endpoints=app.locator.endpoints)
                  request.logger.info("connecting to locator %s", locator.endpoints[0])
  
                  # first try to connect to locator only on remote host with timeout
                  yield gen.with_timeout(self.service_connect_timeout, locator.connect())
                  request.logger.debug("connected to locator %s for %s", locator.endpoints[0], app.name)
                  app = Service(app.name, locator=locator, timeout=RESOLVE_TIMEOUT)
  
                  # try to resolve and connect to application itself
                  yield gen.with_timeout(self.service_connect_timeout, app.connect())
                  request.logger.debug("connected to application %s via %s", app.name, app.endpoints)
              except gen.TimeoutError:
                  # on timeout try next endpoint first
                  request.logger.warning("timed out while connecting to application")
                  continue
              except ServiceError as err:
                  request.logger.warning("got error while resolving app - %s", err)
                  if err.category in LOCATORCATEGORY and err.code == ESERVICENOTAVAILABLE:
                      # if the application is down - also try next endpoint
                      continue
                  else:
                      raise err
              finally:
                  # drop first endpoint to start next connection from different endpoint
                  # we do this, as default logic of connection attempts in locator do not fit here
                  app.locator.endpoints = app.locator.endpoints[1:]
              # return connected app
              raise gen.Return(app)
          raise PluginApplicationError(42, 42, "could not connect to application")