Thread (214 messages) 214 messages, 14 authors, 2021-05-18

Re: [PATCH v2 02/13] reftable: define the public API

From: Han-Wen Nienhuys <hidden>
Date: 2020-11-30 14:57:06

On Mon, Oct 12, 2020 at 6:57 PM Jonathan Nieder [off-list ref] wrote:
quoted
We could, but it would considerably complicate work on this patch
series, as the commit boundary then doesn't fall on file boundaries
anymore. Would you be open to having multiple headers for the public
interface? eg. reftable-record.h, reftable-reader.h etc. ?
I'd be more than open to it: I think that would make for a clearer API.
Done.
quoted
quoted
Should these call BUG()?  Or is it useful for some callers to be able
to recover from these errors?
Since this was written as a standalone library, it's up to the caller
to decide what should be done.
I'm not strongly opinionated about this, but just a quick note: this
implies that the library would need to make sure it is producing a
valid state in error cases.
This is what it already does. I tried to clarify this in some places.
Does the API documentation describe what state a handle is in after
an error --- e.g., what operations are permitted after that?
API_ERROR should not result in state changes.
quoted
quoted
quoted
+int reftable_error_to_errno(int err);
What is the intended use of this function?
The read_raw_ref method in the ref backend API uses errno values as
out-of-band communication mechanism.
Could we change that?  It sounds error-prone.
I moved it into refs/reftable-backend.c; I'd rather not also have to
clean up the files backend as part of this work, though.
quoted
quoted
Do I pass in the 'struct block_source *' as the source arg?  If so, why
are these declared as void *?
you pass in block_source->arg. Should struct implementations of
polymorphic types carry a pointer to their own vtable instead?
I think a pointer to block_source would make it more self-explanatory,
yes.
This has a number of downsides, though. It means I have to introduce
separate structs strbuf_blocksource and file_blocksource, along with
functions to create and deallocate them, so it makes the whole thing
more unwieldy to use.
quoted
quoted
Is the reason this manages the buffer instead of requiring a
caller-supplied buffer to support zero-copy?
Log blocks are compressed, so the caller doesn't know the correct size
to supply. By letting the block source handle the management, we can
swap out the block read from the file for a block managed by malloc on
decompressing a log block.
Hm, my naive assumption would have been that we'd use different
buffers for the compressed and uncompressed data.
Maybe you can comment on how to solve this differently when we get to
the implementation of block reading/writing in the commit series.
quoted
quoted
quoted
+ Generic tables
+
+ A unified API for reading tables, either merged tables, or single readers.
Are there callers/helpers that don't know whether they want one or the
other?
The setup with per-worktree refs means that there are two reftable
stacks in a .git repo. In order to iterate over the entire ref space,
you have to merge two merged tables, but the stack itslef merges a set
of simple reftables.
I see.  That's subtle, so it seems worth documenting for the next
person reading this documentation and wondering why.
Done.

-- 
Han-Wen Nienhuys - Google Munich
I work 80%. Don't expect answers from me on Fridays.
--

Google Germany GmbH, Erika-Mann-Strasse 33, 80636 Munich

Registergericht und -nummer: Hamburg, HRB 86891

Sitz der Gesellschaft: Hamburg

Geschäftsführer: Paul Manicle, Halimah DeLaine Prado
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help