private void ReassignClients(ServerReplica serverReplica) { if (serverReplica.NumClients == 0) { return; } List <Guid> copyOfClients = new List <Guid>(serverReplica.GetCopyOfClients()); foreach (Guid clientId in copyOfClients) { this.ReassignClientFromOriginalIndex(clientId); } }
private void ReassignClientFromOriginalIndex(Guid clientId) { ClientRecord cr = this.clientIdToClientRecordMap[clientId]; ServerReplica nextServerReplica = GetNextServerReplica(cr.CircularIndex); if (nextServerReplica.ReplicaId != cr.ServerReplica.ReplicaId) { cr.ServerReplica.RemoveClient(clientId); this.clientIdToClientRecordMap.Remove(clientId); nextServerReplica.AddClient(clientId); this.clientIdToClientRecordMap[clientId] = new ClientRecord(cr.CircularIndex, nextServerReplica);; } }
private void AddReplicasForServer(Server server) { List <ServerReplica> nextReplicas = new List <ServerReplica>(); for (int i = 0; i < this.numReplicasPerServer; i++) { ServerReplica newReplica = CreateReplicaForServer(server); server.AddReplica(newReplica); this.circularList[newReplica.CircularListIndex] = newReplica; nextReplicas.Add(GetNextServerReplica(newReplica.CircularListIndex)); } foreach (ServerReplica nextReplica in nextReplicas) { ReassignClients(nextReplica); } }
public int GetServerForClient(Guid clientId) { if (this.clientIdToClientRecordMap.ContainsKey(clientId)) { return(this.clientIdToClientRecordMap[clientId].ServerReplica.Server.ServerId); } int clientCircularIndex = GetCircularListIndexForGuid(clientId); int serverReplicaIndex = clientCircularIndex; while (circularList[serverReplicaIndex] == null) { serverReplicaIndex = GetNextCircularListIndex(serverReplicaIndex); } ServerReplica replica = circularList[serverReplicaIndex]; replica.AddClient(clientId); this.clientIdToClientRecordMap[clientId] = new ClientRecord(clientCircularIndex, replica); return(replica.Server.ServerId); }
public void AddReplica(ServerReplica serverReplica) { this.serverReplicas.Add(serverReplica); }
public ClientRecord(int circularIndex, ServerReplica serverReplica) { this.CircularIndex = circularIndex; this.ServerReplica = serverReplica; }