svn commit: r216816 - stable/8/sbin/hastd
Pawel Jakub Dawidek
pjd at FreeBSD.org
Thu Dec 30 09:46:46 UTC 2010
Author: pjd
Date: Thu Dec 30 09:46:45 2010
New Revision: 216816
URL: http://svn.freebsd.org/changeset/base/216816
Log:
MFC r216477,r216478,r216479,r216494,r216721,r216722:
r216477:
Log the fact of launching and include protocol version number.
r216478:
Don't ignore errors from remote requests.
r216479:
Improve problems logging.
r216494:
The 'ret' variable is of type ssize_t and we use proper format for it (%zd), so
no (bogus) cast is needed.
r216721:
When node-specific configuration is missing in resource section, provide
more useful information. Instead of:
hastd: remote address not configured for resource foo
Print the following:
No resource foo configuration for this node (acceptable node names: freefall, freefall.freebsd.org, 44333332-4c44-4e31-4a30-313920202020).
r216722:
Detect when resource is configured more than once.
Modified:
stable/8/sbin/hastd/hastd.c
stable/8/sbin/hastd/parse.y
stable/8/sbin/hastd/primary.c
Directory Properties:
stable/8/sbin/hastd/ (props changed)
Modified: stable/8/sbin/hastd/hastd.c
==============================================================================
--- stable/8/sbin/hastd/hastd.c Thu Dec 30 09:45:26 2010 (r216815)
+++ stable/8/sbin/hastd/hastd.c Thu Dec 30 09:46:45 2010 (r216816)
@@ -619,6 +619,9 @@ main_loop(void)
PJDLOG_VERIFY(sigaddset(&mask, SIGTERM) == 0);
PJDLOG_VERIFY(sigaddset(&mask, SIGCHLD) == 0);
+ pjdlog_info("Started successfully, running protocol version %d.",
+ HAST_PROTO_VERSION);
+
for (;;) {
while ((signo = sigtimedwait(&mask, NULL, &sigtimeout)) != -1) {
switch (signo) {
Modified: stable/8/sbin/hastd/parse.y
==============================================================================
--- stable/8/sbin/hastd/parse.y Thu Dec 30 09:45:26 2010 (r216815)
+++ stable/8/sbin/hastd/parse.y Thu Dec 30 09:46:45 2010 (r216816)
@@ -55,7 +55,7 @@ extern char *yytext;
static struct hastd_config *lconfig;
static struct hast_resource *curres;
-static bool mynode;
+static bool mynode, hadmynode;
static char depth0_control[HAST_ADDRSIZE];
static char depth0_listen[HAST_ADDRSIZE];
@@ -109,6 +109,44 @@ isitme(const char *name)
return (0);
}
+static int
+node_names(char **namesp)
+{
+ static char names[MAXHOSTNAMELEN * 3];
+ char buf[MAXHOSTNAMELEN];
+ char *pos;
+ size_t bufsize;
+
+ if (gethostname(buf, sizeof(buf)) < 0) {
+ pjdlog_errno(LOG_ERR, "gethostname() failed");
+ return (-1);
+ }
+
+ /* First component of the host name. */
+ pos = strchr(buf, '.');
+ if (pos != NULL && pos != buf) {
+ (void)strlcpy(names, buf, MIN((size_t)(pos - buf + 1),
+ sizeof(names)));
+ (void)strlcat(names, ", ", sizeof(names));
+ }
+
+ /* Full host name. */
+ (void)strlcat(names, buf, sizeof(names));
+ (void)strlcat(names, ", ", sizeof(names));
+
+ /* Host UUID. */
+ bufsize = sizeof(buf);
+ if (sysctlbyname("kern.hostuuid", buf, &bufsize, NULL, 0) < 0) {
+ pjdlog_errno(LOG_ERR, "sysctlbyname(kern.hostuuid) failed");
+ return (-1);
+ }
+ (void)strlcat(names, buf, sizeof(names));
+
+ *namesp = names;
+
+ return (0);
+}
+
void
yyerror(const char *str)
{
@@ -424,6 +462,20 @@ resource_statement: RESOURCE resource_st
{
if (curres != NULL) {
/*
+ * There must be section for this node, at least with
+ * remote address configuration.
+ */
+ if (!hadmynode) {
+ char *names;
+
+ if (node_names(&names) != 0)
+ return (1);
+ pjdlog_error("No resource %s configuration for this node (acceptable node names: %s).",
+ curres->hr_name, names);
+ return (1);
+ }
+
+ /*
* Let's see there are some resource-level settings
* that we can use for node-level settings.
*/
@@ -483,12 +535,23 @@ resource_statement: RESOURCE resource_st
resource_start: STR
{
+ /* Check if there is no duplicate entry. */
+ TAILQ_FOREACH(curres, &lconfig->hc_resources, hr_next) {
+ if (strcmp(curres->hr_name, $1) == 0) {
+ pjdlog_error("Resource %s configured more than once.",
+ curres->hr_name);
+ free($1);
+ return (1);
+ }
+ }
+
/*
* Clear those, so we can tell if they were set at
* resource-level or not.
*/
depth1_provname[0] = '\0';
depth1_localpath[0] = '\0';
+ hadmynode = false;
curres = calloc(1, sizeof(*curres));
if (curres == NULL) {
@@ -614,7 +677,7 @@ resource_node_start: STR
case 0:
break;
case 1:
- mynode = true;
+ mynode = hadmynode = true;
break;
default:
assert(!"invalid isitme() return value");
Modified: stable/8/sbin/hastd/primary.c
==============================================================================
--- stable/8/sbin/hastd/primary.c Thu Dec 30 09:45:26 2010 (r216815)
+++ stable/8/sbin/hastd/primary.c Thu Dec 30 09:46:45 2010 (r216816)
@@ -1133,6 +1133,15 @@ local_send_thread(void *arg)
/*
* If READ failed, try to read from remote node.
*/
+ if (ret < 0) {
+ reqlog(LOG_WARNING, 0, ggio,
+ "Local request failed (%s), trying remote node. ",
+ strerror(errno));
+ } else if (ret != ggio->gctl_length) {
+ reqlog(LOG_WARNING, 0, ggio,
+ "Local request failed (%zd != %jd), trying remote node. ",
+ ret, (intmax_t)ggio->gctl_length);
+ }
QUEUE_INSERT1(hio, send, rncomp);
continue;
}
@@ -1141,28 +1150,43 @@ local_send_thread(void *arg)
ret = pwrite(res->hr_localfd, ggio->gctl_data,
ggio->gctl_length,
ggio->gctl_offset + res->hr_localoff);
- if (ret < 0)
+ if (ret < 0) {
hio->hio_errors[ncomp] = errno;
- else if (ret != ggio->gctl_length)
+ reqlog(LOG_WARNING, 0, ggio,
+ "Local request failed (%s): ",
+ strerror(errno));
+ } else if (ret != ggio->gctl_length) {
hio->hio_errors[ncomp] = EIO;
- else
+ reqlog(LOG_WARNING, 0, ggio,
+ "Local request failed (%zd != %jd): ",
+ ret, (intmax_t)ggio->gctl_length);
+ } else {
hio->hio_errors[ncomp] = 0;
+ }
break;
case BIO_DELETE:
ret = g_delete(res->hr_localfd,
ggio->gctl_offset + res->hr_localoff,
ggio->gctl_length);
- if (ret < 0)
+ if (ret < 0) {
hio->hio_errors[ncomp] = errno;
- else
+ reqlog(LOG_WARNING, 0, ggio,
+ "Local request failed (%s): ",
+ strerror(errno));
+ } else {
hio->hio_errors[ncomp] = 0;
+ }
break;
case BIO_FLUSH:
ret = g_flush(res->hr_localfd);
- if (ret < 0)
+ if (ret < 0) {
hio->hio_errors[ncomp] = errno;
- else
+ reqlog(LOG_WARNING, 0, ggio,
+ "Local request failed (%s): ",
+ strerror(errno));
+ } else {
hio->hio_errors[ncomp] = 0;
+ }
break;
}
if (refcount_release(&hio->hio_countdown)) {
@@ -1443,7 +1467,9 @@ remote_recv_thread(void *arg)
error = nv_get_int16(nv, "error");
if (error != 0) {
/* Request failed on remote side. */
- hio->hio_errors[ncomp] = 0;
+ hio->hio_errors[ncomp] = error;
+ reqlog(LOG_WARNING, 0, &hio->hio_ggio,
+ "Remote request failed (%s): ", strerror(error));
nv_free(nv);
goto done_queue;
}
More information about the svn-src-stable
mailing list