예제 #1
0
    synchronized void update(Set<Node> seenNodes) {
      try {
        long start = System.currentTimeMillis();
        CommandResult res = _port.runCommand(_mongo.getDB("admin"), _isMasterCmd);
        _lastCheck = System.currentTimeMillis();
        _pingTime = _lastCheck - start;

        if (res == null) {
          _ok = false;
          return;
        }

        _ok = true;
        _isMaster = res.getBoolean("ismaster", false);
        _isSecondary = res.getBoolean("secondary", false);
        _lastPrimarySignal = res.getString("primary");

        if (res.containsField("hosts")) {
          for (Object x : (List) res.get("hosts")) {
            String host = x.toString();
            Node node = _addIfNotHere(host);
            if (node != null && seenNodes != null) seenNodes.add(node);
          }
        }

        if (res.containsField("passives")) {
          for (Object x : (List) res.get("passives")) {
            String host = x.toString();
            Node node = _addIfNotHere(host);
            if (node != null && seenNodes != null) seenNodes.add(node);
          }
        }

        if (_isMaster) {
          // max size was added in 1.8
          if (res.containsField("maxBsonObjectSize"))
            maxBsonObjectSize = ((Integer) res.get("maxBsonObjectSize")).intValue();
          else maxBsonObjectSize = Bytes.MAX_OBJECT_SIZE;
        }

      } catch (MongoException e) {
        Throwable root = e;
        if (e.getCause() != null) root = e.getCause();
        _logger.log(Level.FINE, "node down: " + _addr + " " + root);
        _ok = false;
      } catch (Exception e) {
        _logger.log(Level.SEVERE, "can't update node: " + _addr, e);
        _ok = false;
      }

      if (!_isMaster) return;

      try {
        DB db = _mongo.getDB("local");
        _port.checkAuth(db);
        DBObject config = _port.findOne(db, "system.replset", new BasicDBObject());
        if (config == null) {
          // probably a replica pair
          // TODO: add this in when pairs are really gone
          // _logger.log( Level.SEVERE , "no replset config!" );
        } else if (config.get("$err") != null
            && UNAUTHENTICATED_ERROR_CODE == (Integer) config.get("code")) {
          _logger.log(
              Level.WARNING,
              "Replica Set updater cannot get results, call authenticate on 'local' or 'admin' db");
        } else {

          String setName = config.get("_id").toString();
          if (_setName == null) {
            _setName = setName;
            _logger = Logger.getLogger(_rootLogger.getName() + "." + setName);
          } else if (!_setName.equals(setName)) {
            _logger.log(Level.SEVERE, "mis match set name old: " + _setName + " new: " + setName);
            return;
          }

          // TODO: look at members
        }
      } catch (MongoException e) {
        if (_setName != null) {
          // this probably means the master is busy, so going to ignore
        } else {
          _logger.log(Level.SEVERE, "can't get initial config from node: " + _addr, e);
        }
      } catch (Exception e) {
        _logger.log(Level.SEVERE, "unexpected error getting config from node: " + _addr, e);
      }
    }
    synchronized void update(Set<UpdatableNode> seenNodes) {
      try {
        long start = System.nanoTime();
        CommandResult res = _port.runCommand(_mongo.getDB("admin"), _isMasterCmd);
        long end = System.nanoTime();
        float newPingMS = (end - start) / 1000000F;
        if (!successfullyContacted) _pingTimeMS = newPingMS;
        else _pingTimeMS = _pingTimeMS + ((newPingMS - _pingTimeMS) / latencySmoothFactor);

        _rootLogger.log(
            Level.FINE,
            "Latency to " + _addr + " actual=" + newPingMS + " smoothed=" + _pingTimeMS);

        successfullyContacted = true;

        if (res == null) {
          throw new MongoInternalException("Invalid null value returned from isMaster");
        }

        if (!_ok) {
          _logger.get().log(Level.INFO, "Server seen up: " + _addr);
        }
        _ok = true;
        _isMaster = res.getBoolean("ismaster", false);
        _isSecondary = res.getBoolean("secondary", false);
        _lastPrimarySignal.set(res.getString("primary"));

        if (res.containsField("hosts")) {
          for (Object x : (List) res.get("hosts")) {
            String host = x.toString();
            UpdatableNode node = _addIfNotHere(host);
            if (node != null && seenNodes != null) seenNodes.add(node);
          }
        }

        if (res.containsField("passives")) {
          for (Object x : (List) res.get("passives")) {
            String host = x.toString();
            UpdatableNode node = _addIfNotHere(host);
            if (node != null && seenNodes != null) seenNodes.add(node);
          }
        }

        // Tags were added in 2.0 but may not be present
        if (res.containsField("tags")) {
          DBObject tags = (DBObject) res.get("tags");
          for (String key : tags.keySet()) {
            _tags.put(key, tags.get(key).toString());
          }
        }

        // max size was added in 1.8
        if (res.containsField("maxBsonObjectSize")) {
          _maxBsonObjectSize = (Integer) res.get("maxBsonObjectSize");
        } else {
          _maxBsonObjectSize = Bytes.MAX_OBJECT_SIZE;
        }

        if (res.containsField("setName")) {
          String setName = res.get("setName").toString();
          if (_setName.get() == null) {
            _setName.set(setName);
            _logger.set(Logger.getLogger(_rootLogger.getName() + "." + setName));
          } else if (!_setName.get().equals(setName)) {
            _logger
                .get()
                .log(Level.SEVERE, "mismatch set name old: " + _setName.get() + " new: " + setName);
          }
        }

      } catch (Exception e) {
        if (_ok) {
          _logger.get().log(Level.WARNING, "Server seen down: " + _addr, e);
        } else if (Math.random() < 0.1) {
          _logger.get().log(Level.WARNING, "Server seen down: " + _addr, e);
        }
        _ok = false;
      }
    }