[Libguestfs] [PATCH libnbd discussion only 4/5] api: Implement concurrent writer.

Richard W.M. Jones rjones at redhat.com
Mon Jun 3 21:13:27 UTC 2019


On Mon, Jun 03, 2019 at 01:27:47PM -0500, Eric Blake wrote:
> On 6/3/19 10:29 AM, Richard W.M. Jones wrote:
> > +=item 4. Modify main loop
> > +
> > +Finally your main loop can unconditionally call
> > +C<nbd_aio_notify_write> when C<nbd_aio_get_direction> returns C<WRITE>
> > +or C<BOTH> (since the concurrent thread can always enqueue more data
> > +and so is always "ready to write").
> 
> Will we ever actually reach a state that is blocked on a write
> completion for aio_get_direction to ever even request a WRITE or BOTH?
> Or will the state machine always manage to churn through requests in
> their entirety and back to state READY which is just a READ state?

Right, I believe the answer is no, we never get WRITE/BOTH, and that
is also what I observed when closely examining the events in the debug
log earlier today.  However I guess better to be safe.

> > +int
> > +nbd_unlocked_set_concurrent_writer (struct nbd_handle *h,
> > +                                    void *data, writer_cb writer)
> > +{
> > +  /* I suppose we could allow this, but it seems more likely that
> > +   * it's an error rather than intentional.
> > +   */
> > +  if (h->writer != NULL) {
> > +    set_error (EINVAL, "concurrent writer was already set for this handle");
> > +    return -1;
> > +  }
> > +
> > +  h->writer = writer;
> > +  h->writer_data = data;
> > +  return 0;
> > +}
> 
> Is it worth a get_concurrent_writer()?  Not strictly necessary, though.

We could add it later but it raises the question of why anyone would
need it.

> > +  else {
> > +    /* Pass the buffer to the concurrent writer thread. */
> > +    h->writer (h->writer_data, buf, len);
> > +    return len;
> 
> [1] So h->writer is NOT allowed to fail directly (if it fails, it must
> call nbd_concurrent_writer_error instead). Stems from the fact that the
> generator doesn't allow callbacks with a return type, but livable.  But
> may warrant extra wording in the documentation.

Right, it's a limitation of the generator which I should probably fix.
If we had that then we could differentiate "immediate failure" (eg
memory allocation) from later failure of send(2) in the writer thread.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
Fedora Windows cross-compiler. Compile Windows programs, test, and
build Windows installers. Over 100 libraries supported.
http://fedoraproject.org/wiki/MinGW




More information about the Libguestfs mailing list