source: src/main/java/geniusweb/partiesserver/RunningPartiesUpdater.java@ 17

Last change on this file since 17 was 16, checked in by bart, 4 years ago

Tries harder to kill parties after deadline

File size: 2.6 KB
RevLine 
[1]1package geniusweb.partiesserver;
2
3import java.util.logging.Level;
4
5import geniusweb.partiesserver.repository.RunningPartiesRepo;
6import geniusweb.partiesserver.repository.RunningParty;
[4]7import geniusweb.party.Party;
[1]8import tudelft.utilities.logging.ReportToLogger;
9import tudelft.utilities.logging.Reporter;
10
11/**
12 *
13 * This object keeps the {@link RunningPartiesRepo} up to date. Main job is to
[16]14 * remove parties that have been timed out. When a party times out, it calls
15 * {@link Party#terminate()} but that might fail to stop a party. In the end,
16 * the protocol should close the connection after the deadline. Start and run
17 * only once.
[1]18 */
19public class RunningPartiesUpdater implements Runnable {
20 private final long period;
21 private final Reporter log = new ReportToLogger("partiesserver");
22 private final RunningPartiesRepo running;
23 /**
24 * when a negotiation runs out of time, the protocol may want to inform all
25 * parties about the failed session. If the parties are all killed at that
[16]26 * moment, this is impossible. Therefore we wait KILL_DELAY extra time
27 * before really killing the parties.
[1]28 */
29 private static final long KILL_DELAY = 2000;
30
31 /**
32 * @param repo the {@link RunningPartiesRepo} that must be updated
33 * automatically
[16]34 * @param period the period with which to check time-out (ms). Recommended
35 * 1000. After constructing you can run this in separate
36 * thread or just call {@link #run()}
[1]37 *
38 */
39 public RunningPartiesUpdater(RunningPartiesRepo repo, final long period) {
40 this.running = repo;
41 this.period = period;
42 }
43
44 /**
45 *
46 * run the updater. Please run only one of this to avoid neeedless CPU load.
47 */
48 @Override
49 public void run() {
50 try {
51 while (true) {
52 Thread.sleep(period);
53 update();
54 }
55 } catch (InterruptedException e) {
[16]56 System.err
57 .println("ERROR: RunningPartiesUpdater was interrupted!");
[1]58 }
59 }
60
61 /**
[16]62 * Removes parties when they ran out of time. Called when some file that may
63 * be relevant has changed, and periodically every {@link #period}.
64 * Synchronized to avoid weird states if filesystem changes rapidly. We
65 * ignore everything but jar files.
[1]66 */
67 void update() {
68 for (RunningParty party : running.list()) {
69 long now = System.currentTimeMillis();
70 if (now >= party.getEndDate().getTime() + KILL_DELAY) {
[16]71 log.log(Level.WARNING,
72 "party " + party.getID() + " still running "
73 + KILL_DELAY / 1000
74 + "s after deadline. Removed now.");
[1]75 running.remove(party.getID());
[16]76 try {
77 Thread.sleep(20);
78 } catch (InterruptedException e) {
79 }
[1]80 }
81 }
82 }
83
84}
Note: See TracBrowser for help on using the repository browser.