@@ -206,6 +206,80 @@ public void onUploadFailed(TransferSnapshot transferSnapshot, Exception ex) {
206
206
assertEquals (4 , fileTransferTracker .allUploaded ().size ());
207
207
}
208
208
209
+ public void testTransferSnapshotOnFileTransferUploadFail () throws Exception {
210
+ AtomicInteger fileTransferSucceeded = new AtomicInteger ();
211
+ AtomicInteger fileTransferFailed = new AtomicInteger ();
212
+ AtomicInteger translogTransferSucceeded = new AtomicInteger ();
213
+ AtomicInteger translogTransferFailed = new AtomicInteger ();
214
+
215
+ doAnswer (invocationOnMock -> {
216
+ ActionListener <TransferFileSnapshot > listener = (ActionListener <TransferFileSnapshot >) invocationOnMock .getArguments ()[2 ];
217
+ Set <TransferFileSnapshot > transferFileSnapshots = (Set <TransferFileSnapshot >) invocationOnMock .getArguments ()[0 ];
218
+
219
+ TransferFileSnapshot actualFileSnapshot = transferFileSnapshots .iterator ().next ();
220
+ FileTransferException testException = new FileTransferException (
221
+ actualFileSnapshot ,
222
+ new RuntimeException ("FileTransferUploadNeedsToFail-Exception" )
223
+ );
224
+
225
+ listener .onFailure (testException );
226
+ transferFileSnapshots .stream ().skip (1 ).forEach (listener ::onResponse );
227
+ return null ;
228
+ }).when (transferService ).uploadBlobs (anySet (), anyMap (), any (ActionListener .class ), any (WritePriority .class ));
229
+
230
+ FileTransferTracker fileTransferTracker = new FileTransferTracker (
231
+ new ShardId ("index" , "indexUUid" , 0 ),
232
+ remoteTranslogTransferTracker
233
+ ) {
234
+ @ Override
235
+ public void onSuccess (TransferFileSnapshot fileSnapshot ) {
236
+ fileTransferSucceeded .incrementAndGet ();
237
+ super .onSuccess (fileSnapshot );
238
+ }
239
+
240
+ @ Override
241
+ public void onFailure (TransferFileSnapshot fileSnapshot , Exception e ) {
242
+ fileTransferFailed .incrementAndGet ();
243
+ super .onFailure (fileSnapshot , e );
244
+ }
245
+ };
246
+
247
+ TranslogTransferManager translogTransferManager = new TranslogTransferManager (
248
+ shardId ,
249
+ transferService ,
250
+ remoteBaseTransferPath .add (TRANSLOG .getName ()),
251
+ remoteBaseTransferPath .add (METADATA .getName ()),
252
+ fileTransferTracker ,
253
+ remoteTranslogTransferTracker ,
254
+ DefaultRemoteStoreSettings .INSTANCE ,
255
+ isTranslogMetadataEnabled
256
+ );
257
+
258
+ SetOnce <Exception > exception = new SetOnce <>();
259
+ assertFalse (translogTransferManager .transferSnapshot (createTransferSnapshot (), new TranslogTransferListener () {
260
+ @ Override
261
+ public void onUploadComplete (TransferSnapshot transferSnapshot ) {
262
+ translogTransferSucceeded .incrementAndGet ();
263
+ }
264
+
265
+ @ Override
266
+ public void onUploadFailed (TransferSnapshot transferSnapshot , Exception ex ) {
267
+ translogTransferFailed .incrementAndGet ();
268
+ exception .set (ex );
269
+ }
270
+ }));
271
+
272
+ assertNotNull (exception .get ());
273
+ assertTrue (exception .get () instanceof TranslogUploadFailedException );
274
+ assertEquals ("Failed to upload 1 files during transfer" , exception .get ().getMessage ());
275
+ assertEquals (0 , exception .get ().getSuppressed ().length );
276
+ assertEquals (3 , fileTransferSucceeded .get ());
277
+ assertEquals (1 , fileTransferFailed .get ());
278
+ assertEquals (0 , translogTransferSucceeded .get ());
279
+ assertEquals (1 , translogTransferFailed .get ());
280
+ assertEquals (3 , fileTransferTracker .allUploaded ().size ());
281
+ }
282
+
209
283
public void testTransferSnapshotOnUploadTimeout () throws Exception {
210
284
doAnswer (invocationOnMock -> {
211
285
Set <TransferFileSnapshot > transferFileSnapshots = invocationOnMock .getArgument (0 );
0 commit comments