This is an automated email from the ASF dual-hosted git repository.
houshengbo 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 9e5cec1 Allow for commands to retry on network error. (#3776)
9e5cec1 is described below
commit 9e5cec1f0e4b98c59e584d453b06a741be4a8c3b
Author: rodric rabbah <[email protected]>
AuthorDate: Mon Jun 18 10:33:54 2018 -0400
Allow for commands to retry on network error. (#3776)
Add test for run cmd with retry.
---
.../scala/src/main/scala/whisk/utils/Retry.scala | 5 ++-
tests/src/test/scala/common/TestUtils.java | 2 +-
tests/src/test/scala/common/Wsk.scala | 46 +++++++++++-----------
3 files changed, 27 insertions(+), 26 deletions(-)
diff --git a/common/scala/src/main/scala/whisk/utils/Retry.scala
b/common/scala/src/main/scala/whisk/utils/Retry.scala
index 9ab3102..2931e71 100644
--- a/common/scala/src/main/scala/whisk/utils/Retry.scala
+++ b/common/scala/src/main/scala/whisk/utils/Retry.scala
@@ -22,12 +22,13 @@ import scala.concurrent.duration._
object retry {
/**
- * Retry a method which returns a value or throws an exception on failure,
up to N times,
+ * Retries a method which returns a value or throws an exception on failure,
up to N times,
* and optionally sleeping up to specified duration between retries.
*
- * @param fn the method to retry, fn is expected to throw an exception if it
fails, else should return a value of type T
+ * @param fn the function to retry; fn is expected to throw an exception if
it fails, else should return a value of type T
* @param N the maximum number of times to apply fn, must be >= 1
* @param waitBeforeRetry an option specifying duration to wait before
retrying method, will not wait if none given
+ * @param retryMessage an optional message to emit before retrying function
* @return the result of fn iff it is successful
* @throws Throwable exception from fn (or an illegal argument exception if
N is < 1)
*/
diff --git a/tests/src/test/scala/common/TestUtils.java
b/tests/src/test/scala/common/TestUtils.java
index d310ff4..a4e7a4b 100644
--- a/tests/src/test/scala/common/TestUtils.java
+++ b/tests/src/test/scala/common/TestUtils.java
@@ -57,9 +57,9 @@ public class TestUtils {
public static final int SUCCESS_EXIT = 0;
public static final int ERROR_EXIT = 1;
public static final int MISUSE_EXIT = 2;
+ public static final int NETWORK_ERROR_EXIT = 3;
public static final int DONTCARE_EXIT = -1; // any value is ok
public static final int ANY_ERROR_EXIT = -2; // any non-zero
value is ok
- public static final int NETWORK_ERROR_EXIT = 3;
public static final int ACCEPTED = 202; // 202
public static final int BAD_REQUEST = 144; // 400 - 256 = 144
diff --git a/tests/src/test/scala/common/Wsk.scala
b/tests/src/test/scala/common/Wsk.scala
index 27ac636..a335f03 100644
--- a/tests/src/test/scala/common/Wsk.scala
+++ b/tests/src/test/scala/common/Wsk.scala
@@ -1032,32 +1032,22 @@ trait RunWskCmd extends BaseRunWsk {
workingDir: File = new File("."),
stdinFile: Option[File] = None,
showCmd: Boolean = false,
- hideFromOutput: Seq[String] = Seq()): RunResult = {
+ hideFromOutput: Seq[String] = Seq(),
+ retriesOnNetworkError: Int = 3): RunResult = {
val args = baseCommand
if (verbose) args += "--verbose"
if (showCmd) println(args.mkString(" ") + " " + params.mkString(" "))
- val rr =
- retry(
- {
- val rr = TestUtils.runCmd(
- DONTCARE_EXIT,
- workingDir,
- TestUtils.logger,
- sys.env ++ env,
- stdinFile.getOrElse(null),
- args ++ params: _*)
-
- if (expectedExitCode != NETWORK_ERROR_EXIT) {
- withClue(hideStr(reportFailure(args ++ params, expectedExitCode,
rr).toString(), hideFromOutput)) {
- rr.exitCode should not be NETWORK_ERROR_EXIT
- }
- }
-
- rr
- },
- 3,
- Some(1.second),
- Some(s"CLI encountered a network error, retrying command..."))
+ val rr = retry(
+ 0,
+ retriesOnNetworkError,
+ () =>
+ TestUtils.runCmd(
+ DONTCARE_EXIT,
+ workingDir,
+ TestUtils.logger,
+ sys.env ++ env,
+ stdinFile.getOrElse(null),
+ args ++ params: _*))
withClue(hideStr(reportFailure(args ++ params, expectedExitCode,
rr).toString(), hideFromOutput)) {
if (expectedExitCode != TestUtils.DONTCARE_EXIT) {
@@ -1070,6 +1060,16 @@ trait RunWskCmd extends BaseRunWsk {
rr
}
+
+ /** Retries cmd on network error exit. */
+ private def retry(i: Int, N: Int, cmd: () => RunResult): RunResult = {
+ val rr = cmd()
+ if (rr.exitCode == NETWORK_ERROR_EXIT && i < N) {
+ Thread.sleep(1.second.toMillis)
+ println(s"command will retry to due to network error: $rr")
+ retry(i + 1, N, cmd)
+ } else rr
+ }
}
object WskAdmin {
--
To stop receiving notification emails like this one, please contact
[email protected].