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