[Devel] [PATCH libvzctl v2] Suppress SUNRPC traffic on "fast stop".

Igor Sukhih igor at virtuozzo.com
Wed Jul 5 14:09:15 MSK 2017


On 07/04/2017 06:01 PM, Stanislav Kinsburskiy wrote:
> Igor, could you please review?
>
>
> 26.06.2017 17:04, Stanislav Kinsburskiy пишет:
>> This is needed to break infinite loop in SUNRPC state machine, 
>> leading to
>> unstoppable container in case of unreachable network.
>>
>> https://jira.sw.ru/browse/PSBM-67544
>>
>> Note: needs kernel rh7-3.10.0-514.16.1.vz7.32.12 or newer
>>
>> v2:
>> 1) Now per-net SUNRPC "kill-tasks" handle for container init process 
>> is used
>> rather than VE cgroup handle.
>>
>> Signed-off-by: Stanislav Kinsburskiy <skinsbursky at virtuozzo.com>
>> ---
>>   lib/env_nsops.c |   52 
>> ++++++++++++++++++++++++++++++++++++++++++++++++----
>>   1 file changed, 48 insertions(+), 4 deletions(-)
>>
>> diff --git a/lib/env_nsops.c b/lib/env_nsops.c
>> index d62dff4..74d6402 100644
>> --- a/lib/env_nsops.c
>> +++ b/lib/env_nsops.c
>> @@ -1067,27 +1067,71 @@ static int ns_env_kill(struct 
>> vzctl_env_handle *h)
>>       return 0;
>>   }
>>   +static int write_sunrpc_kill(struct vzctl_env_handle *h, unsigned 
>> value)
>> +{
>> +    pid_t pid;
>> +    int fd;
>> +    ssize_t res;
>> +    char path[PATH_MAX];
>> +    char *val = value ? "1" : "0";
>> +
>> +    if (cg_env_get_init_pid(h->ctid, &pid))
>> +        return -1;
>> +
>> +    snprintf(path, sizeof(path), "/proc/%d/net/rpc/kill-tasks", pid);
>> +
>> +    if (access(path, F_OK))
>> +        return 0;
>> +
>> +    fd = open(path, O_WRONLY);
>> +    if (fd == -1) {
>> +        vzctl_err(-1, errno, "Failed to open %s: %s", path, 
>> strerror(errno));
>> +        return -1;
>> +    }
>> +
>> +    res = write(fd, val, strlen(val) + 1);
>> +    close(fd);
>> +
>> +    if (res != strlen(val) + 1) {
>> +         vzctl_err(-1, errno, "Unable to %s SUNRPC traffic",
>> +                 value ? "suppress" : "release");
>> +         return -1;
>> +    }
>> +
>> +
>> +    return 0;
       ^^^^^  return 1;

>>
>> +
>> +release_sunrpc:
>> +    if (sunrpc_suppressed > 0)
>> +        (void) write_sunrpc_kill(h, 0);
>> +    return ret;
>>   }
>>     static int ns_env_cleanup(struct vzctl_env_handle *h, int flags) 



More information about the Devel mailing list