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
5 changes: 4 additions & 1 deletion internal/erofsutils/mount.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ func ConvertTarErofs(ctx context.Context, r io.Reader, layerPath, uuid string, m
// The `--tar=i` option instructs mkfs.erofs to only generate the tar index
// for the tar content. The resulting file structure is:
// [Tar index][Original tar content]
func GenerateTarIndexAndAppendTar(ctx context.Context, r io.Reader, layerPath string, mkfsExtraOpts []string) error {
func GenerateTarIndexAndAppendTar(ctx context.Context, r io.Reader, layerPath, uuid string, mkfsExtraOpts []string) error {
// Create a temporary file for storing the tar content
tarFile, err := os.CreateTemp("", "erofs-tar-*")
if err != nil {
Expand All @@ -68,6 +68,9 @@ func GenerateTarIndexAndAppendTar(ctx context.Context, r io.Reader, layerPath st

// Generate tar index directly to layerPath using --tar=i option
args := append([]string{"--tar=i", "--aufs", "--quiet"}, mkfsExtraOpts...)
if uuid != "" {
args = append(args, []string{"-U", uuid}...)
}
args = append(args, layerPath)
cmd := exec.CommandContext(ctx, "mkfs.erofs", args...)
cmd.Stdin = teeReader
Expand Down
5 changes: 3 additions & 2 deletions plugins/diff/erofs/differ.go
Original file line number Diff line number Diff line change
Expand Up @@ -174,16 +174,17 @@ func (s erofsDiff) Apply(ctx context.Context, desc ocispec.Descriptor, mounts []
}

// Choose between tar index or tar conversion mode
// Generate deterministic UUID from layer digest
u := uuid.NewSHA1(uuid.NameSpaceURL, []byte("erofs:blobs/"+desc.Digest))
if s.enableTarIndex {
// Use the tar index method: generate tar index and append tar
err = erofsutils.GenerateTarIndexAndAppendTar(ctx, rc, layerBlobPath, s.mkfsExtraOpts)
err = erofsutils.GenerateTarIndexAndAppendTar(ctx, rc, layerBlobPath, u.String(), s.mkfsExtraOpts)
if err != nil {
return emptyDesc, fmt.Errorf("failed to generate tar index: %w", err)
}
log.G(ctx).WithField("path", layerBlobPath).Debug("Applied layer using tar index mode")
} else {
// Use the tar method: fully convert tar to EROFS
u := uuid.NewSHA1(uuid.NameSpaceURL, []byte("erofs:blobs/"+desc.Digest))
err = erofsutils.ConvertTarErofs(ctx, rc, layerBlobPath, u.String(), s.mkfsExtraOpts)
if err != nil {
return emptyDesc, fmt.Errorf("failed to convert tar to erofs: %w", err)
Expand Down
24 changes: 15 additions & 9 deletions plugins/snapshots/erofs/erofs.go
Original file line number Diff line number Diff line change
Expand Up @@ -728,25 +728,31 @@ func (s *snapshotter) Remove(ctx context.Context, key string) (err error) {
}
}()
return s.ms.WithTransaction(ctx, true, func(ctx context.Context) error {
var k snapshots.Kind

id, k, err = storage.Remove(ctx, key)
id, info, _, err := storage.GetInfo(ctx, key)
if err != nil {
return fmt.Errorf("failed to remove snapshot %s: %w", key, err)
if errdefs.IsNotFound(err) {
return nil
}
return fmt.Errorf("failed to get snapshot info: %w", err)
}

removals, err = s.getCleanupDirectories(ctx)
if err != nil {
return fmt.Errorf("unable to get directories for removal: %w", err)
}
// The layer blob is only persisted for committed snapshots.
if k == snapshots.KindCommitted {
if info.Kind == snapshots.KindCommitted {
// Clear IMMUTABLE_FL before removal, since this flag avoids it.
err = setImmutable(s.layerBlobPath(id), false)
if err != nil && !errdefs.IsNotImplemented(err) {
return fmt.Errorf("failed to clear IMMUTABLE_FL: %w", err)
}
}
_, _, err = storage.Remove(ctx, key)
if err != nil {
return fmt.Errorf("failed to remove snapshot %s: %w", key, err)
}

removals, err = s.getCleanupDirectories(ctx)
if err != nil {
return fmt.Errorf("unable to get directories for removal: %w", err)
}
return nil
})
}
Expand Down
Loading