@@ -291,7 +291,55 @@ func (m *memoryBucket) ReadChunkFile(_ context.Context, id *object.ID, index uin
291291
292292// Migrate implements [storage.Bucket].
293293func (m * memoryBucket ) Migrate (ctx context.Context , id * object.ID , dest storage.Bucket ) error {
294- panic ("unimplemented" )
294+ md , err := m .indexdb .Get (ctx , id .Bytes ())
295+ if err != nil {
296+ return err
297+ }
298+ clog := log .Context (ctx )
299+
300+ var moveErr error
301+ md .Chunks .Range (func (x uint32 ) {
302+ if moveErr != nil {
303+ return
304+ }
305+
306+ rf , _ , err1 := m .ReadChunkFile (ctx , id , x )
307+ if err1 != nil {
308+ moveErr = err1
309+ return
310+ }
311+ defer rf .Close ()
312+
313+ wf , _ , err2 := dest .WriteChunkFile (ctx , id , x )
314+ if err2 != nil {
315+ moveErr = err2
316+ return
317+ }
318+ defer wf .Close ()
319+
320+ if _ , err2 = io .Copy (wf , rf ); err2 != nil {
321+ moveErr = err2
322+ }
323+ })
324+
325+ if moveErr != nil {
326+ clog .Errorf ("failed to move object %s chunks: %v" , id .Key (), moveErr )
327+ return moveErr
328+ }
329+
330+ // 2. Store metadata in target
331+ if err := dest .Store (ctx , md ); err != nil {
332+ clog .Errorf ("failed to store metadata in target bucket for %s: %v" , id .Key (), err )
333+ return err
334+ }
335+
336+ // 3. Discard locally
337+ if err := m .discard (ctx , md ); err != nil {
338+ clog .Errorf ("failed to discard object %s from source bucket: %v" , id .Key (), err )
339+ return err
340+ }
341+
342+ return nil
295343}
296344
297345// SetMigration implements [storage.Bucket].
0 commit comments