Quoting Serge Hallyn (serge.hal...@ubuntu.com): > Quoting Dwight Engen (dwight.en...@oracle.com): > > On Fri, 13 Sep 2013 17:29:53 -0400 > > Dwight Engen <dwight.en...@oracle.com> wrote: > > > > > On Fri, 13 Sep 2013 12:09:55 -0400 > > > S.Çağlar Onur <cag...@10ur.org> wrote: > > > > > > > Hi Dwight, > > > > > > > > Yes, I only observed a hang so far but not this assertion (in fact I > > > > don't remember ever seeing that). What I'm seeing is this; > > > > > > Okay, something funny is going on, but I don't know what yet. That > > > assertion is coming from liblxc.so->libgnutls->libgcrypt and seems to > > > be complaining that we're unlocking something that is already > > > unlocked. So I compiled lxc without GNUTLS support (by commenting out > > > the check for it in configure.ac) and now I get past that and get > > > hangs similar to yours. > > > > > > Interestingly, I modified your program to just do the create and > > > destroy and not the start nor stop and I still get the hangs during > > > the creation part. > > > > Sorry to reply to myself: So now I modified your program to do the > > create single threaded and everything else threaded (see attached > > patch) and that doesn't hang for me. > > > > It looked like to me that the hung threads were stuck on process_lock() > > so I added a backtrace there to debug it a bit more and it looks like > > the hang is in the flow: > > > > lxcapi_create() > > c->save_config() > > container_disk_lock() > > lxclock() > > process_lock() > > > > Not sure why yet though. Serge, do you think this could have to do with > > the fork()ing from a thread in that flow? > > Well, we've got save_config() doing an fopen without the process_lock() > for one thing which is bad. That could explain it in a few ways - we > could have corruption due to both tasks changing fdtable at the same > time, or perhaps because open() is a cancelation point... > > Does doing a process_lock() around the fopen and fclose in > lxcapi_save_config() fix it?
something like this should be a start: Subject: api_start: make thread-safe (or at least start to) Signed-off-by: Serge Hallyn <serge.hal...@ubuntu.com> --- src/lxc/lxccontainer.c | 6 ++++++ src/lxc/parse.c | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index 79237df..3c51c4a 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -665,7 +665,9 @@ static bool create_container_dir(struct lxc_container *c) free(s); return false; } + process_lock(); ret = mkdir(s, 0755); + process_unlock(); if (ret) { if (errno == EEXIST) ret = 0; @@ -1362,11 +1364,15 @@ static bool lxcapi_save_config(struct lxc_container *c, const char *alt_file) if (lret) return false; + process_lock(); fout = fopen(alt_file, "w"); + process_unlock(); if (!fout) goto out; write_config(fout, c->lxc_conf); + process_lock(); fclose(fout); + process_unlock(); ret = true; out: diff --git a/src/lxc/parse.c b/src/lxc/parse.c index 26cbbdd..f154b89 100644 --- a/src/lxc/parse.c +++ b/src/lxc/parse.c @@ -90,7 +90,9 @@ int lxc_file_for_each_line(const char *file, lxc_file_cb callback, void *data) char *line = NULL; size_t len = 0; + process_lock(); f = fopen(file, "r"); + process_unlock(); if (!f) { SYSERROR("failed to open %s", file); return -1; @@ -104,7 +106,9 @@ int lxc_file_for_each_line(const char *file, lxc_file_cb callback, void *data) if (line) free(line); + process_lock(); fclose(f); + process_unlock(); return err; } -- 1.8.3.2 ------------------------------------------------------------------------------ How ServiceNow helps IT people transform IT departments: 1. Consolidate legacy IT systems to a single system of record for IT 2. Standardize and globalize service processes across IT 3. Implement zero-touch automation to replace manual, redundant tasks http://pubads.g.doubleclick.net/gampad/clk?id=51271111&iu=/4140/ostg.clktrk _______________________________________________ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel