Free cookie consent management tool by TermsFeed Policy Generator

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

Last change on this file since 13808 was 13557, checked in by thasling, 9 years ago

Implemented P2PTask-class
Changed communication protocoll http --> net.tcp
Logger is now Parameter of P2PTask

File size: 3.0 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  [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
13  public class ContactServiceImpl : IContactService {
14
15    private ConcurrentDictionary<PeerInfo, DateTime> allPeers = null;
16
17    private Timer timer = null;
18
19    private Object logLock = new Object();
20
21    public ContactServiceImpl() {
22      allPeers = new ConcurrentDictionary<PeerInfo, DateTime>();
23
24      timer = new Timer(60 * 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));
59        }
60      } catch (Exception ex) {
61        //Nothing to do because maybe called from adderror
62      }
63    }
64
65    private void UpdateHeartbeat(PeerInfo source) {
66      Console.WriteLine("hb from {0}:{1}", source.IpAddress, source.Port);
67      DateTime now = DateTime.Now;
68      allPeers.AddOrUpdate(source, now, (k, v) => v = now);
69    }
70
71    private void CleanUpContactTable(object sender, ElapsedEventArgs e) {
72      DateTime deadline = DateTime.Now;
73      //collect items to remove
74      List<PeerInfo> itemsToDelete = new List<PeerInfo>();
75      foreach (PeerInfo pi in allPeers.Keys) {
76        DateTime tmp;
77        if (allPeers.TryGetValue(pi, out tmp)) {
78          if (tmp.AddHours(1f) < deadline) {
79            //if (tmp < deadline.AddHours(1f)) {
80            itemsToDelete.Add(pi);
81          }
82        }
83      }
84      //remove items
85      foreach (PeerInfo pi in itemsToDelete) {
86        DateTime tmp;
87        allPeers.TryRemove(pi, out tmp);
88      }
89    }
90
91    private void AddError(string source, Exception ex) {
92      MakeLog(new PeerInfo() { ProblemInstance = "ContactServer  Error at " + source }, ex.Message);
93    }
94
95  }
96}
Note: See TracBrowser for help on using the repository browser.