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; } }