public WriteResult say(DB db, OutMessage m, DB.WriteConcern concern) throws MongoException { MyPort mp = _threadPort.get(); DBPort port = mp.get(true); port.checkAuth(db); try { port.say(m); if (concern == DB.WriteConcern.STRICT) { return _checkWriteError(mp, port); } else { mp.done(port); return new WriteResult(db, port); } } catch (IOException ioe) { mp.error(ioe); _error(ioe); if (concern == DB.WriteConcern.NONE) { CommandResult res = new CommandResult(); res.put("ok", false); res.put("$err", "NETWORK ERROR"); return new WriteResult(res); } throw new MongoException.Network("can't say something", ioe); } catch (MongoException me) { throw me; } catch (RuntimeException re) { mp.error(re); throw re; } }
WriteResult _checkWriteError(MyPort mp, DBPort port) throws MongoException { CommandResult e = _mongo.getDB("admin").getLastError(); mp.done(port); Object foo = e.get("err"); if (foo == null) return new WriteResult(e); int code = -1; if (e.get("code") instanceof Number) code = ((Number) e.get("code")).intValue(); String s = foo.toString(); if (code == 11000 || code == 11001 || s.startsWith("E11000") || s.startsWith("E11001")) throw new MongoException.DuplicateKey(code, s); throw new MongoException(code, s); }
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); } }