Skip to content
This repository was archived by the owner on Feb 8, 2021. It is now read-only.

Commit f2baf06

Browse files
authored
Merge pull request #677 from bergwolf/storage-base-size
fix storage base size support
2 parents 218df42 + f35ff67 commit f2baf06

File tree

6 files changed

+61
-12
lines changed

6 files changed

+61
-12
lines changed

cmd/hyperd/hyperd.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ func mainDaemon(opt *Options) {
111111
}
112112
}
113113

114-
daemon.InitDockerCfg(strings.Split(opt.Mirrors, ","), strings.Split(opt.InsecureRegistries, ","), c.StorageDriver, c.Root)
114+
daemon.InitDockerCfg(strings.Split(opt.Mirrors, ","), strings.Split(opt.InsecureRegistries, ","), c.StorageDriver, c.StorageBaseSize, c.Root)
115115
d, err := daemon.NewDaemon(c)
116116
if err != nil {
117117
glog.Errorf("The hyperd create failed, %s", err.Error())

daemon/daemon.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ var (
159159
func presentInHelp(usage string) string { return usage }
160160
func absentFromHelp(string) string { return "" }
161161

162-
func InitDockerCfg(mirrors []string, insecureRegistries []string, graphdriver, root string) {
162+
func InitDockerCfg(mirrors []string, insecureRegistries []string, graphdriver, basesize, root string) {
163163
if dockerCfg.LogConfig.Config == nil {
164164
dockerCfg.LogConfig.Config = make(map[string]string)
165165
}
@@ -172,6 +172,13 @@ func InitDockerCfg(mirrors []string, insecureRegistries []string, graphdriver, r
172172
dockerCfg.GraphDriver = graphdriver
173173
dockerCfg.Root = root
174174
dockerCfg.TrustKeyPath = path.Join(root, "keys")
175+
if basesize != "" {
176+
if graphdriver == "devicemapper" {
177+
dockerCfg.GraphOptions = append(dockerCfg.GraphOptions, fmt.Sprintf("dm.basesize=%s", basesize))
178+
} else if graphdriver == "rawblock" {
179+
dockerCfg.GraphOptions = append(dockerCfg.GraphOptions, fmt.Sprintf("rawblock.basesize=%s", basesize))
180+
}
181+
}
175182

176183
// disable docker network
177184
flags.Set("-bridge", "none")

daemon/storage.go

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"time"
1616

1717
dockertypes "github.com/docker/engine-api/types"
18+
"github.com/docker/go-units"
1819
"github.com/golang/glog"
1920
"github.com/hyperhq/hyperd/daemon/daemondb"
2021
"github.com/hyperhq/hyperd/storage"
@@ -105,8 +106,12 @@ func (dms *DevMapperStorage) RootPath() string {
105106

106107
func (dms *DevMapperStorage) Init(c *apitypes.HyperConfig) error {
107108
size := storage.DEFAULT_DM_POOL_SIZE
108-
if c.StorageBaseSize > 0 {
109-
size = c.StorageBaseSize
109+
if c.StorageBaseSize != "" {
110+
nsize, err := units.RAMInBytes(c.StorageBaseSize)
111+
if err != nil {
112+
return err
113+
}
114+
size = int(nsize)
110115
}
111116
dmPool := dm.DeviceMapper{
112117
Datafile: filepath.Join(utils.HYPER_ROOT, "lib") + "/data",
@@ -205,7 +210,7 @@ func (dms *DevMapperStorage) CreateVolume(podId string, spec *apitypes.UserVolum
205210
}
206211
dev_id_str := strconv.Itoa(dev_id)
207212

208-
err = dm.CreateVolume(dms.VolPoolName, deviceName, dev_id_str, storage.DEFAULT_VOL_MKFS, storage.DEFAULT_DM_VOL_SIZE, restore)
213+
err = dm.CreateVolume(dms.VolPoolName, deviceName, dev_id_str, storage.DEFAULT_VOL_MKFS, dms.DmPoolData.Size, restore)
209214
if err != nil && !restore && strings.Contains(err.Error(), "failed: File exists") {
210215
glog.V(1).Infof("retry for dev_id #%d creating collision: %v", dev_id, err)
211216
continue
@@ -501,6 +506,7 @@ func (s *BtrfsStorage) RemoveVolume(podId string, record []byte) error {
501506

502507
type RawBlockStorage struct {
503508
rootPath string
509+
size int64
504510
}
505511

506512
func RawBlockFactory(_ *dockertypes.Info, _ *daemondb.DaemonDB) (Storage, error) {
@@ -519,9 +525,21 @@ func (s *RawBlockStorage) RootPath() string {
519525
}
520526

521527
func (s *RawBlockStorage) Init(c *apitypes.HyperConfig) error {
522-
if err := os.MkdirAll(filepath.Join(s.RootPath(), "volumes"), 0700); err != nil {
528+
err := os.MkdirAll(filepath.Join(s.RootPath(), "volumes"), 0700)
529+
if err != nil {
523530
return err
524531
}
532+
533+
size := int64(storage.DEFAULT_DM_VOL_SIZE)
534+
if c.StorageBaseSize != "" {
535+
size, err = units.RAMInBytes(c.StorageBaseSize)
536+
if err != nil {
537+
return err
538+
}
539+
}
540+
541+
s.size = size
542+
525543
return nil
526544
}
527545

@@ -555,7 +573,7 @@ func (s *RawBlockStorage) InjectFile(src io.Reader, mountId, target, baseDir str
555573

556574
func (s *RawBlockStorage) CreateVolume(podId string, spec *apitypes.UserVolume) error {
557575
block := filepath.Join(s.RootPath(), "volumes", fmt.Sprintf("%s-%s", podId, spec.Name))
558-
if err := rawblock.CreateBlock(block, "xfs", "", uint64(storage.DEFAULT_DM_VOL_SIZE)); err != nil {
576+
if err := rawblock.CreateBlock(block, "xfs", "", uint64(s.size)); err != nil {
559577
return err
560578
}
561579
spec.Source = block

package/dist/etc/hyper/config

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ Initrd=/var/lib/hyper/hyper-initrd.img
3030

3131
# Storage driver for hyperd, valid value includes rawblock, devicemapper, overlay, and aufs
3232
# StorageDriver=overlay
33+
# StorageBaseSize only valid for devicemapper and rawblock
34+
# StorageBaseSize=10GB
3335

3436
# Bridge device for hyperd, default is hyper0
3537
# Bridge=

storage/graphdriver/rawblock/driver.go

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@ import (
55
"os"
66
"os/exec"
77
"path/filepath"
8+
"strings"
89
"sync"
910

1011
"github.com/docker/docker/daemon/graphdriver"
1112
"github.com/docker/docker/pkg/idtools"
13+
"github.com/docker/docker/pkg/parsers"
14+
"github.com/docker/go-units"
1215
"github.com/golang/glog"
1316
"github.com/opencontainers/runc/libcontainer/label"
1417
//"github.com/docker/docker/pkg/mount"
@@ -88,12 +91,31 @@ func Init(home string, options []string, uidMaps, gidMaps []idtools.IDMap) (grap
8891
return nil, err
8992
}
9093

94+
var blockSize = uint64(10 * 1024 * 1024 * 1024)
95+
for _, option := range options {
96+
key, val, err := parsers.ParseKeyValueOpt(option)
97+
if err != nil {
98+
return nil, err
99+
}
100+
key = strings.ToLower(key)
101+
switch key {
102+
case "rawblock.basesize":
103+
size, err := units.RAMInBytes(val)
104+
if err != nil {
105+
return nil, err
106+
}
107+
blockSize = uint64(size)
108+
default:
109+
return nil, fmt.Errorf("rawblock: Unknown option %s\n", key)
110+
}
111+
}
112+
91113
d := &Driver{
92114
home: home,
93115
backingFs: backingFs,
94116
cow: cow,
95117
blockFs: blockFs,
96-
blockSize: 10, // TODO: make it configurable
118+
blockSize: blockSize,
97119
uid: rootUID,
98120
gid: rootGID,
99121
active: map[string]int{},
@@ -111,7 +133,7 @@ func (d *Driver) Status() [][2]string {
111133
{"Backing Filesystem", d.backingFs},
112134
{"Support Copy-On-Write", fmt.Sprintf("%v", d.cow)},
113135
{"Block Filesystem", d.blockFs},
114-
{"Block Size", fmt.Sprintf("%dGB", d.blockSize)},
136+
{"Block Size", fmt.Sprintf("%s", units.HumanSize(float64(d.blockSize)))},
115137
}
116138
}
117139

@@ -131,7 +153,7 @@ func (d *Driver) Create(id, parent, mountLabel string) error {
131153
return err
132154
}
133155
if parent == "" {
134-
return CreateBlock(d.block(id), d.blockFs, mountLabel, d.blockSize*1024*1024*1024)
156+
return CreateBlock(d.block(id), d.blockFs, mountLabel, d.blockSize)
135157
}
136158
if out, err := exec.Command("cp", "-a", "--reflink=auto", d.block(parent), d.block(id)).CombinedOutput(); err != nil {
137159
return fmt.Errorf("Failed to reflink:%v:%s", err, string(out))

types/config.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ type HyperConfig struct {
1717
Host string
1818
GRPCHost string
1919
StorageDriver string
20-
StorageBaseSize int
20+
StorageBaseSize string
2121
VmFactoryPolicy string
2222
Driver string
2323
Kernel string
@@ -56,7 +56,7 @@ func NewHyperConfig(config string) *HyperConfig {
5656
}
5757

5858
c.StorageDriver, _ = cfg.GetValue(goconfig.DEFAULT_SECTION, "StorageDriver")
59-
c.StorageBaseSize = cfg.MustInt(goconfig.DEFAULT_SECTION, "StorageBaseSize", 0)
59+
c.StorageBaseSize, _ = cfg.GetValue(goconfig.DEFAULT_SECTION, "StorageBaseSize")
6060
c.Kernel, _ = cfg.GetValue(goconfig.DEFAULT_SECTION, "Kernel")
6161
c.Initrd, _ = cfg.GetValue(goconfig.DEFAULT_SECTION, "Initrd")
6262
c.Bridge, _ = cfg.GetValue(goconfig.DEFAULT_SECTION, "Bridge")

0 commit comments

Comments
 (0)