diff --git a/lualib/mongo.lua b/lualib/mongo.lua index 877982f4..7393ebbd 100644 --- a/lualib/mongo.lua +++ b/lualib/mongo.lua @@ -105,12 +105,38 @@ local function mongo_auth(mongoc) mongoc.__sock:changebackup(backup) end if rs_data.ismaster then + if rawget(mongoc, "__pickserver") then + rawset(mongoc, "__pickserver", nil) + end return else - local host, port = __parse_addr(rs_data.primary) - mongoc.host = host - mongoc.port = port - mongoc.__sock:changehost(host, port) + if rs_data.primary then + local host, port = __parse_addr(rs_data.primary) + mongoc.host = host + mongoc.port = port + mongoc.__sock:changehost(host, port) + else + skynet.error("WARNING: NO PRIMARY RETURN " .. rs_data.me) + -- determine the primary db using hosts + local pickserver = {} + if rawget(mongoc, "__pickserver") == nil then + for _, v in ipairs(rs_data.hosts) do + if v ~= rs_data.me then + table.insert(pickserver, v) + end + rawset(mongoc, "__pickserver", pickserver) + end + end + if #mongoc.__pickserver <= 0 then + error("CAN NOT DETERMINE THE PRIMARY DB") + end + skynet.error("INFO: TRY TO CONNECT " .. mongoc.__pickserver[1]) + local host, port = __parse_addr(mongoc.__pickserver[1]) + table.remove(mongoc.__pickserver, 1) + mongoc.host = host + mongoc.port = port + mongoc.__sock:changehost(host, port) + end end end end