Free cookie consent management tool by TermsFeed Policy Generator

source: branches/thasling/DistributedGA/DistributedGA.ContactServer/ContactServiceImpl.cs @ 13888

Last change on this file since 13888 was 13888, checked in by thasling, 8 years ago

increased frequences of all timers, threads, etc... for testing purposes

File size: 3.9 KB
Line 
1using System;
2using System.Collections.Concurrent;
3using System.Collections.Generic;
4using System.IO;
5using System.Linq;
6using System.ServiceModel;
7using System.Timers;
8using DistributedGA.Core.Domain;
9
10namespace DistributedGA.ContactServer
11{
12
13    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
14    public class ContactServiceImpl : IContactService
15    {
16
17        private ConcurrentDictionary<PeerInfo, DateTime> allPeers = null;
18
19        private Timer timer = null;
20
21        private Object logLock = new Object();
22
23        public ContactServiceImpl()
24        {
25            allPeers = new ConcurrentDictionary<PeerInfo, DateTime>();
26
27            timer = new Timer(1000); //each hour
28            timer.Elapsed += CleanUpContactTable;
29            timer.Start();
30        }
31
32        public void RegisterPeer(PeerInfo source)
33        {
34            try
35            {
36                UpdateHeartbeat(source);
37            }
38            catch (Exception ex)
39            {
40                AddError("ContactServiceImpl.RegisterPeer", ex);
41            }
42        }
43
44        public List<PeerInfo> GetPeerList(PeerInfo source)
45        {
46            try
47            {
48                UpdateHeartbeat(source);
49                //only return peers of the same work group and not the sender itself
50                return allPeers.Keys.Where(x =>
51                {
52                    if (source.ProblemInstance.Equals(x.ProblemInstance) &&
53                        (!(x.IpAddress.Equals(source.IpAddress) && (x.Port.Equals(source.Port)))))
54                        return true;
55                    else
56                        return false;
57                }).ToList();
58            }
59            catch (Exception ex)
60            {
61                AddError("ContactServiceImpl.GetPeerList", ex);
62                return null;
63            }
64        }
65
66        public void MakeLog(PeerInfo source, string msg)
67        {
68            try
69            {
70                // TODO
71                lock (logLock)
72                {
73                    File.AppendAllText("Log.txt", string.Concat(source.IpAddress, ":", source.Port, ",", source.ProblemInstance, ",", msg, Environment.NewLine));
74                }
75            }
76            catch (Exception ex)
77            {
78                //Nothing to do because maybe called from adderror
79            }
80        }
81
82        public void UpdateHeartbeat(PeerInfo source)
83        {
84            try
85            {
86                Console.WriteLine("hb from {0}:{1}", source.IpAddress, source.Port);
87                DateTime now = DateTime.Now;
88                allPeers.AddOrUpdate(source, now, (k, v) => v = now);
89            }
90            catch (Exception ex)
91            {
92                AddError("ContactServiceImpl.UpdateHeartbeat", ex);
93            }
94        }
95
96        private void CleanUpContactTable(object sender, ElapsedEventArgs e)
97        {
98            DateTime deadline = DateTime.Now;
99            //collect items to remove
100            List<PeerInfo> itemsToDelete = new List<PeerInfo>();
101            foreach (PeerInfo pi in allPeers.Keys)
102            {
103                DateTime tmp;
104                if (allPeers.TryGetValue(pi, out tmp))
105                {
106                    //if (tmp.AddHours(1f) < deadline)
107                    if (tmp.AddMinutes(1) < deadline)  //TODO
108                    {
109                        //if (tmp < deadline.AddHours(1f)) {
110                        itemsToDelete.Add(pi);
111                    }
112                }
113            }
114            //remove items
115            foreach (PeerInfo pi in itemsToDelete)
116            {
117                DateTime tmp;
118                allPeers.TryRemove(pi, out tmp);
119            }
120        }
121
122        private void AddError(string source, Exception ex)
123        {
124            MakeLog(new PeerInfo() { ProblemInstance = "ContactServer  Error at " + source }, ex.Message);
125        }
126
127    }
128}
Note: See TracBrowser for help on using the repository browser.