Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
06/17/16 12:03:25 (8 years ago)
Author:
gkronber
Message:

#2615: added a first version of an analyzer

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/thasling/DistributedGA/DistributedGA.ContactServer/ContactServiceImpl.cs

    r13888 r13905  
    88using DistributedGA.Core.Domain;
    99
    10 namespace DistributedGA.ContactServer
    11 {
     10namespace DistributedGA.ContactServer {
    1211
    13     [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    14     public class ContactServiceImpl : IContactService
    15     {
     12  [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
     13  public class ContactServiceImpl : IContactService {
    1614
    17         private ConcurrentDictionary<PeerInfo, DateTime> allPeers = null;
     15    private ConcurrentDictionary<PeerInfo, DateTime> allPeers = null;
    1816
    19         private Timer timer = null;
     17    private Timer timer = null;
    2018
    21         private Object logLock = new Object();
     19    private Object logLock = new Object();
    2220
    23         public ContactServiceImpl()
    24         {
    25             allPeers = new ConcurrentDictionary<PeerInfo, DateTime>();
     21    public ContactServiceImpl() {
     22      allPeers = new ConcurrentDictionary<PeerInfo, DateTime>();
    2623
    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));
    3059        }
     60      } catch (Exception ex) {
     61        //Nothing to do because maybe called from adderror
     62      }
     63    }
    3164
    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          }
    4288        }
     89      }
     90      //remove items
     91      foreach (PeerInfo pi in itemsToDelete) {
     92        DateTime tmp;
     93        allPeers.TryRemove(pi, out tmp);
     94      }
     95    }
    4396
    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    }
    65100
    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  }
    128102}
Note: See TracChangeset for help on using the changeset viewer.