[lxc-devel] API errors
Serge Hallyn
serge.hallyn at ubuntu.com
Thu Oct 10 14:00:40 UTC 2013
Quoting S.Çağlar Onur (caglar at 10ur.org):
> Hi Serge,
>
>
> On Sat, Oct 5, 2013 at 12:27 AM, Serge Hallyn <serge.hallyn at ubuntu.com>wrote:
>
> > Quoting Serge Hallyn (serge.hallyn at ubuntu.com):
> > > Quoting S.Çağlar Onur (caglar at 10ur.org):
> > > > Hi,
> > > >
> > > > src/lxc/lxccontainer.h contains two public field named error_string and
> > > > error_num. If I'm not missing anything no one seems to be using them.
> > > >
> > > > What was the intention? Should API calls set those and stop using
> > macros
> > > > like ERROR and SYSERROR?
> > >
> > > That is the idea. It's not yet clear to me how to best track that.
> > > Maybe it should become an array of strings, so that each stack layer
> > > moving up and seeing an error happened can give its own input on what
> > > it was doing. Then when lxc-start fails, we can see something like
> > >
> > > [0] failed to create container
> > > [1] failed to setup network
> > > [2] failed to create veth
> > > [3] failed to pass veth into network namespce
> > >
> > > And then yes, ERROR and SYSERROR should be reserved for the actual
> > > programs, and should spit out error stacks as well.
> >
> > So I'm thinking an API like the below. Much in bdev.c for instance can
> > be converted to PUSH_ERR. Although all the places where we have
> > fork()ed obviouslly cannot. There they'll have to keep doing ERROR(),
> > and the parent can point to the logfile for further info.
> >
>
> I'm imagining API methods themselves are going to call the clear_errors
> (i.e something like below) and the only reason to export that is to
> provide an alternative way to manage the stack? If that's the case,
> wouldn't be helpful if there will be a get_error call as well, which
> removes the last error from the stack and returns to the caller?
>
> diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
> index 02126b2..7390cac 100644
> --- a/src/lxc/lxccontainer.c
> +++ b/src/lxc/lxccontainer.c
> @@ -510,6 +510,8 @@ static bool lxcapi_start(struct lxc_container *c, int
> useinit, char * const argv
> if (!c->lxc_conf)
> return false;
>
> + c->clear_errors();
> +
> if ((ret = ongoing_create(c)) < 0) {
> ERROR("Error checking for incomplete creation");
> return false;
Thinking about it more, I'm less sure about sticking the
errors in the lxc_container struct. That's fine for
things like start and freeze, but not for things like
freeze or even a failed lxc_container_new().
I thought maybe it should go in thread-local storage. But
then if we end up with a crash before the caller has a
chance to write the info out to disk, we lose the info.
We could use ipc shared memory, so then we could actually
go in after the fact with a lxc-diagnose tool and get the
latest error messages for a particular (lxcpath,lxcname)
tuple. That actually seems to have the fewest downsides,
and may address all our requirements.
-serge
More information about the lxc-devel
mailing list