This is an automated email from the ASF dual-hosted git repository. dubeejw pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-openwhisk.git
The following commit(s) were added to refs/heads/master by this push: new 6de2694 Enforce WhiskAction equality mod DocRevision. (#3121) 6de2694 is described below commit 6de269440b8ccc20bb1e21de0f81e8a727921d56 Author: rodric rabbah <rod...@gmail.com> AuthorDate: Wed Jan 3 08:24:00 2018 -0500 Enforce WhiskAction equality mod DocRevision. (#3121) --- .../main/scala/whisk/core/connector/Message.scala | 9 --------- .../main/scala/whisk/core/entity/WhiskAction.scala | 5 +++++ .../containerpool/test/ContainerPoolTests.scala | 15 ++++++++++++++ .../scala/whisk/core/entity/test/SchemaTests.scala | 23 ++++++++++++++++++++-- 4 files changed, 41 insertions(+), 11 deletions(-) diff --git a/common/scala/src/main/scala/whisk/core/connector/Message.scala b/common/scala/src/main/scala/whisk/core/connector/Message.scala index c7cff9f..d79ba26 100644 --- a/common/scala/src/main/scala/whisk/core/connector/Message.scala +++ b/common/scala/src/main/scala/whisk/core/connector/Message.scala @@ -58,15 +58,6 @@ case class ActivationMessage(override val transid: TransactionId, cause: Option[ActivationId] = None) extends Message { - def meta = - JsObject("meta" -> { - cause map { c => - JsObject(c.toJsObject.fields ++ activationId.toJsObject.fields) - } getOrElse { - activationId.toJsObject - } - }) - override def serialize = ActivationMessage.serdes.write(this).compactPrint override def toString = { diff --git a/common/scala/src/main/scala/whisk/core/entity/WhiskAction.scala b/common/scala/src/main/scala/whisk/core/entity/WhiskAction.scala index afd85cc..4aaddbd 100644 --- a/common/scala/src/main/scala/whisk/core/entity/WhiskAction.scala +++ b/common/scala/src/main/scala/whisk/core/entity/WhiskAction.scala @@ -216,6 +216,11 @@ case class WhiskActionMetaData(namespace: EntityPath, * * exec is typed to CodeExec to guarantee executability by an Invoker. * + * Note: Two actions are equal regardless of their DocRevision if there is one. + * The invoker uses action equality when matching actions to warm containers. + * That means creating an action, invoking it, then deleting/recreating/reinvoking + * it will reuse the previous container. The delete/recreate restores the SemVer to 0.0.1. + * * @param namespace the namespace for the action * @param name the name of the action * @param exec the action executable details diff --git a/tests/src/test/scala/whisk/core/containerpool/test/ContainerPoolTests.scala b/tests/src/test/scala/whisk/core/containerpool/test/ContainerPoolTests.scala index a607f5b..dcfe5e4 100644 --- a/tests/src/test/scala/whisk/core/containerpool/test/ContainerPoolTests.scala +++ b/tests/src/test/scala/whisk/core/containerpool/test/ContainerPoolTests.scala @@ -90,6 +90,7 @@ class ContainerPoolTests val runMessage = createRunMessage(action, invocationNamespace) val runMessageDifferentAction = createRunMessage(differentAction, invocationNamespace) + val runMessageDifferentVersion = createRunMessage(action.copy().revision(DocRevision("v2")), invocationNamespace) val runMessageDifferentNamespace = createRunMessage(action, differentInvocationNamespace) val runMessageDifferentEverything = createRunMessage(differentAction, differentInvocationNamespace) @@ -133,6 +134,20 @@ class ContainerPoolTests containers(1).expectNoMsg(100.milliseconds) } + it should "reuse a warm container when action is the same even if revision changes" in within(timeout) { + val (containers, factory) = testContainers(2) + val feed = TestProbe() + val pool = system.actorOf(ContainerPool.props(factory, 2, 2, feed.ref)) + + pool ! runMessage + containers(0).expectMsg(runMessage) + containers(0).send(pool, NeedWork(warmedData())) + + pool ! runMessageDifferentVersion + containers(0).expectMsg(runMessageDifferentVersion) + containers(1).expectNoMsg(100.milliseconds) + } + it should "create a container if it cannot find a matching container" in within(timeout) { val (containers, factory) = testContainers(2) val feed = TestProbe() 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 dd3fa04..504db38 100644 --- a/tests/src/test/scala/whisk/core/entity/test/SchemaTests.scala +++ b/tests/src/test/scala/whisk/core/entity/test/SchemaTests.scala @@ -26,17 +26,16 @@ import scala.language.postfixOps import scala.language.reflectiveCalls import scala.util.Failure import scala.util.Try - import org.junit.runner.RunWith import org.scalatest.BeforeAndAfter import org.scalatest.FlatSpec import org.scalatest.Matchers import org.scalatest.junit.JUnitRunner - import spray.json._ import spray.json.DefaultJsonProtocol._ import whisk.core.controller.test.WhiskAuthHelpers import whisk.core.entitlement.Privilege +import whisk.core.entity.ExecManifest.{ImageName, RuntimeManifest} import whisk.core.entity._ import whisk.core.entity.size.SizeInt import whisk.http.Messages @@ -469,6 +468,26 @@ class SchemaTests extends FlatSpec with BeforeAndAfter with ExecHelpers with Mat } } + it should "compare as equal two actions even if their revision does not match" in { + val exec = CodeExecAsString(RuntimeManifest("actionKind", ImageName("testImage")), "testCode", None) + val actionA = WhiskAction(EntityPath("actionSpace"), EntityName("actionName"), exec) + val actionB = actionA.copy() + val actionC = actionA.copy() + actionC.revision(DocRevision("2")) + actionA shouldBe actionB + actionA shouldBe actionC + } + + it should "compare as equal two executable actions even if their revision does not match" in { + val exec = CodeExecAsString(RuntimeManifest("actionKind", ImageName("testImage")), "testCode", None) + val actionA = ExecutableWhiskAction(EntityPath("actionSpace"), EntityName("actionName"), exec) + val actionB = actionA.copy() + val actionC = actionA.copy() + actionC.revision(DocRevision("2")) + actionA shouldBe actionB + actionA shouldBe actionC + } + it should "reject malformed JSON" in { val b64 = Base64.getEncoder() val contents = b64.encodeToString("tarball".getBytes) -- To stop receiving notification emails like this one, please contact ['"commits@openwhisk.apache.org" <commits@openwhisk.apache.org>'].