5
5
"context"
6
6
"fmt"
7
7
"io"
8
- "os"
9
8
"slices"
10
9
"sort"
11
10
"strings"
@@ -40,12 +39,6 @@ func WithCompactionObjectOptions(options ...ObjectOption) CompactionOption {
40
39
}
41
40
}
42
41
43
- func WithCompactionTempDir (tempdir string ) CompactionOption {
44
- return func (p * compactionConfig ) {
45
- p .tempdir = tempdir
46
- }
47
- }
48
-
49
42
func WithCompactionDestination (storage objstore.Bucket ) CompactionOption {
50
43
return func (p * compactionConfig ) {
51
44
p .destination = storage
@@ -54,7 +47,6 @@ func WithCompactionDestination(storage objstore.Bucket) CompactionOption {
54
47
55
48
type compactionConfig struct {
56
49
objectOptions []ObjectOption
57
- tempdir string
58
50
source objstore.BucketReader
59
51
destination objstore.Bucket
60
52
}
@@ -66,7 +58,6 @@ func Compact(
66
58
options ... CompactionOption ,
67
59
) (m []* metastorev1.BlockMeta , err error ) {
68
60
c := & compactionConfig {
69
- tempdir : os .TempDir (),
70
61
source : storage ,
71
62
destination : storage ,
72
63
}
@@ -89,9 +80,9 @@ func Compact(
89
80
90
81
compacted := make ([]* metastorev1.BlockMeta , 0 , len (plan ))
91
82
for _ , p := range plan {
92
- md , compactionErr := p .Compact (ctx , c .destination , c . tempdir )
83
+ md , compactionErr := p .Compact (ctx , c .destination )
93
84
if compactionErr != nil {
94
- return nil , err
85
+ return nil , compactionErr
95
86
}
96
87
compacted = append (compacted , md )
97
88
}
@@ -182,14 +173,12 @@ func newBlockCompaction(
182
173
return p
183
174
}
184
175
185
- func (b * CompactionPlan ) Compact (ctx context.Context , dst objstore.Bucket , tmpdir string ) (m * metastorev1.BlockMeta , err error ) {
186
- w , err := NewBlockWriter (dst , b .path , tmpdir )
187
- if err != nil {
188
- return nil , fmt .Errorf ("block writer: %w" , err )
189
- }
176
+ func (b * CompactionPlan ) Compact (ctx context.Context , dst objstore.Bucket ) (m * metastorev1.BlockMeta , err error ) {
177
+ w := NewBlockWriter (ctx , dst , b .path )
190
178
defer func () {
191
- err = multierror . New ( err , w .Close ()). Err ()
179
+ _ = w .Close ()
192
180
}()
181
+
193
182
// Datasets are compacted in a strict order.
194
183
for i , s := range b .datasets {
195
184
b .datasetIndex .resetDatasetIndex (uint32 (i ))
@@ -207,7 +196,7 @@ func (b *CompactionPlan) Compact(ctx context.Context, dst objstore.Bucket, tmpdi
207
196
return nil , fmt .Errorf ("writing metadata: %w" , err )
208
197
}
209
198
b .meta .Size = w .Offset ()
210
- if err = w .Upload ( ctx ); err != nil {
199
+ if err = w .Close ( ); err != nil {
211
200
return nil , fmt .Errorf ("flushing block writer: %w" , err )
212
201
}
213
202
return b .meta , nil
@@ -266,7 +255,6 @@ type datasetCompaction struct {
266
255
parent * CompactionPlan
267
256
meta * metastorev1.Dataset
268
257
labels * metadata.LabelBuilder
269
- path string // Set at open.
270
258
271
259
datasets []* Dataset
272
260
@@ -312,42 +300,38 @@ func (m *datasetCompaction) append(s *Dataset) {
312
300
}
313
301
314
302
func (m * datasetCompaction ) compact (ctx context.Context , w * Writer ) (err error ) {
315
- if err = m .open (ctx , w .Dir ()); err != nil {
303
+ off := w .Offset ()
304
+ m .meta .TableOfContents = make ([]uint64 , 0 , 3 )
305
+ m .meta .TableOfContents = append (m .meta .TableOfContents , w .Offset ())
306
+
307
+ if err = m .open (ctx , w ); err != nil {
316
308
return fmt .Errorf ("failed to open sections for compaction: %w" , err )
317
309
}
318
- defer func () {
319
- err = multierror .New (err , m .cleanup ()).Err ()
320
- }()
321
310
if err = m .mergeAndClose (ctx ); err != nil {
322
311
return fmt .Errorf ("failed to merge datasets: %w" , err )
323
312
}
324
- if err = m .writeTo (w ); err != nil {
325
- return fmt .Errorf ("failed to write sections: %w" , err )
313
+
314
+ m .meta .TableOfContents = append (m .meta .TableOfContents , w .Offset ())
315
+ if _ , err = w .ReadFrom (bytes .NewReader (m .indexRewriter .buf )); err != nil {
316
+ return fmt .Errorf ("failed to read index: %w" , err )
317
+ }
318
+ m .meta .TableOfContents = append (m .meta .TableOfContents , w .Offset ())
319
+ if _ , err = w .ReadFrom (bytes .NewReader (m .symbolsRewriter .buf .Bytes ())); err != nil {
320
+ return fmt .Errorf ("failed to read symbols: %w" , err )
326
321
}
322
+
323
+ m .meta .Size = w .Offset () - off
324
+ m .meta .Labels = m .labels .Build ()
327
325
return nil
328
326
}
329
327
330
- func (m * datasetCompaction ) open (ctx context.Context , path string ) (err error ) {
331
- m .path = path
332
- defer func () {
333
- if err != nil {
334
- err = multierror .New (err , m .cleanup ()).Err ()
335
- }
336
- }()
337
-
338
- if err = os .MkdirAll (m .path , 0o777 ); err != nil {
339
- return err
340
- }
341
-
328
+ func (m * datasetCompaction ) open (ctx context.Context , w io.Writer ) (err error ) {
342
329
var estimatedProfileTableSize int64
343
330
for _ , ds := range m .datasets {
344
331
estimatedProfileTableSize += ds .sectionSize (SectionProfiles )
345
332
}
346
333
pageBufferSize := estimatePageBufferSize (estimatedProfileTableSize )
347
- m .profilesWriter , err = newProfileWriter (m .path , pageBufferSize )
348
- if err != nil {
349
- return err
350
- }
334
+ m .profilesWriter = newProfileWriter (pageBufferSize , w )
351
335
352
336
m .indexRewriter = newIndexRewriter ()
353
337
m .symbolsRewriter = newSymbolsRewriter ()
@@ -373,7 +357,6 @@ func (m *datasetCompaction) open(ctx context.Context, path string) (err error) {
373
357
}
374
358
return merr .Err ()
375
359
}
376
-
377
360
return nil
378
361
}
379
362
@@ -433,30 +416,6 @@ func (m *datasetCompaction) close() (err error) {
433
416
return err
434
417
}
435
418
436
- func (m * datasetCompaction ) writeTo (w * Writer ) error {
437
- off := w .Offset ()
438
- m .meta .TableOfContents = make ([]uint64 , 0 , 3 )
439
- m .meta .TableOfContents = append (m .meta .TableOfContents , w .Offset ())
440
- if err := w .ReadFromFile (FileNameProfilesParquet ); err != nil {
441
- return err
442
- }
443
- m .meta .TableOfContents = append (m .meta .TableOfContents , w .Offset ())
444
- if _ , err := w .ReadFrom (bytes .NewReader (m .indexRewriter .buf )); err != nil {
445
- return err
446
- }
447
- m .meta .TableOfContents = append (m .meta .TableOfContents , w .Offset ())
448
- if _ , err := w .ReadFrom (bytes .NewReader (m .symbolsRewriter .buf .Bytes ())); err != nil {
449
- return err
450
- }
451
- m .meta .Size = w .Offset () - off
452
- m .meta .Labels = m .labels .Build ()
453
- return nil
454
- }
455
-
456
- func (m * datasetCompaction ) cleanup () error {
457
- return os .RemoveAll (m .path )
458
- }
459
-
460
419
func newIndexRewriter () * indexRewriter {
461
420
return & indexRewriter {
462
421
symbols : make (map [string ]struct {}),
0 commit comments