From: Pete Zaitcev <zaitcev@redhat.com>
To: Jeff Garzik <jeff@garzik.org>
Cc: Project Hail List <hail-devel@vger.kernel.org>
Subject: [Patch 2/3] chunkd: use "auto" keyword
Date: Tue, 29 Sep 2009 15:40:01 -0600 [thread overview]
Message-ID: <20090929154001.096abc3a@redhat.com> (raw)
The current implementation of automatic listening ports was configured
implicitly by adding <PortFile> clause. This turned out to be a silly
idea. A special keyword for <Port> is more convenient. Also, we do not
need to use /dev/null in <PortFile> anymore.
The configuration is not strictly speaking compatible, but since
nobody should be using auto ports in production anyway, impact on
installations should be nil. But this must be built after the support
for "-p auto" is added to CLD.
Signed-off-by: Pete Zaitcev <zaitcev@redhat.com>
diff -urp -X dontdiff chunkd-m/doc/setup.txt chunkd-tip/doc/setup.txt
--- chunkd-m/doc/setup.txt 2009-09-10 21:20:17.322717905 -0600
+++ chunkd-tip/doc/setup.txt 2009-09-29 11:46:44.683272442 -0600
@@ -39,6 +39,15 @@ _cld._udp.phx2.ex.com has SRV record 10
not a great idea to specify interfaces, since they often use IPv6 or
acquire IP addresses from DHCP. So, just specify a port.
+ An option exists to let the server to listen on a random port with
+ the "auto" keyword:
+
+ <Listen>auto</Listen>
+
+ This works with CLD-aware clients that find the connection information
+ from records like /chunk-picbak/*. It's not commonly used in real clouds
+ but may be beneficial in chroots and other odd environments.
+
*) choose pathname (dir + filename) where daemon should store its
PID file. Default is /var/run/chunkd.pid, but it limits you to
one Chunk daemon per node, which is usual in clouds.
diff -urp -X dontdiff chunkd-m/server/config.c chunkd-tip/server/config.c
--- chunkd-m/server/config.c 2009-09-10 21:20:17.328715747 -0600
+++ chunkd-tip/server/config.c 2009-09-29 11:24:18.169224959 -0600
@@ -131,13 +131,8 @@ static void cfg_elm_end_listen(struct co
return;
}
- if (cc->tmp_listen.port && cc->tmp_listen.port_file) {
- applog(LOG_ERR, "cfgfile: Listen with both Port and PortFile");
- goto err;
- }
-
- if (!cc->tmp_listen.port && !cc->tmp_listen.port_file) {
- applog(LOG_ERR, "cfgfile: Listen with no Port or PortFile");
+ if (!cc->tmp_listen.port) {
+ applog(LOG_ERR, "cfgfile: Listen with no Port");
goto err;
}
@@ -318,7 +313,8 @@ static void cfg_elm_end (GMarkupParseCon
if (cc->in_listen) {
n = strtol(cc->text, NULL, 10);
- if (n > 0 && n < 65536) {
+ if ((n > 0 && n < 65536) ||
+ !strcmp(cc->text, "auto")) {
free(cc->tmp_listen.port);
cc->tmp_listen.port = cc->text;
} else {
diff -urp -X dontdiff chunkd-m/server/server.c chunkd-tip/server/server.c
--- chunkd-m/server/server.c 2009-09-10 21:20:17.329715602 -0600
+++ chunkd-tip/server/server.c 2009-09-29 10:53:25.827153407 -0600
@@ -1018,6 +1018,23 @@ err_out:
cli_free(cli);
}
+static int net_write_port(const char *port_file, const char *port_str)
+{
+ FILE *portf;
+ int rc;
+
+ portf = fopen(port_file, "w");
+ if (portf == NULL) {
+ rc = errno;
+ applog(LOG_INFO, "Cannot create port file %s: %s",
+ port_file, strerror(rc));
+ return -rc;
+ }
+ fprintf(portf, "%s\n", port_str);
+ fclose(portf);
+ return 0;
+}
+
static int net_open_socket(const struct listen_cfg *cfg,
int addr_fam, int sock_type, int sock_prot,
int addr_len, void *addr_ptr)
@@ -1089,10 +1106,8 @@ static int net_open_socket(const struct
*/
static int net_open_any(struct listen_cfg *cfg)
{
- char *portfile = cfg->port_file;
struct sockaddr_in addr4;
struct sockaddr_in6 addr6;
- FILE *portf;
int fd4, fd6;
socklen_t addr_len;
unsigned short port;
@@ -1139,24 +1154,17 @@ static int net_open_any(struct listen_cf
port = ntohs(addr4.sin_port);
}
- applog(LOG_INFO, "Listening on port %u file %s", port, portfile);
+ applog(LOG_INFO, "Listening on auto port %u", port);
+ free(cfg->port);
rc = asprintf(&cfg->port, "%u", port);
if (rc < 0) {
applog(LOG_ERR, "OOM");
return -ENOMEM;
}
- portf = fopen(portfile, "w");
- if (portf == NULL) {
- rc = errno;
- applog(LOG_INFO, "Cannot create port file %s: %s",
- portfile, strerror(rc));
- return -rc;
- }
- fprintf(portf, "%u\n", port);
- fclose(portf);
-
+ if (cfg->port_file)
+ return net_write_port(cfg->port_file, cfg->port);
return 0;
}
@@ -1213,12 +1221,14 @@ static int net_open_known(const struct l
listen_serv, sizeof(listen_serv),
NI_NUMERICHOST | NI_NUMERICSERV);
- applog(LOG_INFO, "Listening on %s port %s",
+ applog(LOG_INFO, "Listening on host %s port %s",
listen_host, listen_serv);
}
freeaddrinfo(res0);
+ if (cfg->port_file)
+ net_write_port(cfg->port_file, cfg->port);
return 0;
err_out:
@@ -1227,7 +1237,7 @@ err_out:
static int net_open(struct listen_cfg *cfg)
{
- if (cfg->port_file)
+ if (!strcmp(cfg->port, "auto"))
return net_open_any(cfg);
else
return net_open_known(cfg);
diff -urp -X dontdiff chunkd-m/test/server-test.cfg chunkd-tip/test/server-test.cfg
--- chunkd-m/test/server-test.cfg 2009-09-10 21:20:17.336715752 -0600
+++ chunkd-tip/test/server-test.cfg 2009-09-29 11:44:05.962218307 -0600
@@ -5,10 +5,12 @@
</SSL>
<Listen>
+ <Port>auto</Port>
<PortFile>chunkd.port</PortFile>
</Listen>
<Listen>
+ <Port>auto</Port>
<PortFile>chunkd-ssl.port</PortFile>
<Encrypt>true</Encrypt>
</Listen>
diff -urp -X dontdiff chunkd-m/test/start-daemon.real chunkd-tip/test/start-daemon.real
--- chunkd-m/test/start-daemon.real 2009-09-10 21:31:52.957718587 -0600
+++ chunkd-tip/test/start-daemon.real 2009-09-29 09:46:01.956156333 -0600
@@ -11,7 +11,7 @@ then
exit 1
fi
-/usr/sbin/cld -d data/cld -P cld.pid --port-file=cld.port -E
+/usr/sbin/cld -d data/cld -P cld.pid -p auto --port-file=cld.port -E
../server/chunkd -C $top_srcdir/test/server-test.cfg -E $*
diff -urp -X dontdiff chunkd-m/test/start-daemon.real.in chunkd-tip/test/start-daemon.real.in
--- chunkd-m/test/start-daemon.real.in 2009-09-10 21:20:17.337719649 -0600
+++ chunkd-tip/test/start-daemon.real.in 2009-09-29 09:44:01.765251512 -0600
@@ -11,7 +11,7 @@ then
exit 1
fi
-@CLDC_CMD@ -d data/cld -P cld.pid --port-file=cld.port -E
+@CLDC_CMD@ -d data/cld -P cld.pid -p auto --port-file=cld.port -E
../server/chunkd -C $top_srcdir/test/server-test.cfg -E $*
next reply other threads:[~2009-09-29 21:40 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-09-29 21:40 Pete Zaitcev [this message]
2009-09-30 21:53 ` [Patch 2/3] chunkd: use "auto" keyword Jeff Garzik
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090929154001.096abc3a@redhat.com \
--to=zaitcev@redhat.com \
--cc=hail-devel@vger.kernel.org \
--cc=jeff@garzik.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.