When choosing the best RS, if some of them have later changes (from the local DS) than the local DS has, retain only those that have the latest available changes.
This also fixes the ComputeBestServerTest#test3ServersUp unit test that sometimes may fail.
| | |
| | | * Find replication servers who are up to date (or more up to date than us, |
| | | * if for instance we failed and restarted, having sent some changes to the |
| | | * RS but without having time to store our own state) regarding our own |
| | | * server id. If some servers more up to date, prefer this list. |
| | | * server id. If some servers more up to date, prefer this list but take |
| | | * only the latest change number. |
| | | */ |
| | | ChangeNumber latestRsChangeNumber = null; |
| | | for (Integer rsId : bestServers.keySet()) |
| | | { |
| | | ReplicationServerInfo replicationServerInfo = bestServers.get(rsId); |
| | |
| | | { |
| | | // This replication server is even more up to date than the local |
| | | // server |
| | | moreUpToDateServers.put(rsId, replicationServerInfo); |
| | | if (latestRsChangeNumber == null) |
| | | { |
| | | // Initialize the latest change number |
| | | latestRsChangeNumber = rsChangeNumber; |
| | | } |
| | | if (rsChangeNumber.newerOrEquals(latestRsChangeNumber)) |
| | | { |
| | | if (rsChangeNumber.equals(latestRsChangeNumber)) |
| | | { |
| | | moreUpToDateServers.put(rsId, replicationServerInfo); |
| | | } else |
| | | { |
| | | // This RS is even more up to date, clear the list and store this |
| | | // new RS |
| | | moreUpToDateServers.clear(); |
| | | moreUpToDateServers.put(rsId, replicationServerInfo); |
| | | latestRsChangeNumber = rsChangeNumber; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | cn = new ChangeNumber(4L, 0, myId3); |
| | | aState.update(cn); |
| | | replServerStartMsg = |
| | | new ReplServerStartMsg(12, WINNER, null, 0, aState, (short)0, 0L, |
| | | new ReplServerStartMsg(12, LOOSER2, null, 0, aState, (short)0, 0L, |
| | | false, (byte)1, 0); |
| | | rsInfos.put(12, ReplicationServerInfo.newInstance(replServerStartMsg)); |
| | | |
| | |
| | | cn = new ChangeNumber(1L, 0, myId3); |
| | | aState.update(cn); |
| | | replServerStartMsg = |
| | | new ReplServerStartMsg(13, LOOSER2, null, 0, aState, (short)0, 0L, |
| | | new ReplServerStartMsg(13, WINNER, null, 0, aState, (short)0, 0L, |
| | | false, (byte)1, 0); |
| | | rsInfos.put(13, ReplicationServerInfo.newInstance(replServerStartMsg)); |
| | | |