Coverage Summary for Class: PeerScoringReporterService (co.rsk.scoring)
Class |
Class, %
|
Method, %
|
Line, %
|
PeerScoringReporterService |
0%
(0/1)
|
0%
(0/8)
|
0%
(0/25)
|
1 package co.rsk.scoring;
2
3 import co.rsk.config.InternalService;
4 import com.google.common.annotations.VisibleForTesting;
5 import org.slf4j.Logger;
6 import org.slf4j.LoggerFactory;
7
8 import java.util.List;
9 import java.util.concurrent.Executors;
10 import java.util.concurrent.ScheduledExecutorService;
11 import java.util.concurrent.TimeUnit;
12
13 /**
14 * This internal service prints a summary of peer scoring information, every 5 minutes (configurable)
15 * */
16 public class PeerScoringReporterService implements InternalService {
17
18 private static final Logger logger = LoggerFactory.getLogger("peerScoring");
19 private final PeerScoringManager peerScoringManager;
20 private final long time;
21 protected final ScheduledExecutorService scheduledExecutorService;
22
23 public PeerScoringReporterService(long time, PeerScoringManager peerScoringManager, ScheduledExecutorService scheduledExecutorService) {
24 this.peerScoringManager = peerScoringManager;
25 this.time = time;
26 this.scheduledExecutorService = scheduledExecutorService;
27 }
28
29 public static PeerScoringReporterService withScheduler(long peerScoringReportTime, PeerScoringManager peerScoringManager) {
30 return new PeerScoringReporterService(peerScoringReportTime, peerScoringManager, Executors.newSingleThreadScheduledExecutor());
31 }
32
33 @Override
34 public void start() {
35 logger.debug("starting peer scoring reporter service");
36 try {
37 List<PeerScoringInformation> peerScoringInformationList = peerScoringManager.getPeersInformation();
38 scheduledExecutorService.scheduleAtFixedRate(() -> printReports(peerScoringInformationList),
39 0,
40 time,
41 TimeUnit.MILLISECONDS
42 );
43 running();
44 } catch (Exception e) {
45 logger.warn("peer scoring reporter failed", e);
46 stop();
47 }
48 }
49
50 @Override
51 public void stop() {
52 scheduledExecutorService.shutdown();
53 logger.warn("peer scoring reporter service has been stopped");
54 stopped();
55 }
56
57 public void printReports(List<PeerScoringInformation> peerScoringInformationList) {
58 try {
59 String reputationSummaryString = PeerScoringReporterUtil.reputationSummaryString(peerScoringInformationList);
60 logger.debug("reputation summary {}", reputationSummaryString);
61
62 String detailedReputationString = PeerScoringReporterUtil.detailedReputationString(peerScoringInformationList);
63 logger.debug("detailed reputation status {}", detailedReputationString);
64 } catch (Exception e) {
65 logger.warn("failed to print reports", e);
66 }
67 }
68
69 @VisibleForTesting
70 public boolean initialized() {
71 // todo(techdebt) this should be only at TestPeerScoringReporterService class and inject that into a TestRSKContext
72 return scheduledExecutorService != null && peerScoringManager != null && time > 0;
73 }
74
75 protected void running() {
76 }
77
78 protected void stopped() {
79 }
80 }