Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 13 additions & 13 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,21 +14,21 @@ jobs:
timeout-minutes: 5

steps:
- uses: actions/setup-go@v5
- uses: actions/setup-go@v6
with:
go-version: 1.22
go-version: 1.23

- name: Set env
shell: bash
run: |
echo "${{ github.workspace }}/bin" >> $GITHUB_PATH

- uses: actions/checkout@v4
- uses: actions/checkout@v6
with:
path: src/github.com/containerd/zfs
fetch-depth: 25

- uses: containerd/project-checks@v1.1.0
- uses: containerd/project-checks@v1.2.2
with:
working-directory: src/github.com/containerd/zfs

Expand All @@ -39,11 +39,11 @@ jobs:

strategy:
matrix:
go-version: [1.22]
go-version: [1.23]
os: [ubuntu-22.04]

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
with:
path: src/github.com/containerd/zfs

Expand All @@ -52,14 +52,14 @@ jobs:
run: |
echo "${{ github.workspace }}/bin" >> $GITHUB_PATH

- uses: actions/setup-go@v3
- uses: actions/setup-go@v6
with:
go-version: ${{ matrix.os-version }}

- uses: actions/checkout@v4
- uses: golangci/golangci-lint-action@v6
- uses: actions/checkout@v6
- uses: golangci/golangci-lint-action@v9
with:
version: v1.61.0
version: v2.7
skip-cache: true
args: --timeout=8m

Expand All @@ -69,13 +69,13 @@ jobs:
timeout-minutes: 5

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
with:
path: src/github.com/containerd/zfs

- uses: actions/setup-go@v5
- uses: actions/setup-go@v6
with:
go-version: 1.22
go-version: 1.23

- name: Set env
shell: bash
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,11 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6

- uses: actions/setup-go@v5
- uses: actions/setup-go@v6
with:
go-version: 1.22
go-version: 1.23

# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
Expand Down
82 changes: 41 additions & 41 deletions zfs.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,12 +102,12 @@ func destroySnapshot(dataset *zfs.Dataset) error {
//
// Should be used for parent resolution, existence checks and to discern
// the kind of snapshot.
func (z *snapshotter) Stat(ctx context.Context, key string) (snapshots.Info, error) {
ctx, t, err := z.ms.TransactionContext(ctx, false)
func (s *snapshotter) Stat(ctx context.Context, key string) (snapshots.Info, error) {
ctx, t, err := s.ms.TransactionContext(ctx, false)
if err != nil {
return snapshots.Info{}, err
}
defer t.Rollback() //nolint:errcheck
defer func() { _ = t.Rollback() }()
_, info, _, err := storage.GetInfo(ctx, key)
if err != nil {
return snapshots.Info{}, err
Expand All @@ -117,31 +117,31 @@ func (z *snapshotter) Stat(ctx context.Context, key string) (snapshots.Info, err
}

// Usage retrieves the disk usage of the top-level snapshot.
func (z *snapshotter) Usage(ctx context.Context, key string) (snapshots.Usage, error) {
return z.usage(ctx, key)
func (s *snapshotter) Usage(ctx context.Context, key string) (snapshots.Usage, error) {
return s.usage(ctx, key)
}

func (z *snapshotter) usage(ctx context.Context, key string) (snapshots.Usage, error) {
ctx, t, err := z.ms.TransactionContext(ctx, false)
func (s *snapshotter) usage(ctx context.Context, key string) (snapshots.Usage, error) {
ctx, t, err := s.ms.TransactionContext(ctx, false)
if err != nil {
return snapshots.Usage{}, err
}
id, info, usage, err := storage.GetInfo(ctx, key)
t.Rollback() //nolint:errcheck
_ = t.Rollback()

if err != nil {
return snapshots.Usage{}, err
}

if info.Kind == snapshots.KindActive {
activeName := filepath.Join(z.dataset.Name, id)
activeName := filepath.Join(s.dataset.Name, id)
sDataset, err := zfs.GetDataset(activeName)
if err != nil {
return snapshots.Usage{}, err
}

if int64(sDataset.Used) > maxSnapshotSize {
return snapshots.Usage{}, fmt.Errorf("Dataset size exceeds maximum snapshot size of %d bytes", maxSnapshotSize)
return snapshots.Usage{}, fmt.Errorf("dataset size exceeds maximum snapshot size of %d bytes", maxSnapshotSize)
}

usage = snapshots.Usage{
Expand All @@ -154,25 +154,25 @@ func (z *snapshotter) usage(ctx context.Context, key string) (snapshots.Usage, e
}

// Walk the committed snapshots.
func (z *snapshotter) Walk(ctx context.Context, fn snapshots.WalkFunc, filters ...string) error {
ctx, t, err := z.ms.TransactionContext(ctx, false)
func (s *snapshotter) Walk(ctx context.Context, fn snapshots.WalkFunc, filters ...string) error {
ctx, t, err := s.ms.TransactionContext(ctx, false)
if err != nil {
return err
}
defer t.Rollback() //nolint:errcheck
defer func() { _ = t.Rollback() }()
return storage.WalkInfo(ctx, fn, filters...)
}

func (z *snapshotter) Prepare(ctx context.Context, key, parent string, opts ...snapshots.Opt) ([]mount.Mount, error) {
return z.createSnapshot(ctx, snapshots.KindActive, key, parent, opts...)
func (s *snapshotter) Prepare(ctx context.Context, key, parent string, opts ...snapshots.Opt) ([]mount.Mount, error) {
return s.createSnapshot(ctx, snapshots.KindActive, key, parent, opts...)
}

func (z *snapshotter) View(ctx context.Context, key, parent string, opts ...snapshots.Opt) ([]mount.Mount, error) {
return z.createSnapshot(ctx, snapshots.KindView, key, parent, opts...)
func (s *snapshotter) View(ctx context.Context, key, parent string, opts ...snapshots.Opt) ([]mount.Mount, error) {
return s.createSnapshot(ctx, snapshots.KindView, key, parent, opts...)
}

func (z *snapshotter) createSnapshot(ctx context.Context, kind snapshots.Kind, key, parent string, opts ...snapshots.Opt) ([]mount.Mount, error) {
ctx, t, err := z.ms.TransactionContext(ctx, true)
func (s *snapshotter) createSnapshot(ctx context.Context, kind snapshots.Kind, key, parent string, opts ...snapshots.Opt) ([]mount.Mount, error) {
ctx, t, err := s.ms.TransactionContext(ctx, true)
if err != nil {
return nil, err
}
Expand All @@ -189,15 +189,15 @@ func (z *snapshotter) createSnapshot(ctx context.Context, kind snapshots.Kind, k
return nil, err
}

targetName := filepath.Join(z.dataset.Name, a.ID)
targetName := filepath.Join(s.dataset.Name, a.ID)
var target *zfs.Dataset
if len(a.ParentIDs) == 0 {
target, err = createFilesystem(targetName)
if err != nil {
return nil, err
}
} else {
parent0Name := filepath.Join(z.dataset.Name, a.ParentIDs[0]) + "@" + snapshotSuffix
parent0Name := filepath.Join(s.dataset.Name, a.ParentIDs[0]) + "@" + snapshotSuffix
parent0, err := zfs.GetDataset(parent0Name)
if err != nil {
return nil, err
Expand All @@ -217,10 +217,10 @@ func (z *snapshotter) createSnapshot(ctx context.Context, kind snapshots.Kind, k
return nil, err
}
readonly := kind == snapshots.KindView
return z.mounts(target, readonly)
return s.mounts(target, readonly)
}

func (z *snapshotter) mounts(dataset *zfs.Dataset, readonly bool) ([]mount.Mount, error) {
func (s *snapshotter) mounts(dataset *zfs.Dataset, readonly bool) ([]mount.Mount, error) {
var options []string
if readonly {
options = append(options, "ro")
Expand All @@ -234,13 +234,13 @@ func (z *snapshotter) mounts(dataset *zfs.Dataset, readonly bool) ([]mount.Mount
}, nil
}

func (z *snapshotter) Commit(ctx context.Context, name, key string, opts ...snapshots.Opt) (err error) {
usage, err := z.usage(ctx, key)
func (s *snapshotter) Commit(ctx context.Context, name, key string, opts ...snapshots.Opt) (err error) {
usage, err := s.usage(ctx, key)
if err != nil {
return fmt.Errorf("failed to compute usage: %w", err)
}

ctx, t, err := z.ms.TransactionContext(ctx, true)
ctx, t, err := s.ms.TransactionContext(ctx, true)
if err != nil {
return err
}
Expand All @@ -257,7 +257,7 @@ func (z *snapshotter) Commit(ctx context.Context, name, key string, opts ...snap
return fmt.Errorf("failed to commit: %w", err)
}

activeName := filepath.Join(z.dataset.Name, id)
activeName := filepath.Join(s.dataset.Name, id)
active, err := zfs.GetDataset(activeName)
if err != nil {
return err
Expand All @@ -282,28 +282,28 @@ func (z *snapshotter) Commit(ctx context.Context, name, key string, opts ...snap
// called on an read-write or readonly transaction.
//
// This can be used to recover mounts after calling View or Prepare.
func (z *snapshotter) Mounts(ctx context.Context, key string) ([]mount.Mount, error) {
ctx, t, err := z.ms.TransactionContext(ctx, false)
func (s *snapshotter) Mounts(ctx context.Context, key string) ([]mount.Mount, error) {
ctx, t, err := s.ms.TransactionContext(ctx, false)
if err != nil {
return nil, err
}
s, err := storage.GetSnapshot(ctx, key)
t.Rollback() //nolint:errcheck
snapshot, err := storage.GetSnapshot(ctx, key)
_ = t.Rollback()
if err != nil {
return nil, fmt.Errorf("failed to get active snapshot: %w", err)
}
sName := filepath.Join(z.dataset.Name, s.ID)
sName := filepath.Join(s.dataset.Name, snapshot.ID)
sDataset, err := zfs.GetDataset(sName)
if err != nil {
return nil, err
}
return z.mounts(sDataset, false)
return s.mounts(sDataset, false)
}

// Remove abandons the transaction identified by key. All resources
// associated with the key will be removed.
func (z *snapshotter) Remove(ctx context.Context, key string) (err error) {
ctx, t, err := z.ms.TransactionContext(ctx, true)
func (s *snapshotter) Remove(ctx context.Context, key string) (err error) {
ctx, t, err := s.ms.TransactionContext(ctx, true)
if err != nil {
return err
}
Expand All @@ -321,7 +321,7 @@ func (z *snapshotter) Remove(ctx context.Context, key string) (err error) {
return fmt.Errorf("failed to remove snapshot: %w", err)
}

datasetName := filepath.Join(z.dataset.Name, id)
datasetName := filepath.Join(s.dataset.Name, id)
if k == snapshots.KindCommitted {
snapshotName := datasetName + "@" + snapshotSuffix
snapshot, err := zfs.GetDataset(snapshotName)
Expand All @@ -344,15 +344,15 @@ func (z *snapshotter) Remove(ctx context.Context, key string) (err error) {
return err
}

func (o *snapshotter) Update(ctx context.Context, info snapshots.Info, fieldpaths ...string) (snapshots.Info, error) {
ctx, t, err := o.ms.TransactionContext(ctx, true)
func (s *snapshotter) Update(ctx context.Context, info snapshots.Info, fieldpaths ...string) (snapshots.Info, error) {
ctx, t, err := s.ms.TransactionContext(ctx, true)
if err != nil {
return snapshots.Info{}, err
}

info, err = storage.UpdateInfo(ctx, info, fieldpaths...)
if err != nil {
t.Rollback() //nolint:errcheck
_ = t.Rollback()
return snapshots.Info{}, err
}

Expand All @@ -363,6 +363,6 @@ func (o *snapshotter) Update(ctx context.Context, info snapshots.Info, fieldpath
return info, nil
}

func (o *snapshotter) Close() error {
return o.ms.Close()
func (s *snapshotter) Close() error {
return s.ms.Close()
}
2 changes: 1 addition & 1 deletion zfs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ func TestZFSUsage(t *testing.T) {
if err != nil {
t.Error(err)
}
defer closer() //nolint:errcheck
defer func() { _ = closer() }()

// Prepare empty base layer
target := filepath.Join(root, "prepare-1")
Expand Down
Loading