|
4 | 4 | "bytes" |
5 | 5 | "encoding/binary" |
6 | 6 | "errors" |
7 | | - "fmt" |
8 | 7 | "math" |
9 | 8 |
|
10 | 9 | "github.com/nspcc-dev/bbolt" |
@@ -186,68 +185,6 @@ func (db *DB) iterateExpired(tx *bbolt.Tx, curEpoch uint64, h ExpiredObjectHandl |
186 | 185 | return err |
187 | 186 | } |
188 | 187 |
|
189 | | -// IterateCoveredByTombstones iterates over all objects in DB which are covered |
190 | | -// by tombstone with string address from tss. Locked objects are not included |
191 | | -// (do not confuse with objects of type LOCK). |
192 | | -// |
193 | | -// If h returns ErrInterruptIterator, nil returns immediately. |
194 | | -// Returns other errors of h directly. |
195 | | -// |
196 | | -// Does not modify tss. |
197 | | -func (db *DB) IterateCoveredByTombstones(tss map[string]oid.Address, h func(oid.Address) error) error { |
198 | | - db.modeMtx.RLock() |
199 | | - defer db.modeMtx.RUnlock() |
200 | | - |
201 | | - if db.mode.NoMetabase() { |
202 | | - return ErrDegradedMode |
203 | | - } |
204 | | - |
205 | | - currEpoch := db.epochState.CurrentEpoch() |
206 | | - |
207 | | - return db.boltDB.View(func(tx *bbolt.Tx) error { |
208 | | - return db.iterateCoveredByTombstones(tx, currEpoch, tss, h) |
209 | | - }) |
210 | | -} |
211 | | - |
212 | | -func (db *DB) iterateCoveredByTombstones(tx *bbolt.Tx, currEpoch uint64, tss map[string]oid.Address, h func(oid.Address) error) error { |
213 | | - bktGraveyard := tx.Bucket(graveyardBucketName) |
214 | | - |
215 | | - err := bktGraveyard.ForEach(func(k, v []byte) error { |
216 | | - var addr oid.Address |
217 | | - if err := decodeAddressFromKey(&addr, v[:addressKeySize]); err != nil { |
218 | | - return err |
219 | | - } |
220 | | - if _, ok := tss[addr.EncodeToString()]; ok { |
221 | | - var addr oid.Address |
222 | | - |
223 | | - err := decodeAddressFromKey(&addr, k) |
224 | | - if err != nil { |
225 | | - return fmt.Errorf("could not parse address of the object under tombstone: %w", err) |
226 | | - } |
227 | | - |
228 | | - metaBucket := tx.Bucket(metaBucketKey(addr.Container())) |
229 | | - var metaCursor *bbolt.Cursor |
230 | | - if metaBucket != nil { |
231 | | - metaCursor = metaBucket.Cursor() |
232 | | - } |
233 | | - |
234 | | - if objectLocked(tx, currEpoch, metaCursor, addr.Container(), addr.Object()) { |
235 | | - return nil |
236 | | - } |
237 | | - |
238 | | - return h(addr) |
239 | | - } |
240 | | - |
241 | | - return nil |
242 | | - }) |
243 | | - |
244 | | - if errors.Is(err, ErrInterruptIterator) { |
245 | | - err = nil |
246 | | - } |
247 | | - |
248 | | - return err |
249 | | -} |
250 | | - |
251 | 188 | func mkFilterPhysicalPrefix() []byte { |
252 | 189 | var prefix = make([]byte, 1+len(object.FilterPhysical)+1+len(binPropMarker)+1) |
253 | 190 |
|
|
0 commit comments