Skip to content

Commit 40a26cc

Browse files
committed
fix(tracing): execute completion callbacks in reverse LIFO order
1 parent 8f11f7f commit 40a26cc

File tree

2 files changed

+65
-52
lines changed

2 files changed

+65
-52
lines changed

sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/CompositeTracer.java

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -89,22 +89,22 @@ public Scope inScope() {
8989

9090
@Override
9191
public void operationSucceeded() {
92-
for (ApiTracer child : children) {
93-
child.operationSucceeded();
92+
for (int i = children.size() - 1; i >= 0; i--) {
93+
children.get(i).operationSucceeded();
9494
}
9595
}
9696

9797
@Override
9898
public void operationCancelled() {
99-
for (ApiTracer child : children) {
100-
child.operationCancelled();
99+
for (int i = children.size() - 1; i >= 0; i--) {
100+
children.get(i).operationCancelled();
101101
}
102102
}
103103

104104
@Override
105105
public void operationFailed(Throwable error) {
106-
for (ApiTracer child : children) {
107-
child.operationFailed(error);
106+
for (int i = children.size() - 1; i >= 0; i--) {
107+
children.get(i).operationFailed(error);
108108
}
109109
}
110110

@@ -132,71 +132,71 @@ public void attemptStarted(Object request, int attemptNumber) {
132132

133133
@Override
134134
public void attemptSucceeded() {
135-
for (ApiTracer child : children) {
136-
child.attemptSucceeded();
135+
for (int i = children.size() - 1; i >= 0; i--) {
136+
children.get(i).attemptSucceeded();
137137
}
138138
}
139139

140140
@Override
141141
public void attemptCancelled() {
142-
for (ApiTracer child : children) {
143-
child.attemptCancelled();
142+
for (int i = children.size() - 1; i >= 0; i--) {
143+
children.get(i).attemptCancelled();
144144
}
145145
}
146146

147147
@Override
148148
public void attemptFailed(Throwable error, org.threeten.bp.Duration delay) {
149-
for (ApiTracer child : children) {
150-
child.attemptFailed(error, delay);
149+
for (int i = children.size() - 1; i >= 0; i--) {
150+
children.get(i).attemptFailed(error, delay);
151151
}
152152
}
153153

154154
@Override
155155
public void attemptFailedDuration(Throwable error, java.time.Duration delay) {
156-
for (ApiTracer child : children) {
157-
child.attemptFailedDuration(error, delay);
156+
for (int i = children.size() - 1; i >= 0; i--) {
157+
children.get(i).attemptFailedDuration(error, delay);
158158
}
159159
}
160160

161161
@Override
162162
public void attemptFailedRetriesExhausted(Throwable error) {
163-
for (ApiTracer child : children) {
164-
child.attemptFailedRetriesExhausted(error);
163+
for (int i = children.size() - 1; i >= 0; i--) {
164+
children.get(i).attemptFailedRetriesExhausted(error);
165165
}
166166
}
167167

168168
@Override
169169
public void attemptPermanentFailure(Throwable error) {
170-
for (ApiTracer child : children) {
171-
child.attemptPermanentFailure(error);
170+
for (int i = children.size() - 1; i >= 0; i--) {
171+
children.get(i).attemptPermanentFailure(error);
172172
}
173173
}
174174

175175
@Override
176176
public void lroStartFailed(Throwable error) {
177-
for (ApiTracer child : children) {
178-
child.lroStartFailed(error);
177+
for (int i = children.size() - 1; i >= 0; i--) {
178+
children.get(i).lroStartFailed(error);
179179
}
180180
}
181181

182182
@Override
183183
public void lroStartSucceeded() {
184-
for (ApiTracer child : children) {
185-
child.lroStartSucceeded();
184+
for (int i = children.size() - 1; i >= 0; i--) {
185+
children.get(i).lroStartSucceeded();
186186
}
187187
}
188188

189189
@Override
190190
public void responseReceived() {
191-
for (ApiTracer child : children) {
192-
child.responseReceived();
191+
for (int i = children.size() - 1; i >= 0; i--) {
192+
children.get(i).responseReceived();
193193
}
194194
}
195195

196196
@Override
197197
public void responseHeadersReceived(Map<String, Object> headers) {
198-
for (ApiTracer child : children) {
199-
child.responseHeadersReceived(headers);
198+
for (int i = children.size() - 1; i >= 0; i--) {
199+
children.get(i).responseHeadersReceived(headers);
200200
}
201201
}
202202

sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/CompositeTracerTest.java

Lines changed: 39 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -122,23 +122,26 @@ void testInScope_childScopeCloseThrows() {
122122
@Test
123123
void testOperationSucceeded() {
124124
compositeTracer.operationSucceeded();
125-
verify(child1).operationSucceeded();
126-
verify(child2).operationSucceeded();
125+
InOrder inOrder = inOrder(child2, child1);
126+
inOrder.verify(child2).operationSucceeded();
127+
inOrder.verify(child1).operationSucceeded();
127128
}
128129

129130
@Test
130131
void testOperationCancelled() {
131132
compositeTracer.operationCancelled();
132-
verify(child1).operationCancelled();
133-
verify(child2).operationCancelled();
133+
InOrder inOrder = inOrder(child2, child1);
134+
inOrder.verify(child2).operationCancelled();
135+
inOrder.verify(child1).operationCancelled();
134136
}
135137

136138
@Test
137139
void testOperationFailed() {
138140
Throwable error = new RuntimeException("test error");
139141
compositeTracer.operationFailed(error);
140-
verify(child1).operationFailed(error);
141-
verify(child2).operationFailed(error);
142+
InOrder inOrder = inOrder(child2, child1);
143+
inOrder.verify(child2).operationFailed(error);
144+
inOrder.verify(child1).operationFailed(error);
142145
}
143146

144147
@Test
@@ -168,15 +171,17 @@ void testAttemptStarted() {
168171
@Test
169172
void testAttemptSucceeded() {
170173
compositeTracer.attemptSucceeded();
171-
verify(child1).attemptSucceeded();
172-
verify(child2).attemptSucceeded();
174+
InOrder inOrder = inOrder(child2, child1);
175+
inOrder.verify(child2).attemptSucceeded();
176+
inOrder.verify(child1).attemptSucceeded();
173177
}
174178

175179
@Test
176180
void testAttemptCancelled() {
177181
compositeTracer.attemptCancelled();
178-
verify(child1).attemptCancelled();
179-
verify(child2).attemptCancelled();
182+
InOrder inOrder = inOrder(child2, child1);
183+
inOrder.verify(child2).attemptCancelled();
184+
inOrder.verify(child1).attemptCancelled();
180185
}
181186

182187
@Test
@@ -185,63 +190,71 @@ void testAttemptFailedDeprecated() {
185190
Throwable error = new RuntimeException("test error");
186191
org.threeten.bp.Duration delay = org.threeten.bp.Duration.ofSeconds(1);
187192
compositeTracer.attemptFailed(error, delay);
188-
verify(child1).attemptFailed(error, delay);
189-
verify(child2).attemptFailed(error, delay);
193+
InOrder inOrder = inOrder(child2, child1);
194+
inOrder.verify(child2).attemptFailed(error, delay);
195+
inOrder.verify(child1).attemptFailed(error, delay);
190196
}
191197

192198
@Test
193199
void testAttemptFailedDuration() {
194200
Throwable error = new RuntimeException("test error");
195201
java.time.Duration delay = java.time.Duration.ofSeconds(1);
196202
compositeTracer.attemptFailedDuration(error, delay);
197-
verify(child1).attemptFailedDuration(error, delay);
198-
verify(child2).attemptFailedDuration(error, delay);
203+
InOrder inOrder = inOrder(child2, child1);
204+
inOrder.verify(child2).attemptFailedDuration(error, delay);
205+
inOrder.verify(child1).attemptFailedDuration(error, delay);
199206
}
200207

201208
@Test
202209
void testAttemptFailedRetriesExhausted() {
203210
Throwable error = new RuntimeException("test error");
204211
compositeTracer.attemptFailedRetriesExhausted(error);
205-
verify(child1).attemptFailedRetriesExhausted(error);
206-
verify(child2).attemptFailedRetriesExhausted(error);
212+
InOrder inOrder = inOrder(child2, child1);
213+
inOrder.verify(child2).attemptFailedRetriesExhausted(error);
214+
inOrder.verify(child1).attemptFailedRetriesExhausted(error);
207215
}
208216

209217
@Test
210218
void testAttemptPermanentFailure() {
211219
Throwable error = new RuntimeException("test error");
212220
compositeTracer.attemptPermanentFailure(error);
213-
verify(child1).attemptPermanentFailure(error);
214-
verify(child2).attemptPermanentFailure(error);
221+
InOrder inOrder = inOrder(child2, child1);
222+
inOrder.verify(child2).attemptPermanentFailure(error);
223+
inOrder.verify(child1).attemptPermanentFailure(error);
215224
}
216225

217226
@Test
218227
void testLroStartFailed() {
219228
Throwable error = new RuntimeException("test error");
220229
compositeTracer.lroStartFailed(error);
221-
verify(child1).lroStartFailed(error);
222-
verify(child2).lroStartFailed(error);
230+
InOrder inOrder = inOrder(child2, child1);
231+
inOrder.verify(child2).lroStartFailed(error);
232+
inOrder.verify(child1).lroStartFailed(error);
223233
}
224234

225235
@Test
226236
void testLroStartSucceeded() {
227237
compositeTracer.lroStartSucceeded();
228-
verify(child1).lroStartSucceeded();
229-
verify(child2).lroStartSucceeded();
238+
InOrder inOrder = inOrder(child2, child1);
239+
inOrder.verify(child2).lroStartSucceeded();
240+
inOrder.verify(child1).lroStartSucceeded();
230241
}
231242

232243
@Test
233244
void testResponseReceived() {
234245
compositeTracer.responseReceived();
235-
verify(child1).responseReceived();
236-
verify(child2).responseReceived();
246+
InOrder inOrder = inOrder(child2, child1);
247+
inOrder.verify(child2).responseReceived();
248+
inOrder.verify(child1).responseReceived();
237249
}
238250

239251
@Test
240252
void testResponseHeadersReceived() {
241253
Map<String, Object> headers = ImmutableMap.<String, Object>of("testHeader", "testValue");
242254
compositeTracer.responseHeadersReceived(headers);
243-
verify(child1).responseHeadersReceived(headers);
244-
verify(child2).responseHeadersReceived(headers);
255+
InOrder inOrder = inOrder(child2, child1);
256+
inOrder.verify(child2).responseHeadersReceived(headers);
257+
inOrder.verify(child1).responseHeadersReceived(headers);
245258
}
246259

247260
@Test

0 commit comments

Comments
 (0)