PutObjectsSnowball will put multiple objects with a single put call. A (compressed) TAR file will be created which will contain multiple objects. The key for each object will be used for the destination in the specified bucket. Total size should be < 5TB. This function blocks until 'objs' is closed
(ctx context.Context, bucketName string, opts SnowballOptions, objs <-chan SnowballObject)
| 107 | // Total size should be < 5TB. |
| 108 | // This function blocks until 'objs' is closed and the content has been uploaded. |
| 109 | func (c *Client) PutObjectsSnowball(ctx context.Context, bucketName string, opts SnowballOptions, objs <-chan SnowballObject) (err error) { |
| 110 | err = opts.Opts.validate(c) |
| 111 | if err != nil { |
| 112 | return err |
| 113 | } |
| 114 | var tmpWriter io.Writer |
| 115 | var getTmpReader func() (rc readSeekCloser, sz int64, err error) |
| 116 | if opts.InMemory { |
| 117 | b := bytes.NewBuffer(nil) |
| 118 | tmpWriter = b |
| 119 | getTmpReader = func() (readSeekCloser, int64, error) { |
| 120 | return nopReadSeekCloser{bytes.NewReader(b.Bytes())}, int64(b.Len()), nil |
| 121 | } |
| 122 | } else { |
| 123 | f, err := os.CreateTemp("", "s3-putsnowballobjects-*") |
| 124 | if err != nil { |
| 125 | return err |
| 126 | } |
| 127 | name := f.Name() |
| 128 | tmpWriter = f |
| 129 | var once sync.Once |
| 130 | defer once.Do(func() { |
| 131 | f.Close() |
| 132 | }) |
| 133 | defer os.Remove(name) |
| 134 | getTmpReader = func() (readSeekCloser, int64, error) { |
| 135 | once.Do(func() { |
| 136 | f.Close() |
| 137 | }) |
| 138 | f, err := os.Open(name) |
| 139 | if err != nil { |
| 140 | return nil, 0, err |
| 141 | } |
| 142 | st, err := f.Stat() |
| 143 | if err != nil { |
| 144 | return nil, 0, err |
| 145 | } |
| 146 | return f, st.Size(), nil |
| 147 | } |
| 148 | } |
| 149 | flush := func() error { return nil } |
| 150 | if !opts.Compress { |
| 151 | if !opts.InMemory { |
| 152 | // Insert buffer for writes. |
| 153 | buf := bufio.NewWriterSize(tmpWriter, 1<<20) |
| 154 | flush = buf.Flush |
| 155 | tmpWriter = buf |
| 156 | } |
| 157 | } else { |
| 158 | s2c := s2.NewWriter(tmpWriter, s2.WriterBetterCompression()) |
| 159 | flush = s2c.Close |
| 160 | defer s2c.Close() |
| 161 | tmpWriter = s2c |
| 162 | } |
| 163 | t := tar.NewWriter(tmpWriter) |
| 164 | |
| 165 | objectLoop: |
| 166 | for { |