public void RegisterMetadata(string address)
        {
            MetadataServerInfo mi = new MetadataServerInfo(address);

            msi[mi.getID(base_port)] = mi;
            //    Console.WriteLine("MetadataServer at " + address + " has registered.");
        }
 private void getMetadataDatabase()
 {
     if (msi == null)
     {
         throw new System.ApplicationException("MetadataServer.getMetadataDatabase: there are no metadata servers registered in local server... Recover will not be possible!");
     }
     Console.WriteLine("Recovering metadata server number " + (this.metadataPort - this.base_port) + "...");
     for (int i = 0; i < msi.GetLength(0); i++)
     {
         MetadataServerInfo mi = msi[i];
         if (mi != null)
         {
             try
             {
                 metadataDB = ((MetadataMessageService)Activator.GetObject(typeof(MetadataMessageService), "tcp://localhost:" + mi.port + "/DataMessageService")).MetadataTransfer();
                 int msID = mi.getID(base_port);
                 Console.WriteLine("Metadata successfully tranfered from metadata server number " + msID + ".");
                 return;
             }
             catch (Exception e)
             {
                 onlineMS[mi.getID(base_port)] = false;
                 msi[i] = null;
             }
         }
     }
 }
        // Data server register from data server itself
        public void Register(string address)
        {
            DataServerInfo dsi = new DataServerInfo(address);

            Monitor.Enter(onlineDataServers);
            onlineDataServers.Add(dsi);
            Monitor.Exit(onlineDataServers);
            for (int i = 0; i < msi.GetLength(0); i++)
            {
                MetadataServerInfo mi = msi[i];
                if (mi != null && mi.port != this.metadataPort)
                {
                    try
                    {
                        MetadataMessageService metadataServer = (MetadataMessageService)Activator.GetObject(typeof(MetadataMessageService), "tcp://localhost:" + mi.port + "/MessageService");
                        metadataServer.RegisterDataReplica(dsi.address);
                    }
                    catch (RemotingException e)
                    {
                        onlineMS[mi.getID(base_port)] = false;
                        msi[i] = null;
                    }
                    catch (SocketException e)
                    {
                        onlineMS[mi.getID(base_port)] = false;
                        msi[i] = null;
                    }
                }
            }
            //  Console.WriteLine("DataServer at " + address + " has registered.");
        }
        /**
         * Consensus Client-Metadata Servers for active replication: send response to client and save metadata of created file
         **/
        public MetadataDTO createCommit(MetadataQuorumDto dataservers, string fileName, int nbDataServers, int readQuorum, int writeQuorum)
        {
            MetadataDTO metadataDTO;

            freezer.WaitOne();
            //next if-else is for load balancing the file creation task for selected metadata server from client
            if (dataservers.runCreate(metadataPort))
            {
                int ticket    = getTicket();
                int timestamp = dataservers.timestamps[metadataPort - base_port];
                Dictionary <string, string> dataServers = CreateFileOnServers(dataservers.Dataservers, fileName, nbDataServers);
                metadataDTO = new MetadataDTO(nbDataServers, readQuorum, writeQuorum, dataServers, ticket);
                MetadataContent metadata = new MetadataContent(metadataDTO, __OPEN__, timestamp);
                metadataDB.Add(fileName, metadata);
                for (int i = 0; i < msi.GetLength(0); i++)
                {
                    MetadataServerInfo mi = msi[i];
                    if (mi != null)
                    {
                        //indirect hearbeat for metadata being up or down
                        try
                        {
                            ((MetadataMessageService)Activator.GetObject(typeof(MetadataMessageService), "tcp://localhost:" + mi.port + "/DataMessageService")).SendMetadataDto(fileName, metadataDTO, dataservers);
                            int msID = mi.getID(base_port);
                            Console.WriteLine("Metadata successfully tranfered from metadata server number " + msID + ".");
                        }
                        catch (Exception e)
                        {
                            onlineMS[mi.getID(base_port)] = false;
                            msi[i] = null;
                        }
                    }
                }
                Console.WriteLine("File \"" + fileName + "\" created by client in elected metadata server.");

                return(metadataDTO);
            }
            else
            {
                throw new System.ApplicationException("createCommit: unexpected run in non elected metadata server");
            }
        }