[lxc-devel] [PATCH 1/3] lxc-start: fix the container leak when daemonize
Qiang Huang
h.huangqiang at huawei.com
Thu Jan 23 07:09:55 UTC 2014
On 2014/1/23 8:27, Serge Hallyn wrote:
> Quoting Qiang Huang (h.huangqiang at huawei.com):
>> When start container with daemon model, we'll have a new daemon
>> process in lxcapi_start, whose c->numthreads is 2, inherited
>> from his father, and his father's return and lxc_container_put
>> won't affect son's numthreads. So when daemon stops, he only
>> did on lxc_container_put, the lxc_container will leak.
>>
>> Actually, lxc_container_get only works for mulit-threads cases,
>> here we did fork, and don't need to hold container count to
>> protect anything, so just remove it.
>>
>> Signed-off-by: Serge Hallyn <serge.hallyn at ubuntu.com>
>
> No,
Sorry, I'll drop this.
>
>> Signed-off-by: Qiang Huang <h.huangqiang at huawei.com>
>> ---
>> src/lxc/lxccontainer.c | 10 +++++-----
>> 1 file changed, 5 insertions(+), 5 deletions(-)
>>
>> diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
>> index 368cb46..d020918 100644
>> --- a/src/lxc/lxccontainer.c
>> +++ b/src/lxc/lxccontainer.c
>> @@ -589,15 +589,11 @@ static bool lxcapi_start(struct lxc_container *c, int useinit, char * const argv
>> * while container is running...
>> */
>> if (daemonize) {
>> - if (!lxc_container_get(c))
>> - return false;
>> lxc_monitord_spawn(c->config_path);
>>
>> pid_t pid = fork();
>> - if (pid < 0) {
>> - lxc_container_put(c);
>> + if (pid < 0)
>> return false;
>> - }
>> if (pid != 0)
>> return wait_on_daemonized_start(c, pid);
>>
>> @@ -639,6 +635,10 @@ reboot:
>> }
>>
>> if (daemonize) {
>> + /* When daemon was forked, it inherited parent's
>> + * lxc_container, so here need a put to free
>> + * lxc_container.
>> + */
>> lxc_container_put(c);
>
> Why did you change this in my patch? Since we have removed the
> lxc_container_get() at the top of this patch, the matching put
> should also be removed.
>
> I'm going to go ahead an apply my original patch
> (https://lists.linuxcontainers.org/pipermail/lxc-devel/2014-January/007343.html)
> If you think there is an error in that logic, it'll be easier
> to reason about as a separate patch on top of mine.
I already reasoned in the added comment, we need this because if not,
lxc_container won't be freed when daemon exits, and PID file won't
be unlinked either.
What about this:
>From 80f3862f9c4dbc8a05e79e50c50e79e30ffebc25 Mon Sep 17 00:00:00 2001
From: Qiang Huang <h.huangqiang at huawei.com>
Date: Thu, 23 Jan 2014 14:25:31 +0800
Subject: [PATCH] daemon: add lxc_container_put to free container when daemon exits
PID file in lxc_container is unlinked when lxc_container_free,
if we leak the container, the PID file also won't be removed
after container down.
Signed-off-by: Qiang Huang <h.huangqiang at huawei.com>
---
src/lxc/lxccontainer.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
index 28de455..d76e386 100644
--- a/src/lxc/lxccontainer.c
+++ b/src/lxc/lxccontainer.c
@@ -669,9 +669,14 @@ reboot:
goto reboot;
}
- if (daemonize)
+ if (daemonize) {
+ /* When daemon forked, he inherited father's
+ * lxc_container, so here need a put to free
+ * lxc_container.
+ */
+ lxc_container_put(c);
exit (ret == 0 ? true : false);
- else
+ } else
return (ret == 0 ? true : false);
}
--
1.8.3
>
>> exit (ret == 0 ? true : false);
>> } else {
>> --
>> 1.8.3
>>
>>
>
> .
>
More information about the lxc-devel
mailing list