func (v *VolumeEntry) Expand(db *bolt.DB, executor executors.Executor, allocator Allocator, sizeGB int) (e error) { // Allocate new bricks in the cluster brick_entries, err := v.allocBricksInCluster(db, allocator, v.Info.Cluster, sizeGB) if err != nil { return err } // Setup cleanup function defer func() { if e != nil { logger.Debug("Error detected, cleaning up") // Remove from db db.Update(func(tx *bolt.Tx) error { for _, brick := range brick_entries { v.removeBrickFromDb(tx, brick) } err := v.Save(tx) godbc.Check(err == nil) return nil }) } }() // Create bricks err = CreateBricks(db, executor, brick_entries) if err != nil { logger.Err(err) return err } // Setup cleanup function defer func() { if e != nil { logger.Debug("Error detected, cleaning up") DestroyBricks(db, executor, brick_entries) } }() // Create a volume request to send to executor // so that it can add the new bricks vr, host, err := v.createVolumeRequest(db, brick_entries) if err != nil { return err } // Expand the volume _, err = executor.VolumeExpand(host, vr) if err != nil { return err } // Increase the recorded volume size v.Info.Size += sizeGB // Save volume entry err = db.Update(func(tx *bolt.Tx) error { // Save brick entries for _, brick := range brick_entries { err := brick.Save(tx) if err != nil { return err } } return v.Save(tx) }) return err }