Skip to content

Commit c2109a6

Browse files
authored
add failure policy to upload directory (#4181)
1 parent d10e67b commit c2109a6

20 files changed

+958
-102
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"services": [
3+
{
4+
"serviceName": "S3",
5+
"type": "minor",
6+
"changeLogMessages": [
7+
"Add FailurePolicy property to TransferUtilityUploadDirectoryRequest to allow configuration of failure handling behavior during directory uploads. The default behavior is set to abort on failure. Users can now choose to either abort the entire operation or continue uploading remaining files when a failure occurs.",
8+
"Add ObjectUploadFailedEvent event to TransferUtilityUploadDirectoryRequest to notify users when an individual file upload fails during a directory upload operation. This event provides details about the failed upload, including the original request, the specific file request and the exception encountered."
9+
]
10+
}
11+
]
12+
}

generator/ServiceClientGeneratorLib/Generators/SourceFiles/AssemblyInfo.cs

Lines changed: 39 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// ------------------------------------------------------------------------------
22
// <auto-generated>
33
// This code was generated by a tool.
4-
// Runtime Version: 17.0.0.0
4+
// Runtime Version: 18.0.0.0
55
//
66
// Changes to this file may cause incorrect behavior and will be lost if
77
// the code is regenerated.
@@ -15,8 +15,8 @@ namespace ServiceClientGenerator.Generators.SourceFiles
1515
/// Class to produce the template output
1616
/// </summary>
1717

