public void OnFileClosedRunning(MetadataEntry metaDados) { List <DataserverInfo> dataservers = _core.RequestDataserverList( ); Dictionary <DataserverInfo, ICollection <LocalFileStatistics> > globalState = new Dictionary <DataserverInfo, ICollection <LocalFileStatistics> >( ); Console.WriteLine("------>Statistics Begin"); long totalReadsSystem = 0; long totalWritesSystem = 0; long totalFiles = 0; foreach (DataserverInfo info in dataservers) { Console.WriteLine("ID: " + info.IdStruct.id + " | " + info.IdStruct.hostname + " | " + info.IdStruct.port + " | " + info.IdStruct.recoverPort); ICollection <LocalFileStatistics> statistics = GetServerStatistics(info.IdStruct.hostname, info.IdStruct.port); if (statistics != null) { DataserverInfo update = ProcessStatitics(info, statistics); totalReadsSystem += update.TotalRead; totalWritesSystem += update.TotalWrite; totalFiles += update.TotalFiles; globalState.Add(update, statistics); } } BalancerEngine(globalState, totalReadsSystem, totalWritesSystem, totalFiles, globalState.Count); Console.WriteLine("--------->Statistics End"); }
public DataserverInfo ProcessStatitics(DataserverInfo server, ICollection <LocalFileStatistics> statistics) { server.TotalRead = 0; server.TotalWrite = 0; server.TotalFiles = 0; foreach (LocalFileStatistics statics in statistics) { server.TotalRead += statics.readTraffic; server.TotalWrite += statics.writeTraffic; server.TotalFiles++; } return(server); }
////////////////////////////// Dataserver's interface /////////////// /// Alloc "serversToAlloc" dataservers to file in entry. private int AllocFileOnDataServer(MetadataEntry entry) { //A entry tem de estar trancada com o lock do filename lock ( _dataServerTable ) { int serversLeft = entry.NBDataServers - entry.ServerFileList.Count; if (serversLeft <= 0) { return(0); } List <DataserverInfo> toRemove = new List <DataserverInfo>( ); int countDataServers = _dataServerTable.Count; int iterator = countDataServers; while (iterator-- > 0) { int index = (_lastDataserver++) % countDataServers; DataserverInfo dataserverInfo = _dataServerTable[index]; if (entry.ServerFileList.ContainsKey(dataserverInfo.IdStruct)) { continue; } if (serversLeft == 0) { return(0); } // Generate Fresh LocalNames String localFilename = GenerateLocalFileName(entry.FileName, serversLeft); Boolean successFul = CreateEmptyFileOnDataServer(dataserverInfo.IdStruct.hostname, dataserverInfo.IdStruct.port, localFilename, entry.FileName); if (!successFul) { toRemove.Add(dataserverInfo); continue; } Console.WriteLine("Add local file"); _used.Add(localFilename); entry.ServerFileList.TryAdd(dataserverInfo.IdStruct, localFilename); serversLeft--; } foreach (DataserverInfo dataserverInfo in toRemove) { if (_dataServerTable.Remove(dataserverInfo)) { Console.WriteLine("Unvailable server removed: " + dataserverInfo.IdStruct.id); } } if (serversLeft > 0) { Console.WriteLine("Metadata cant alloc enough dataservers : " + entry.FileName + "missing: " + serversLeft); } return(serversLeft); } }
////////////////////////////// Dataserver's interface /////////////// /// Alloc "serversToAlloc" dataservers to file in entry. private void CopyEntryBetweenDataservers(MetadataEntry entry) { //A entry tem de estar trancada com o lock do filename lock ( _dataServerTable ) { int serversLeft = entry.NBDataServers - entry.ServerFileList.Count; if (serversLeft <= 0) { return; } List <DataserverInfo> toRemove = new List <DataserverInfo>( ); DataserverInfo src = null; String srcLocalfilename = ""; foreach (DataserverInfo dataserverInfo in _dataServerTable) { if (entry.ServerFileList.ContainsKey(dataserverInfo.IdStruct)) { src = dataserverInfo; entry.ServerFileList.TryGetValue(src.IdStruct, out srcLocalfilename); break; } } if (src == null) { Console.WriteLine("ALERT: Cant move, this file dont have any server. Aloloc emptyfiles"); AllocFileOnDataServer(entry); return; } foreach (DataserverInfo dataserverInfo in _dataServerTable) { if (entry.ServerFileList.ContainsKey(dataserverInfo.IdStruct)) { continue; } if (serversLeft == 0) { return; } // Generate Fresh LocalNames String destLocalFilename = GenerateLocalFileName(entry.FileName, serversLeft); Boolean successFul = CopyFileBetweenServer(src.IdStruct.hostname, src.IdStruct.port, dataserverInfo.IdStruct.hostname, dataserverInfo.IdStruct.port, srcLocalfilename, destLocalFilename); if (!successFul) { toRemove.Add(dataserverInfo); continue; } Console.WriteLine("Add local file"); _used.Add(destLocalFilename); entry.ServerFileList.TryAdd(dataserverInfo.IdStruct, destLocalFilename); serversLeft--; } foreach (DataserverInfo dataserverInfo in toRemove) { if (_dataServerTable.Remove(dataserverInfo)) { Console.WriteLine("Unvailable server removed: " + dataserverInfo.IdStruct.id); } } if (serversLeft > 0) { Console.WriteLine("Metadata cant alloc enough dataservers : " + entry.FileName + "missing: " + serversLeft); } } }