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;
                }
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to