public override void execute(MetaDataServer md)
        {
            FileMetadata metadata = md.FileMetadata[Filename];
            ServerObjectWrapper sourceDataServer = md.DataServers[SourceId];
            ServerObjectWrapper receiverDataServer = md.DataServers[ReceiverId];

            lock (Filename)
            {

                if (canRemove(md) && !metadata.IsOpen)
                {
                    metadata.FileServers.Remove(sourceDataServer);
                }

                md.registerMigratingFile(Filename, SourceId, ReceiverId);

                metadata.FileServers.Add(receiverDataServer);

                Console.WriteLine("#MDS: migrating file: " + Filename + "from [ DS " + sourceDataServer.Id + " ] to [ DS " + receiverDataServer.Id + " ]");
                string servers = "";
                foreach(ServerObjectWrapper server in metadata.FileServers){
                    servers += server.Id + "  ";
                }
                 Console.WriteLine("#MDS: file " + Filename + " is in servers: " + servers);
            }
        }
        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];
        }
        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();
        }
        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;
        }
        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();
        }
示例#8
0
        public void registerOperations(MetaDataServer md, List<MetaDataOperation> list)
        {
            foreach (MetaDataOperation operation in list)
            {

                registerOperation(md, operation);
            }
        }
示例#9
0
        public void registerOperation(MetaDataServer md, MetaDataOperation operation)
        {
            Console.WriteLine("registerOperation: " + operation + (operation == null ? "NULL" : "" + operation.OperationId));
            if (md == null || operation == null)
            {
                throw new ArgumentNullException("RegisterOperation - Expected a MDS and an operation [ MDS:" + md + ", Operation: " + operation + " ]");
            }

            int operationId;

            lock (typeof(MetaDataLog))
            {
                operationId = NextId++;
            }

            if (md.getReplicationHandler().IsMaster)
            {
                operation.OperationId = operationId;
            }
            if (!log.Contains(operation))
            {
                log.Add(operation);
            }

            md.getReplicationHandler().syncOperation(operation);
        }
示例#10
0
 public void init(MetaDataServer md)
 {
     log = new List<MetaDataOperation>();
     MetadataServer = md;
     NextId = 0;
     Status = 0;
 }
        private List<ServerObjectWrapper> getFirstServers(MetaDataServer md, int numDataServers)
        {
            List<ServerObjectWrapper> firstDataServers = new List<ServerObjectWrapper>();

             foreach (ServerObjectWrapper dataserverWrapper in md.DataServers.Values)
             {
                 if (firstDataServers.Count < numDataServers)
                 {
                     firstDataServers.Add(new ServerObjectWrapper(dataserverWrapper));
                 }
             }
             return firstDataServers;
        }
示例#12
0
 static void Main(string[] args)
 {
     Console.SetWindowSize(80, 15);
     if (args.Length < 2)
     {
         Console.WriteLine("Usage: <port> <metadataServerId>");
         Console.ReadLine();
     }
     else
     {
         MetaDataServer metadataServer = new MetaDataServer();
         metadataServer.initialize(Int32.Parse(args[0]), args[1]);
         Util.createDir(CommonTypes.Properties.Resources.TEMP_DIR);
         metadataServer.startConnection(metadataServer);
         metadataServer.fail();
         metadataServer.recover();
         Console.WriteLine("#MDS: Registered " + metadataServer.Id + " at " + metadataServer.Url);
         Console.ReadLine();
     }
 }
示例#13
0
        public void startConnection(MetaDataServer metadataServer)
        {
            BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider();
            provider.TypeFilterLevel = TypeFilterLevel.Full;
            IDictionary props = new Hashtable();
            props["port"] = Port;
            TcpChannel channel = new TcpChannel(props, null, provider);
            ChannelServices.RegisterChannel(channel, true);

            RemotingServices.Marshal(metadataServer, Id, typeof(MetaDataServer));
        }
示例#14
0
        public void getCheckpoint(String metadataServerId)
        {
            try
            {
                Console.WriteLine("#MDS: Recovering Checkpoint!");
                System.Xml.Serialization.XmlSerializer reader = new System.Xml.Serialization.XmlSerializer(typeof(MetaDataServer), new Type[]{ typeof(MetaDataCloseOperation), typeof(MetaDataCreateOperation), typeof(MetaDataDeleteOperation),
                        typeof(MetaDataRegisterServerOperation), typeof(MetaDataMigrateOperation), typeof(MetaDataOpenOperation)});

                string dirName = CommonTypes.Properties.Resources.TEMP_DIR + "\\" + metadataServerId + "\\checkpoint.xml";
                System.IO.StreamReader fileReader = new System.IO.StreamReader(dirName);

                MetaDataServer metadaServer = new MetaDataServer();
                metadaServer = (MetaDataServer)reader.Deserialize(fileReader);

                this.CheckpointCounter = metadaServer.CheckpointCounter;
                this.DataServers = metadaServer.DataServers;
                this.FileMetadata = metadaServer.FileMetadata;
                this.Log = metadaServer.Log;
                this.Port = metadaServer.Port;
                foreach (String filename in FileMetadata.Keys)
                {
                    addMetadataLock(filename, new ManualResetEvent(false));
                }
                fileReader.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine("#MDS: GetCheckpoint Failed: " + e.Message);
            }
        }
示例#15
0
 public abstract void execute(MetaDataServer md);