boolean _isMaster(DBObject res) { Object x = res.get("ismaster"); if (x == null) throw new IllegalStateException("ismaster shouldn't be null: " + res); if (x instanceof Boolean) return (Boolean) x; if (x instanceof Number) return ((Number) x).intValue() == 1; throw new IllegalArgumentException("invalid ismaster [" + x + "] : " + x.getClass().getName()); }
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); } }