@@ -34,12 +34,6 @@ export function computeHedgeRequestDelay(
34
34
return - 1 ;
35
35
}
36
36
37
- export function cancelOthersOnFinish ( main : Promise < any > , tied : Promise < any > ) : void {
38
- let finished = false ;
39
- main . then ( ( ) => ( ! finished ? tied . cancel ( ) : { } ) ) ;
40
- tied . then ( ( ) => { finished = true ; } ) ;
41
- }
42
-
43
37
export function computeLatency (
44
38
promise : Promise < any > ,
45
39
timer : Measured . Stopwatch ,
@@ -89,6 +83,24 @@ function registerRequestStat<Req>(
89
83
hedgeRequest . then ( onFinish ( 'hedge' ) ) ;
90
84
}
91
85
86
+ function createHeadgeRequest< Req , Rep > (
87
+ originalPromise: Promise< Rep > ,
88
+ delay: number,
89
+ service: Service< Req , Rep > ,
90
+ input: Req
91
+ ): Promise< Rep > {
92
+ let aborted = false ;
93
+ const onOriginalFinish = ( ) => { aborted = true ; } ;
94
+ originalPromise . then ( onOriginalFinish , onOriginalFinish ) ;
95
+
96
+ return new Promise ( ( resolve ) => {
97
+ const executeHedgeRequest = ( ) => {
98
+ if ( ! aborted ) resolve ( service ( input ) ) ;
99
+ } ;
100
+ setTimeout ( executeHedgeRequest , delay ) ;
101
+ } ) ;
102
+ }
103
+
92
104
export default function hedgeRequestFilter< Req , Rep > (
93
105
options: HedgeServiceOptions< Req > ,
94
106
): Filter< Req , Req , Rep , Rep > {
@@ -112,8 +124,7 @@ export default function hedgeRequestFilter<Req, Rep>(
112
124
113
125
const hedgeDelay = computeHedgeRequestDelay ( latencyHistogram , options ) ;
114
126
if ( hedgeDelay >= minMs ) {
115
- const hedgeRequest = Promise . delay ( hedgeDelay ) . then ( ( ) => service ( input ) ) ;
116
- cancelOthersOnFinish ( mainRequest , hedgeRequest ) ;
127
+ const hedgeRequest = createHeadgeRequest ( mainRequest , hedgeDelay , service , input ) ;
117
128
118
129
const hedgeTimer = new Measured . Stopwatch ( ) ;
119
130
computeLatency ( hedgeRequest , hedgeTimer , latencyHistogram , hedgeDelay ) ;
0 commit comments