Skip to content

Commit

Permalink
Merge pull request moby#13151 from Mic92/master
Browse files Browse the repository at this point in the history
zfs: update filesystem cache on filesystem creation/deletion
  • Loading branch information
LK4D4 committed May 12, 2015
2 parents c9821d8 + 2cb2352 commit 445afe0
Showing 1 changed file with 25 additions and 5 deletions.
30 changes: 25 additions & 5 deletions daemon/graphdriver/zfs/zfs.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"path"
"strconv"
"strings"
"sync"
"syscall"
"time"

Expand Down Expand Up @@ -154,6 +155,7 @@ func lookupZfsDataset(rootdir string) (string, error) {
type Driver struct {
dataset *zfs.Dataset
options ZfsOptions
sync.Mutex // protects filesystem cache against concurrent access
filesystemsCache map[string]bool
}

Expand Down Expand Up @@ -194,7 +196,7 @@ func (d *Driver) Status() [][2]string {
}
}

func cloneFilesystem(name, parentName string) error {
func (d *Driver) cloneFilesystem(name, parentName string) error {
snapshotName := fmt.Sprintf("%d", time.Now().Nanosecond())
parentDataset := zfs.Dataset{Name: parentName}
snapshot, err := parentDataset.Snapshot(snapshotName /*recursive */, false)
Expand All @@ -203,6 +205,12 @@ func cloneFilesystem(name, parentName string) error {
}

_, err = snapshot.Clone(name, map[string]string{"mountpoint": "legacy"})
if err == nil {
d.Lock()
d.filesystemsCache[name] = true
d.Unlock()
}

if err != nil {
snapshot.Destroy(zfs.DestroyDeferDeletion)
return err
Expand Down Expand Up @@ -245,15 +253,27 @@ func (d *Driver) create(id, parent string) error {
name := d.ZfsPath(id)
if parent == "" {
mountoptions := map[string]string{"mountpoint": "legacy"}
_, err := zfs.CreateFilesystem(name, mountoptions)
fs, err := zfs.CreateFilesystem(name, mountoptions)
if err == nil {
d.Lock()
d.filesystemsCache[fs.Name] = true
d.Unlock()
}
return err
}
return cloneFilesystem(name, d.ZfsPath(parent))
return d.cloneFilesystem(name, d.ZfsPath(parent))
}

func (d *Driver) Remove(id string) error {
dataset := zfs.Dataset{Name: d.ZfsPath(id)}
return dataset.Destroy(zfs.DestroyRecursive)
name := d.ZfsPath(id)
dataset := zfs.Dataset{Name: name}
err := dataset.Destroy(zfs.DestroyRecursive)
if err == nil {
d.Lock()
delete(d.filesystemsCache, name)
d.Unlock()
}
return err
}

func (d *Driver) Get(id, mountLabel string) (string, error) {
Expand Down

0 comments on commit 445afe0

Please sign in to comment.