MCPcopy
hub / github.com/rclone/rclone / putCompress

Method putCompress

backend/compress/zstd_handler.go:93–168  ·  view source on GitHub ↗

putCompress compresses the input data and uploads it to the remote, returning the new object and its metadata

(
	ctx context.Context,
	f *Fs,
	in io.Reader,
	src fs.ObjectInfo,
	options []fs.OpenOption,
	mimeType string,
)

Source from the content-addressed store, hash-verified

91
92// putCompress compresses the input data and uploads it to the remote, returning the new object and its metadata
93func (z *zstdModeHandler) putCompress(
94 ctx context.Context,
95 f *Fs,
96 in io.Reader,
97 src fs.ObjectInfo,
98 options []fs.OpenOption,
99 mimeType string,
100) (fs.Object, *ObjectMetadata, error) {
101 // Unwrap reader accounting
102 in, wrap := accounting.UnWrap(in)
103
104 // Add the metadata hasher
105 metaHasher := md5.New()
106 in = io.TeeReader(in, metaHasher)
107
108 // Compress the file
109 pipeReader, pipeWriter := io.Pipe()
110
111 resultsZstd := make(chan compressionResult[SzstdMetadata])
112 go func() {
113 writer, err := NewWriterSzstd(pipeWriter, zstd.WithEncoderLevel(zstd.EncoderLevel(f.opt.CompressionLevel)))
114 if err != nil {
115 resultsZstd <- compressionResult[SzstdMetadata]{err: err}
116 close(resultsZstd)
117 return
118 }
119 _, err = io.Copy(writer, in)
120 if wErr := writer.Close(); wErr != nil && err == nil {
121 err = wErr
122 }
123 if cErr := pipeWriter.Close(); cErr != nil && err == nil {
124 err = cErr
125 }
126
127 resultsZstd <- compressionResult[SzstdMetadata]{err: err, meta: writer.GetMetadata()}
128 close(resultsZstd)
129 }()
130
131 wrappedIn := wrap(bufio.NewReaderSize(pipeReader, bufferSize))
132
133 ht := f.Fs.Hashes().GetOne()
134 var hasher *hash.MultiHasher
135 var err error
136 if ht != hash.None {
137 wrappedIn, wrap = accounting.UnWrap(wrappedIn)
138 hasher, err = hash.NewMultiHasherTypes(hash.NewHashSet(ht))
139 if err != nil {
140 return nil, nil, err
141 }
142 wrappedIn = io.TeeReader(wrappedIn, hasher)
143 wrappedIn = wrap(wrappedIn)
144 }
145
146 o, err := f.rcat(ctx, makeDataName(src.Remote(), src.Size(), f.mode), io.NopCloser(wrappedIn), src.ModTime(ctx), options)
147 if err != nil {
148 return nil, nil, err
149 }
150

Callers

nothing calls this directly

Calls 15

newMetadataMethod · 0.95
UnWrapFunction · 0.92
NewMultiHasherTypesFunction · 0.92
NewHashSetFunction · 0.92
NewWriterSzstdFunction · 0.85
closeFunction · 0.85
wrapFunction · 0.85
makeDataNameFunction · 0.85
GetMetadataMethod · 0.80
GetOneMethod · 0.80
verifyObjectHashMethod · 0.80
CopyMethod · 0.65

Tested by

no test coverage detected