(LeaderIs r)
| 390 | } |
| 391 | |
| 392 | private long processLeaderIs(LeaderIs r) throws Exception { |
| 393 | ConnectorProxy leader = this.leader; |
| 394 | logger.info("=============== LEADERIS Old={} New={} From={}", |
| 395 | leader != null ? leader.getName() : null, r.Argument.getLeaderId(), r.getSender()); |
| 396 | |
| 397 | // 启用代理(多个raft共享连接)。 |
| 398 | if (null != proxyAgent) { |
| 399 | var newLeader = proxyAgent.getLeader(raftConfig.getNodes().get(r.Argument.getLeaderId())); |
| 400 | if (null != newLeader) { |
| 401 | if (setLeader(r, newLeader)) |
| 402 | resend(true); |
| 403 | |
| 404 | r.SendResultCode(0); |
| 405 | return Procedure.Success; |
| 406 | } |
| 407 | // else continue old process; |
| 408 | } |
| 409 | // else continue old process |
| 410 | |
| 411 | var node = client.getConfig().findConnector(r.Argument.getLeaderId()); |
| 412 | if (node == null) { |
| 413 | // 当前 Agent 没有 Leader 的配置,创建一个。 |
| 414 | // 由于 Agent 在新增 node 时也会得到新配置广播, |
| 415 | // 一般不会发生这种情况。 |
| 416 | var address = r.Argument.getLeaderId().split("_"); |
| 417 | if (address.length != 2) |
| 418 | return 0; |
| 419 | |
| 420 | OutObject<Connector> outNode = new OutObject<>(); |
| 421 | if (client.getConfig().tryGetOrAddConnector(address[0], Integer.parseInt(address[1]), true, outNode)) |
| 422 | outNode.value.start(); |
| 423 | } else { |
| 424 | //noinspection DataFlowIssue |
| 425 | if (!r.Argument.isLeader() && r.Argument.getLeaderId().equals(r.getSender().getConnector().getName())) { |
| 426 | // 【错误处理】用来观察。 |
| 427 | logger.warn("New Leader Is Not A Leader."); |
| 428 | // 发送者不是Leader,但它的发送的LeaderId又是自己,【尝试选择另外一个Node】。 |
| 429 | node = getRandomConnector(node); |
| 430 | } |
| 431 | } |
| 432 | |
| 433 | if (setLeader(r, new ConnectorProxy(node))) |
| 434 | resend(true); |
| 435 | |
| 436 | r.SendResultCode(0); |
| 437 | return Procedure.Success; |
| 438 | } |
| 439 | |
| 440 | private void resend() { |
| 441 | resend(false); |
nothing calls this directly
no test coverage detected