示例#1
0
        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);
            }
        }
示例#2
0
        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);;
            }
        }
示例#3
0
        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);
            }
        }
示例#4
0
        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);
        }
示例#5
0
 public void AddReplica(ServerReplica serverReplica)
 {
     this.serverReplicas.Add(serverReplica);
 }
示例#6
0
 public ClientRecord(int circularIndex, ServerReplica serverReplica)
 {
     this.CircularIndex = circularIndex;
     this.ServerReplica = serverReplica;
 }