@@ -145,77 +145,20 @@ func (a *archive) writeArchive(index int, rmds *fileset.Fileset[*reader.Metadata
145
145
return checkpoint .SaveKey (context .Background (), a .persister , rmds .Get (), archiveKey (index ), ops ... )
146
146
}
147
147
148
- func (a * archive ) archiveEnabled () bool {
149
- return a .pollsToArchive > 0 && a .persister != nil
150
- }
151
-
152
148
func (a * archive ) restoreArchiveIndex (ctx context.Context ) {
153
- // remove extra "keys" once archive restoration is done
149
+ var err error
150
+ // remove extra "keys" in case `pollsToArchive` has changed between collector restarts
154
151
defer a .removeExtraKeys (ctx )
155
- defer func () {
156
- // store current pollsToArchive
157
- if err := a .persister .Set (ctx , archivePollsToArchiveKey , encodeIndex (a .pollsToArchive )); err != nil {
158
- a .logger .Error ("Error storing polls_to_archive" , zap .Error (err ))
159
- }
160
- }()
161
-
162
- previousPollsToArchive , err := a .getPreviousPollsToArchive (ctx )
163
- if err != nil {
164
- // if there's an error reading previousPollsToArchive, default to current value
165
- previousPollsToArchive = a .pollsToArchive
166
- }
167
152
168
153
a .archiveIndex , err = a .getArchiveIndex (ctx )
169
154
if err != nil {
170
- a .logger .Error ("error while reading the archiveIndexKey. Starting from 0" , zap .Error (err ))
171
- return
172
- }
173
-
174
- if previousPollsToArchive < a .pollsToArchive {
175
- // if archive size has increased, we just increment the index until we enconter a nil value
176
- for a .archiveIndex < a .pollsToArchive && a .isSet (ctx , a .archiveIndex ) {
177
- a .archiveIndex ++
178
- }
179
- } else if previousPollsToArchive > a .pollsToArchive {
180
- // we will only attempt to rewrite archive if the archive size has shrunk
181
- a .logger .Warn ("polls_to_archive has changed. Will attempt to rewrite archive" )
182
- a .rewriteArchive (ctx , previousPollsToArchive )
183
- }
184
- }
185
-
186
- func (a * archive ) rewriteArchive (ctx context.Context , previousPollsToArchive int ) {
187
- // helper to rewrite data from oldIndex to newIndex
188
- rewrite := func (newIdx , oldIdex int ) error {
189
- oldVal , err := a .persister .Get (ctx , archiveKey (oldIdex ))
190
- if err != nil {
191
- return err
192
- }
193
- return a .persister .Set (ctx , archiveKey (newIdx ), oldVal )
155
+ a .logger .Error ("error while fetching archive index" , zap .Error (err ))
156
+ a .archiveIndex = 0
194
157
}
195
- // Calculate the least recent index, w.r.t. new archive size
196
-
197
- leastRecentIndex := mod (a .archiveIndex - a .pollsToArchive , previousPollsToArchive )
198
-
199
- // Refer archive.md for the detailed design
200
- if mod (a .archiveIndex - 1 , previousPollsToArchive ) > a .pollsToArchive {
201
- for i := 0 ; i < a .pollsToArchive ; i ++ {
202
- if err := rewrite (i , leastRecentIndex ); err != nil {
203
- a .logger .Error ("error while swapping archive" , zap .Error (err ))
204
- }
205
- leastRecentIndex = (leastRecentIndex + 1 ) % previousPollsToArchive
206
- }
158
+ if a .archiveIndex >= a .pollsToArchive || a .archiveIndex < 0 {
159
+ // archiveIndex is out of bounds. This most likely happened if `pollsToArchive` changed between collector restarts
160
+ // we just set archiveIndex to 0 in this case i.e. to reboot the archive index
207
161
a .archiveIndex = 0
208
- } else {
209
- if ! a .isSet (ctx , a .archiveIndex ) {
210
- // If the current index points at an unset key, no need to do anything
211
- return
212
- }
213
- for i := 0 ; i < a .pollsToArchive - a .archiveIndex ; i ++ {
214
- if err := rewrite (a .archiveIndex + i , leastRecentIndex ); err != nil {
215
- a .logger .Warn ("error while swapping archive" , zap .Error (err ))
216
- }
217
- leastRecentIndex = (leastRecentIndex + 1 ) % previousPollsToArchive
218
- }
219
162
}
220
163
}
221
164
@@ -227,20 +170,6 @@ func (a *archive) removeExtraKeys(ctx context.Context) {
227
170
}
228
171
}
229
172
230
- func (a * archive ) getPreviousPollsToArchive (ctx context.Context ) (int , error ) {
231
- byteIndex , err := a .persister .Get (ctx , archivePollsToArchiveKey )
232
- if err != nil {
233
- a .logger .Error ("error while reading the archiveIndexKey" , zap .Error (err ))
234
- return 0 , err
235
- }
236
- previousPollsToArchive , err := decodeIndex (byteIndex )
237
- if err != nil {
238
- a .logger .Error ("error while decoding previousPollsToArchive" , zap .Error (err ))
239
- return 0 , err
240
- }
241
- return previousPollsToArchive , nil
242
- }
243
-
244
173
func (a * archive ) getArchiveIndex (ctx context.Context ) (int , error ) {
245
174
byteIndex , err := a .persister .Get (ctx , archiveIndexKey )
246
175
if err != nil {
@@ -253,8 +182,9 @@ func (a *archive) getArchiveIndex(ctx context.Context) (int, error) {
253
182
return archiveIndex , nil
254
183
}
255
184
256
- func (a * archive ) isSet (ctx context.Context , index int ) bool {
257
- val , err := a .persister .Get (ctx , archiveKey (index ))
185
+ // isSet returns true of index `i` is set in the archive ring buffer
186
+ func (a * archive ) isSet (ctx context.Context , i int ) bool {
187
+ val , err := a .persister .Get (ctx , archiveKey (i ))
258
188
return val != nil && err == nil
259
189
}
260
190
0 commit comments