-
Notifications
You must be signed in to change notification settings - Fork 33
WIP: Staged layer creation #378
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 1 commit
a302c81
8332a27
ff03216
a6fa507
361278b
e60d339
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -2369,21 +2369,91 @@ func (d *Driver) DifferTarget(id string) (string, error) { | |
| return d.getDiffPath(id) | ||
| } | ||
|
|
||
| // ApplyDiff applies the new layer into a root | ||
| func (d *Driver) ApplyDiff(id, parent string, options graphdriver.ApplyDiffOpts) (size int64, err error) { | ||
| idMappings := options.Mappings | ||
| if idMappings == nil { | ||
| idMappings = &idtools.IDMappings{} | ||
| // StartStagingDiffToApply applies the new layer into a temporary directory. | ||
| // It returns a CleanupTempDirFunc which can nil or set regardless if the function return an error or not. | ||
| // CommitFunc is only set when there is no error returned and the int64 value returns the size of the layer. | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Needs updating |
||
| // | ||
| // This API is experimental and can be changed without bumping the major version number. | ||
| func (d *Driver) StartStagingDiffToApply(options graphdriver.ApplyDiffOpts) (tempdir.CleanupTempDirFunc, *tempdir.StageAddition, int64, error) { | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. A warning that this can run concurrently with any other operations on the driver would be nice (both here and in the interface definition). |
||
| // FIXME: how to consolidate with d.getTempDirRoot(id) if we don't have the id? | ||
| tempDirRoot := filepath.Join(d.homeDirForImageStore(), tempDirName) | ||
| t, err := tempdir.NewTempDir(tempDirRoot) | ||
| if err != nil { | ||
| return nil, nil, -1, err | ||
| } | ||
|
|
||
| sa, err := t.StageAddition() | ||
| if err != nil { | ||
| return nil, nil, -1, err | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. missing t.Cleanup? |
||
| } | ||
|
|
||
| size, err := d.applyDiff(sa.Path, options) | ||
| if err != nil { | ||
| return t.Cleanup, nil, -1, err | ||
| } | ||
|
|
||
| return t.Cleanup, sa, size, nil | ||
| } | ||
|
|
||
| // CommitStagedLayer that was created with StartStagingDiffToApply(). | ||
| // | ||
| // This API is experimental and can be changed without bumping the major version number. | ||
| func (d *Driver) CommitStagedLayer(id string, sa *tempdir.StageAddition) error { | ||
| applyDir, err := d.getDiffPath(id) | ||
| if err != nil { | ||
| return err | ||
| } | ||
|
|
||
| // FIXME: Is there a better way to do this? | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. (I agree, this suggests a refactoring might be possible and beneficial.) |
||
| stat, err := system.Stat(applyDir) | ||
| if err != nil { | ||
| return err | ||
| } | ||
| if err := os.Chmod(sa.Path, os.FileMode(stat.Mode())); err != nil { | ||
| return err | ||
| } | ||
|
|
||
| if err := os.Chown(sa.Path, int(stat.UID()), int(stat.GID())); err != nil { | ||
| return err | ||
| } | ||
| if d.options.forceMask != nil { | ||
| st, err := idtools.GetContainersOverrideXattr(applyDir) | ||
| if err != nil { | ||
| return err | ||
| } | ||
| if err := idtools.SetContainersOverrideXattr(sa.Path, st); err != nil { | ||
| return err | ||
| } | ||
| } | ||
|
|
||
| // The os.Rename() function used by CommitFunc errors when the target directory already | ||
| // exists, as such delete the dir. | ||
| if err := os.Remove(applyDir); err != nil { | ||
| return err | ||
| } | ||
|
|
||
| return sa.Commit(applyDir) | ||
| } | ||
|
|
||
| // ApplyDiff applies the new layer into a root | ||
| func (d *Driver) ApplyDiff(id, parent string, options graphdriver.ApplyDiffOpts) (size int64, err error) { | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. (Absolutely non-blocking: BTW it seems that nothing is using the |
||
| applyDir, err := d.getDiffPath(id) | ||
| if err != nil { | ||
| return 0, err | ||
| } | ||
| return d.applyDiff(applyDir, options) | ||
| } | ||
|
|
||
| // ApplyDiff applies the new layer into a root | ||
| func (d *Driver) applyDiff(target string, options graphdriver.ApplyDiffOpts) (size int64, err error) { | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. A warning that this can run concurrently with any other operations on the driver would be nice. … and that might motivate auditing and documenting which fields of |
||
| idMappings := options.Mappings | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. (Non-blocking: So far, all callers were setting |
||
| if idMappings == nil { | ||
| idMappings = &idtools.IDMappings{} | ||
| } | ||
|
|
||
| logrus.Debugf("Applying tar in %s", applyDir) | ||
| logrus.Debugf("Applying tar in %s", target) | ||
| // Overlay doesn't need the parent id to apply the diff | ||
| if err := untar(options.Diff, applyDir, &archive.TarOptions{ | ||
| if err := untar(options.Diff, target, &archive.TarOptions{ | ||
| UIDMaps: idMappings.UIDs(), | ||
| GIDMaps: idMappings.GIDs(), | ||
| IgnoreChownErrors: d.options.ignoreChownErrors, | ||
|
|
@@ -2394,7 +2464,7 @@ func (d *Driver) ApplyDiff(id, parent string, options graphdriver.ApplyDiffOpts) | |
| return 0, err | ||
| } | ||
|
|
||
| return directory.Size(applyDir) | ||
| return directory.Size(target) | ||
| } | ||
|
|
||
| func (d *Driver) getComposefsData(id string) string { | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Eventually please copy & paste the detailed description here, e.g. about the unusual
CleanupTempDirFuncreturn value.