示例#1
0
        private void BalanceEntries(MetadataEntry currentEntry, RequestBalancing balanceRequest)
        {
            Console.WriteLine("Ballance entries please");
            MetadataEntry newEntry = currentEntry.Clone();

            switch (balanceRequest.Writes)
            {
            case BalancingStatus.Excess:
                newEntry.NBDataServers++;
                newEntry.ReadQuorum++;
                break;

            case BalancingStatus.Few:
                break;

            case BalancingStatus.Ok:
                break;
            }

            switch (balanceRequest.Reads)
            {
            case BalancingStatus.Excess:
                newEntry.NBDataServers++;
                newEntry.WriteQuorum++;
                break;

            case BalancingStatus.Few:
                break;

            case  BalancingStatus.Ok:
                break;
            }


            int difference = newEntry.NBDataServers - currentEntry.NBDataServers;

            //Update values
            currentEntry.NBDataServers = newEntry.NBDataServers;
            currentEntry.ReadQuorum    = newEntry.ReadQuorum;
            currentEntry.WriteQuorum   = newEntry.WriteQuorum;

            if (difference < 0)
            {
                KeyValuePair <ServerId, String>[]       entriesList = currentEntry.ServerFileList.ToArray( );
                ConcurrentDictionary <ServerId, String> newlist     = new ConcurrentDictionary <ServerId, string>( );
                //Temos de alocar menos servidores
                for (int i = 0; i < currentEntry.NBDataServers; i++)
                {
                    //Reduce list
                    newlist.TryAdd(entriesList[i].Key, entriesList[i].Value);
                }
                //TODO Delete files on dataservers
            }
            if (difference > 0)
            {
                //Temos de alocar mais servidores
                CopyEntryBetweenDataservers(currentEntry);
            }
        }
示例#2
0
 public void Balancing(RequestBalancing entry)
 {
     if (LoadBalancer.Enabled)
     {
         //New balancing thread to wait for close
         new BalacingThreadDel(BalancingThread).BeginInvoke(entry, null, null);
         //Continue
     }
 }
示例#3
0
        private void BalancingThread(RequestBalancing newEntry)
        {
            //Mutex locker = new Mutex( false, newEntry.FileName );
            MetadataEntry currentEntry;

            EventWaitHandle monitor = new EventWaitHandle(true, EventResetMode.AutoReset, "padi" + MetadataServer.ThisMetaserverId + newEntry.FileName + "balancing");

            while (LoadBalancer.Enabled)
            {
                Console.WriteLine("Balacing operation start ");
                monitor.WaitOne( );
                Console.WriteLine("Balacing operation unlocked ");

                //locker.WaitOne( );
                Console.WriteLine("Ballancer Thread checking ");
                Boolean status = _metaTable.TryGetValue(newEntry.FileName, out currentEntry);
                if (status == false)
                {
                    //Ficheiro foi eliminado
                    //locker.ReleaseMutex( );
                    return;
                }
                if (!currentEntry.IsOpen( ))
                {
                    BalanceEntries(currentEntry, newEntry);
                    // locker.ReleaseMutex( );
                    return;
                }
                //FILE IS OPEN YET, IF YES, WAIT
                //locker.ReleaseMutex( );
                Console.WriteLine("Balacing operation locked: ");
                monitor.WaitOne( );
                Console.WriteLine("Balacing operation unlocked");
                monitor.Set( );
            }
        }
示例#4
0
        private static MetaserverResponse Balancing(MetaRequest request)
        {
            Console.WriteLine("New balancing message");
            if (!LoadBalancer.Enabled)
            {
                Console.WriteLine("Load balance not enable");
                return(new MetaserverResponse(ResponseStatus.Success, request, ThisMetaserverId));
            }
            Console.WriteLine("Load balance  enable");
            RequestBalancing   balancingRequest = (RequestBalancing)request;
            MetaserverResponse response;

            try
            {
                core.Balancing(balancingRequest);
                response = new MetaserverResponse(ResponseStatus.Success, request, ThisMetaserverId);
            }
            catch (Exception ex)
            {
                response           = new MetaserverResponse(ResponseStatus.Exception, request, ThisMetaserverId);
                response.Exception = new PadiException(PadiExceptiontType.Balancing, ex.Message);
            }
            return(response);
        }
示例#5
0
        private void BalancerEngine(Dictionary <DataserverInfo, ICollection <LocalFileStatistics> > globalState, long totalReadsSystem, long totalWritesSystem, long totalFiles, int numServers)
        {
            long avgTraffic = (totalReadsSystem + totalWritesSystem) / numServers;
            long avgWrite   = totalWritesSystem / numServers;
            long avgRead    = totalReadsSystem / numServers;

            //Reads+Writes
            Dictionary <String, RequestBalancing> entriesToChange = new Dictionary <string, RequestBalancing>( );

            foreach (KeyValuePair <DataserverInfo, ICollection <LocalFileStatistics> > serverStaticsPair in globalState)
            {
                // PROCESSAR O SERVIDOR COMO QUEIRAMOS
                foreach (LocalFileStatistics file in serverStaticsPair.Value)
                {
                    String           filename = file.filename;
                    RequestBalancing status   = new RequestBalancing(filename);

                    long writeDiff = file.writeTraffic - avgWrite;
                    if (writeDiff > avgWrite * TOLERANCE)
                    {
                        //Escritas em excesso
                        status.Writes = BalancingStatus.Excess;
                    }
                    if (writeDiff < (-avgWrite * TOLERANCE))
                    {
                        //Menos escritas que o normal
                        status.Writes = BalancingStatus.Few;
                    }
                    long readDiff = file.readTraffic - avgRead;
                    if (readDiff > avgRead * TOLERANCE)
                    {
                        //Leituras em excesso
                        status.Reads = BalancingStatus.Excess;
                    }
                    if (readDiff < (-avgRead * TOLERANCE))
                    {
                        //Menos Leituras que o normal
                        status.Reads = BalancingStatus.Few;
                    }
                    //Was updated?
                    if (status.Reads == BalancingStatus.Ok && status.Writes == BalancingStatus.Ok)
                    {
                        continue;
                    }

                    if (entriesToChange.ContainsKey(filename))
                    {
                        //TODO NORMALIZE (se ja existe, outros servidores tambem estao mal)
                    }
                    else
                    {
                        entriesToChange.Add(filename, status);
                    }
                }
            }

            foreach (RequestBalancing request in entriesToChange.Values)
            {
                connectionToMeta.SendRequestToMetaserver(request);
            }
        }