This is an automated email from the ASF dual-hosted git repository.
markusthoemmes 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 4181f7c Allow invoker pools to overlap for small N. (#3751)
4181f7c is described below
commit 4181f7cda8cdf5022244e6c14bfe313112f0b730
Author: rodric rabbah <[email protected]>
AuthorDate: Mon Jun 18 14:14:00 2018 -0400
Allow invoker pools to overlap for small N. (#3751)
For small N, allow the managed invokers to overlap with blackbox invokers.
As an example, for a blackbox fraction of 10%, and two invokers, the
blackbox
pool will have size 1, but the managed pool will utilize both invokers.
---
.../ShardingContainerPoolBalancer.scala | 8 ++++---
.../test/ShardingContainerPoolBalancerTests.scala | 27 ++++++++++++++++++++++
2 files changed, 32 insertions(+), 3 deletions(-)
diff --git
a/core/controller/src/main/scala/whisk/core/loadBalancer/ShardingContainerPoolBalancer.scala
b/core/controller/src/main/scala/whisk/core/loadBalancer/ShardingContainerPoolBalancer.scala
index eb95936..bad3842 100644
---
a/core/controller/src/main/scala/whisk/core/loadBalancer/ShardingContainerPoolBalancer.scala
+++
b/core/controller/src/main/scala/whisk/core/loadBalancer/ShardingContainerPoolBalancer.scala
@@ -424,12 +424,14 @@ case class ShardingContainerPoolBalancerState(
val oldSize = _invokers.size
val newSize = newInvokers.size
- val blackboxes = Math.max(1, (newSize.toDouble * blackboxFraction).toInt)
- val managed = Math.max(1, newSize - blackboxes)
+ // for small N, allow the managed invokers to overlap with blackbox
invokers, and
+ // further assume that blackbox invokers << managed invokers
+ val managed = Math.max(1, Math.ceil(newSize.toDouble * (1 -
blackboxFraction)).toInt)
+ val blackboxes = Math.max(1, Math.floor(newSize.toDouble *
blackboxFraction).toInt)
_invokers = newInvokers
- _blackboxInvokers = _invokers.takeRight(blackboxes)
_managedInvokers = _invokers.take(managed)
+ _blackboxInvokers = _invokers.takeRight(blackboxes)
if (oldSize != newSize) {
_managedStepSizes =
ShardingContainerPoolBalancer.pairwiseCoprimeNumbersUntil(managed)
diff --git
a/tests/src/test/scala/whisk/core/loadBalancer/test/ShardingContainerPoolBalancerTests.scala
b/tests/src/test/scala/whisk/core/loadBalancer/test/ShardingContainerPoolBalancerTests.scala
index 49712c2..2f8ce96 100644
---
a/tests/src/test/scala/whisk/core/loadBalancer/test/ShardingContainerPoolBalancerTests.scala
+++
b/tests/src/test/scala/whisk/core/loadBalancer/test/ShardingContainerPoolBalancerTests.scala
@@ -83,6 +83,33 @@ class ShardingContainerPoolBalancerTests extends FlatSpec
with Matchers with Str
state.blackboxStepSizes shouldBe Seq(1)
}
+ it should "allow managed partition to overlap with blackbox for small N" in {
+ Seq(0.1, 0.2, 0.3, 0.4, 0.5).foreach { bf =>
+ val state =
ShardingContainerPoolBalancerState()(ShardingContainerPoolBalancerConfig(bf, 1))
+
+ (1 to 100).toSeq.foreach { i =>
+ state.updateInvokers((1 to i).map(_ => healthy(1)))
+
+ withClue(s"invoker count $bf $i:") {
+ state.managedInvokers.length should be <= i
+ state.blackboxInvokers should have size Math.max(1, (bf * i).toInt)
+
+ val m = state.managedInvokers.length
+ val b = state.blackboxInvokers.length
+ bf match {
+ // written out explicitly for clarity
+ case 0.1 if i < 10 => m + b shouldBe i + 1
+ case 0.2 if i < 5 => m + b shouldBe i + 1
+ case 0.3 if i < 4 => m + b shouldBe i + 1
+ case 0.4 if i < 3 => m + b shouldBe i + 1
+ case 0.5 if i < 2 => m + b shouldBe i + 1
+ case _ => m + b shouldBe i
+ }
+ }
+ }
+ }
+ }
+
it should "update the cluster size, adjusting the invoker slots accordingly"
in {
val slots = 10
val state =
ShardingContainerPoolBalancerState()(ShardingContainerPoolBalancerConfig(0.5,
slots))
--
To stop receiving notification emails like this one, please contact
[email protected].