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];
        }
        private Boolean canRemove(MetaDataServer md)
        {
            FileMetadata metadata = md.FileMetadata[Filename];

            int numActualServers = metadata.FileServers.Count;

            int numMigratingServers = md.getMigratingFiles()[Filename].Count;
            int quorumMax = Math.Max(metadata.WriteQuorum, metadata.ReadQuorum);
            int maxMigrating = metadata.FileServers.Count - quorumMax - numMigratingServers;

            Console.WriteLine("canMigrate [ numActualServers: " + numActualServers + ", numMigratingServers: " + numMigratingServers + ", quorumMax: " + quorumMax + ", maxMigrating: " + maxMigrating + "] - can? " + (maxMigrating > 0));
            return maxMigrating > 0;
        }