提交 e9b8d264 authored 作者: blu's avatar blu

refactor of delta config

上级 734956d4
...@@ -110,13 +110,14 @@ private: ...@@ -110,13 +110,14 @@ private:
json ret; json ret;
ret["code"] = 0; ret["code"] = 0;
ret["msg"] = "ok"; ret["msg"] = "ok";
string msg; string msg = "evcloudsvc may gracefully or strictly handled below issues for you. please correct them:\n";
bool hasError = false; bool hasError = false;
try{ try{
// construct sn2mods, mod2mgr // construct sn2mods, mod2mgr
if(v.count("ipcs") == 0||v["ipcs"].size() == 0 || v.count("sn") == 0 || v["sn"] != k) { if(v.count("ipcs") == 0||v["ipcs"].size() == 0 || v.count("sn") == 0 || v["sn"] != k) {
spdlog::warn("evcloudsvc edge cluster {} has no sn/ipcs: {}", k, v.dump()); msg += fmt::format("\t\tedge cluster {} has no sn/ipcs: {}.", k, v.dump());
ret["msg"] = msg;
} }
else { else {
json &ipcs = v["ipcs"]; json &ipcs = v["ipcs"];
...@@ -126,7 +127,8 @@ private: ...@@ -126,7 +127,8 @@ private:
break; break;
} }
if(ipc.count("modules") == 0||ipc["modules"].size() == 0) { if(ipc.count("modules") == 0||ipc["modules"].size() == 0) {
spdlog::warn("evcloudsvc edge cluster {} has no modules for ipc {}", k, ipcIdx); msg += fmt::format("\tedge cluster {} has no modules for ipc {}", k, ipcIdx);
ret["msg"] = msg;
} }
else { else {
json &modules = ipc["modules"]; json &modules = ipc["modules"];
...@@ -135,7 +137,8 @@ private: ...@@ -135,7 +137,8 @@ private:
break; break;
} }
if(ma.size() == 0) { if(ma.size() == 0) {
spdlog::warn("evcloudsvc /{}/ipcs/{}/modules/{} empty", k, ipcIdx, mn); msg += fmt::format("/{}/ipcs/{}/modules/{} empty", k, ipcIdx, mn);
ret["msg"] = msg;
continue; continue;
} }
int modIdx = 0; int modIdx = 0;
...@@ -144,7 +147,8 @@ private: ...@@ -144,7 +147,8 @@ private:
break; break;
} }
if(m.size() == 0) { if(m.size() == 0) {
spdlog::warn("evcloudsvc /{}/ipcs/{}/modules/{}/{} empty", k, ipcIdx, mn, modIdx); msg+= fmt::format("\t\t/{}/ipcs/{}/modules/{}/{} empty", k, ipcIdx, mn, modIdx);
ret["msg"] = msg;
continue; continue;
} }
if(m.count("sn") == 0 || m["sn"].size() == 0 || m.count("iid") == 0 || m["iid"].size() == 0||(mn == "evml" && (m.count("type") == 0||m["type"].size() == 0))) { if(m.count("sn") == 0 || m["sn"].size() == 0 || m.count("iid") == 0 || m["iid"].size() == 0||(mn == "evml" && (m.count("type") == 0||m["type"].size() == 0))) {
...@@ -192,9 +196,11 @@ private: ...@@ -192,9 +196,11 @@ private:
if(hasError) { if(hasError) {
ret["code"] = -1; ret["code"] = -1;
} }
if(ret["msg"] != "ok") {
spdlog::error(ret["msg"].get<string>());
}
return ret; return ret;
} }
json config(json &newConfig) json config(json &newConfig)
...@@ -222,10 +228,13 @@ private: ...@@ -222,10 +228,13 @@ private:
// for edge clusters, those are mgrs // for edge clusters, those are mgrs
for(auto &[k, v]: data.items()) { for(auto &[k, v]: data.items()) {
if(this->configMap.count(k) ^ this->peerData["config"].count(k)) { if(this->configMap.count(k) ^ this->peerData["config"].count(k)) {
spdlog::error("evcloudsvc inconsistent configuration for cluster {}", k); spdlog::warn("evcloudsvc inconsistent configuration for cluster {}", k);
// TODO: handle this situation gracefully. // TODO: handle this situation gracefully.
// rmeove both
this->configMap.erase(k);
this->peerData["config"].erase(k);
} }
else {
if(v.size() == 0) { if(v.size() == 0) {
// ignore // ignore
continue; continue;
...@@ -252,6 +261,9 @@ private: ...@@ -252,6 +261,9 @@ private:
msg = gids["msg"]; msg = gids["msg"];
break; break;
} }
if(gids["msg"] != "ok") {
ret["msg"] = gids["msg"];
}
for(auto &[a,b]: gids["data"].items()) { for(auto &[a,b]: gids["data"].items()) {
string devSn = strutils::split(a, ':')[0]; string devSn = strutils::split(a, ':')[0];
...@@ -264,8 +276,12 @@ private: ...@@ -264,8 +276,12 @@ private:
hasError = true; hasError = true;
msg = r["msg"]; msg = r["msg"];
break; break;
} }
}
if(r["msg"] != "ok") {
ret["msg"] = r["msg"];
}
// update configmap for cluster config // update configmap for cluster config
this->configMap[k] = k; this->configMap[k] = k;
...@@ -595,9 +611,17 @@ public: ...@@ -595,9 +611,17 @@ public:
ret["msg"] = string("evcloudsvc no existing valid configuration,abort patching for ") + _sn; ret["msg"] = string("evcloudsvc no existing valid configuration,abort patching for ") + _sn;
} }
else { else {
ret["data"] = ret["data"].patch(cfg); try{
spdlog::info("evcloudsvc merged {}: {} \n\t{}", _sn, cfg.dump(), ret["data"].dump()); json patched = ret["data"].patch(cfg);
ret = this->config(ret); ret["data"] = patched;
spdlog::info("evcloudsvc merged {}: {} \n\t{}", _sn, cfg.dump(), patched["data"].dump());
ret = this->config(ret);
}catch(exception &e){
string msg = fmt::format("evclousvc exception when patching {} with {}: {}", ret["data"].dump(), cfg.dump(), e.what());
spdlog::error(msg);
ret["code"] = 3;
ret["msg"] = msg;
}
} }
} }
} }
......
...@@ -158,11 +158,19 @@ json getModuleGidsFromCfg(string sn, json &data, string caller, int ipcIdx) ...@@ -158,11 +158,19 @@ json getModuleGidsFromCfg(string sn, json &data, string caller, int ipcIdx)
ret["code"] = 0; ret["code"] = 0;
ret["msg"] = "ok"; ret["msg"] = "ok";
ret["data"] = json(); ret["data"] = json();
string msg = "[warnning] we gracefully handled below errors, please correct them:\n";
try { try {
// lock_guard<mutex> lock(cacheLock); // lock_guard<mutex> lock(cacheLock);
string peerId; string peerId;
pid_t pid; pid_t pid;
for(auto &[k,v]:data.items()) { for(auto &[k,v]:data.items()) {
if(v.count("sn") == 0|| v["sn"].size() == 0 || v.count("ipcs") == 0 || v["ipcs"].size() == 0) {
msg += fmt::format( "\t\tcluster {} has no sn/ipcs field", v.dump());
spdlog::warn(msg);
ret["msg"] = msg;
continue;
}
if(ipcIdx == -1) { if(ipcIdx == -1) {
if(k == sn || sn.empty()) { if(k == sn || sn.empty()) {
peerId = v["sn"].get<string>() + ":evmgr:0"; peerId = v["sn"].get<string>() + ":evmgr:0";
...@@ -179,9 +187,22 @@ json getModuleGidsFromCfg(string sn, json &data, string caller, int ipcIdx) ...@@ -179,9 +187,22 @@ json getModuleGidsFromCfg(string sn, json &data, string caller, int ipcIdx)
continue; continue;
} }
if(ipc.count("modules") == 0|| ipc["modules"].size() == 0) {
msg += fmt::format( "\t\tipc {} has no modules field", ipc.dump());
spdlog::warn(msg);
ret["msg"] = msg;
continue;
}
json &modules = ipc["modules"]; json &modules = ipc["modules"];
for(auto &[mn, ml] : modules.items()) { for(auto &[mn, ml] : modules.items()) {
for(auto &m : ml) { for(auto &m : ml) {
if(m.count("sn") == 0 || m["sn"].size() == 0 || m.count("iid") == 0 || (mn=="evml" && (m.count("type") == 0 || m["type"].size() == 0))) {
msg += fmt::format( "\t\tmodule {} has no sn/iid/type(evml only) field", m.dump());
spdlog::warn(msg);
ret["msg"] = msg;
continue;
}
if(m["sn"] != sn && !sn.empty()) { if(m["sn"] != sn && !sn.empty()) {
continue; continue;
} }
...@@ -337,6 +358,9 @@ json getModulesOperFromConfDiff(json& oldConfig, json &newConfig, json &diff, st ...@@ -337,6 +358,9 @@ json getModulesOperFromConfDiff(json& oldConfig, json &newConfig, json &diff, st
hasError = true; hasError = true;
break; break;
}else{ }else{
if(jret["msg"] != "ok") {
ret["msg"] = jret["msg"];
}
for(auto &k: jret["data"]) { for(auto &k: jret["data"]) {
if(d["op"] == "remove"){ if(d["op"] == "remove"){
ret["data"][string(k)] = 0; ret["data"][string(k)] = 0;
...@@ -511,12 +535,15 @@ json getModulesOperFromConfDiff(json& oldConfig, json &newConfig, json &diff, st ...@@ -511,12 +535,15 @@ json getModulesOperFromConfDiff(json& oldConfig, json &newConfig, json &diff, st
} }
json jret = cfgutils::getModuleGidsFromCfg(sn, mgr, "getModulesOperFromConfDiff"); json jret = cfgutils::getModuleGidsFromCfg(sn, mgr, "getModulesOperFromConfDiff");
spdlog::info("jret: {}", jret.dump()); spdlog::info("getModulesOperFromConfDiff getModuleGidsFromCfg: {}", jret.dump());
if(jret["code"] != 0) { if(jret["code"] != 0) {
ret["msg"] = jret["msg"]; ret["msg"] = jret["msg"];
hasError = true; hasError = true;
break; break;
}else{ }else{
if(jret["msg"] != "ok") {
ret["msg"] = jret["msg"];
}
for(auto &k: jret["data"]) { for(auto &k: jret["data"]) {
if(d["op"] == "remove"){ if(d["op"] == "remove"){
ret["data"][string(k)] = 0; ret["data"][string(k)] = 0;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论