コード例 #1
0
        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");
        }
コード例 #2
0
 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);
 }
コード例 #3
0
        ////////////////////////////// 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);
            }
        }
コード例 #4
0
        ////////////////////////////// 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);
                }
            }
        }