From ed508ac142f9ae98fee56b200f80c0d525484819 Mon Sep 17 00:00:00 2001 From: Terry Chan Date: Sat, 20 Jan 2018 15:34:40 +0800 Subject: [PATCH 1/2] Fix no parse --fast-open in manager mode --- src/manager.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/manager.c b/src/manager.c index fc99e190..75882f94 100644 --- a/src/manager.c +++ b/src/manager.c @@ -121,6 +121,8 @@ build_config(char *prefix, struct manager_ctx *manager, struct server *server) fprintf(f, ",\n\"method\":\"%s\"", manager->method); if (server->fast_open[0]) fprintf(f, ",\n\"fast_open\": %s", server->fast_open); + else if (manager->fast_open) + fprintf(f, ",\n\"fast_open\": true"); if (server->mode) fprintf(f, ",\n\"mode\":\"%s\"", server->mode); if (server->plugin) From b6faadf857c7880662eb897061d459679102d452 Mon Sep 17 00:00:00 2001 From: Terry Chan Date: Sat, 20 Jan 2018 15:44:17 +0800 Subject: [PATCH 2/2] Support TCP_NODELAY in manager mode --- src/manager.c | 25 +++++++++++++++++++++++++ src/manager.h | 2 ++ 2 files changed, 27 insertions(+) diff --git a/src/manager.c b/src/manager.c index 75882f94..e0012f99 100644 --- a/src/manager.c +++ b/src/manager.c @@ -123,6 +123,10 @@ build_config(char *prefix, struct manager_ctx *manager, struct server *server) fprintf(f, ",\n\"fast_open\": %s", server->fast_open); else if (manager->fast_open) fprintf(f, ",\n\"fast_open\": true"); + if (server->no_delay[0]) + fprintf(f, ",\n\"no_delay\": %s", server->no_delay); + else if (manager->no_delay) + fprintf(f, ",\n\"no_delay\": true"); if (server->mode) fprintf(f, ",\n\"mode\":\"%s\"", server->mode); if (server->plugin) @@ -184,6 +188,10 @@ construct_command_line(struct manager_ctx *manager, struct server *server) int len = strlen(cmd); snprintf(cmd + len, BUF_SIZE - len, " --fast-open"); } + if (server->no_delay[0] == 0 && manager->no_delay) { + int len = strlen(cmd); + snprintf(cmd + len, BUF_SIZE - len, " --no-delay"); + } if (manager->ipv6first) { int len = strlen(cmd); snprintf(cmd + len, BUF_SIZE - len, " -6"); @@ -296,6 +304,10 @@ get_server(char *buf, int len) if (value->type == json_boolean) { strncpy(server->fast_open, (value->u.boolean ? "true" : "false"), 8); } + } else if (strcmp(name, "no_delay") == 0) { + if (value->type == json_boolean) { + strncpy(server->no_delay, (value->u.boolean ? "true" : "false"), 8); + } } else if (strcmp(name, "plugin") == 0) { if (value->type == json_string) { server->plugin = strdup(value->u.string.ptr); @@ -846,6 +858,7 @@ main(int argc, char **argv) char *plugin_opts = NULL; int fast_open = 0; + int no_delay = 0; int reuse_port = 0; int mode = TCP_ONLY; int mtu = 0; @@ -865,6 +878,7 @@ main(int argc, char **argv) static struct option long_options[] = { { "fast-open", no_argument, NULL, GETOPT_VAL_FAST_OPEN }, + { "no-delay", no_argument, NULL, GETOPT_VAL_NODELAY }, { "reuse-port", no_argument, NULL, GETOPT_VAL_REUSE_PORT }, { "acl", required_argument, NULL, GETOPT_VAL_ACL }, { "manager-address", required_argument, NULL, @@ -892,6 +906,9 @@ main(int argc, char **argv) case GETOPT_VAL_FAST_OPEN: fast_open = 1; break; + case GETOPT_VAL_NODELAY: + no_delay = 1; + break; case GETOPT_VAL_ACL: acl = optarg; break; @@ -1001,6 +1018,9 @@ main(int argc, char **argv) if (fast_open == 0) { fast_open = conf->fast_open; } + if (no_delay == 0) { + no_delay = conf->no_delay; + } if (reuse_port == 0) { reuse_port = conf->reuse_port; } @@ -1064,6 +1084,10 @@ main(int argc, char **argv) #endif } + if (no_delay == 1) { + LOGI("using tcp no-delay"); + } + // ignore SIGPIPE signal(SIGPIPE, SIG_IGN); signal(SIGCHLD, SIG_IGN); @@ -1081,6 +1105,7 @@ main(int argc, char **argv) manager.reuse_port = reuse_port; manager.fast_open = fast_open; + manager.no_delay = no_delay; manager.verbose = verbose; manager.mode = mode; manager.password = password; diff --git a/src/manager.h b/src/manager.h index 3130bf3d..8619baa1 100644 --- a/src/manager.h +++ b/src/manager.h @@ -40,6 +40,7 @@ struct manager_ctx { ev_io io; int fd; int fast_open; + int no_delay; int reuse_port; int verbose; int mode; @@ -68,6 +69,7 @@ struct server { char port[8]; char password[128]; char fast_open[8]; + char no_delay[8]; char *mode; char *method; char *plugin;