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 }