18-
#line 1 "C:\dev\repos\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
19-
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")]
18+
#line 1 "D:\CodeBase\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
19+
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "18.0.0.0")]
2020
public partial class AssemblyInfo : BaseGenerator
2121
{
2222
#line hidden
@@ -36,43 +36,43 @@ public override string TransformText()
3636
// associated with an assembly.
3737
[assembly: AssemblyTitle(""");
3838

39-
#line 12 "C:\dev\repos\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
39+
#line 12 "D:\CodeBase\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
4040
this.Write(this.ToStringHelper.ToStringWithCulture(this.Config.AssemblyTitle));
4141

4242
#line default
4343
#line hidden
4444
this.Write("\")]\r\n#if BCL\r\n[assembly: AssemblyDescription(\"");
4545

46-
#line 14 "C:\dev\repos\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
46+
#line 14 "D:\CodeBase\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
4747
this.Write(this.ToStringHelper.ToStringWithCulture(this.Config.AssemblyDescription(versionIdentifier: "4.7.2")));
4848

4949
#line default
5050
#line hidden
5151
this.Write("\")]\r\n#elif NETSTANDARD20\r\n[assembly: AssemblyDescription(\"");
5252

53-
#line 16 "C:\dev\repos\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
53+
#line 16 "D:\CodeBase\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
5454
this.Write(this.ToStringHelper.ToStringWithCulture(this.Config.AssemblyDescription(versionIdentifier: "NetStandard 2.0")));
5555

5656
#line default
5757
#line hidden
5858
this.Write("\")]\r\n#elif NETCOREAPP3_1\r\n[assembly: AssemblyDescription(\"");
5959

60-
#line 18 "C:\dev\repos\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
60+
#line 18 "D:\CodeBase\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
6161
this.Write(this.ToStringHelper.ToStringWithCulture(this.Config.AssemblyDescription(versionIdentifier: ".NET Core 3.1")));
6262

6363
#line default
6464
#line hidden
6565
this.Write("\")]\r\n#elif NET8_0\r\n[assembly: AssemblyDescription(\"");
6666

67-
#line 20 "C:\dev\repos\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
67+
#line 20 "D:\CodeBase\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
6868
this.Write(this.ToStringHelper.ToStringWithCulture(this.Config.AssemblyDescription(versionIdentifier: ".NET 8.0")));
6969

7070
#line default
7171
#line hidden
7272
this.Write("\")]\r\n#else\r\n#error Unknown platform constant - unable to set correct AssemblyDesc" +
7373
"ription\r\n#endif\r\n\r\n");
7474

75-
#line 25 "C:\dev\repos\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
75+
#line 25 "D:\CodeBase\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
7676
if (this.Config.AssemblyTitle=="AWSSDK.DynamoDBv2") {
7777

7878
#line default
@@ -81,23 +81,43 @@ public override string TransformText()
8181
[assembly: InternalsVisibleTo(""AWSSDK.UnitTests.NetFramework, PublicKey=0024000004800000940000000602000000240000525341310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9df0b52aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09d3bc0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf1252ed08a2413f00a28f3a0752a81203f03ccb7f684db373518b4"")]
8282
");
8383

84-
#line 28 "C:\dev\repos\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
84+
#line 28 "D:\CodeBase\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
8585
}
8686

8787
#line default
8888
#line hidden
8989

90-
#line 29 "C:\dev\repos\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
90+
#line 29 "D:\CodeBase\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
9191
if (this.Config.AssemblyTitle=="AWSSDK.S3") {
9292

9393
#line default
9494
#line hidden
95-
this.Write(@"[assembly: InternalsVisibleTo(""AWSSDK.UnitTests.S3.NetFramework, PublicKey=0024000004800000940000000602000000240000525341310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9df0b52aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09d3bc0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf1252ed08a2413f00a28f3a0752a81203f03ccb7f684db373518b4"")]
96-
[assembly: InternalsVisibleTo(""AWSSDK.UnitTests.NetFramework, PublicKey=0024000004800000940000000602000000240000525341310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9df0b52aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09d3bc0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf1252ed08a2413f00a28f3a0752a81203f03ccb7f684db373518b4"")]
97-
[assembly: InternalsVisibleTo(""DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7"")]
98-
");
99-
100-
#line 33 "C:\dev\repos\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
95+
this.Write("[assembly: InternalsVisibleTo(\"AWSSDK.UnitTests.S3.NetFramework, PublicKey=002400" +
96+
"0004800000940000000602000000240000525341310004000001000100db5f59f098d27276c78338" +
97+
"75a6263a3cc74ab17ba9a9df0b52aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa7" +
98+
"6adc811d3c8fc55859b0d09d3bc0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a4799" +
99+
"67c3622762977900eddbf1252ed08a2413f00a28f3a0752a81203f03ccb7f684db373518b4\")]\r\n[" +
100+
"assembly: InternalsVisibleTo(\"AWSSDK.UnitTests.NetFramework, PublicKey=002400000" +
101+
"4800000940000000602000000240000525341310004000001000100db5f59f098d27276c7833875a" +
102+
"6263a3cc74ab17ba9a9df0b52aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76ad" +
103+
"c811d3c8fc55859b0d09d3bc0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c" +
104+
"3622762977900eddbf1252ed08a2413f00a28f3a0752a81203f03ccb7f684db373518b4\")]\r\n\r\n//" +
105+
" We should remove this in the future when TransferUtility Upload/Download direct" +
106+
"ory methods return responses.\r\n// We should update the Integration Tests in Tran" +
107+
"sferUtilityTests.cs to not use the internal methods and instead use the new publ" +
108+
"ic ones that return responses.\r\n[assembly: InternalsVisibleTo(\"AWSSDK.Integratio" +
109+
"nTests.S3.NetFramework, PublicKey=0024000004800000940000000602000000240000525341" +
110+
"310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9df0b52aedbe7252745" +
111+
"db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09d3bc0a84eecd0ba89" +
112+
"1f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf1252ed08a2413f00a28" +
113+
"f3a0752a81203f03ccb7f684db373518b4\")]\r\n[assembly: InternalsVisibleTo(\"DynamicPro" +
114+
"xyGenAssembly2, PublicKey=002400000480000094000000060200000024000052534131000400" +
115+
"0001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734a" +
116+
"a39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64" +
117+
"bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be" +
118+
"11e6a7d3113e92484cf7045cc7\")]\r\n");
119+
120+
#line 37 "D:\CodeBase\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
101121
}
102122

103123
#line default
@@ -126,14 +146,14 @@ public override string TransformText()
126146
// [assembly: AssemblyVersion(""1.0.*"")]
127147
[assembly: AssemblyVersion(""");
128148

129-
#line 56 "C:\dev\repos\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
149+
#line 60 "D:\CodeBase\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
130150
this.Write(this.ToStringHelper.ToStringWithCulture(this.Config.ServiceVersion));
131151

132152
#line default
133153
#line hidden
134154
this.Write("\")]\r\n[assembly: AssemblyFileVersion(\"");
135155

136-
#line 57 "C:\dev\repos\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
156+
#line 61 "D:\CodeBase\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\AssemblyInfo.tt"
137157
this.Write(this.ToStringHelper.ToStringWithCulture(this.Config.ServiceFileVersion));
138158

139159
#line default

generator/ServiceClientGeneratorLib/Generators/SourceFiles/AssemblyInfo.tt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ using System.Runtime.CompilerServices;
2929
<# if (this.Config.AssemblyTitle=="AWSSDK.S3") { #>
3030
[assembly: InternalsVisibleTo("AWSSDK.UnitTests.S3.NetFramework, PublicKey=0024000004800000940000000602000000240000525341310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9df0b52aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09d3bc0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf1252ed08a2413f00a28f3a0752a81203f03ccb7f684db373518b4")]
3131
[assembly: InternalsVisibleTo("AWSSDK.UnitTests.NetFramework, PublicKey=0024000004800000940000000602000000240000525341310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9df0b52aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09d3bc0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf1252ed08a2413f00a28f3a0752a81203f03ccb7f684db373518b4")]
32+
33+
// We should remove this in the future when TransferUtility Upload/Download directory methods return responses.
34+
// We should update the Integration Tests in TransferUtilityTests.cs to not use the internal methods and instead use the new public ones that return responses.
35+
[assembly: InternalsVisibleTo("AWSSDK.IntegrationTests.S3.NetFramework, PublicKey=0024000004800000940000000602000000240000525341310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9df0b52aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09d3bc0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf1252ed08a2413f00a28f3a0752a81203f03ccb7f684db373518b4")]
3236
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")]
3337
<# } #>
3438
[assembly: AssemblyConfiguration("")]

sdk/src/Services/S3/Custom/Transfer/Model/DirectoryResult.cs renamed to sdk/src/Services/S3/Custom/Transfer/DirectoryResult.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
*
2121
*/
2222

23-
namespace Amazon.S3.Transfer.Model
23+
namespace Amazon.S3.Transfer
2424
{
2525
/// <summary>
2626
/// Overall outcome of a directory operation.

sdk/src/Services/S3/Custom/Transfer/Model/FailurePolicy.cs renamed to sdk/src/Services/S3/Custom/Transfer/FailurePolicy.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
*
2121
*/
2222

23-
namespace Amazon.S3.Transfer.Model
23+
namespace Amazon.S3.Transfer
2424
{
2525
/// <summary>
2626
/// Specifies the policy to apply when a failure occurs during a directory transfer operation.

sdk/src/Services/S3/Custom/Transfer/Internal/DownloadDirectoryCommand.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
using Amazon.S3.Util;
3232
using Amazon.Util.Internal;
3333
using Amazon.Runtime;
34-
using Amazon.S3.Transfer.Model;
3534

3635
namespace Amazon.S3.Transfer.Internal
3736
{

sdk/src/Services/S3/Custom/Transfer/Internal/UploadDirectoryCommand.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
*
2121
*/
2222
using System;
23+
using System.Collections.Concurrent;
2324
using System.Collections.Generic;
2425
using System.IO;
2526
using System.Text;
@@ -34,12 +35,15 @@ namespace Amazon.S3.Transfer.Internal
3435
/// </summary>
3536
internal partial class UploadDirectoryCommand : BaseCommand<TransferUtilityUploadDirectoryResponse>
3637
{
38+
private IFailurePolicy _failurePolicy;
39+
private ConcurrentBag<Exception> _errors = new ConcurrentBag<Exception>();
3740
TransferUtilityUploadDirectoryRequest _request;
3841
TransferUtility _utility;
3942
TransferUtilityConfig _config;
4043

4144
int _totalNumberOfFiles;
4245
int _numberOfFilesUploaded;
46+
int _numberOfFilesSuccessfullyUploaded;
4347
long _totalBytes;
4448
long _transferredBytes;
4549

@@ -48,6 +52,10 @@ internal UploadDirectoryCommand(TransferUtility utility, TransferUtilityConfig c
4852
this._utility = utility;
4953
this._request = request;
5054
this._config = config;
55+
_failurePolicy =
56+
request.FailurePolicy == FailurePolicy.AbortOnFailure
57+
? new AbortOnFailurePolicy()
58+
: new ContinueOnFailurePolicy(_errors);
5159
}
5260

5361
internal TransferUtilityUploadRequest ConstructRequest(string basePath, string filepath, string prefix)

sdk/src/Services/S3/Custom/Transfer/Internal/_async/BaseCommand.async.cs

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,6 @@
1313
* permissions and limitations under the License.
1414
*/
1515

16-
using Amazon.S3.Model;
17-
using System;
18-
using System.Collections.Generic;
19-
using System.IO;
20-
using System.Linq;
21-
using System.Text;
2216
using System.Threading;
2317
using System.Threading.Tasks;
2418

@@ -30,24 +24,5 @@ internal abstract partial class BaseCommand<TResponse> where TResponse : class
3024
/// Executes the command and returns a typed response
3125
/// </summary>
3226
public abstract Task<TResponse> ExecuteAsync(CancellationToken cancellationToken);
33-
34-
protected static async Task ExecuteCommandAsync<T>(BaseCommand<T> command, CancellationTokenSource internalCts) where T : class
35-
{
36-
try
37-
{
38-
await command.ExecuteAsync(internalCts.Token)
39-
.ConfigureAwait(continueOnCapturedContext: false);
40-
}
41-
catch (Exception exception)
42-
{
43-
if (!(exception is OperationCanceledException))
44-
{
45-
// Cancel scheduling any more tasks.
46-
// Cancel other upload requests.
47-
internalCts.Cancel();
48-
}
49-
throw;
50-
}
51-
}
5227
}
5328
}

sdk/src/Services/S3/Custom/Transfer/Internal/_bcl+netstandard/DownloadDirectoryCommand.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515

1616
using Amazon.S3.Model;
1717
using Amazon.S3.Util;
18-
using Amazon.S3.Transfer.Model;
1918
using System;
2019
using System.Collections.Concurrent;
2120
using System.Collections.Generic;

0 commit comments

Comments
 (0)