static int do_freeze_thaw(bool freeze, const char *name, const char *lxcpath) { int ret; char v[100]; const char *state = freeze ? "FROZEN" : "THAWED"; size_t state_len = 6; lxc_state_t new_state = freeze ? FROZEN : THAWED; ret = lxc_cgroup_set("freezer.state", state, name, lxcpath); if (ret < 0) { ERROR("Failed to freeze %s", name); return -1; } for (;;) { ret = lxc_cgroup_get("freezer.state", v, sizeof(v), name, lxcpath); if (ret < 0) { ERROR("Failed to get freezer state of %s", name); return -1; } v[99] = '\0'; v[lxc_char_right_gc(v, strlen(v))] = '\0'; ret = strncmp(v, state, state_len); if (ret == 0) { lxc_cmd_serve_state_clients(name, lxcpath, new_state); lxc_monitor_send_state(name, new_state, lxcpath); return 0; } sleep(1); } }
static int do_freeze_thaw(int freeze, const char *name, const char *lxcpath) { char v[100]; const char *state = freeze ? "FROZEN" : "THAWED"; if (lxc_cgroup_set("freezer.state", state, name, lxcpath) < 0) { ERROR("Failed to freeze %s:%s", lxcpath, name); return -1; } while (1) { if (lxc_cgroup_get("freezer.state", v, 100, name, lxcpath) < 0) { ERROR("Failed to get new freezer state for %s:%s", lxcpath, name); return -1; } if (v[strlen(v)-1] == '\n') v[strlen(v)-1] = '\0'; if (strncmp(v, state, strlen(state)) == 0) { if (name) lxc_monitor_send_state(name, freeze ? FROZEN : THAWED, lxcpath); return 0; } sleep(1); } }
/* * test_running_container: test cgroup functions against a running container * * @group : name of the container group or NULL for default "lxc" * @name : name of the container */ static int test_running_container(const char *lxcpath, const char *group, const char *name) { int ret = -1; struct lxc_container *c = NULL; char *cgrelpath; char relpath[PATH_MAX+1]; char value[NAME_MAX], value_save[NAME_MAX]; sprintf(relpath, "%s/%s", group ? group : "lxc", name); if ((c = lxc_container_new(name, lxcpath)) == NULL) { TSTERR("container %s couldn't instantiate", name); goto err1; } if (!c->is_defined(c)) { TSTERR("container %s does not exist", name); goto err2; } cgrelpath = lxc_cmd_get_cgroup_path(c->name, c->config_path, "freezer"); if (!cgrelpath) { TSTERR("lxc_cmd_get_cgroup_path returned NULL"); goto err2; } if (!strstr(cgrelpath, relpath)) { TSTERR("lxc_cmd_get_cgroup_path %s not in %s", relpath, cgrelpath); goto err3; } /* test get/set value using memory.soft_limit_in_bytes file */ ret = lxc_cgroup_get("memory.soft_limit_in_bytes", value, sizeof(value), c->name, c->config_path); if (ret < 0) { TSTERR("lxc_cgroup_get failed"); goto err3; } strcpy(value_save, value); ret = lxc_cgroup_set("memory.soft_limit_in_bytes", "512M", c->name, c->config_path); if (ret < 0) { TSTERR("lxc_cgroup_set failed %d %d", ret, errno); goto err3; } ret = lxc_cgroup_get("memory.soft_limit_in_bytes", value, sizeof(value), c->name, c->config_path); if (ret < 0) { TSTERR("lxc_cgroup_get failed"); goto err3; } if (strcmp(value, "536870912\n")) { TSTERR("lxc_cgroup_set_bypath failed to set value >%s<", value); goto err3; } /* restore original value */ ret = lxc_cgroup_set("memory.soft_limit_in_bytes", value_save, c->name, c->config_path); if (ret < 0) { TSTERR("lxc_cgroup_set failed"); goto err3; } ret = 0; err3: free(cgrelpath); err2: lxc_container_put(c); err1: return ret; }