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"); } }