@@ -19,6 +19,10 @@ type writerV3 struct {
19
19
files []block.File
20
20
footer Footer
21
21
22
+ encodersV3
23
+ }
24
+
25
+ type encodersV3 struct {
22
26
stringsEncoder * symbolsEncoder [string ]
23
27
mappingsEncoder * symbolsEncoder [v1.InMemoryMapping ]
24
28
functionsEncoder * symbolsEncoder [v1.InMemoryFunction ]
@@ -27,22 +31,10 @@ type writerV3 struct {
27
31
28
32
func newWriterV3 (c * Config ) * writerV3 {
29
33
return & writerV3 {
30
- config : c ,
31
- index : IndexFile {
32
- Header : IndexHeader {
33
- Magic : symdbMagic ,
34
- Version : FormatV3 ,
35
- },
36
- },
37
- footer : Footer {
38
- Magic : symdbMagic ,
39
- Version : FormatV3 ,
40
- },
41
-
42
- stringsEncoder : newStringsEncoder (),
43
- mappingsEncoder : newMappingsEncoder (),
44
- functionsEncoder : newFunctionsEncoder (),
45
- locationsEncoder : newLocationsEncoder (),
34
+ config : c ,
35
+ index : newIndexFileV3 (),
36
+ footer : newFooterV3 (),
37
+ encodersV3 : newEncodersV3 (),
46
38
}
47
39
}
48
40
@@ -58,7 +50,7 @@ func (w *writerV3) writePartitions(partitions []*PartitionWriter) (err error) {
58
50
w .files = []block.File {w .dataFile .meta ()}
59
51
}()
60
52
for _ , p := range partitions {
61
- if err = writePartitionV3 (w , p ); err != nil {
53
+ if err = writePartitionV3 (w . dataFile . w , & w . encodersV3 , p ); err != nil {
62
54
return fmt .Errorf ("failed to write partition: %w" , err )
63
55
}
64
56
w .index .PartitionHeaders = append (w .index .PartitionHeaders , & p .header )
@@ -83,17 +75,17 @@ func (w *writerV3) newFile(path string) (f *fileWriter, err error) {
83
75
return f , err
84
76
}
85
77
86
- func writePartitionV3 (w * writerV3 , p * PartitionWriter ) (err error ) {
87
- if p .header .V3 .Strings , err = writeSymbolsBlock (w . dataFile , p .strings .slice , w .stringsEncoder ); err != nil {
78
+ func writePartitionV3 (w * writerOffset , e * encodersV3 , p * PartitionWriter ) (err error ) {
79
+ if p .header .V3 .Strings , err = writeSymbolsBlock (w , p .strings .slice , e .stringsEncoder ); err != nil {
88
80
return err
89
81
}
90
- if p .header .V3 .Mappings , err = writeSymbolsBlock (w . dataFile , p .mappings .slice , w .mappingsEncoder ); err != nil {
82
+ if p .header .V3 .Mappings , err = writeSymbolsBlock (w , p .mappings .slice , e .mappingsEncoder ); err != nil {
91
83
return err
92
84
}
93
- if p .header .V3 .Functions , err = writeSymbolsBlock (w . dataFile , p .functions .slice , w .functionsEncoder ); err != nil {
85
+ if p .header .V3 .Functions , err = writeSymbolsBlock (w , p .functions .slice , e .functionsEncoder ); err != nil {
94
86
return err
95
87
}
96
- if p .header .V3 .Locations , err = writeSymbolsBlock (w . dataFile , p .locations .slice , w .locationsEncoder ); err != nil {
88
+ if p .header .V3 .Locations , err = writeSymbolsBlock (w , p .locations .slice , e .locationsEncoder ); err != nil {
97
89
return err
98
90
}
99
91
for ci , c := range p .stacktraces .chunks {
@@ -102,7 +94,7 @@ func writePartitionV3(w *writerV3, p *PartitionWriter) (err error) {
102
94
stacks = uint32 (len (p .stacktraces .hashToIdx ))
103
95
}
104
96
h := StacktraceBlockHeader {
105
- Offset : w .dataFile . w . offset ,
97
+ Offset : w .offset ,
106
98
Partition : p .header .Partition ,
107
99
BlockIndex : uint16 (ci ),
108
100
Encoding : StacktraceEncodingGroupVarint ,
@@ -111,7 +103,7 @@ func writePartitionV3(w *writerV3, p *PartitionWriter) (err error) {
111
103
StacktraceMaxNodes : c .partition .maxNodesPerChunk ,
112
104
}
113
105
crc := crc32 .New (castagnoli )
114
- if h .Size , err = c .WriteTo (io .MultiWriter (crc , w . dataFile )); err != nil {
106
+ if h .Size , err = c .WriteTo (io .MultiWriter (crc , w )); err != nil {
115
107
return fmt .Errorf ("writing stacktrace chunk data: %w" , err )
116
108
}
117
109
h .CRC = crc .Sum32 ()
@@ -120,18 +112,63 @@ func writePartitionV3(w *writerV3, p *PartitionWriter) (err error) {
120
112
return nil
121
113
}
122
114
123
- func writeSymbolsBlock [T any ](w * fileWriter , s []T , e * symbolsEncoder [T ]) (h SymbolsBlockHeader , err error ) {
124
- h .Offset = uint64 (w .w . offset )
115
+ func writeSymbolsBlock [T any ](w * writerOffset , s []T , e * symbolsEncoder [T ]) (h SymbolsBlockHeader , err error ) {
116
+ h .Offset = uint64 (w .offset )
125
117
crc := crc32 .New (castagnoli )
126
- mw := io .MultiWriter (crc , w . w )
118
+ mw := io .MultiWriter (crc , w )
127
119
if err = e .encode (mw , s ); err != nil {
128
120
return h , err
129
121
}
130
- h .Size = uint32 (w .w . offset ) - uint32 (h .Offset )
122
+ h .Size = uint32 (w .offset ) - uint32 (h .Offset )
131
123
h .CRC = crc .Sum32 ()
132
124
h .Length = uint32 (len (s ))
133
125
h .BlockSize = uint32 (e .blockSize )
134
126
h .BlockHeaderSize = uint16 (e .blockEncoder .headerSize ())
135
127
h .Format = e .blockEncoder .format ()
136
128
return h , nil
137
129
}
130
+
131
+ func WritePartition (p * PartitionWriter , dst io.Writer ) error {
132
+ index := newIndexFileV3 ()
133
+ footer := newFooterV3 ()
134
+ encoders := newEncodersV3 ()
135
+ w := withWriterOffset (dst )
136
+
137
+ if err := writePartitionV3 (w , & encoders , p ); err != nil {
138
+ return fmt .Errorf ("failed to write partition: %w" , err )
139
+ }
140
+ index .PartitionHeaders = append (index .PartitionHeaders , & p .header )
141
+ footer .IndexOffset = uint64 (w .offset )
142
+ if _ , err := index .WriteTo (w ); err != nil {
143
+ return fmt .Errorf ("failed to write index: %w" , err )
144
+ }
145
+ if _ , err := w .Write (footer .MarshalBinary ()); err != nil {
146
+ return fmt .Errorf ("failed to write footer: %w" , err )
147
+ }
148
+ return nil
149
+ }
150
+
151
+ func newEncodersV3 () encodersV3 {
152
+ return encodersV3 {
153
+ stringsEncoder : newStringsEncoder (),
154
+ mappingsEncoder : newMappingsEncoder (),
155
+ functionsEncoder : newFunctionsEncoder (),
156
+ locationsEncoder : newLocationsEncoder (),
157
+ }
158
+ }
159
+
160
+ func newFooterV3 () Footer {
161
+ return Footer {
162
+ Magic : symdbMagic ,
163
+ Version : FormatV3 ,
164
+ }
165
+ }
166
+
167
+ func newIndexFileV3 () IndexFile {
168
+ return IndexFile {
169
+ Header : IndexHeader {
170
+ Magic : symdbMagic ,
171
+ Version : FormatV3 ,
172
+ },
173
+ }
174
+ }
0 commit comments