Colin Walters [Thu, 9 Jun 2022 22:32:09 +0000 (18:32 -0400)]
fsck: Don't load all object names into memory
We recently discovered `list_objects()` is inefficient with memory.
The more efficient `list_objects_set()` API isn't yet public, but
this fsck code actually just skips over non-commit objects, and
we already have an API to list just those.
Colin Walters [Thu, 9 Jun 2022 18:59:44 +0000 (14:59 -0400)]
rust-bindings: Update cargo package list
When we did the merger, it turns out cargo by default is basically
going to include all of stuff in the git repository root directory
which is "libostree". We just want the stuff in `rust-bindings/`.
I initially tried adding `include = "rust-bindings/"` but
according to
https://doc.rust-lang.org/cargo/reference/manifest.html#the-exclude-and-include-fields
specifying `include` means that `exclude` is
ignored, which is kind of annoying. Further, doing so *also*
turns off the cargo automatic rules for handling e.g. `gitignore`.
So for now I went with the approach of adding everything from the C
library stuff into `exclude/`.
Colin Walters [Wed, 8 Jun 2022 13:53:33 +0000 (09:53 -0400)]
ci: Add a flow that does a git libostree + git rust-bindings
In https://github.com/ostreedev/ostree/pull/2633 I realized
that our CI only builds git of libostree or git of rust-bindings,
not git of both. And we definitely want to test the latter too,
so e.g. the Rust tests *also* become tests for changes to the C code.
Colin Walters [Wed, 8 Jun 2022 01:41:08 +0000 (21:41 -0400)]
repo: Further optimize `ostree_repo_list_objects_set()`
In a prior change we discovered that for bad historical reasons
libostree was returning a mapping "object type+checksum" => "metadata"
but the "metadata" was redundant and pointless.
Optimize the prune API to use a (currently internal) object listing
API which returns a set, not a map. This allows `GHashTable` to
avoid allocating a separate array for the values, neatly cutting
memory usage in half (from ~13MB to ~6MB) on my test case of a
dry-run prune of a FCOS build.
Colin Walters [Tue, 7 Jun 2022 21:59:02 +0000 (17:59 -0400)]
rust: Bump semver, add feature for current release
There were some changes to the sys API for introspection fixes.
And add a feature for the current release, which is something
I'll add to the checklist for releases.
Colin Walters [Wed, 8 Jun 2022 00:30:09 +0000 (20:30 -0400)]
repo: Optimize memory use of `ostree_repo_list_objects()`
I was looking at https://github.com/ostreedev/ostree/pull/2632
and confused at the usage of
`GVariant *value = g_variant_new ("(b@as)", TRUE, g_variant_new_strv (NULL, 0));`
which looked strange - why the empty strv?
It turns out that this is a historical legacy of the time when
ostree had pack files. And nothing actually cares about the values
of these variants; we should have an API that returns a proper set,
and not a hash.
But...since all of these things have exactly the same value, instead
of allocating lots of redundant copies on the heap, just have
them all hold a refcount on a shared value.
This cuts the heap usage from 20MB to 13MB on a test FCOS repository
build.
Colin Walters [Thu, 2 Jun 2022 23:42:52 +0000 (19:42 -0400)]
Drop `OSTREE_BUILT_FEATURES` from introspection
It inherently depends on the individual build, and can't
really be an official stable API for introspection users.
I've noticed the value of this flip flop when doing local builds.
I'm fairly certain no one is trying to use it from a higher level
language.
It'd probably make sense to even drop from the official C API,
but I'm trying to be conservative with that.
Colin Walters [Thu, 2 Jun 2022 21:13:17 +0000 (17:13 -0400)]
Rename ostree-cmdprivate to drop out of introspection
I was looking at our `.gir` and noticed we had the cmdprivate bits
because the pattern for excluding headers is `-private.h`, which
didn't match `cmdprivate.h`.
James Westman [Mon, 30 May 2022 22:28:54 +0000 (17:28 -0500)]
Fix annotations on ostree_mutable_tree_lookup()
(nullable) and (optional) were missing on lookup()'s out parameters,
which caused the rust bindings for the function to not work. Due to the
missing (nullable), it would return a Result<(GString, MutableTree), _>,
not a Result<(Option<GString>, Option<MutableTree>), _>, which led to
panics.
Jonathan Lebon [Thu, 26 May 2022 20:54:43 +0000 (16:54 -0400)]
copr: mark git checkout as safe
Recent git became more strict wrt git repos in parent dirs owned by
other users. This broke our COPR builds due to the git checkout being
created by a different user and mounted in. We need to explicitly mark
the repo as safe.
For more information, see:
https://github.com/actions/checkout/issues/760
We want to parse a new "bls-append-except-default" key from ostree config. The
key-value pairs specified by this key will be added to the generated
BLS fragments of non-default deployments. They must follow the format
"key1,value1;key2,value2" and so on.
This change will allow us to land GRUB password support in FCOS.
Colin Walters [Sat, 7 May 2022 17:51:31 +0000 (13:51 -0400)]
Add APIs to get xattrs from disk
I'm aiming to do some more work on the Rust side around `fsck`
like functionality, and this is a useful primitive. There isn't
a great Rust crate for xattrs, and I think it's better to share this
code.
Colin Walters [Fri, 6 May 2022 20:46:46 +0000 (16:46 -0400)]
cfg.mk: Don't even look at rust-bindings/
It's really tempting to remove `make syntax-check`, it has very
very rarely found any real problems.
But anyways, just exclude all the binding code because it trips
up random problems we simply don't care about like mentions of
`O_NDELAY` in the `GLib-2.0.gir`.
Colin Walters [Tue, 26 Apr 2022 23:30:01 +0000 (19:30 -0400)]
Add a `repo()` accessor to `TransactionGuard`
I want to write APIs that *require* the caller to have set up
an ostree transaction. It's natural to require passing a guard
to do so. But then we want an accessor for the repo.
Colin Walters [Sat, 26 Feb 2022 13:46:50 +0000 (08:46 -0500)]
repo: Add `query_file` API
The underlying `ostree_repo_load_file()` API has the caller pass
`NULL` for output arguments it doesn't want. This isn't sanely
bindable in Rust - what the generator does is always request
all values, but maps them all to `Option<T>`.
The main cases are where a user wants either metadata, or both
metadata and content. This API gives just metadata; it's a
bit more efficient as we don't need to open the file, and doesn't
require the caller to `unwrap()`.