Skip to content

Commit

Permalink
commands: remove mutex from state client list
Browse files Browse the repository at this point in the history
I was thinking about the locking here yesterday and it dawned on me that we
actually don't need this at all:
- possible contention between traversing list to send states to state clients
  and adding new state clients to the list:
  It is the command handler that adds new state clients to the state client
  list. The command handler and the code that actually sends out the container
  states run in the same process so there's not contention and thus no locking
  needed.
- adding state clients to the list from multiple threads:
  The command handler itself is single-threaded so only one thread's request can
  be served at the same time so no locking is needed.
- sending out the state to state clients via the command handler itself:
  The state client also adds and removes state clients from the state client
  list so there's no locking needed.

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
  • Loading branch information
Christian Brauner committed Feb 26, 2018
1 parent 69556ea commit 328a3f0
Show file tree
Hide file tree
Showing 3 changed files with 0 additions and 8 deletions.
2 changes: 0 additions & 2 deletions src/lxc/commands.c
Expand Up @@ -1149,7 +1149,6 @@ static void lxc_cmd_fd_cleanup(int fd, struct lxc_handler *handler,
return;
}

process_lock();
lxc_list_for_each_safe(cur, &handler->conf->state_clients, next) {
client = cur->elem;
if (client->clientfd != fd)
Expand All @@ -1165,7 +1164,6 @@ static void lxc_cmd_fd_cleanup(int fd, struct lxc_handler *handler,
*/
break;
}
process_unlock();
}

static int lxc_cmd_handler(int fd, uint32_t events, void *data,
Expand Down
3 changes: 0 additions & 3 deletions src/lxc/commands_utils.c
Expand Up @@ -211,14 +211,11 @@ int lxc_add_state_client(int state_client_fd, struct lxc_handler *handler,
return -ENOMEM;
}

process_lock();
state = handler->state;
if (states[state] != 1) {
lxc_list_add_elem(tmplist, newclient);
lxc_list_add_tail(&handler->conf->state_clients, tmplist);
process_unlock();
} else {
process_unlock();
free(newclient);
free(tmplist);
return state;
Expand Down
3 changes: 0 additions & 3 deletions src/lxc/start.c
Expand Up @@ -390,7 +390,6 @@ int lxc_serve_state_clients(const char *name, struct lxc_handler *handler,
struct lxc_state_client *client;
struct lxc_msg msg = {.type = lxc_msg_state, .value = state};

process_lock();
if (state == THAWED)
handler->state = RUNNING;
else
Expand All @@ -400,7 +399,6 @@ int lxc_serve_state_clients(const char *name, struct lxc_handler *handler,

if (lxc_list_empty(&handler->conf->state_clients)) {
TRACE("No state clients registered");
process_unlock();
return 0;
}

Expand Down Expand Up @@ -437,7 +435,6 @@ int lxc_serve_state_clients(const char *name, struct lxc_handler *handler,
free(cur->elem);
free(cur);
}
process_unlock();

return 0;
}
Expand Down

0 comments on commit 328a3f0

Please sign in to comment.