Skip to content

Commit 66eb158

Browse files
author
ehennum
committed
Bug:24202 exponential backoff for retry
git-svn-id: svn+ssh://svn.marklogic.com/project/engsvn/client-api/java/branches/b1_0@161552 62cac252-8da6-4816-9e9d-6dc37b19578c
1 parent 66e9661 commit 66eb158

File tree

1 file changed

+40
-29
lines changed

1 file changed

+40
-29
lines changed

src/main/java/com/marklogic/client/impl/JerseyServices.java

Lines changed: 40 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.util.Iterator;
2525
import java.util.List;
2626
import java.util.Map;
27+
import java.util.Random;
2728
import java.util.Set;
2829
import java.util.concurrent.ConcurrentLinkedQueue;
2930

@@ -122,8 +123,10 @@ public void verify(String hostname, String[] cns, String[] subjectAlts)
122123
private ApacheHttpClient4 client;
123124
private WebResource connection;
124125

125-
private int maxRetries = 64;
126-
private int delayMillis = 125;
126+
private Random randRetry = new Random();
127+
private int maxRetries = 9;
128+
private int delayFloor = 120;
129+
private int delayMultiplier = 5;
127130

128131
private boolean isFirstRequest = false;
129132

@@ -366,7 +369,7 @@ public void deleteDocument(RequestLogger reqlog, DocumentDescriptor desc,
366369
response.close();
367370

368371
try {
369-
Thread.sleep(delayMillis);
372+
Thread.sleep(calculateDelay(randRetry, retry));
370373
} catch (InterruptedException e) {}
371374
}
372375
if (retry >= maxRetries) {
@@ -480,7 +483,7 @@ private boolean getDocumentImpl(RequestLogger reqlog,
480483
response.close();
481484

482485
try {
483-
Thread.sleep(delayMillis);
486+
Thread.sleep(calculateDelay(randRetry, retry));
484487
} catch (InterruptedException e) {}
485488
}
486489
if (retry >= maxRetries) {
@@ -578,7 +581,7 @@ private boolean getDocumentImpl(RequestLogger reqlog,
578581
response.close();
579582

580583
try {
581-
Thread.sleep(delayMillis);
584+
Thread.sleep(calculateDelay(randRetry, retry));
582585
} catch (InterruptedException e) {}
583586
}
584587
if (retry >= maxRetries) {
@@ -688,7 +691,7 @@ public DocumentDescriptor head(RequestLogger reqlog, String uri,
688691
response.close();
689692

690693
try {
691-
Thread.sleep(delayMillis);
694+
Thread.sleep(calculateDelay(randRetry, retry));
692695
} catch (InterruptedException e) {}
693696
}
694697
if (retry >= maxRetries) {
@@ -840,7 +843,7 @@ private void putDocumentImpl(RequestLogger reqlog, DocumentDescriptor desc,
840843
if (!isResendable)
841844
throw new ResourceNotResendableException("Cannot retry request for "+uri);
842845
try {
843-
Thread.sleep(delayMillis);
846+
Thread.sleep(calculateDelay(randRetry, retry));
844847
} catch (InterruptedException e) {}
845848
}
846849
if (retry >= maxRetries) {
@@ -937,7 +940,7 @@ private void putDocumentImpl(RequestLogger reqlog, DocumentDescriptor desc,
937940
if (hasStreamingPart)
938941
throw new ResourceNotResendableException("Cannot retry request for "+uri);
939942
try {
940-
Thread.sleep(delayMillis);
943+
Thread.sleep(calculateDelay(randRetry, retry));
941944
} catch (InterruptedException e) {}
942945
}
943946
if (retry >= maxRetries) {
@@ -1008,7 +1011,7 @@ public String openTransaction(String name, int timeLimit)
10081011
response.close();
10091012

10101013
try {
1011-
Thread.sleep(delayMillis);
1014+
Thread.sleep(calculateDelay(randRetry, retry));
10121015
} catch (InterruptedException e) {}
10131016
}
10141017
if (retry >= maxRetries) {
@@ -1083,7 +1086,7 @@ private void completeTransaction(String transactionId, String result)
10831086
response.close();
10841087

10851088
try {
1086-
Thread.sleep(delayMillis);
1089+
Thread.sleep(calculateDelay(randRetry, retry));
10871090
} catch (InterruptedException e) {}
10881091
}
10891092
if (retry >= maxRetries) {
@@ -1413,7 +1416,7 @@ else if (payloadFormat != Format.XML && payloadFormat != Format.JSON)
14131416
response.close();
14141417

14151418
try {
1416-
Thread.sleep(delayMillis);
1419+
Thread.sleep(calculateDelay(randRetry, retry));
14171420
} catch (InterruptedException e) {
14181421
}
14191422
}
@@ -1478,7 +1481,7 @@ public void deleteSearch(RequestLogger reqlog, DeleteQueryDefinition queryDef, S
14781481
response.close();
14791482

14801483
try {
1481-
Thread.sleep(delayMillis);
1484+
Thread.sleep(calculateDelay(randRetry, retry));
14821485
} catch (InterruptedException e) {
14831486
}
14841487
}
@@ -1612,7 +1615,7 @@ public <T> T values(Class<T> as, ValuesDefinition valDef, String mimetype,
16121615
response.close();
16131616

16141617
try {
1615-
Thread.sleep(delayMillis);
1618+
Thread.sleep(calculateDelay(randRetry, retry));
16161619
} catch (InterruptedException e) {}
16171620
}
16181621
if (retry >= maxRetries) {
@@ -1673,7 +1676,7 @@ public <T> T valuesList(Class<T> as, ValuesListDefinition valDef,
16731676
response.close();
16741677

16751678
try {
1676-
Thread.sleep(delayMillis);
1679+
Thread.sleep(calculateDelay(randRetry, retry));
16771680
} catch (InterruptedException e) {}
16781681
}
16791682
if (retry >= maxRetries) {
@@ -1728,7 +1731,7 @@ public <T> T optionsList(Class<T> as, String mimetype, String transactionId)
17281731
response.close();
17291732

17301733
try {
1731-
Thread.sleep(delayMillis);
1734+
Thread.sleep(calculateDelay(randRetry, retry));
17321735
} catch (InterruptedException e) {}
17331736
}
17341737
if (retry >= maxRetries) {
@@ -1780,7 +1783,7 @@ public <T> T getValue(RequestLogger reqlog, String type, String key,
17801783
response.close();
17811784

17821785
try {
1783-
Thread.sleep(delayMillis);
1786+
Thread.sleep(calculateDelay(randRetry, retry));
17841787
} catch (InterruptedException e) {}
17851788
}
17861789
if (retry >= maxRetries) {
@@ -1839,7 +1842,7 @@ public <T> T getValues(RequestLogger reqlog, String type, String mimetype,
18391842
response.close();
18401843

18411844
try {
1842-
Thread.sleep(delayMillis);
1845+
Thread.sleep(calculateDelay(randRetry, retry));
18431846
} catch (InterruptedException e) {}
18441847
}
18451848
if (retry >= maxRetries) {
@@ -1989,7 +1992,7 @@ private void putPostValueImpl(RequestLogger reqlog, String method,
19891992
throw new ResourceNotResendableException(
19901993
"Cannot retry request for "+connectPath);
19911994
try {
1992-
Thread.sleep(delayMillis);
1995+
Thread.sleep(calculateDelay(randRetry, retry));
19931996
} catch (InterruptedException e) {}
19941997
}
19951998
if (retry >= maxRetries) {
@@ -2045,7 +2048,7 @@ public void deleteValue(RequestLogger reqlog, String type, String key)
20452048
response.close();
20462049

20472050
try {
2048-
Thread.sleep(delayMillis);
2051+
Thread.sleep(calculateDelay(randRetry, retry));
20492052
} catch (InterruptedException e) {}
20502053
}
20512054
if (retry >= maxRetries) {
@@ -2093,7 +2096,7 @@ public void deleteValues(RequestLogger reqlog, String type)
20932096
response.close();
20942097

20952098
try {
2096-
Thread.sleep(delayMillis);
2099+
Thread.sleep(calculateDelay(randRetry, retry));
20972100
} catch (InterruptedException e) {}
20982101
}
20992102
if (retry >= maxRetries) {
@@ -2140,7 +2143,7 @@ public <R extends AbstractReadHandle> R getResource(
21402143
response.close();
21412144

21422145
try {
2143-
Thread.sleep(delayMillis);
2146+
Thread.sleep(calculateDelay(randRetry, retry));
21442147
} catch (InterruptedException e) {}
21452148
}
21462149
if (retry >= maxRetries) {
@@ -2183,7 +2186,7 @@ public ServiceResultIterator getIteratedResource(
21832186
response.close();
21842187

21852188
try {
2186-
Thread.sleep(delayMillis);
2189+
Thread.sleep(calculateDelay(randRetry, retry));
21872190
} catch (InterruptedException e) {}
21882191
}
21892192
if (retry >= maxRetries) {
@@ -2237,7 +2240,7 @@ R putResource(RequestLogger reqlog, String path, RequestParameters params,
22372240
if (!isResendable)
22382241
throw new ResourceNotResendableException("Cannot retry request for "+path);
22392242
try {
2240-
Thread.sleep(delayMillis);
2243+
Thread.sleep(calculateDelay(randRetry, retry));
22412244
} catch (InterruptedException e) {}
22422245
}
22432246
if (retry >= maxRetries) {
@@ -2296,7 +2299,7 @@ R putResource(RequestLogger reqlog, String path, RequestParameters params,
22962299
if (hasStreamingPart)
22972300
throw new ResourceNotResendableException("Cannot retry request for "+path);
22982301
try {
2299-
Thread.sleep(delayMillis);
2302+
Thread.sleep(calculateDelay(randRetry, retry));
23002303
} catch (InterruptedException e) {}
23012304
}
23022305
if (retry >= maxRetries) {
@@ -2353,7 +2356,7 @@ public <R extends AbstractReadHandle> R postResource(
23532356
if (!isResendable)
23542357
throw new ResourceNotResendableException("Cannot retry request for "+path);
23552358
try {
2356-
Thread.sleep(delayMillis);
2359+
Thread.sleep(calculateDelay(randRetry, retry));
23572360
} catch (InterruptedException e) {}
23582361
}
23592362
if (retry >= maxRetries) {
@@ -2408,7 +2411,7 @@ public <R extends AbstractReadHandle, W extends AbstractWriteHandle> R postResou
24082411
if (hasStreamingPart)
24092412
throw new ResourceNotResendableException("Cannot retry request for "+path);
24102413
try {
2411-
Thread.sleep(delayMillis);
2414+
Thread.sleep(calculateDelay(randRetry, retry));
24122415
} catch (InterruptedException e) {}
24132416
}
24142417
if (retry >= maxRetries) {
@@ -2463,7 +2466,7 @@ public ServiceResultIterator postIteratedResource(
24632466
if (!isResendable)
24642467
throw new ResourceNotResendableException("Cannot retry request for "+path);
24652468
try {
2466-
Thread.sleep(delayMillis);
2469+
Thread.sleep(calculateDelay(randRetry, retry));
24672470
} catch (InterruptedException e) {}
24682471
}
24692472
if (retry >= maxRetries) {
@@ -2509,7 +2512,7 @@ public <W extends AbstractWriteHandle> ServiceResultIterator postIteratedResourc
25092512
if (hasStreamingPart)
25102513
throw new ResourceNotResendableException("Cannot retry request for "+path);
25112514
try {
2512-
Thread.sleep(delayMillis);
2515+
Thread.sleep(calculateDelay(randRetry, retry));
25132516
} catch (InterruptedException e) {}
25142517
}
25152518
if (retry >= maxRetries) {
@@ -2554,7 +2557,7 @@ public <R extends AbstractReadHandle> R deleteResource(
25542557
response.close();
25552558

25562559
try {
2557-
Thread.sleep(delayMillis);
2560+
Thread.sleep(calculateDelay(randRetry, retry));
25582561
} catch (InterruptedException e) {}
25592562
}
25602563
if (retry >= maxRetries) {
@@ -2998,6 +3001,14 @@ private String stringJoin(Collection collection, String separator,
29983001
return (builder != null) ? builder.toString() : null;
29993002
}
30003003

3004+
private int calculateDelay(Random rand, int iteration) {
3005+
int base = (iteration == 0) ? delayMultiplier :
3006+
(1 << iteration) * delayMultiplier;
3007+
return delayFloor + base + rand.nextInt(
3008+
(iteration + 1 < maxRetries) ? base : base / 2
3009+
);
3010+
}
3011+
30013012
public class JerseyResult implements ServiceResult {
30023013
private RequestLogger reqlog;
30033014
private BodyPart part;

0 commit comments

Comments
 (0)