()
| 1166 | } |
| 1167 | |
| 1168 | private void loadTimer() throws Exception { |
| 1169 | var serverId = zeze.getConfig().getServerId(); |
| 1170 | var outRoot = new BNodeRoot(); |
| 1171 | var r = Task.call(zeze.newProcedure(() -> { |
| 1172 | var root = _tNodeRoot.getOrAdd(serverId); |
| 1173 | // 本地每次load都递增。用来处理和接管的并发。 |
| 1174 | root.setLoadSerialNo(root.getLoadSerialNo() + 1); |
| 1175 | outRoot.assign(root); |
| 1176 | return 0; |
| 1177 | }, "Timer.loadTimerLocal")); |
| 1178 | if (r == Procedure.Success) { |
| 1179 | var offlineNotify = new BOfflineNotify(); |
| 1180 | offlineNotify.serverId = serverId; |
| 1181 | offlineNotify.notifyId = "Zeze.Component.Timer.OfflineNotify"; |
| 1182 | offlineNotify.notifySerialId = outRoot.getLoadSerialNo(); |
| 1183 | zeze.getServiceManager().offlineRegister(offlineNotify, |
| 1184 | notify -> spliceLoadTimer(notify.serverId, notify.notifySerialId)); |
| 1185 | loadTimer(outRoot.getHeadNodeId(), outRoot.getHeadNodeId(), serverId); // last也填头节点是因为链表是循环的 |
| 1186 | } else |
| 1187 | logger.error("loadTimer failed: r={}", r); |
| 1188 | |
| 1189 | var agent = zeze.getServiceManager(); |
| 1190 | if (agent instanceof Agent) { // 暂时只支持非Raft的ServiceManager |
| 1191 | var p = new AnnounceServers(); |
| 1192 | p.Argument.notifyId = "Zeze.Component.Timer.NotifyOffline"; |
| 1193 | p.Argument.serverId = serverId; |
| 1194 | _tNodeRoot.walk((k, v) -> { |
| 1195 | if (v.getHeadNodeId() != 0) { |
| 1196 | p.Argument.watchServerIds.add(k); |
| 1197 | p.Argument.watchSerialIds.add(v.getLoadSerialNo()); |
| 1198 | } |
| 1199 | return true; |
| 1200 | }); |
| 1201 | ((Agent)agent).offlineRegister(p.Argument.notifyId, |
| 1202 | notify -> spliceLoadTimer(notify.serverId, notify.notifySerialId)); |
| 1203 | agent.waitReady(); |
| 1204 | p.SendAndWaitCheckResultCode(((Agent)agent).getClient().getSocket()); |
| 1205 | } |
| 1206 | } |
| 1207 | |
| 1208 | /** |
| 1209 | * 收到接管通知的服务器调用这个函数进行接管处理。 |
no test coverage detected