diff options
author | Jon Bratseth <jonbratseth@yahoo.com> | 2017-09-08 13:10:46 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-09-08 13:10:46 +0200 |
commit | 0c956d12ebc311219dc38fb775f2a8984a4039d7 (patch) | |
tree | 0431709ecbdaaf64e35fc0124c291571ea46ee8b | |
parent | 1983053bd66f712cb2d825b1cd9e566ef7fe341b (diff) | |
parent | 05b6862c7ade2c77bc48d5d04874fc51fe6cd19d (diff) |
Merge pull request #3370 from vespa-engine/arnej/find-hostname-in-defaults-module
Arnej/find hostname in defaults module
19 files changed, 96 insertions, 83 deletions
diff --git a/config-proxy/src/main/sh/vespa-config-ctl b/config-proxy/src/main/sh/vespa-config-ctl.sh index c1d4b9613e7..db96fe0eadb 100755 --- a/config-proxy/src/main/sh/vespa-config-ctl +++ b/config-proxy/src/main/sh/vespa-config-ctl.sh @@ -81,16 +81,7 @@ export VESPA_SENTINEL_PORT mkdir -p "$LOGDIR" mkdir -p "$VESPA_LOG_CONTROL_DIR" -# sanity check hostname -hname=$(hostname) -canon=$(perl -e 'use Socket; - my $hostname = `hostname`; chomp($hostname); - my ($err, @results) = Socket::getaddrinfo($hostname, 0, {"flags" => Socket::AI_CANONNAME}); - print @results[0]->{"canonname"} . "\n";') -if [ "$hname" != "$canon" ]; then - echo "The hostname ($hname) must match with gethostbyname (was $canon)" - exit 1 -fi +hname=$(vespa-print-default hostname) CONFIG_ID="hosts/$hname" export CONFIG_ID @@ -120,7 +111,7 @@ case $1 in fail=true for ((sleepcount=0;$sleepcount<600;sleepcount=$sleepcount+1)) ; do usleep 100000 - if [ -f $P_CONFIG_PROXY ] && kill -0 `cat $P_CONFIG_PROXY` && vespa-ping-configproxy -s `hostname` 2>/dev/null + if [ -f $P_CONFIG_PROXY ] && kill -0 `cat $P_CONFIG_PROXY` && vespa-ping-configproxy -s $hname 2>/dev/null then echo "config proxy started (runserver pid `cat $P_CONFIG_PROXY`)" fail=false diff --git a/config-proxy/src/main/sh/vespa-config-loadtester b/config-proxy/src/main/sh/vespa-config-loadtester.sh index fc0a33d8d49..fc0a33d8d49 100644 --- a/config-proxy/src/main/sh/vespa-config-loadtester +++ b/config-proxy/src/main/sh/vespa-config-loadtester.sh diff --git a/config-proxy/src/main/sh/vespa-config-verification b/config-proxy/src/main/sh/vespa-config-verification.sh index 52174495ee3..52174495ee3 100644 --- a/config-proxy/src/main/sh/vespa-config-verification +++ b/config-proxy/src/main/sh/vespa-config-verification.sh diff --git a/config/src/apps/vespa-config/vespa-config.pl b/config/src/apps/vespa-config/vespa-config.pl index cc0daed3e7d..d54d7af4418 100755 --- a/config/src/apps/vespa-config/vespa-config.pl +++ b/config/src/apps/vespa-config/vespa-config.pl @@ -72,6 +72,8 @@ use warnings; use File::Copy; use File::Temp; +my $myHostname = `vespa-print-default hostname`; +chomp $myHostname; my $default_configproxy_port = "19090"; my $default_configserver_port = "19070"; my $zk_client_port; @@ -155,10 +157,7 @@ sub printConfigServerPort { sub getConfigServers { my @ret; - my $hostname = `hostname`; - chomp $hostname; - - my $addr = getVar('addr_configserver', $hostname, 1); + my $addr = getVar('addr_configserver', $myHostname, 1); my $port = getVar('port_configserver_rpc', $default_configserver_port, 0); my $h; @@ -253,9 +252,7 @@ sub makeFiledistributorDistributorConfig { my $cfgFile = $VESPA_HOME . "/conf/filedistributor/filedistributor.cfg"; open(CFG, "> ${cfgFile}.new") or die "Cannot write to '${cfgFile}.new'"; print CFG "torrentport 19093\n"; - my $hostname = `hostname`; - chomp $hostname; - print CFG "hostname \"$hostname\"\n"; + print CFG "hostname \"$myHostname\"\n"; print CFG "filedbpath \"$VESPA_HOME" . "/var/db/vespa/filedistribution\"\n"; print CFG "maxdownloadspeed 0\n"; print CFG "maxuploadspeed 0\n"; @@ -268,9 +265,7 @@ sub makeFiledistributorDistributorConfig { sub makeFiledistributorRpcConfig { my $cfgFile = $VESPA_HOME . "/conf/filedistributor/filedistributorrpc.cfg"; open(CFG, "> ${cfgFile}.new") or die "Cannot write to '${cfgFile}.new'"; - my $hostname = `hostname`; - chomp $hostname; - print CFG "connectionspec \"tcp/$hostname:19092\"\n"; + print CFG "connectionspec \"tcp/$myHostname:19092\"\n"; close(CFG); rename("${cfgFile}.new", ${cfgFile}) or die "Cannot rename '${cfgFile}.new' -> '${cfgFile}': $!\n"; @@ -294,8 +289,6 @@ sub makeFiledistributorConfig { } sub isThisAConfigServer { - my $hostnameForThisHost = `hostname`; - chomp $hostnameForThisHost; my $addr; foreach $addr (getConfigServers()) { my $host = ""; @@ -303,7 +296,7 @@ sub isThisAConfigServer { if ($addr =~ /(.*):(\d+)$/) { $host = $1; } - if ($hostnameForThisHost eq $host or $host eq "localhost") { + if ($myHostname eq $host or $host eq "localhost") { print "yes\n"; exit 0; } diff --git a/config/src/apps/vespa-configproxy-cmd/main.cpp b/config/src/apps/vespa-configproxy-cmd/main.cpp index 16ab5e50710..63fa1285bb2 100644 --- a/config/src/apps/vespa-configproxy-cmd/main.cpp +++ b/config/src/apps/vespa-configproxy-cmd/main.cpp @@ -28,7 +28,7 @@ Application::parseOpts() _flags.method = optArg; break; case 's': - _flags.hostname = optArg; + _flags.targethost = optArg; break; case 'p': _flags.portnumber = atoi(optArg); diff --git a/config/src/apps/vespa-configproxy-cmd/proxycmd.cpp b/config/src/apps/vespa-configproxy-cmd/proxycmd.cpp index fb60f9c223c..3407a880ec7 100644 --- a/config/src/apps/vespa-configproxy-cmd/proxycmd.cpp +++ b/config/src/apps/vespa-configproxy-cmd/proxycmd.cpp @@ -13,7 +13,7 @@ Flags & Flags::operator=(const Flags &) = default; Flags::Flags() : method("cache"), args(), - hostname("localhost"), + targethost("localhost"), portnumber(19090) { } Flags::~Flags() { } @@ -62,7 +62,7 @@ void ProxyCmd::printArray(FRT_Values *rvals) { } vespalib::string ProxyCmd::makeSpec() { - return vespalib::make_string("tcp/%s:%d", _flags.hostname.c_str(), _flags.portnumber); + return vespalib::make_string("tcp/%s:%d", _flags.targethost.c_str(), _flags.portnumber); } void ProxyCmd::autoPrint() { diff --git a/config/src/apps/vespa-configproxy-cmd/proxycmd.h b/config/src/apps/vespa-configproxy-cmd/proxycmd.h index fca5903dc79..df8f429a3c9 100644 --- a/config/src/apps/vespa-configproxy-cmd/proxycmd.h +++ b/config/src/apps/vespa-configproxy-cmd/proxycmd.h @@ -12,7 +12,7 @@ class FRT_Values; struct Flags { vespalib::string method; std::vector<vespalib::string> args; - vespalib::string hostname; + vespalib::string targethost; int portnumber; Flags(const Flags &); Flags & operator=(const Flags &); diff --git a/defaults/src/apps/printdefault/printdefault.cpp b/defaults/src/apps/printdefault/printdefault.cpp index da0c6782d31..73e199fb441 100644 --- a/defaults/src/apps/printdefault/printdefault.cpp +++ b/defaults/src/apps/printdefault/printdefault.cpp @@ -7,13 +7,17 @@ int main(int argc, char **argv) { if (argc != 2) { fprintf(stderr, "usage: %s <variable>\n", argv[0]); - fprintf(stderr, " the variable must be 'home' or 'portbase' currently\n"); + fprintf(stderr, " variable names are: home, user, hostname, portbase, configservers,\n"); + fprintf(stderr, " configserver_rpc_port, configservers_rpc\n"); + fprintf(stderr, " configservers_http, configsources, configproxy_rpc\n"); return 1; } if (strcmp(argv[1], "home") == 0) { printf("%s\n", vespa::Defaults::vespaHome()); } else if (strcmp(argv[1], "user") == 0) { printf("%s\n", vespa::Defaults::vespaUser()); + } else if (strcmp(argv[1], "hostname") == 0) { + printf("%s\n", vespa::Defaults::vespaHostname()); } else if (strcmp(argv[1], "portbase") == 0) { printf("%d\n", vespa::Defaults::vespaPortBase()); } else if (strcmp(argv[1], "configserver_rpc_port") == 0) { diff --git a/defaults/src/main/java/com/yahoo/vespa/defaults/Defaults.java b/defaults/src/main/java/com/yahoo/vespa/defaults/Defaults.java index d8cf0947ef0..8a9be7891ae 100644 --- a/defaults/src/main/java/com/yahoo/vespa/defaults/Defaults.java +++ b/defaults/src/main/java/com/yahoo/vespa/defaults/Defaults.java @@ -1,8 +1,14 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.defaults; -import java.util.Optional; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.InetAddress; +import java.nio.charset.StandardCharsets; import java.util.logging.Logger; +import java.util.Optional; + + /** * The defaults of basic Vespa configuration variables. @@ -18,12 +24,14 @@ public class Defaults { private final String vespaHome; private final String vespaUser; + private final String vespaHost; private final int vespaWebServicePort; private final int vespaPortBase; private Defaults() { vespaHome = findVespaHome(); vespaUser = findVespaUser(); + vespaHost = findVespaHostname(); vespaWebServicePort = findVespaWebServicePort(); vespaPortBase = 19000; // TODO } @@ -42,6 +50,23 @@ public class Defaults { return vespaHome; } + static private String findVespaHostname() { + Optional<String> vespaHostEnv = Optional.ofNullable(System.getenv("VESPA_HOSTNAME")); + if (vespaHostEnv.isPresent() && ! vespaHostEnv.get().trim().isEmpty()) { + return vespaHostEnv.get().trim(); + } + try { + Process p = Runtime.getRuntime().exec("hostname"); + BufferedReader r = new BufferedReader( + new InputStreamReader(p.getInputStream(), StandardCharsets.UTF_8)); + String line = r.readLine(); + if (line != null && ! line.trim().isEmpty()) { + return line; + } + } catch (java.io.IOException e) {} + return "localhost"; + } + static private String findVespaUser() { Optional<String> vespaUserEnv = Optional.ofNullable(System.getenv("VESPA_USER")); if (! vespaUserEnv.isPresent()) { @@ -72,6 +97,13 @@ public class Defaults { **/ public String vespaUser() { return vespaUser; } + + /** + * Compute the host name that identifies myself + * @return the vespa host name + **/ + public String vespaHostname() { return vespaHost; } + /** * Returns the path to the root under which Vespa should read and write files. * Will not end with a "/". diff --git a/defaults/src/vespa/defaults.cpp b/defaults/src/vespa/defaults.cpp index 730ec4735ca..d10e4064f83 100644 --- a/defaults/src/vespa/defaults.cpp +++ b/defaults/src/vespa/defaults.cpp @@ -13,8 +13,12 @@ namespace { +#define HOST_BUF_SZ 1024 + const char *defaultHome = "/opt/vespa"; const char *defaultUser = "vespa"; +const char *defaultHost = "localhost"; +char hostbuf[HOST_BUF_SZ]; int defaultWebServicePort = 8080; int defaultPortBase = 19000; int defaultPortConfigServerRpc = 19070; @@ -63,6 +67,16 @@ void findDefaults() { defaultUser = env; } } + env = getenv("VESPA_HOSTNAME"); + if (env != NULL) { + defaultHost = env; + } else { + int err = gethostname(hostbuf, HOST_BUF_SZ); + hostbuf[HOST_BUF_SZ-1] = '\0'; + if (err == 0 && strlen(hostbuf) > 0 && strlen(hostbuf) < HOST_BUF_SZ-1) { + defaultHost = hostbuf; + } + } long p = getNumFromEnv("VESPA_WEB_SERVICE_PORT"); if (p > 0) { // fprintf(stderr, "debug\tdefault web service port is '%ld'\n", p); @@ -180,6 +194,13 @@ Defaults::vespaUser() return defaultUser; } +const char * +Defaults::vespaHostname() +{ + findDefaults(); + return defaultHost; +} + int Defaults::vespaWebServicePort() { diff --git a/defaults/src/vespa/defaults.h b/defaults/src/vespa/defaults.h index 53e44b3f526..d0b400ef563 100644 --- a/defaults/src/vespa/defaults.h +++ b/defaults/src/vespa/defaults.h @@ -34,6 +34,12 @@ public: static const char *vespaUser(); /** + * Compute the host name that identifies myself + * @return the vespa host name + **/ + static const char *vespaHostname(); + + /** * Compute the port number where the Vespa webservice * container should be available. * diff --git a/install_java.cmake b/install_java.cmake index 3822540e388..79aa927df24 100644 --- a/install_java.cmake +++ b/install_java.cmake @@ -52,9 +52,9 @@ install_fat_java_artifact(vespaclient-java) install_fat_java_artifact(zkfacade) vespa_install_script(application-preprocessor/src/main/sh/vespa-preprocess-application bin) -vespa_install_script(config-proxy/src/main/sh/vespa-config-ctl bin) -vespa_install_script(config-proxy/src/main/sh/vespa-config-loadtester bin) -vespa_install_script(config-proxy/src/main/sh/vespa-config-verification bin) +vespa_install_script(config-proxy/src/main/sh/vespa-config-ctl.sh vespa-config-ctl bin) +vespa_install_script(config-proxy/src/main/sh/vespa-config-loadtester.sh vespa-config-loadtester bin) +vespa_install_script(config-proxy/src/main/sh/vespa-config-verification.sh vespa-config-verification bin) vespa_install_script(config-model/src/main/perl/vespa-deploy bin) vespa_install_script(config-model/src/main/perl/vespa-expand-config.pl bin) vespa_install_script(config-model/src/main/perl/vespa-replicate-log-stream bin) diff --git a/vespaclient/src/perl/lib/Yahoo/Vespa/Utils.pm b/vespaclient/src/perl/lib/Yahoo/Vespa/Utils.pm index 6e8e965601f..7da65a568b1 100644 --- a/vespaclient/src/perl/lib/Yahoo/Vespa/Utils.pm +++ b/vespaclient/src/perl/lib/Yahoo/Vespa/Utils.pm @@ -8,7 +8,6 @@ package Yahoo::Vespa::Utils; use strict; use warnings; use Carp (); -use Sys::Hostname qw(hostname); BEGIN { # - Define exports from this module use base 'Exporter'; @@ -35,9 +34,8 @@ return 1; # independent of computer they run on. sub getHostname { # () if (!defined $HOSTNAME) { - $HOSTNAME = hostname; &assertNotUnitTest(); - $HOSTNAME = `hostname`; + $HOSTNAME = `vespa-print-default hostname`; chomp $HOSTNAME; } return $HOSTNAME; diff --git a/vespaclient/src/vespa/vespaclient/vdsstates/statesapp.cpp b/vespaclient/src/vespa/vespaclient/vdsstates/statesapp.cpp index 99c91216d20..b24eb3e0373 100644 --- a/vespaclient/src/vespa/vespaclient/vdsstates/statesapp.cpp +++ b/vespaclient/src/vespa/vespaclient/vdsstates/statesapp.cpp @@ -1,5 +1,6 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +#include <vespa/defaults.h> #include <vespa/document/util/stringutil.h> #include <vespa/fnet/frt/frt.h> #include <vespa/slobrok/sbmirror.h> @@ -339,15 +340,7 @@ struct StateApp : public FastOS_Application { { indexes.push_back(_options._nodeIndex); } else { - std::vector<char> host(HOST_NAME_MAX); - int result = gethostname(&host[0], host.size()); - if (result != 0) { - std::cerr << "Failed to retrieve hostname of this node, " - "thus we cannot figure out what services run " - "on this node.\n"; - break; - } - std::string hostname(&host[0]); + std::string hostname(vespa::Defaults::vespaHostname()); FRT_RPCRequest* req = supervisor.AllocRPCRequest(); req->SetMethodName("getNodeList"); target->InvokeSync(req, 10.0); diff --git a/vespalib/src/vespa/vespalib/util/host_name.cpp b/vespalib/src/vespa/vespalib/util/host_name.cpp index a33f81b068f..98ac2c80183 100644 --- a/vespalib/src/vespa/vespalib/util/host_name.cpp +++ b/vespalib/src/vespa/vespalib/util/host_name.cpp @@ -1,21 +1,14 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "host_name.h" -#include <vespa/vespalib/util/exceptions.h> -#include <unistd.h> +#include <vespa/defaults.h> namespace vespalib { namespace { vespalib::string make_host_name() { - constexpr size_t max_size = 1024; - char hostname[max_size + 1]; - memset(hostname, 0, sizeof(hostname)); - if (gethostname(hostname, max_size) != 0) { - throw FatalException("gethostname failed"); - } - return hostname; + return vespa::Defaults::vespaHostname(); } } // namespace vespalib::<unnamed> diff --git a/vespalog/pom.xml b/vespalog/pom.xml index d300c4c56a2..6cea5ab83d9 100644 --- a/vespalog/pom.xml +++ b/vespalog/pom.xml @@ -29,6 +29,11 @@ </dependency> <dependency> <groupId>com.yahoo.vespa</groupId> + <artifactId>defaults</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>com.yahoo.vespa</groupId> <artifactId>annotations</artifactId> <version>${project.version}</version> </dependency> diff --git a/vespalog/src/main/java/com/yahoo/log/Util.java b/vespalog/src/main/java/com/yahoo/log/Util.java index 43e2a2dd321..6259e37f908 100644 --- a/vespalog/src/main/java/com/yahoo/log/Util.java +++ b/vespalog/src/main/java/com/yahoo/log/Util.java @@ -1,6 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.log; +import static com.yahoo.vespa.defaults.Defaults.getDefaults; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.InetAddress; @@ -13,28 +14,8 @@ import java.net.InetAddress; */ public class Util { - /** - * We do not have direct access to the <code>gethostname</code> - * system call, so we have to fake it. - */ public static String getHostName () { - String hostname = "-"; - try { - Process p = Runtime.getRuntime().exec("hostname"); - BufferedReader r = new BufferedReader( - new InputStreamReader(p.getInputStream(), "UTF-8")); - hostname = r.readLine(); - if (hostname != null) { - return hostname; - } - } - catch (java.io.IOException e) {} - try { - hostname = InetAddress.getLocalHost().getHostName(); - return hostname; - } - catch (java.net.UnknownHostException e) {} - return "-"; + return getDefaults().vespaHostname(); } /** diff --git a/vespalog/src/vespa/log/llparser.cpp b/vespalog/src/vespa/log/llparser.cpp index d239f291c9f..5e48343dfaf 100644 --- a/vespalog/src/vespa/log/llparser.cpp +++ b/vespalog/src/vespa/log/llparser.cpp @@ -6,15 +6,15 @@ #include <cstdlib> #include <unistd.h> #include <sys/time.h> +#include <vespa/defaults.h> namespace ns_log { static const char *defcomponent = "logger"; static const char *defservice = "-"; -static char defhostname[256] = "localhost"; LLParser::LLParser() - : _defHostname(defhostname), + : _defHostname(vespa::Defaults::vespaHostname()), _defService(defservice), _defComponent(defcomponent), _defLevel(Logger::info), @@ -37,9 +37,6 @@ LLParser::LLParser() delete _target; _target = target; } - if (gethostname(defhostname, 256) == 0) { - _defHostname = defhostname; - } snprintf(_defPid, 10, "%d", (int)getpid()); } diff --git a/vespalog/src/vespa/log/log.cpp b/vespalog/src/vespa/log/log.cpp index a0977406dc0..7d98c22957d 100644 --- a/vespalog/src/vespa/log/log.cpp +++ b/vespalog/src/vespa/log/log.cpp @@ -12,6 +12,7 @@ LOG_SETUP_INDIRECT(".log", "$Id$"); #include "control-file.h" #include "bufferedlogger.h" +#include <vespa/defaults.h> #include <vespa/fastos/thread.h> #include <cassert> #include <cstdarg> @@ -114,9 +115,7 @@ void Logger::ensureHostname() { if (_hostname[0] == '\0') { - char hn[257]; - snprintf(_hostname, sizeof _hostname, "%s", - (gethostname(hn, sizeof hn) == 0) ? hn : "-"); + snprintf(_hostname, sizeof _hostname, "%s", vespa::Defaults::vespaHostname()); } } |