Skip to content
This repository has been archived by the owner on Apr 13, 2022. It is now read-only.

Commit

Permalink
Merge pull request #376 from ScorexFoundation/i374
Browse files Browse the repository at this point in the history
I374
  • Loading branch information
kushti committed Oct 14, 2020
2 parents 9f070a8 + 102e2d4 commit cfe0bed
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 5 deletions.
19 changes: 15 additions & 4 deletions src/main/scala/scorex/core/api/http/PeersApiRoute.scala
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ import akka.http.scaladsl.server.Route
import io.circe.generic.semiauto._
import io.circe.syntax._
import io.circe.{Encoder, Json}
import scorex.core.api.http.PeersApiRoute.{BlacklistedPeers, PeerInfoResponse}
import scorex.core.network.NetworkController.ReceivableMessages.{ConnectTo, GetConnectedPeers}
import scorex.core.network.peer.PeerInfo
import scorex.core.api.http.PeersApiRoute.{BlacklistedPeers, PeerInfoResponse, PeersStatusResponse}
import scorex.core.network.NetworkController.ReceivableMessages.{ConnectTo, GetConnectedPeers, GetPeersStatus}
import scorex.core.network.peer.{PeerInfo, PeersStatus}
import scorex.core.network.peer.PeerManager.ReceivableMessages.{GetAllPeers, GetBlacklistedPeers}
import scorex.core.settings.RESTApiSettings
import scorex.core.utils.NetworkTimeProvider
Expand All @@ -23,7 +23,7 @@ case class PeersApiRoute(peerManager: ActorRef,
(implicit val context: ActorRefFactory, val ec: ExecutionContext) extends ApiRoute {

override lazy val route: Route = pathPrefix("peers") {
allPeers ~ connectedPeers ~ blacklistedPeers ~ connect
allPeers ~ connectedPeers ~ blacklistedPeers ~ connect ~ peersStatus
}

def allPeers: Route = (path("all") & get) {
Expand All @@ -49,6 +49,13 @@ case class PeersApiRoute(peerManager: ActorRef,
ApiResponse(result)
}

def peersStatus: Route = (path("status") & get) {
val result = askActor[PeersStatus](networkController, GetPeersStatus).map {
case PeersStatus(lastIncomingMessage,currentNetworkTime) => PeersStatusResponse(lastIncomingMessage,currentNetworkTime)
}
ApiResponse(result)
}

private val addressAndPortRegexp = "([\\w\\.]+):(\\d{1,5})".r

def connect: Route = (path("connect") & post & withAuth & entity(as[Json])) { json =>
Expand Down Expand Up @@ -88,6 +95,8 @@ object PeersApiRoute {
)
}

case class PeersStatusResponse(lastIncomingMessage: Long, currentSystemTime: Long)

case class BlacklistedPeers(addresses: Seq[String])

@SuppressWarnings(Array("org.wartremover.warts.PublicInference"))
Expand All @@ -96,5 +105,7 @@ object PeersApiRoute {
@SuppressWarnings(Array("org.wartremover.warts.PublicInference"))
implicit val encodeBlackListedPeers: Encoder[BlacklistedPeers] = deriveEncoder

@SuppressWarnings(Array("org.wartremover.warts.PublicInference"))
implicit val encodePeersStatusResponse: Encoder[PeersStatusResponse] = deriveEncoder
}

10 changes: 9 additions & 1 deletion src/main/scala/scorex/core/network/NetworkController.scala
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,15 @@ import akka.io.Tcp._
import akka.io.{IO, Tcp}
import akka.pattern.ask
import akka.util.Timeout
import scorex.core.api.http.PeersApiRoute.PeersStatusResponse
import scorex.core.app.{ScorexContext, Version}
import scorex.core.network.NodeViewSynchronizer.ReceivableMessages.{DisconnectedPeer, HandshakedPeer}
import scorex.core.network.message.Message.MessageCode
import scorex.core.network.message.{Message, MessageSpec}
import scorex.core.network.peer.PeerManager.ReceivableMessages._
import scorex.core.network.peer.{LocalAddressPeerFeature, PeerInfo, PeerManager, PenaltyType}
import scorex.core.settings.NetworkSettings
import scorex.core.utils.NetworkUtils
import scorex.core.utils.{NetworkUtils, TimeProvider}
import scorex.util.ScorexLogging

import scala.concurrent.ExecutionContext
Expand Down Expand Up @@ -60,6 +61,8 @@ class NetworkController(settings: NetworkSettings,
private var connections = Map.empty[InetSocketAddress, ConnectedPeer]
private var unconfirmedConnections = Set.empty[InetSocketAddress]

private var lastIncomingMessage : TimeProvider.Time = 0

//check own declared address for validity
validateDeclaredAddress()

Expand Down Expand Up @@ -101,6 +104,7 @@ class NetworkController(settings: NetworkSettings,
case Some(cp) => cp.peerInfo match {
case Some(pi) =>
val now = scorexContext.timeProvider.time()
lastIncomingMessage = now
connections += remoteAddress -> cp.copy(peerInfo = Some(pi.copy(lastSeen = now)))
case None => log.warn("Peer info not found for a message got from: " + remoteAddress)
}
Expand Down Expand Up @@ -182,6 +186,9 @@ class NetworkController(settings: NetworkSettings,

//calls from API / application
private def interfaceCalls: Receive = {
case GetPeersStatus =>
sender() ! PeersStatusResponse(lastIncomingMessage, scorexContext.timeProvider.time())

case GetConnectedPeers =>
sender() ! connections.values.flatMap(_.peerInfo).toSeq

Expand Down Expand Up @@ -474,6 +481,7 @@ object NetworkController {

case object GetConnectedPeers

case object GetPeersStatus
}

}
Expand Down
8 changes: 8 additions & 0 deletions src/main/scala/scorex/core/network/peer/PeerInfo.scala
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,14 @@ case class PeerInfo(peerSpec: PeerSpec,
lastSeen: Long,
connectionType: Option[ConnectionDirection] = None)

/**
* Information about all peers
*
* @param lastIncomingMessage - timestamp of last received message from any peer
* @param currentNetworkTime - current network time
*/
case class PeersStatus(lastIncomingMessage: Long, currentNetworkTime: Long)

object PeerInfo {

/**
Expand Down

0 comments on commit cfe0bed

Please sign in to comment.