[lxc-devel] [PATCH] Use container specific domain socket name
S.Çağlar Onur
caglar at 10ur.org
Tue Apr 9 01:35:31 UTC 2013
From: "S.Çağlar Onur" <caglar at 10ur.org>
Otherwise trying to start N containers in parallel gives "lxc_container: bind : Address already in use" error.
Found while using Go bindings to create/start/stop large number of containers in parallel so I reproduced the same using Python API to rule out possible Go related problems.
----
import lxc
from queue import Empty
from multiprocessing import Process, Queue
def create(q):
while True:
try:
x = q.get(block=False)
c = lxc.Container(str(x))
print("Starting", x)
c.start()
except Empty:
break
if __name__=="__main__":
work_queue = Queue()
for i in range(11):
work_queue.put(i)
process = [Process(target=create, args=(work_queue,)) for i in range(4)]
for p in process:
p.start()
for p in process:
p.join()
----
caglar at qgq:~/Project$ sudo python3 cstart.py
Starting 0
Starting 1
lxc_container: bind : Address already in use
Starting 3
Starting 4
Starting 2
lxc_container: lxc_container: bind : Address already in use
bind : Address already in uselxc_container: bind : Address already in use
Starting 5
Starting 6
lxc_container: bind : Address already in use
lxc_container: bind : Address already in use
Starting 7
Starting 8
Starting 9
lxc_container: bind : Address already in use
lxc_container: bind : Address already in use
lxc_container: bind : Address already in use
Starting 10
lxc_container: bind : Address already in use
Signed-off-by: S.Çağlar Onur <caglar at 10ur.org>
---
src/lxc/lxc.h | 2 +-
src/lxc/lxc_monitor.c | 2 +-
src/lxc/monitor.c | 10 +++++-----
src/lxc/state.c | 2 +-
4 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/src/lxc/lxc.h b/src/lxc/lxc.h
index db921f0..224d460 100644
--- a/src/lxc/lxc.h
+++ b/src/lxc/lxc.h
@@ -74,7 +74,7 @@ extern int lxc_execute(const char *name, char *const argv[], int quiet,
* The function will return an fd corresponding to the events
* Returns a file descriptor on success, < 0 otherwise
*/
-extern int lxc_monitor_open(const char *lxcpath);
+extern int lxc_monitor_open(const char *lxcpath, const char *lxcname);
/*
* Read the state of the container if this one has changed
diff --git a/src/lxc/lxc_monitor.c b/src/lxc/lxc_monitor.c
index 0530373..4898377 100644
--- a/src/lxc/lxc_monitor.c
+++ b/src/lxc/lxc_monitor.c
@@ -87,7 +87,7 @@ int main(int argc, char *argv[])
return -1;
}
- fd = lxc_monitor_open(my_args.lxcpath);
+ fd = lxc_monitor_open(my_args.lxcpath, my_args.name);
if (fd < 0)
return -1;
diff --git a/src/lxc/monitor.c b/src/lxc/monitor.c
index afdaf67..2590559 100644
--- a/src/lxc/monitor.c
+++ b/src/lxc/monitor.c
@@ -47,7 +47,7 @@ lxc_log_define(lxc_monitor, lxc);
#define UNIX_PATH_MAX 108
#endif
-static void lxc_monitor_send(struct lxc_msg *msg, const char *lxcpath)
+static void lxc_monitor_send(struct lxc_msg *msg, const char *lxcpath, const char *lxcname)
{
int fd;
struct sockaddr_un addr = { .sun_family = AF_UNIX };
@@ -59,7 +59,7 @@ static void lxc_monitor_send(struct lxc_msg *msg, const char *lxcpath)
* should we take a hash of lxcpath? a subset of it?
*/
len = sizeof(addr.sun_path) - 1;
- ret = snprintf(offset, len, "%s/lxc-monitor", lxcpath);
+ ret = snprintf(offset, len, "%s/%s-monitor", lxcpath, lxcname);
if (ret < 0 || ret >= len) {
ERROR("lxcpath too long to open monitor");
return;
@@ -82,10 +82,10 @@ void lxc_monitor_send_state(const char *name, lxc_state_t state, const char *lxc
strncpy(msg.name, name, sizeof(msg.name));
msg.name[sizeof(msg.name) - 1] = 0;
- lxc_monitor_send(&msg, lxcpath);
+ lxc_monitor_send(&msg, lxcpath, name);
}
-int lxc_monitor_open(const char *lxcpath)
+int lxc_monitor_open(const char *lxcpath, const char *lxcname)
{
struct sockaddr_un addr = { .sun_family = AF_UNIX };
char *offset = &addr.sun_path[1];
@@ -97,7 +97,7 @@ int lxc_monitor_open(const char *lxcpath)
* should we take a hash of lxcpath? a subset of it?
*/
len = sizeof(addr.sun_path) - 1;
- ret = snprintf(offset, len, "%s/lxc-monitor", lxcpath);
+ ret = snprintf(offset, len, "%s/%s-monitor", lxcpath, lxcname);
if (ret < 0 || ret >= len) {
ERROR("lxcpath too long to open monitor");
return -1;
diff --git a/src/lxc/state.c b/src/lxc/state.c
index 3e7e94a..454c02e 100644
--- a/src/lxc/state.c
+++ b/src/lxc/state.c
@@ -201,7 +201,7 @@ extern int lxc_wait(const char *lxcname, const char *states, int timeout, const
if (fillwaitedstates(states, s))
return -1;
- fd = lxc_monitor_open(lxcpath);
+ fd = lxc_monitor_open(lxcpath, lxcname);
if (fd < 0)
return -1;
--
1.7.10.4
More information about the lxc-devel
mailing list