feat: add option to disable combining the pending part
Signed-off-by: Libo Huang <huanglibo2010@gmail.com>master
							parent
							
								
									77f2180378
								
							
						
					
					
						commit
						117757a5cb
					
				| 
						 | 
					@ -97,6 +97,7 @@ type DriverParameters struct {
 | 
				
			||||||
	MultipartCopyChunkSize      int64
 | 
						MultipartCopyChunkSize      int64
 | 
				
			||||||
	MultipartCopyMaxConcurrency int64
 | 
						MultipartCopyMaxConcurrency int64
 | 
				
			||||||
	MultipartCopyThresholdSize  int64
 | 
						MultipartCopyThresholdSize  int64
 | 
				
			||||||
 | 
						MultipartCombineSmallPart   bool
 | 
				
			||||||
	RootDirectory               string
 | 
						RootDirectory               string
 | 
				
			||||||
	StorageClass                string
 | 
						StorageClass                string
 | 
				
			||||||
	UserAgent                   string
 | 
						UserAgent                   string
 | 
				
			||||||
| 
						 | 
					@ -146,6 +147,7 @@ type driver struct {
 | 
				
			||||||
	MultipartCopyChunkSize      int64
 | 
						MultipartCopyChunkSize      int64
 | 
				
			||||||
	MultipartCopyMaxConcurrency int64
 | 
						MultipartCopyMaxConcurrency int64
 | 
				
			||||||
	MultipartCopyThresholdSize  int64
 | 
						MultipartCopyThresholdSize  int64
 | 
				
			||||||
 | 
						MultipartCombineSmallPart   bool
 | 
				
			||||||
	RootDirectory               string
 | 
						RootDirectory               string
 | 
				
			||||||
	StorageClass                string
 | 
						StorageClass                string
 | 
				
			||||||
	ObjectACL                   string
 | 
						ObjectACL                   string
 | 
				
			||||||
| 
						 | 
					@ -356,6 +358,23 @@ func FromParameters(parameters map[string]interface{}) (*Driver, error) {
 | 
				
			||||||
		return nil, fmt.Errorf("the useDualStack parameter should be a boolean")
 | 
							return nil, fmt.Errorf("the useDualStack parameter should be a boolean")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mutlipartCombineSmallPart := true
 | 
				
			||||||
 | 
						combine := parameters["multipartcombinesmallpart"]
 | 
				
			||||||
 | 
						switch combine := combine.(type) {
 | 
				
			||||||
 | 
						case string:
 | 
				
			||||||
 | 
							b, err := strconv.ParseBool(combine)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, fmt.Errorf("the multipartcombinesmallpart parameter should be a boolean")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							mutlipartCombineSmallPart = b
 | 
				
			||||||
 | 
						case bool:
 | 
				
			||||||
 | 
							mutlipartCombineSmallPart = combine
 | 
				
			||||||
 | 
						case nil:
 | 
				
			||||||
 | 
							// do nothing
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return nil, fmt.Errorf("the multipartcombinesmallpart parameter should be a boolean")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sessionToken := ""
 | 
						sessionToken := ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	params := DriverParameters{
 | 
						params := DriverParameters{
 | 
				
			||||||
| 
						 | 
					@ -373,6 +392,7 @@ func FromParameters(parameters map[string]interface{}) (*Driver, error) {
 | 
				
			||||||
		multipartCopyChunkSize,
 | 
							multipartCopyChunkSize,
 | 
				
			||||||
		multipartCopyMaxConcurrency,
 | 
							multipartCopyMaxConcurrency,
 | 
				
			||||||
		multipartCopyThresholdSize,
 | 
							multipartCopyThresholdSize,
 | 
				
			||||||
 | 
							mutlipartCombineSmallPart,
 | 
				
			||||||
		fmt.Sprint(rootDirectory),
 | 
							fmt.Sprint(rootDirectory),
 | 
				
			||||||
		storageClass,
 | 
							storageClass,
 | 
				
			||||||
		fmt.Sprint(userAgent),
 | 
							fmt.Sprint(userAgent),
 | 
				
			||||||
| 
						 | 
					@ -497,6 +517,7 @@ func New(params DriverParameters) (*Driver, error) {
 | 
				
			||||||
		MultipartCopyChunkSize:      params.MultipartCopyChunkSize,
 | 
							MultipartCopyChunkSize:      params.MultipartCopyChunkSize,
 | 
				
			||||||
		MultipartCopyMaxConcurrency: params.MultipartCopyMaxConcurrency,
 | 
							MultipartCopyMaxConcurrency: params.MultipartCopyMaxConcurrency,
 | 
				
			||||||
		MultipartCopyThresholdSize:  params.MultipartCopyThresholdSize,
 | 
							MultipartCopyThresholdSize:  params.MultipartCopyThresholdSize,
 | 
				
			||||||
 | 
							MultipartCombineSmallPart:   params.MultipartCombineSmallPart,
 | 
				
			||||||
		RootDirectory:               params.RootDirectory,
 | 
							RootDirectory:               params.RootDirectory,
 | 
				
			||||||
		StorageClass:                params.StorageClass,
 | 
							StorageClass:                params.StorageClass,
 | 
				
			||||||
		ObjectACL:                   params.ObjectACL,
 | 
							ObjectACL:                   params.ObjectACL,
 | 
				
			||||||
| 
						 | 
					@ -1386,7 +1407,7 @@ func (w *writer) flushPart() error {
 | 
				
			||||||
		// nothing to write
 | 
							// nothing to write
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if len(w.pendingPart) < int(w.driver.ChunkSize) {
 | 
						if w.driver.MultipartCombineSmallPart && len(w.pendingPart) < int(w.driver.ChunkSize) {
 | 
				
			||||||
		// closing with a small pending part
 | 
							// closing with a small pending part
 | 
				
			||||||
		// combine ready and pending to avoid writing a small part
 | 
							// combine ready and pending to avoid writing a small part
 | 
				
			||||||
		w.readyPart = append(w.readyPart, w.pendingPart...)
 | 
							w.readyPart = append(w.readyPart, w.pendingPart...)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -43,6 +43,7 @@ func init() {
 | 
				
			||||||
	regionEndpoint := os.Getenv("REGION_ENDPOINT")
 | 
						regionEndpoint := os.Getenv("REGION_ENDPOINT")
 | 
				
			||||||
	sessionToken := os.Getenv("AWS_SESSION_TOKEN")
 | 
						sessionToken := os.Getenv("AWS_SESSION_TOKEN")
 | 
				
			||||||
	useDualStack := os.Getenv("S3_USE_DUALSTACK")
 | 
						useDualStack := os.Getenv("S3_USE_DUALSTACK")
 | 
				
			||||||
 | 
						combineSmallPart := os.Getenv("MULTIPART_COMBINE_SMALL_PART")
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		panic(err)
 | 
							panic(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -84,6 +85,10 @@ func init() {
 | 
				
			||||||
		useDualStackBool := false
 | 
							useDualStackBool := false
 | 
				
			||||||
		if useDualStack != "" {
 | 
							if useDualStack != "" {
 | 
				
			||||||
			useDualStackBool, err = strconv.ParseBool(useDualStack)
 | 
								useDualStackBool, err = strconv.ParseBool(useDualStack)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							multipartCombineSmallPart := true
 | 
				
			||||||
 | 
							if combineSmallPart != "" {
 | 
				
			||||||
 | 
								multipartCombineSmallPart, err = strconv.ParseBool(combineSmallPart)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return nil, err
 | 
									return nil, err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					@ -104,6 +109,7 @@ func init() {
 | 
				
			||||||
			defaultMultipartCopyChunkSize,
 | 
								defaultMultipartCopyChunkSize,
 | 
				
			||||||
			defaultMultipartCopyMaxConcurrency,
 | 
								defaultMultipartCopyMaxConcurrency,
 | 
				
			||||||
			defaultMultipartCopyThresholdSize,
 | 
								defaultMultipartCopyThresholdSize,
 | 
				
			||||||
 | 
								multipartCombineSmallPart,
 | 
				
			||||||
			rootDirectory,
 | 
								rootDirectory,
 | 
				
			||||||
			storageClass,
 | 
								storageClass,
 | 
				
			||||||
			driverName + "-test",
 | 
								driverName + "-test",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue