예제 #1
0
파일: DataServer.cs 프로젝트: jfloff/PADI
        public void SendHeartbeat()
        {
            if (fail) return;
            if (freeze)
            {
                freezed.Enqueue(() => SendHeartbeat());
                return;
            }

            while (true)
            {
                try
                {
                    Heartbeat heartbeat = new Heartbeat(MyWeight(), new Dictionary<string, Weight>(weights));
                    //Console.WriteLine("HEARTBEAT TO " + master);
                    GarbageCollected toDelete = metadatas[master].Heartbeat(id, heartbeat);

                    foreach (string localFilename in toDelete)
                    {
                        Console.WriteLine("GARBAGE COLLECTOR = " + localFilename);
                        FileData ignoredFileData; files.TryRemove(localFilename, out ignoredFileData);
                        Weight ignoredStats; weights.TryRemove(localFilename, out ignoredStats);
                    }

                    return;
                }
                catch (ProcessFailedException)
                {
                    RandomMaster();
                }
                catch (NotTheMasterException e)
                {
                    master = e.NewMaster;
                }
            }
        }
예제 #2
0
파일: Metadata.cs 프로젝트: jfloff/PADI
        public GarbageCollected Heartbeat(string dataServerId, Heartbeat heartbeat)
        {
            if (fail) throw new ProcessFailedException(id);
            if (ImNoMaster()) throw new NotTheMasterException(id, master);

            //Console.WriteLine("HEARTBEAT FROM " + dataServerId);

            if (dataServers.Contains(dataServerId))
            {
                GarbageCollected toDelete = new GarbageCollected();

                // update data server weight
                dataServers.Touch(dataServerId, heartbeat.DataServerWeight);
                foreach (var entry in heartbeat.FileWeights)
                {
                    string localFilename = entry.Key;
                    Weight fileWeight = entry.Value;

                    // garbage collection
                    if (!dataServers.ContainsFile(dataServerId, localFilename))
                    {
                        toDelete.Add(localFilename);
                    }
                    else
                    {
                        // update file weights
                        dataServers.UpdateFileWeight(dataServerId, localFilename, fileWeight);
                    }
                }

                // pending files if this data server returned
                if (dataServers.Failed(dataServerId))
                {
                    CheckPending(dataServerId);
                }

                return toDelete;
            }

            return null;
        }