-
Notifications
You must be signed in to change notification settings - Fork 383
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
OCI layout extensions #2633
base: main
Are you sure you want to change the base?
OCI layout extensions #2633
Conversation
In draft for now. |
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.
Just a quick skim; I’m afraid I didn’t read the added tests yet.
ae7457e
to
234b45f
Compare
I'd love to have some explicit test condition on Linux to make sure that the reflinking works. We're using the function from c/storage which is e2e tested. The unit tests run on tmp, so we have to create the test dirs in $HOME ... not sure we should though. |
234b45f
to
6481647
Compare
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.
Actual detailed review still pending, I’m afraid.
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.
A full review now.
@@ -148,11 +148,17 @@ func testParseReference(t *testing.T, fn func(string) (types.ImageReference, err | |||
"relativepath", |
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.
Holding the line at “all of *_transport.go
should have test coverage”, please port the two test cases added to TestGetManifestDescriptor
from #1677 (and then see if more need to be added).
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.
Isn't that already being tested now with fixtures/two_images_manifest
?
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.
Tooling says that case ref.image != "" && ref.sourceIndex != -1:
and case ref.sourceIndex != -1:
is not covered by tests.
require.Equal(t, test.names[i], ociRef.image) | ||
if test.names[i] != "" { | ||
require.True(t, strings.HasSuffix(res.Reference.StringWithinTransport(), test.names[i])) | ||
} |
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.
else
test that res.Reference
is a sourceIndex reference with the right index?
Or, alternatively, use the returned reference to read a manifest and verify that it matches res.ManifestDescriptor.Digest
.
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.
I think we are doing that above, aren't we?
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.
The test above verifies that res.ManifestDescriptor
is valid, not that res.Reference
is usable.
In particular, changing the index = manifestIndex
line in reader.go
to index = manifestIndex * 0
, or … + 1
, currently doesn’t fail tests.
…
Tests writing to non-test directories , and possibly leaving them around on aborts/failures, seems rather unexpected to me, some might consider it (or, at least, be worried that it is) hostile. So I’d prefer to leave this to e2e tests, maybe the future tests of the Podman artifact CLI. (Just because I was looking it up, Google says reflinks don’t work on ext4. That’s not really a blocker, we could gate this behind a filesystem type check.) |
Vendor containers/image/pull/2633 and update the code so we can start testing it. Signed-off-by: Valentin Rothberg <[email protected]>
6481647
to
ff76927
Compare
Images in the index can now be referenced via the @sourceIndex syntax. Signed-off-by: Miloslav Trmač <[email protected]> Signed-off-by: Valentin Rothberg <[email protected]>
The new API allows for listing all manifests in an OCI layout's index. Signed-off-by: Miloslav Trmač <[email protected]> Signed-off-by: Valentin Rothberg <[email protected]>
ff76927
to
30a132d
Compare
Try to reflink the file and restort to copying it in case of failure. Also add an Options struct to be future proof. Signed-off-by: Miloslav Trmač <[email protected]> Signed-off-by: Valentin Rothberg <[email protected]>
30a132d
to
8565739
Compare
#include <linux/fs.h> | ||
|
||
#ifndef FICLONE | ||
#define FICLONE _IOW(0x94, 9, int) |
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.
x/sys/unix.FICLONE
exists; if that works, we can avoid the CGo dependency.
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.
Thanks! ACK overall.
Ideally, I’d prefer sharing the reflink call with c/storage, but the logic (usage of c/storage/pkg/pools
requires c/storage to explicitly special-case CopyFileRange
, which is otherwise automatic) is just different enough to make that awkward, and anyway it’s ~10 lines, so not worth worrying about.
"io" | ||
"os" | ||
|
||
"golang.org/x/sys/unix" |
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.
Please run go mod tidy
to mark the package as a direct dependency.
blobFile.Close() | ||
explicitClosed = true | ||
|
||
*closed = true |
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.
(Nit: Move this one line above, please, to keep it immediately next to the actual .Close()
.)
@@ -300,6 +314,63 @@ func (d *ociImageDestination) CommitWithOptions(ctx context.Context, options pri | |||
return os.WriteFile(d.ref.indexPath(), indexJSON, 0644) | |||
} | |||
|
|||
// PutBlobFromLocalFileOptions is unused but may receive functionality in the future. | |||
type PutBlobFromLocalFileOptions struct{} |
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.
type PutBlobFromLocalFileOptions struct{} | |
type PutBlobFromLocalFileOption struct{} |
please, multiple options can be independent items at the call site.
defer srcFile.Close() | ||
|
||
// reflink.Copy will io.Copy() in case reflinking fails | ||
err = reflink.Copy(srcFile, blobFile) |
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.
(Absolutely non-blocking, this is internal-only anyway, and it works just fine as is: Maybe the function could be named explicitly enough to make the comment unnecessary, something like ReflinkOrCopy
. OTOH some linters gripe about reflink.Reflink…
.)
return "", -1, err | ||
} | ||
|
||
_, err = blobFile.Seek(0, 0) |
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.
_, err = blobFile.Seek(0, 0) | |
_, err = blobFile.Seek(0, io.SeekStart) |
please
defer func() { | ||
if !blobFileClosed { | ||
blobFile.Close() | ||
} |
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.
blobFile
remains on the filesystem on failure; I think this needs the succeeded
logic from PutBlobWithOptions
.
return private.UploadedBlob{Digest: blobDigest, Size: size}, nil | ||
} | ||
|
||
func (d *ociImageDestination) blobFileSyncAndRename(blobFile *os.File, blobDigest digest.Digest, closed *bool) error { |
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.
Documenting the interaction of blobFile
and *closed
would be nice.
Taken over from #2567 but: