Skip to content

Commit

Permalink
Merge branch 'rajesh.kalaria_ve3573_troubleshoot-connection-acceptanc…
Browse files Browse the repository at this point in the history
…e-issue-part-2' into 'main'

VE-3573: possible fix for endpoint not found intermittent issue

See merge request evernym/verity/verity!627
  • Loading branch information
Rajesh Kalaria committed Sep 12, 2022
2 parents 866db5e + 8b6171b commit 5916f65
Show file tree
Hide file tree
Showing 18 changed files with 405 additions and 185 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import com.evernym.verity.actor.msg_tracer.progress_tracker.{HasMsgProgressTrack
import com.evernym.verity.actor.resourceusagethrottling.EntityId
import com.evernym.verity.agentmsg.msgcodec.UnknownFormatType
import com.evernym.verity.cache.{AGENCY_IDENTITY_CACHE_FETCHER, AGENT_ACTOR_CONFIG_CACHE_FETCHER, KEY_VALUE_MAPPER_ACTOR_CACHE_FETCHER}
import com.evernym.verity.cache.base.{Cache, FetcherParam, GetCachedObjectParam, KeyDetail}
import com.evernym.verity.cache.base.{Cache, FetcherParam, GetCachedObjectParam, ReqParam}
import com.evernym.verity.cache.fetchers.{AgentConfigCacheFetcher, CacheValueFetcher, GetAgencyIdentityCacheParam}
import com.evernym.verity.config.ConfigConstants.{AKKA_SHARDING_REGION_NAME_USER_AGENT, VDR_LEDGER_PREFIX_MAPPINGS, VDR_UNQUALIFIED_LEDGER_PREFIX, VERITY_ENDORSER_DEFAULT_DID}
import com.evernym.verity.did.didcomm.v1.messages.{MsgFamily, MsgType, TypedMsgLike}
Expand Down Expand Up @@ -200,7 +200,7 @@ trait AgentCommon
case (Some(adp), Some(ak)) if adp.DID.nonEmpty => Future.successful(adp.copy(verKey = ak.verKey))
case (Some(adp), _) if adp.DID.nonEmpty && adp.verKey.isEmpty => agencyDidPairFutByCache(adp.DID)
case _ =>
val gcop = GetCachedObjectParam(KeyDetail(AGENCY_DID_KEY, required = false), KEY_VALUE_MAPPER_ACTOR_CACHE_FETCHER)
val gcop = GetCachedObjectParam(ReqParam(AGENCY_DID_KEY, required = false), KEY_VALUE_MAPPER_ACTOR_CACHE_FETCHER)
generalCache.getByParamAsync(gcop).flatMap { cqr =>
agencyDidPairFutByCache(cqr.getAgencyDIDReq)
}
Expand All @@ -209,7 +209,7 @@ trait AgentCommon

def agencyDidPairFutByCache(agencyDID: DidStr): Future[DidPair] = {
val gadp = GetAgencyIdentityCacheParam(agencyDID, GetAgencyIdentity(agencyDID, getEndpoint = false))
val gadfcParam = GetCachedObjectParam(KeyDetail(gadp, required = true), AGENCY_IDENTITY_CACHE_FETCHER)
val gadfcParam = GetCachedObjectParam(ReqParam(gadp, required = true), AGENCY_IDENTITY_CACHE_FETCHER)
generalCache.getByParamAsync(gadfcParam)
.map(cqr => DidPair(agencyDID, cqr.getAgencyInfoReq(agencyDID).verKeyReq))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import com.evernym.verity.actor.cluster_singleton.{AddMapping, ForKeyValueMapper
import com.evernym.verity.actor.wallet.{CreateNewKey, CreateWallet, NewKeyCreated, WalletCreated}
import com.evernym.verity.agentmsg.msgpacker.UnpackParam
import com.evernym.verity.cache.{LEDGER_GET_ENDPOINT_CACHE_FETCHER, LEDGER_GET_VER_KEY_CACHE_FETCHER}
import com.evernym.verity.cache.base.{GetCachedObjectParam, KeyDetail}
import com.evernym.verity.cache.base.{GetCachedObjectParam, ReqParam}
import com.evernym.verity.cache.fetchers.{GetEndpointParam, GetVerKeyParam}
import com.evernym.verity.config.ConfigConstants
import com.evernym.verity.constants.ActorNameConstants._
Expand Down Expand Up @@ -211,13 +211,13 @@ class AgencyAgent(val agentActorContext: AgentActorContext,
//dhh Same note about caching as above.
def getCachedEndpointFromLedger(did: DidStr, req: Boolean = false): Future[Option[Either[StatusDetail, String]]] = {
val gep = GetEndpointParam(did, ledgerReqSubmitter)
val gcop = GetCachedObjectParam(KeyDetail(gep, required = req), LEDGER_GET_ENDPOINT_CACHE_FETCHER)
val gcop = GetCachedObjectParam(ReqParam(gep, required = req), LEDGER_GET_ENDPOINT_CACHE_FETCHER)
getCachedStringValue(did, gcop)
}

def getCachedVerKeyFromLedger(did: DidStr, req: Boolean = false): Future[Option[Either[StatusDetail, String]]] = {
val gvkp = GetVerKeyParam(did, ledgerReqSubmitter)
val gcop = GetCachedObjectParam(KeyDetail(gvkp, required = req), LEDGER_GET_VER_KEY_CACHE_FETCHER)
val gcop = GetCachedObjectParam(ReqParam(gvkp, required = req), LEDGER_GET_VER_KEY_CACHE_FETCHER)
getCachedStringValue(did, gcop)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@ import com.evernym.verity.constants.Constants.AGENCY_DID_KEY

import scala.concurrent.{ExecutionContext, Future}
import com.evernym.verity.cache.KEY_VALUE_MAPPER_ACTOR_CACHE_FETCHER
import com.evernym.verity.cache.base.{Cache, GetCachedObjectParam, KeyDetail}
import com.evernym.verity.cache.base.{Cache, GetCachedObjectParam, ReqParam}

trait AgencyIdUtil
extends HasExecutionContextProvider {

private implicit val executionContext: ExecutionContext = futureExecutionContext

def getAgencyDID(implicit generalCache: Cache): Future[String] = {
val gcop = GetCachedObjectParam(KeyDetail(AGENCY_DID_KEY, required = false), KEY_VALUE_MAPPER_ACTOR_CACHE_FETCHER)
val gcop = GetCachedObjectParam(ReqParam(AGENCY_DID_KEY, required = false), KEY_VALUE_MAPPER_ACTOR_CACHE_FETCHER)
generalCache.getByParamAsync(gcop).map { cqr =>
cqr.getAgencyDIDReq
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import com.evernym.verity.ledger.LedgerSvcException
import com.evernym.verity.protocol.protocols.connecting.common.TheirRoutingParam
import com.evernym.verity.actor.wallet.PackedMsg
import com.evernym.verity.cache.AGENCY_IDENTITY_CACHE_FETCHER
import com.evernym.verity.cache.base.{CacheQueryResponse, GetCachedObjectParam, KeyDetail}
import com.evernym.verity.cache.base.{QueryResult, GetCachedObjectParam, ReqParam}
import com.evernym.verity.cache.fetchers.GetAgencyIdentityCacheParam
import com.evernym.verity.did.DidStr
import com.evernym.verity.did.didcomm.v1.messages.MsgId
Expand Down Expand Up @@ -40,27 +40,23 @@ trait AgentMsgSender

def getAgencyIdentityFut(localAgencyDID: String,
gad: GetAgencyIdentity,
mw: MetricsWriter): Future[CacheQueryResponse] = {
mw: MetricsWriter): Future[QueryResult] = {
mw.runWithSpan("getAgencyIdentityFut", "AgentMsgSender", InternalSpan) {
val gadp = GetAgencyIdentityCacheParam(localAgencyDID, gad)
val gadfcParam = GetCachedObjectParam(KeyDetail(gadp, required = true), AGENCY_IDENTITY_CACHE_FETCHER)
val gadfcParam = GetCachedObjectParam(ReqParam(gadp, required = true), AGENCY_IDENTITY_CACHE_FETCHER)
generalCache.getByParamAsync(gadfcParam)
}
}

private def theirAgencyEndpointFut(localAgencyDID:DidStr,
theirAgencyDID: DidStr,
mw: MetricsWriter): Future[CacheQueryResponse] = {
mw: MetricsWriter): Future[QueryResult] = {
val gad = GetAgencyIdentity(theirAgencyDID)
getAgencyIdentityFut(localAgencyDID, gad, mw)
}

private def handleRemoteAgencyEndpointNotFound(theirAgencyDID: DidStr): Exception = {
val errorMsg =
"error while getting endpoint from ledger (" +
"possible-causes: ledger pool not reachable/up/responding etc, " +
s"target DID: $theirAgencyDID)"
LedgerSvcException(errorMsg)
private def handleRemoteAgencyEndpointNotFound(theirAgencyDID: DidStr, errorMsg: String): Exception = {
LedgerSvcException(s"error while getting endpoint from ledger (target DID: $theirAgencyDID): $errorMsg")
}

private def getRemoteAgencyEndpoint(implicit sm: SendMsgParam, mw: MetricsWriter): Future[String] = {
Expand All @@ -70,10 +66,10 @@ trait AgentMsgSender
val theirAgencyInfo = cqr.getAgencyInfoReq(theirAgencyDID)
logger.info(s"theirAgencyInfo received for '$theirAgencyDID': " + theirAgencyInfo)
theirAgencyInfo.endpointOpt.getOrElse(
throw handleRemoteAgencyEndpointNotFound(theirAgencyDID)
throw handleRemoteAgencyEndpointNotFound(theirAgencyDID, "endpoint found to be empty (via cache)")
)
}.recover {
case _: Exception => throw handleRemoteAgencyEndpointNotFound(theirAgencyDID)
case e: Exception => throw handleRemoteAgencyEndpointNotFound(theirAgencyDID, e.getMessage)
}
case Right(endpoint) => Future.successful(endpoint)
}
Expand All @@ -92,7 +88,7 @@ trait AgentMsgSender
r
}.recover {
case e: Exception =>
logger.error("error while sending message to their agency endpoint '${sm.theirRoutingParam.route}': " + Exceptions.getStackTraceAsString(e))
logger.error(s"error while sending message to their agency endpoint '${sm.theirRoutingParam.route}': " + Exceptions.getStackTraceAsString(e))
handleMsgDeliveryResult(MsgDeliveryResult.failed(sm, MSG_DELIVERY_STATUS_FAILED, Exceptions.getErrorMsg(e)))
throw e
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import com.evernym.verity.util2.Status.getUnhandledError
import com.evernym.verity.actor.agent.user.{AgentConfig, AgentConfigs, GetConfigDetail, GetConfigs}
import com.evernym.verity.agentmsg.msgfamily.ConfigDetail
import com.evernym.verity.cache.AGENT_ACTOR_CONFIG_CACHE_FETCHER
import com.evernym.verity.cache.base.{Cache, GetCachedObjectParam, KeyDetail}
import com.evernym.verity.cache.base.{Cache, GetCachedObjectParam, ReqParam}
import com.evernym.verity.cache.fetchers.GetConfigCacheParam
import com.evernym.verity.did.DidStr

Expand Down Expand Up @@ -59,9 +59,9 @@ trait UsesConfigs extends HasAppConfig with HasExecutionContextProvider {

def getConfigsFromUserAgent(configs: Set[GetConfigDetail]): Future[AgentConfigs] = {

def buildKeyDetails(gcd: Set[GetConfigDetail], req: Boolean): Set[KeyDetail] = {
if (gcd.nonEmpty) Set(KeyDetail(GetConfigCacheParam(ownerAgentKeyDIDReq, GetConfigs(gcd.map(_.name))), required = req))
else Set.empty[KeyDetail]
def buildKeyDetails(gcd: Set[GetConfigDetail], req: Boolean): Set[ReqParam] = {
if (gcd.nonEmpty) Set(ReqParam(GetConfigCacheParam(ownerAgentKeyDIDReq, GetConfigs(gcd.map(_.name))), required = req))
else Set.empty[ReqParam]
}

val (reqs, nonReqs) = configs.partition(_.req)
Expand Down
Loading

0 comments on commit 5916f65

Please sign in to comment.