[ovs-dev] [threads v2 10/13] async-append: New library to allow asynchronous appending to a log file.

Ben Pfaff blp at nicira.com
Thu Jul 18 21:41:23 UTC 2013


On Wed, Jul 17, 2013 at 03:33:38PM -0700, Alex Wang wrote:
> few inline questions below,
> 
> 
> +static bool
> > +async_append_is_full(const struct async_append *ap)
> > +{
> > +    return (ap->aiocb_head - ap->aiocb_tail >= MAX_CBS
> > +            || byteq_is_full(&ap->byteq));
> > +}
> >
> 
> 
> Just make sure, "ap->aiocb_head - ap->aiocb_tail > MAX_CBS" won't happen,
> right?

That's right, that would be a bug.

> > +void
> +async_append_write(struct async_append *ap, const void *data_, size_t size)
> > +{
> > +    const uint8_t *data = data_;
> > +
> > +    if (!async_append_enabled) {
> > +        ignore(write(ap->fd, data, size));
> > +        return;
> > +    }
> > +
> > +    while (size > 0) {
> > +        struct aiocb *aiocb;
> > +        size_t chunk_size;
> > +        void *chunk;
> > +
> > +        while (async_append_is_full(ap)) {
> > +            async_append_wait(ap);
> > +        }
> > +
> > +        chunk = byteq_head(&ap->byteq);
> > +        chunk_size = byteq_headroom(&ap->byteq);
> > +        if (chunk_size > size) {
> > +            chunk_size = size;
> > +        }
> > +        memcpy(chunk, data, chunk_size);
> > +
> > +        aiocb = &ap->aiocbs[ap->aiocb_head & (MAX_CBS - 1)];
> > +        memset(aiocb, 0, sizeof *aiocb);
> > +        aiocb->aio_fildes = ap->fd;
> > +        aiocb->aio_offset = 0;
> > +        aiocb->aio_buf = chunk;
> > +        aiocb->aio_nbytes = chunk_size;
> > +        aiocb->aio_sigevent.sigev_notify = SIGEV_NONE;
> > +        if (aio_write(aiocb) == -1) {
> > +            async_append_flush(ap);
> > +            ignore(write(ap->fd, data, size));
> > +            return;
> > +        }
> > +
> > +        data += chunk_size;
> > +        size -= chunk_size;
> > +        byteq_advance_head(&ap->byteq, chunk_size);
> > +        ap->aiocb_head++;
> > +    }
> > +}
> >
> 
> 
> Is there requirement that the "* data_" must not be free'ed before
> asynchronously written to 'fd'?

That's right too.  (Do you see a mistake here regarding that rule?)

Thanks,

Ben.



More information about the dev mailing list