You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@openwhisk.apache.org by GitBox <gi...@apache.org> on 2018/05/03 10:53:12 UTC
[GitHub] markusthoemmes closed pull request #3199: One tid for the whole
system.
markusthoemmes closed pull request #3199: One tid for the whole system.
URL: https://github.com/apache/incubator-openwhisk/pull/3199
This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:
As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):
diff --git a/ansible/group_vars/all b/ansible/group_vars/all
index f04807be57..977d6eddd9 100644
--- a/ansible/group_vars/all
+++ b/ansible/group_vars/all
@@ -97,7 +97,7 @@ jmx:
enabled: "{{ jmxremote_enabled | default('true') }}"
transactions:
- stride: "{{ groups['controllers'] | length }}"
+ header: "{{ transactions_header | default('X-Request-ID') }}"
registry:
confdir: "{{ config_root_dir }}/registry"
diff --git a/ansible/roles/controller/tasks/deploy.yml b/ansible/roles/controller/tasks/deploy.yml
index 8173f0017b..8a839d4874 100644
--- a/ansible/roles/controller/tasks/deploy.yml
+++ b/ansible/roles/controller/tasks/deploy.yml
@@ -201,7 +201,7 @@
"CONFIG_whisk_spi_LoadBalancerProvider": "{{ controller.loadbalancer.spi }}"
"CONFIG_logback_log_level": "{{ controller.loglevel }}"
- "CONFIG_whisk_transactions_stride": "{{ transactions.stride | default() }}"
+ "CONFIG_whisk_transactions_header": "{{ transactions.header }}"
- name: create seed nodes list
set_fact:
diff --git a/ansible/roles/invoker/tasks/deploy.yml b/ansible/roles/invoker/tasks/deploy.yml
index 2643b548b4..b542d78189 100644
--- a/ansible/roles/invoker/tasks/deploy.yml
+++ b/ansible/roles/invoker/tasks/deploy.yml
@@ -227,6 +227,7 @@
-e CONFIG_whisk_timeLimit_max='{{ limit_action_time_max | default() }}'
-e CONFIG_whisk_timeLimit_std='{{ limit_action_time_std | default() }}'
-e CONFIG_whisk_activation_payload_max='{{ limit_activation_payload | default() }}'
+ -e CONFIG_whisk_transactions_header='{{ transactions.header }}'
-v /sys/fs/cgroup:/sys/fs/cgroup
-v /run/runc:/run/runc
-v {{ whisk_logs_dir }}/invoker{{ groups['invokers'].index(inventory_hostname) }}:/logs
diff --git a/ansible/roles/nginx/templates/nginx.conf.j2 b/ansible/roles/nginx/templates/nginx.conf.j2
index 8b2f07bc40..a8632d9db0 100644
--- a/ansible/roles/nginx/templates/nginx.conf.j2
+++ b/ansible/roles/nginx/templates/nginx.conf.j2
@@ -15,7 +15,7 @@ http {
rewrite_log on;
{# change log format to display the upstream information #}
log_format combined-upstream '$remote_addr - $remote_user [$time_local] '
- '$request $status $body_bytes_sent '
+ '[#tid_$request_id] $request $status $body_bytes_sent '
'$http_referer $http_user_agent $upstream_addr';
access_log /logs/nginx_access.log combined-upstream;
@@ -59,6 +59,12 @@ http {
}
proxy_set_header X-OW-EXTRA-LOGGING $extra_logging;
+ # Set the request id generated by nginx as tid-header to the upstream.
+ # This tid is either the request-id generated by ngix or a tid, sent by the caller.
+ proxy_set_header {{ transactions.header }} $request_id;
+
+ # Send the tid always back as header.
+ add_header {{ transactions.header }} $request_id always;
{# Turn off sending information about the server to the client #}
server_tokens off;
diff --git a/common/scala/src/main/resources/application.conf b/common/scala/src/main/resources/application.conf
index f665edb933..ea4bd46340 100644
--- a/common/scala/src/main/resources/application.conf
+++ b/common/scala/src/main/resources/application.conf
@@ -131,8 +131,7 @@ whisk {
# transaction ID related configuration
transactions {
- stride = 1
- stride = ${?CONTROLLER_INSTANCES}
+ header = "X-Request-ID"
}
# action runtimes configuration
runtimes {
diff --git a/common/scala/src/main/scala/whisk/common/TransactionId.scala b/common/scala/src/main/scala/whisk/common/TransactionId.scala
index 1f901a1707..cb16a42fd8 100644
--- a/common/scala/src/main/scala/whisk/common/TransactionId.scala
+++ b/common/scala/src/main/scala/whisk/common/TransactionId.scala
@@ -17,20 +17,15 @@
package whisk.common
-import java.time.Clock
-import java.time.Duration
-import java.time.Instant
-import java.util.concurrent.atomic.AtomicInteger
+import java.time.{Clock, Duration, Instant}
-import scala.math.BigDecimal.int2bigDecimal
-import scala.util.Try
-import akka.event.Logging.{DebugLevel, InfoLevel, WarningLevel}
-import akka.event.Logging.LogLevel
+import akka.event.Logging.{DebugLevel, InfoLevel, LogLevel, WarningLevel}
+import akka.http.scaladsl.model.headers.RawHeader
+import pureconfig.loadConfigOrThrow
import spray.json._
-
import whisk.core.ConfigKeys
-import pureconfig._
+import scala.util.Try
/**
* A transaction id for tracking operations in the system that are specific to a request.
@@ -39,11 +34,9 @@ import pureconfig._
*/
case class TransactionId private (meta: TransactionMetadata) extends AnyVal {
def id = meta.id
- override def toString = {
- if (meta.id > 0) s"#tid_${meta.id}"
- else if (meta.id < 0) s"#sid_${-meta.id}"
- else "??"
- }
+ override def toString = s"#tid_${meta.id}"
+
+ def toHeader = RawHeader(TransactionId.generatorConfig.header, meta.id)
/**
* Method to count events.
@@ -190,8 +183,9 @@ case class StartMarker(val start: Instant, startMarker: LogMarkerToken)
* @param id the transaction identifier; it is positive for client requests,
* negative for system operation and zero when originator is not known
* @param start the timestamp when the request processing commenced
+ * @param extraLogging enables logging, if set to true
*/
-protected case class TransactionMetadata(val id: Long, val start: Instant, val extraLogging: Boolean = false)
+protected case class TransactionMetadata(val id: String, val start: Instant, val extraLogging: Boolean = false)
object TransactionId {
@@ -200,58 +194,44 @@ object TransactionId {
val metricsKamonTags: Boolean = sys.env.get("METRICS_KAMON_TAGS").getOrElse("False").toBoolean
val metricsLog: Boolean = sys.env.get("METRICS_LOG").getOrElse("True").toBoolean
- val unknown = TransactionId(0)
- val testing = TransactionId(-1) // Common id for for unit testing
- val invoker = TransactionId(-100) // Invoker startup/shutdown or GC activity
- val invokerWarmup = TransactionId(-101) // Invoker warmup thread that makes stem-cell containers
- val invokerNanny = TransactionId(-102) // Invoker nanny thread
- val dispatcher = TransactionId(-110) // Kafka message dispatcher
- val loadbalancer = TransactionId(-120) // Loadbalancer thread
- val invokerHealth = TransactionId(-121) // Invoker supervision
- val controller = TransactionId(-130) // Controller startup
- val dbBatcher = TransactionId(-140) // Database batcher
-
- def apply(tid: BigDecimal, extraLogging: Boolean = false): TransactionId = {
- Try {
- val now = Instant.now(Clock.systemUTC())
- TransactionId(TransactionMetadata(tid.toLong, now, extraLogging))
- } getOrElse unknown
+ val generatorConfig = loadConfigOrThrow[TransactionGeneratorConfig](ConfigKeys.transactions)
+
+ val systemPrefix = "sid_"
+
+ val unknown = TransactionId(systemPrefix + "unknown")
+ val testing = TransactionId(systemPrefix + "testing") // Common id for for unit testing
+ val invoker = TransactionId(systemPrefix + "invoker") // Invoker startup/shutdown or GC activity
+ val invokerWarmup = TransactionId(systemPrefix + "invokerWarmup") // Invoker warmup thread that makes stem-cell containers
+ val invokerNanny = TransactionId(systemPrefix + "invokerNanny") // Invoker nanny thread
+ val dispatcher = TransactionId(systemPrefix + "dispatcher") // Kafka message dispatcher
+ val loadbalancer = TransactionId(systemPrefix + "loadbalancer") // Loadbalancer thread
+ val invokerHealth = TransactionId(systemPrefix + "invokerHealth") // Invoker supervision
+ val controller = TransactionId(systemPrefix + "controller") // Controller startup
+ val dbBatcher = TransactionId(systemPrefix + "dbBatcher") // Database batcher
+
+ def apply(tid: String, extraLogging: Boolean = false): TransactionId = {
+ val now = Instant.now(Clock.systemUTC())
+ TransactionId(TransactionMetadata(tid, now, extraLogging))
}
implicit val serdes = new RootJsonFormat[TransactionId] {
def write(t: TransactionId) = {
if (t.meta.extraLogging)
- JsArray(JsNumber(t.meta.id), JsNumber(t.meta.start.toEpochMilli), JsBoolean(t.meta.extraLogging))
+ JsArray(JsString(t.meta.id), JsNumber(t.meta.start.toEpochMilli), JsBoolean(t.meta.extraLogging))
else
- JsArray(JsNumber(t.meta.id), JsNumber(t.meta.start.toEpochMilli))
+ JsArray(JsString(t.meta.id), JsNumber(t.meta.start.toEpochMilli))
}
def read(value: JsValue) =
Try {
value match {
- case JsArray(Vector(JsNumber(id), JsNumber(start))) =>
- TransactionId(TransactionMetadata(id.longValue, Instant.ofEpochMilli(start.longValue), false))
- case JsArray(Vector(JsNumber(id), JsNumber(start), JsBoolean(extraLogging))) =>
- TransactionId(TransactionMetadata(id.longValue, Instant.ofEpochMilli(start.longValue), extraLogging))
+ case JsArray(Vector(JsString(id), JsNumber(start))) =>
+ TransactionId(TransactionMetadata(id, Instant.ofEpochMilli(start.longValue), false))
+ case JsArray(Vector(JsString(id), JsNumber(start), JsBoolean(extraLogging))) =>
+ TransactionId(TransactionMetadata(id, Instant.ofEpochMilli(start.longValue), extraLogging))
}
} getOrElse unknown
}
}
-/**
- * A thread-safe transaction counter.
- */
-trait TransactionCounter {
- case class TransactionCounterConfig(stride: Int)
-
- val transCounterConfig = loadConfigOrThrow[TransactionCounterConfig](ConfigKeys.transactions)
- val stride = transCounterConfig.stride
- val instanceOrdinal: Int
-
- // seed the counter so transids do not overlap: instanceOrdinal + n * stride, start at n = 1
- private lazy val cnt = new AtomicInteger(instanceOrdinal + stride)
-
- def transid(extraLogging: Boolean = false): TransactionId = {
- TransactionId(cnt.addAndGet(stride), extraLogging)
- }
-}
+case class TransactionGeneratorConfig(header: String)
diff --git a/common/scala/src/main/scala/whisk/core/WhiskConfig.scala b/common/scala/src/main/scala/whisk/core/WhiskConfig.scala
index 231341fbfb..0c937ae372 100644
--- a/common/scala/src/main/scala/whisk/core/WhiskConfig.scala
+++ b/common/scala/src/main/scala/whisk/core/WhiskConfig.scala
@@ -240,7 +240,6 @@ object ConfigKeys {
val kubernetesTimeouts = s"$kubernetes.timeouts"
val transactions = "whisk.transactions"
- val stride = s"$transactions.stride"
val logStore = "whisk.logstore"
val splunk = s"$logStore.splunk"
diff --git a/common/scala/src/main/scala/whisk/http/BasicHttpService.scala b/common/scala/src/main/scala/whisk/http/BasicHttpService.scala
index ece541b8b7..586d7dce25 100644
--- a/common/scala/src/main/scala/whisk/http/BasicHttpService.scala
+++ b/common/scala/src/main/scala/whisk/http/BasicHttpService.scala
@@ -17,27 +17,29 @@
package whisk.http
-import scala.collection.immutable.Seq
-import scala.concurrent.{Await, Future}
-import scala.concurrent.duration.DurationInt
+import java.util.concurrent.ThreadLocalRandom
+
import akka.actor.ActorSystem
import akka.event.Logging
import akka.http.scaladsl.Http
-import akka.http.scaladsl.model._
-import akka.http.scaladsl.model.HttpRequest
-import akka.http.scaladsl.server._
+import akka.http.scaladsl.model.{HttpRequest, _}
import akka.http.scaladsl.server.RouteResult.Rejected
+import akka.http.scaladsl.server._
import akka.http.scaladsl.server.directives._
import akka.stream.ActorMaterializer
import spray.json._
import whisk.common._
import whisk.core.WhiskConfig
+import scala.collection.immutable.Seq
+import scala.concurrent.duration.DurationInt
+import scala.concurrent.{Await, Future}
+
/**
* This trait extends the Akka Directives and Actor with logging and transaction counting
* facilities common to all OpenWhisk REST services.
*/
-trait BasicHttpService extends Directives with TransactionCounter {
+trait BasicHttpService extends Directives {
val OW_EXTRA_LOGGING_HEADER = "X-OW-EXTRA-LOGGING"
@@ -72,13 +74,15 @@ trait BasicHttpService extends Directives with TransactionCounter {
*/
def route: Route = {
assignId { implicit transid =>
- DebuggingDirectives.logRequest(logRequestInfo _) {
- DebuggingDirectives.logRequestResult(logResponseInfo _) {
- BasicDirectives.mapRequest(_.removeHeader(OW_EXTRA_LOGGING_HEADER)) {
- handleRejections(BasicHttpService.customRejectionHandler) {
- prioritizeRejections {
- toStrictEntity(30.seconds) {
- routes
+ respondWithHeader(transid.toHeader) {
+ DebuggingDirectives.logRequest(logRequestInfo _) {
+ DebuggingDirectives.logRequestResult(logResponseInfo _) {
+ BasicDirectives.mapRequest(_.removeHeader(OW_EXTRA_LOGGING_HEADER)) {
+ handleRejections(BasicHttpService.customRejectionHandler) {
+ prioritizeRejections {
+ toStrictEntity(30.seconds) {
+ routes
+ }
}
}
}
@@ -88,6 +92,10 @@ trait BasicHttpService extends Directives with TransactionCounter {
}
}
+ // Scala random should be enough here, as the generation for the tid is only a fallback. In addition the tid only has
+ // to be unique within a few minutes.
+ private val dict = ('A' to 'Z') ++ ('a' to 'z') ++ ('0' to '9')
+
/** Assigns transaction id to every request. */
protected def assignId = HeaderDirectives.optionalHeaderValueByName(OW_EXTRA_LOGGING_HEADER) flatMap { headerValue =>
val extraLogging = headerValue match {
@@ -97,7 +105,20 @@ trait BasicHttpService extends Directives with TransactionCounter {
case Some(value) => value.toLowerCase == "on"
case None => false
}
- extract(_ => transid(extraLogging))
+ extract { req =>
+ val tid =
+ req.request.headers
+ .find(_.name == TransactionId.generatorConfig.header)
+ .map(_.value)
+ .filterNot(_.startsWith(TransactionId.systemPrefix))
+ .getOrElse {
+ // As this is only a fallback, because the tid should be generated by nginx, this shouldn't be used.
+ // Therefore we didn't take a deep look into performance here.
+ (0 until 32).map(_ => dict(ThreadLocalRandom.current().nextInt(dict.size))).mkString("")
+ }
+
+ TransactionId(tid, extraLogging)
+ }
}
/** Generates log entry for every request. */
diff --git a/common/scala/src/main/scala/whisk/http/ErrorResponse.scala b/common/scala/src/main/scala/whisk/http/ErrorResponse.scala
index 97d2008db9..40685c0994 100644
--- a/common/scala/src/main/scala/whisk/http/ErrorResponse.scala
+++ b/common/scala/src/main/scala/whisk/http/ErrorResponse.scala
@@ -253,7 +253,7 @@ object ErrorResponse extends Directives with DefaultJsonProtocol {
def read(v: JsValue) =
Try {
v.asJsObject.getFields("error", "code") match {
- case Seq(JsString(error), JsNumber(code)) =>
+ case Seq(JsString(error), JsString(code)) =>
ErrorResponse(error, TransactionId(code))
case Seq(JsString(error)) =>
ErrorResponse(error, TransactionId.unknown)
diff --git a/core/controller/src/main/scala/whisk/core/controller/Controller.scala b/core/controller/src/main/scala/whisk/core/controller/Controller.scala
index 340df960e7..c1c739075b 100644
--- a/core/controller/src/main/scala/whisk/core/controller/Controller.scala
+++ b/core/controller/src/main/scala/whisk/core/controller/Controller.scala
@@ -82,8 +82,6 @@ class Controller(val instance: InstanceId,
implicit val logging: Logging)
extends BasicRasService {
- override val instanceOrdinal = instance.toInt
-
TransactionId.controller.mark(
this,
LoggingMarkers.CONTROLLER_STARTUP(instance.toInt),
diff --git a/core/controller/src/main/scala/whisk/core/controller/Triggers.scala b/core/controller/src/main/scala/whisk/core/controller/Triggers.scala
index 8bf2de740f..760ae04f67 100644
--- a/core/controller/src/main/scala/whisk/core/controller/Triggers.scala
+++ b/core/controller/src/main/scala/whisk/core/controller/Triggers.scala
@@ -383,7 +383,8 @@ trait WhiskTriggersApi extends WhiskCollectionAPI {
* @param args the arguments to post to the action
* @return a future with the HTTP response from the action activation
*/
- private def postActivation(user: Identity, rule: ReducedRule, args: JsObject): Future[HttpResponse] = {
+ private def postActivation(user: Identity, rule: ReducedRule, args: JsObject)(
+ implicit transid: TransactionId): Future[HttpResponse] = {
// Build the url to invoke an action mapped to the rule
val actionUrl = baseControllerPath / rule.action.path.root.asString / "actions"
@@ -394,7 +395,9 @@ trait WhiskTriggersApi extends WhiskCollectionAPI {
val request = HttpRequest(
method = POST,
uri = url.withPath(actionUrl ++ actionPath),
- headers = List(Authorization(BasicHttpCredentials(user.authkey.uuid.asString, user.authkey.key.asString))),
+ headers = List(
+ Authorization(BasicHttpCredentials(user.authkey.uuid.asString, user.authkey.key.asString)),
+ transid.toHeader),
entity = HttpEntity(MediaTypes.`application/json`, args.compactPrint))
singleRequest(request)
diff --git a/core/invoker/src/main/scala/whisk/core/invoker/Invoker.scala b/core/invoker/src/main/scala/whisk/core/invoker/Invoker.scala
index 58a4d1d097..4a69d3cf99 100644
--- a/core/invoker/src/main/scala/whisk/core/invoker/Invoker.scala
+++ b/core/invoker/src/main/scala/whisk/core/invoker/Invoker.scala
@@ -39,7 +39,7 @@ import whisk.core.connector.PingMessage
import whisk.core.entity._
import whisk.core.entity.ExecManifest
import whisk.core.entity.InstanceId
-import whisk.http.BasicHttpService
+import whisk.http.{BasicHttpService, BasicRasService}
import whisk.spi.SpiLoader
import whisk.utils.ExecutionContextFactory
import whisk.common.TransactionId
@@ -185,7 +185,7 @@ object Invoker {
})
val port = config.servicePort.toInt
- BasicHttpService.startHttpService(new InvokerServer().route, port)(
+ BasicHttpService.startHttpService(new BasicRasService {}.route, port)(
actorSystem,
ActorMaterializer.create(actorSystem))
}
diff --git a/core/invoker/src/main/scala/whisk/core/invoker/InvokerServer.scala b/core/invoker/src/main/scala/whisk/core/invoker/InvokerServer.scala
deleted file mode 100644
index 2b45fca469..0000000000
--- a/core/invoker/src/main/scala/whisk/core/invoker/InvokerServer.scala
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package whisk.core.invoker
-
-import whisk.http.BasicRasService
-
-/**
- * Implements web server to handle certain REST API calls.
- * Currently provides a health ping route, only.
- */
-class InvokerServer() extends BasicRasService {
- override val instanceOrdinal = 1
-}
diff --git a/tests/src/test/scala/whisk/common/SchedulerTests.scala b/tests/src/test/scala/whisk/common/SchedulerTests.scala
index 14d325b5aa..35eaf68d70 100644
--- a/tests/src/test/scala/whisk/common/SchedulerTests.scala
+++ b/tests/src/test/scala/whisk/common/SchedulerTests.scala
@@ -127,7 +127,7 @@ class SchedulerTests extends FlatSpec with Matchers with WskActorSystem with Str
waitForCalls()
stream.toString.split(" ").drop(1).mkString(" ") shouldBe {
- s"[ERROR] [#sid_1] [Scheduler] halted because $msg\n"
+ s"[ERROR] [$transid] [Scheduler] halted because $msg\n"
}
}
diff --git a/tests/src/test/scala/whisk/core/containerpool/test/ContainerProxyTests.scala b/tests/src/test/scala/whisk/core/containerpool/test/ContainerProxyTests.scala
index fcde7e70eb..205834ed40 100644
--- a/tests/src/test/scala/whisk/core/containerpool/test/ContainerProxyTests.scala
+++ b/tests/src/test/scala/whisk/core/containerpool/test/ContainerProxyTests.scala
@@ -19,41 +19,29 @@ package whisk.core.containerpool.test
import java.time.Instant
-import scala.concurrent.Future
-import scala.concurrent.Promise
-import scala.concurrent.duration._
-import org.junit.runner.RunWith
-import org.scalatest.BeforeAndAfterAll
-import org.scalatest.FlatSpecLike
-import org.scalatest.Matchers
-import org.scalatest.junit.JUnitRunner
-import akka.actor.ActorRef
-import akka.actor.ActorSystem
-import akka.actor.FSM
-import akka.actor.FSM.CurrentState
-import akka.actor.FSM.SubscribeTransitionCallBack
-import akka.actor.FSM.Transition
+import akka.actor.FSM.{CurrentState, SubscribeTransitionCallBack, Transition}
+import akka.actor.{ActorRef, ActorSystem, FSM}
import akka.stream.scaladsl.Source
-import akka.testkit.ImplicitSender
-import akka.testkit.TestKit
+import akka.testkit.{ImplicitSender, TestKit}
import akka.util.ByteString
-import common.LoggedFunction
-import common.StreamLogging
-
-import scala.concurrent.ExecutionContext
-import spray.json._
+import common.{LoggedFunction, StreamLogging}
+import org.junit.runner.RunWith
+import org.scalatest.junit.JUnitRunner
+import org.scalatest.{BeforeAndAfterAll, FlatSpecLike, Matchers}
import spray.json.DefaultJsonProtocol._
-import whisk.common.Logging
-import whisk.common.TransactionId
+import spray.json._
+import whisk.common.{Logging, TransactionId}
import whisk.core.connector.ActivationMessage
import whisk.core.containerpool._
import whisk.core.containerpool.logging.LogCollectingException
+import whisk.core.entity.ExecManifest.{ImageName, RuntimeManifest}
import whisk.core.entity._
-import whisk.core.entity.ExecManifest.RuntimeManifest
-import whisk.core.entity.ExecManifest.ImageName
import whisk.core.entity.size._
import whisk.http.Messages
+import scala.concurrent.duration._
+import scala.concurrent.{ExecutionContext, Future, Promise}
+
@RunWith(classOf[JUnitRunner])
class ContainerProxyTests
extends TestKit(ActorSystem("ContainerProxys"))
@@ -79,7 +67,7 @@ class ContainerProxyTests
val action = ExecutableWhiskAction(EntityPath("actionSpace"), EntityName("actionName"), exec)
// create a transaction id to set the start time and control queue time
- val messageTransId = TransactionId(BigDecimal(TransactionId.testing.meta.id))
+ val messageTransId = TransactionId(TransactionId.testing.meta.id)
val initInterval = {
val now = messageTransId.meta.start.plusMillis(50) // this is the queue time for cold start
diff --git a/tests/src/test/scala/whisk/core/controller/test/ControllerTestCommon.scala b/tests/src/test/scala/whisk/core/controller/test/ControllerTestCommon.scala
index e9df1d530b..fdceb1411e 100644
--- a/tests/src/test/scala/whisk/core/controller/test/ControllerTestCommon.scala
+++ b/tests/src/test/scala/whisk/core/controller/test/ControllerTestCommon.scala
@@ -30,7 +30,6 @@ import akka.http.scaladsl.testkit.ScalatestRouteTest
import akka.http.scaladsl.testkit.RouteTestTimeout
import spray.json.DefaultJsonProtocol
import spray.json.JsString
-import whisk.common.TransactionCounter
import whisk.common.TransactionId
import whisk.core.WhiskConfig
import whisk.core.connector.ActivationMessage
@@ -52,15 +51,12 @@ protected trait ControllerTestCommon
with BeforeAndAfterAll
with ScalatestRouteTest
with Matchers
- with TransactionCounter
with DbUtils
with ExecHelpers
with WhiskServices
with StreamLogging {
- override val instanceOrdinal = 0
- override val instance = InstanceId(instanceOrdinal)
- val activeAckTopicIndex = InstanceId(instanceOrdinal)
+ val activeAckTopicIndex = InstanceId(0)
implicit val routeTestTimeout = RouteTestTimeout(90 seconds)
diff --git a/tests/src/test/scala/whisk/core/controller/test/PackagesApiTests.scala b/tests/src/test/scala/whisk/core/controller/test/PackagesApiTests.scala
index c0e2e40223..706ca9cb66 100644
--- a/tests/src/test/scala/whisk/core/controller/test/PackagesApiTests.scala
+++ b/tests/src/test/scala/whisk/core/controller/test/PackagesApiTests.scala
@@ -17,19 +17,19 @@
package whisk.core.controller.test
-import scala.language.postfixOps
-import org.junit.runner.RunWith
-import org.scalatest.junit.JUnitRunner
-import akka.http.scaladsl.model.StatusCodes._
import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
+import akka.http.scaladsl.model.StatusCodes._
import akka.http.scaladsl.server.Route
+import org.junit.runner.RunWith
+import org.scalatest.junit.JUnitRunner
import spray.json.DefaultJsonProtocol._
import spray.json._
-import whisk.core.entity._
import whisk.core.controller.WhiskPackagesApi
import whisk.core.entitlement.Collection
-import whisk.http.ErrorResponse
-import whisk.http.Messages
+import whisk.core.entity._
+import whisk.http.{ErrorResponse, Messages}
+
+import scala.language.postfixOps
/**
* Tests Packages API.
@@ -750,7 +750,7 @@ class PackagesApiTests extends ControllerTestCommon with WhiskPackagesApi {
status should be(Conflict)
val response = responseAs[ErrorResponse]
response.error should include("Package not empty (contains 1 entity)")
- response.code.id should be >= 1L
+ response.code.id should not be empty
}
}
diff --git a/tests/src/test/scala/whisk/core/controller/test/WebActionsApiTests.scala b/tests/src/test/scala/whisk/core/controller/test/WebActionsApiTests.scala
index 97d5999401..0dd58486ca 100644
--- a/tests/src/test/scala/whisk/core/controller/test/WebActionsApiTests.scala
+++ b/tests/src/test/scala/whisk/core/controller/test/WebActionsApiTests.scala
@@ -334,7 +334,7 @@ trait WebActionsApiBaseTests extends ControllerTestCommon with BeforeAndAfterEac
error.fields.get("error").get shouldBe JsString(m)
}
error.fields.get("code") shouldBe defined
- error.fields.get("code").get shouldBe an[JsNumber]
+ error.fields.get("code").get shouldBe an[JsString]
}
Seq(None, Some(WhiskAuthHelpers.newIdentity())).foreach { creds =>
diff --git a/tests/src/test/scala/whisk/core/database/test/DbUtils.scala b/tests/src/test/scala/whisk/core/database/test/DbUtils.scala
index 7cf9074fa1..b341bae88f 100644
--- a/tests/src/test/scala/whisk/core/database/test/DbUtils.scala
+++ b/tests/src/test/scala/whisk/core/database/test/DbUtils.scala
@@ -18,6 +18,7 @@
package whisk.core.database.test
import java.util.concurrent.TimeoutException
+import java.util.concurrent.atomic.AtomicInteger
import scala.collection.mutable.ListBuffer
import scala.concurrent.Await
@@ -31,7 +32,6 @@ import scala.util.Success
import scala.util.Try
import spray.json._
import spray.json.DefaultJsonProtocol._
-import whisk.common.TransactionCounter
import whisk.common.TransactionId
import whisk.core.database._
import whisk.core.database.memory.MemoryArtifactStore
@@ -45,13 +45,15 @@ import whisk.core.entity.types.EntityStore
* operations with those that flow through the cache. To mitigate this, use unique asset
* names in tests, and defer all cleanup to the end of a test suite.
*/
-trait DbUtils extends TransactionCounter {
+trait DbUtils {
implicit val dbOpTimeout = 15 seconds
- override val instanceOrdinal = 0
- val instance = InstanceId(instanceOrdinal)
+ val instance = InstanceId(0)
val docsToDelete = ListBuffer[(ArtifactStore[_], DocInfo)]()
case class RetryOp() extends Throwable
+ val cnt = new AtomicInteger(0)
+ def transid() = TransactionId(cnt.incrementAndGet().toString)
+
/**
* Retry an operation 'step()' awaiting its result up to 'timeout'.
* Attempt the operation up to 'count' times. The future from the
diff --git a/tests/src/test/scala/whisk/core/database/test/DocumentHandlerTests.scala b/tests/src/test/scala/whisk/core/database/test/DocumentHandlerTests.scala
index c68fffd75c..20dc280c7b 100644
--- a/tests/src/test/scala/whisk/core/database/test/DocumentHandlerTests.scala
+++ b/tests/src/test/scala/whisk/core/database/test/DocumentHandlerTests.scala
@@ -17,14 +17,16 @@
package whisk.core.database.test
+import java.util.concurrent.atomic.AtomicInteger
+
+import common.WskActorSystem
import org.junit.runner.RunWith
-import org.scalatest.{FlatSpec, Matchers, OptionValues}
+import org.scalatest.concurrent.ScalaFutures
import org.scalatest.junit.JUnitRunner
+import org.scalatest.{FlatSpec, Matchers, OptionValues}
+import spray.json.DefaultJsonProtocol._
import spray.json._
-import DefaultJsonProtocol._
-import common.WskActorSystem
-import org.scalatest.concurrent.ScalaFutures
-import whisk.common.{TransactionCounter, TransactionId}
+import whisk.common.TransactionId
import whisk.core.database.SubjectHandler.SubjectView
import whisk.core.database.WhisksHandler.ROOT_NS
import whisk.core.database._
@@ -33,14 +35,10 @@ import whisk.core.entity._
import scala.concurrent.Future
@RunWith(classOf[JUnitRunner])
-class DocumentHandlerTests
- extends FlatSpec
- with Matchers
- with ScalaFutures
- with OptionValues
- with TransactionCounter
- with WskActorSystem {
- override val instanceOrdinal = 0
+class DocumentHandlerTests extends FlatSpec with Matchers with ScalaFutures with OptionValues with WskActorSystem {
+
+ val cnt = new AtomicInteger(0)
+ def transid() = TransactionId(cnt.incrementAndGet().toString)
behavior of "WhisksHandler computeFields"
diff --git a/tests/src/test/scala/whisk/core/database/test/behavior/ArtifactStoreBehaviorBase.scala b/tests/src/test/scala/whisk/core/database/test/behavior/ArtifactStoreBehaviorBase.scala
index e13e420eef..e22063d6c2 100644
--- a/tests/src/test/scala/whisk/core/database/test/behavior/ArtifactStoreBehaviorBase.scala
+++ b/tests/src/test/scala/whisk/core/database/test/behavior/ArtifactStoreBehaviorBase.scala
@@ -24,7 +24,7 @@ import common.{StreamLogging, WskActorSystem}
import org.scalatest.concurrent.{IntegrationPatience, ScalaFutures}
import org.scalatest.{BeforeAndAfterAll, BeforeAndAfterEach, FlatSpec, Matchers}
import spray.json.{JsObject, JsValue}
-import whisk.common.{TransactionCounter, TransactionId}
+import whisk.common.TransactionId
import whisk.core.database.test.DbUtils
import whisk.core.database.{ArtifactStore, StaleParameter}
import whisk.core.entity._
@@ -35,7 +35,6 @@ import scala.util.Random
trait ArtifactStoreBehaviorBase
extends FlatSpec
with ScalaFutures
- with TransactionCounter
with Matchers
with StreamLogging
with DbUtils
@@ -44,8 +43,6 @@ trait ArtifactStoreBehaviorBase
with BeforeAndAfterEach
with BeforeAndAfterAll {
- override val instanceOrdinal = 0
-
//Bring in sync the timeout used by ScalaFutures and DBUtils
implicit override val patienceConfig: PatienceConfig = PatienceConfig(timeout = dbOpTimeout)
diff --git a/tests/src/test/scala/whisk/core/entity/test/SchemaTests.scala b/tests/src/test/scala/whisk/core/entity/test/SchemaTests.scala
index d6111d002e..99fe13121c 100644
--- a/tests/src/test/scala/whisk/core/entity/test/SchemaTests.scala
+++ b/tests/src/test/scala/whisk/core/entity/test/SchemaTests.scala
@@ -72,12 +72,12 @@ class SchemaTests extends FlatSpec with BeforeAndAfter with ExecHelpers with Mat
behavior of "TransactionId"
it should "serdes a transaction id without extraLogging parameter" in {
- val txIdWithoutParameter = TransactionId(4711)
+ val txIdWithoutParameter = TransactionId("4711")
// test serialization
val serializedTxIdWithoutParameter = TransactionId.serdes.write(txIdWithoutParameter)
serializedTxIdWithoutParameter match {
- case JsArray(Vector(JsNumber(id), JsNumber(_))) =>
+ case JsArray(Vector(JsString(id), JsNumber(_))) =>
assert(id == txIdWithoutParameter.meta.id)
case _ => withClue(serializedTxIdWithoutParameter) { assert(false) }
}
@@ -89,12 +89,12 @@ class SchemaTests extends FlatSpec with BeforeAndAfter with ExecHelpers with Mat
}
it should "serdes a transaction id with extraLogging parameter" in {
- val txIdWithParameter = TransactionId(4711, true)
+ val txIdWithParameter = TransactionId("4711", true)
// test serialization
val serializedTxIdWithParameter = TransactionId.serdes.write(txIdWithParameter)
serializedTxIdWithParameter match {
- case JsArray(Vector(JsNumber(id), JsNumber(_), JsBoolean(extraLogging))) =>
+ case JsArray(Vector(JsString(id), JsNumber(_), JsBoolean(extraLogging))) =>
assert(id == txIdWithParameter.meta.id)
assert(extraLogging)
case _ => withClue(serializedTxIdWithParameter) { assert(false) }
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
With regards,
Apache Git Services