Skip to content

Commit fe8e7ce

Browse files
committed
feat: implement object migration for memory and disk buckets and correct DBPath in disk migration tests.
1 parent 34a8e28 commit fe8e7ce

3 files changed

Lines changed: 100 additions & 4 deletions

File tree

storage/bucket/disk/disk.go

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -478,7 +478,55 @@ func (d *diskBucket) ReadChunkFile(ctx context.Context, id *object.ID, index uin
478478

479479
// Migrate implements [storage.Bucket].
480480
func (d *diskBucket) Migrate(ctx context.Context, id *object.ID, dest storage.Bucket) error {
481-
panic("unimplemented")
481+
md, err := d.indexdb.Get(ctx, id.Bytes())
482+
if err != nil {
483+
return err
484+
}
485+
clog := log.Context(ctx)
486+
487+
var moveErr error
488+
md.Chunks.Range(func(x uint32) {
489+
if moveErr != nil {
490+
return
491+
}
492+
493+
rf, _, err1 := d.ReadChunkFile(ctx, id, x)
494+
if err1 != nil {
495+
moveErr = err1
496+
return
497+
}
498+
defer rf.Close()
499+
500+
wf, _, err2 := dest.WriteChunkFile(ctx, id, x)
501+
if err2 != nil {
502+
moveErr = err2
503+
return
504+
}
505+
defer wf.Close()
506+
507+
if _, err2 = io.Copy(wf, rf); err2 != nil {
508+
moveErr = err2
509+
}
510+
})
511+
512+
if moveErr != nil {
513+
clog.Errorf("failed to move object %s chunks: %v", id.Key(), moveErr)
514+
return moveErr
515+
}
516+
517+
// 2. Store metadata in target
518+
if err := dest.Store(ctx, md); err != nil {
519+
clog.Errorf("failed to store metadata in target bucket for %s: %v", id.Key(), err)
520+
return err
521+
}
522+
523+
// 3. Discard locally
524+
if err := d.discard(ctx, md); err != nil {
525+
clog.Errorf("failed to discard object %s from source bucket: %v", id.Key(), err)
526+
return err
527+
}
528+
529+
return nil
482530
}
483531

484532
// SetMigration implements storage.Bucket.

storage/bucket/disk/disk_migration_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ func TestMigration_Promote(t *testing.T) {
3737

3838
cfg := &storage.BucketConfig{
3939
Path: basepath,
40-
DBPath: filepath.Join(basepath, "/.indexdb"),
40+
DBPath: filepath.Join(basepath, ".indexdb"),
4141
DBType: "pebble",
4242
Driver: "native",
4343
Type: "normal",
@@ -94,7 +94,7 @@ func TestMigration_Demote(t *testing.T) {
9494

9595
cfg := &storage.BucketConfig{
9696
Path: basepath,
97-
DBPath: filepath.Join(basepath, "/.indexdb"),
97+
DBPath: filepath.Join(basepath, ".indexdb"),
9898
DBType: "pebble",
9999
Driver: "native",
100100
Type: "normal",

storage/bucket/memory/memory.go

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,55 @@ func (m *memoryBucket) ReadChunkFile(_ context.Context, id *object.ID, index uin
291291

292292
// Migrate implements [storage.Bucket].
293293
func (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

Comments
 (0)