- Timestamp:
- 06/17/16 12:03:25 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/thasling/DistributedGA/DistributedGA.ContactServer/ContactServiceImpl.cs
r13888 r13905 8 8 using DistributedGA.Core.Domain; 9 9 10 namespace DistributedGA.ContactServer 11 { 10 namespace DistributedGA.ContactServer { 12 11 13 [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 14 public class ContactServiceImpl : IContactService 15 { 12 [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 13 public class ContactServiceImpl : IContactService { 16 14 17 15 private ConcurrentDictionary<PeerInfo, DateTime> allPeers = null; 18 16 19 17 private Timer timer = null; 20 18 21 19 private Object logLock = new Object(); 22 20 23 public ContactServiceImpl() 24 { 25 allPeers = new ConcurrentDictionary<PeerInfo, DateTime>(); 21 public ContactServiceImpl() { 22 allPeers = new ConcurrentDictionary<PeerInfo, DateTime>(); 26 23 27 timer = new Timer(1000); //each hour 28 timer.Elapsed += CleanUpContactTable; 29 timer.Start(); 24 timer = new Timer(1000); //each hour 25 timer.Elapsed += CleanUpContactTable; 26 timer.Start(); 27 } 28 29 public void RegisterPeer(PeerInfo source) { 30 try { 31 UpdateHeartbeat(source); 32 } catch (Exception ex) { 33 AddError("ContactServiceImpl.RegisterPeer", ex); 34 } 35 } 36 37 public List<PeerInfo> GetPeerList(PeerInfo source) { 38 try { 39 UpdateHeartbeat(source); 40 //only return peers of the same work group and not the sender itself 41 return allPeers.Keys.Where(x => { 42 if (source.ProblemInstance.Equals(x.ProblemInstance) && 43 (!(x.IpAddress.Equals(source.IpAddress) && (x.Port.Equals(source.Port))))) 44 return true; 45 else 46 return false; 47 }).ToList(); 48 } catch (Exception ex) { 49 AddError("ContactServiceImpl.GetPeerList", ex); 50 return null; 51 } 52 } 53 54 public void MakeLog(PeerInfo source, string msg) { 55 try { 56 // TODO 57 lock (logLock) { 58 File.AppendAllText("Log.txt", string.Concat(source.IpAddress, ":", source.Port, ",", source.ProblemInstance, ",", msg, Environment.NewLine)); 30 59 } 60 } catch (Exception ex) { 61 //Nothing to do because maybe called from adderror 62 } 63 } 31 64 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 } 65 public void UpdateHeartbeat(PeerInfo source) { 66 try { 67 Console.WriteLine("hb from {0}:{1}", source.IpAddress, source.Port); 68 DateTime now = DateTime.Now; 69 allPeers.AddOrUpdate(source, now, (k, v) => v = now); 70 } catch (Exception ex) { 71 AddError("ContactServiceImpl.UpdateHeartbeat", ex); 72 } 73 } 74 75 private void CleanUpContactTable(object sender, ElapsedEventArgs e) { 76 DateTime deadline = DateTime.Now; 77 //collect items to remove 78 List<PeerInfo> itemsToDelete = new List<PeerInfo>(); 79 foreach (PeerInfo pi in allPeers.Keys) { 80 DateTime tmp; 81 if (allPeers.TryGetValue(pi, out tmp)) { 82 //if (tmp.AddHours(1f) < deadline) 83 if (tmp.AddMinutes(1) < deadline) //TODO 84 { 85 //if (tmp < deadline.AddHours(1f)) { 86 itemsToDelete.Add(pi); 87 } 42 88 } 89 } 90 //remove items 91 foreach (PeerInfo pi in itemsToDelete) { 92 DateTime tmp; 93 allPeers.TryRemove(pi, out tmp); 94 } 95 } 43 96 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 } 97 private void AddError(string source, Exception ex) { 98 MakeLog(new PeerInfo() { ProblemInstance = "ContactServer Error at " + source }, ex.Message); 99 } 65 100 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 } 101 } 128 102 }
Note: See TracChangeset
for help on using the changeset viewer.