public override void execute(MetaDataServer md)
        {
            if (!md.FileMetadata.ContainsKey(Filename))
            {
                throw new OpenFileException("#MDS.open - File " + Filename + " does not exist");
            }
            else if (md.FileMetadata[Filename].Clients.Contains(ClientID))
            {
                Console.WriteLine("#MDS.open - File " + Filename + " is already open for user " + ClientID);
                Result = md.FileMetadata[Filename];
                return;
            }
            else
            {
                Console.WriteLine("#MDS: opening file: " + Filename);
                lock (Filename)
                {
                    md.FileMetadata[Filename].IsOpen = true;
                    md.FileMetadata[Filename].Clients.Add(ClientID);

                    md.makeCheckpoint();

                    Result = md.FileMetadata[Filename];
                }
            }
        }
        public override void execute(MetaDataServer md)
        {
            if (!md.FileMetadata.ContainsKey(Filename))
            {
            throw new CommonTypes.Exceptions.DeleteFileException("#MDS.delete - File " + Filename + " does not exist");
            }

            md.FileMetadata.Remove(Filename);
            Console.WriteLine("#MDS: Deleted file: " + Filename);
            md.makeCheckpoint();
        }
        public override void execute(MetaDataServer md)
        {
            Console.WriteLine("#MDS: Registering DS " + DataServerId);
            if ( md.DataServers.ContainsKey(DataServerId) )
            {
                md.DataServers.Remove(DataServerId);
            }
            ServerObjectWrapper remoteObjectWrapper = new ServerObjectWrapper(DataServerPort, DataServerId, DataServerHost);
            md.DataServers.Add(DataServerId, remoteObjectWrapper);
            md.addServerToUnbalancedFiles(DataServerId);

            HeartbeatMessage heartbeat = new HeartbeatMessage(DataServerId, 0 , 0, 0, 0, new Dictionary<string,FileAccessCounter>());
            md.receiveHeartbeat(heartbeat);
            md.makeCheckpoint();
        }
        public override void execute(MetaDataServer md)
        {
            if (!md.FileMetadata.ContainsKey(Filename))
            {
               // throw new CloseFileException("#MDS.close - File " + Filename + " does not exist");
                return;
            }

            if (md.FileMetadata.ContainsKey(Filename) && !md.FileMetadata[Filename].Clients.Contains(ClientID))
            {
                //throw new CloseFileException("#MDS.close - File " + filename + " is not open for user " + clientID);
                Console.WriteLine("#MDS.close - File " + Filename + " is already closed for user " + ClientID);
                return;
            }

            Console.WriteLine("#MDS: closing file " + Filename + "...");
            md.FileMetadata[Filename].Clients.Remove(ClientID);
            if (md.FileMetadata[Filename].Clients.Count == 0)
            {
                md.FileMetadata[Filename].IsOpen = false;
            }
            md.makeCheckpoint();
        }
        public override void execute(MetaDataServer md)
        {
            if ((WriteQuorum > NumberOfDataServers) || (ReadQuorum > NumberOfDataServers))
            {
                throw new CreateFileException("Invalid quorums values in create " + Filename);
            }

            if (md.FileMetadata.ContainsKey(Filename))
            {
                throw new CreateFileException("#MDS.create - The file " + Filename + " already exists ");
            }

               // List<ServerObjectWrapper> newFileDataServers = getFirstServers(md, NumberOfDataServers);
            List<ServerObjectWrapper> newFileDataServers = md.getSortedServers(NumberOfDataServers);

            FileMetadata newFileMetadata = new FileMetadata(Filename, NumberOfDataServers, ReadQuorum, WriteQuorum, newFileDataServers);

            md.FileMetadata.Add(Filename, newFileMetadata);
            md.addMetadataLock(Filename, new ManualResetEvent(false));
            md.getMigratingFiles().Add(Filename, new List<Tuple<string, string>>());
            Console.WriteLine("#MDS: Created " + Filename);
            md.makeCheckpoint();

            Result = md.FileMetadata[Filename];
        }