[Midnightbsd-cvs] src [8034] trunk/sbin/hastd: simplify the code by using snprlcat.
laffer1 at midnightbsd.org
laffer1 at midnightbsd.org
Thu Sep 15 16:41:03 EDT 2016
Revision: 8034
http://svnweb.midnightbsd.org/src/?rev=8034
Author: laffer1
Date: 2016-09-15 16:41:03 -0400 (Thu, 15 Sep 2016)
Log Message:
-----------
simplify the code by using snprlcat. check if there is acmsg at all.
Modified Paths:
--------------
trunk/sbin/hastd/hast.conf.5
trunk/sbin/hastd/primary.c
trunk/sbin/hastd/proto_common.c
Modified: trunk/sbin/hastd/hast.conf.5
===================================================================
--- trunk/sbin/hastd/hast.conf.5 2016-09-15 20:39:01 UTC (rev 8033)
+++ trunk/sbin/hastd/hast.conf.5 2016-09-15 20:41:03 UTC (rev 8034)
@@ -63,7 +63,7 @@
compression <algorithm>
timeout <seconds>
exec <path>
-metaflush "on" | "off"
+metaflush on | off
pidfile <path>
on <node> {
@@ -89,7 +89,7 @@
local <path>
timeout <seconds>
exec <path>
- metaflush "on" | "off"
+ metaflush on | off
on <node> {
# Resource-node section
@@ -96,7 +96,7 @@
name <name>
# Required
local <path>
- metaflush "on" | "off"
+ metaflush on | off
# Required
remote <addr>
source <addr>
@@ -106,7 +106,7 @@
name <name>
# Required
local <path>
- metaflush "on" | "off"
+ metaflush on | off
# Required
remote <addr>
source <addr>
Modified: trunk/sbin/hastd/primary.c
===================================================================
--- trunk/sbin/hastd/primary.c 2016-09-15 20:39:01 UTC (rev 8033)
+++ trunk/sbin/hastd/primary.c 2016-09-15 20:41:03 UTC (rev 8034)
@@ -543,7 +543,28 @@
return (0);
}
+
+/*
+ * Function instructs GEOM_GATE to handle reads directly from within the kernel.
+ */
+static void
+enable_direct_reads(struct hast_resource *res)
+{
+ struct g_gate_ctl_modify ggiomodify;
+ bzero(&ggiomodify, sizeof(ggiomodify));
+ ggiomodify.gctl_version = G_GATE_VERSION;
+ ggiomodify.gctl_unit = res->hr_ggateunit;
+ ggiomodify.gctl_modify = GG_MODIFY_READPROV | GG_MODIFY_READOFFSET;
+ strlcpy(ggiomodify.gctl_readprov, res->hr_localpath,
+ sizeof(ggiomodify.gctl_readprov));
+ ggiomodify.gctl_readoffset = res->hr_localoff;
+ if (ioctl(res->hr_ggatefd, G_GATE_CMD_MODIFY, &ggiomodify) == 0)
+ pjdlog_debug(1, "Direct reads enabled.");
+ else
+ pjdlog_errno(LOG_WARNING, "Failed to enable direct reads");
+}
+
static int
init_remote(struct hast_resource *res, struct proto_conn **inp,
struct proto_conn **outp)
@@ -692,6 +713,8 @@
res->hr_secondary_localcnt = nv_get_uint64(nvin, "localcnt");
res->hr_secondary_remotecnt = nv_get_uint64(nvin, "remotecnt");
res->hr_syncsrc = nv_get_uint8(nvin, "syncsrc");
+ if (res->hr_syncsrc == HAST_SYNCSRC_PRIMARY)
+ enable_direct_reads(res);
if (nv_exists(nvin, "virgin")) {
/*
* Secondary was reinitialized, bump localcnt if it is 0 as
@@ -990,36 +1013,33 @@
{
char msg[1024];
va_list ap;
- int len;
va_start(ap, fmt);
- len = vsnprintf(msg, sizeof(msg), fmt, ap);
+ (void)vsnprintf(msg, sizeof(msg), fmt, ap);
va_end(ap);
- if ((size_t)len < sizeof(msg)) {
- switch (ggio->gctl_cmd) {
- case BIO_READ:
- (void)snprintf(msg + len, sizeof(msg) - len,
- "READ(%ju, %ju).", (uintmax_t)ggio->gctl_offset,
- (uintmax_t)ggio->gctl_length);
- break;
- case BIO_DELETE:
- (void)snprintf(msg + len, sizeof(msg) - len,
- "DELETE(%ju, %ju).", (uintmax_t)ggio->gctl_offset,
- (uintmax_t)ggio->gctl_length);
- break;
- case BIO_FLUSH:
- (void)snprintf(msg + len, sizeof(msg) - len, "FLUSH.");
- break;
- case BIO_WRITE:
- (void)snprintf(msg + len, sizeof(msg) - len,
- "WRITE(%ju, %ju).", (uintmax_t)ggio->gctl_offset,
- (uintmax_t)ggio->gctl_length);
- break;
- default:
- (void)snprintf(msg + len, sizeof(msg) - len,
- "UNKNOWN(%u).", (unsigned int)ggio->gctl_cmd);
- break;
- }
+ switch (ggio->gctl_cmd) {
+ case BIO_READ:
+ (void)snprlcat(msg, sizeof(msg), "READ(%ju, %ju).",
+ (uintmax_t)ggio->gctl_offset,
+ (uintmax_t)ggio->gctl_length);
+ break;
+ case BIO_DELETE:
+ (void)snprlcat(msg, sizeof(msg), "DELETE(%ju, %ju).",
+ (uintmax_t)ggio->gctl_offset,
+ (uintmax_t)ggio->gctl_length);
+ break;
+ case BIO_FLUSH:
+ (void)snprlcat(msg, sizeof(msg), "FLUSH.");
+ break;
+ case BIO_WRITE:
+ (void)snprlcat(msg, sizeof(msg), "WRITE(%ju, %ju).",
+ (uintmax_t)ggio->gctl_offset,
+ (uintmax_t)ggio->gctl_length);
+ break;
+ default:
+ (void)snprlcat(msg, sizeof(msg), "UNKNOWN(%u).",
+ (unsigned int)ggio->gctl_cmd);
+ break;
}
pjdlog_common(loglevel, debuglevel, -1, "%s", msg);
}
@@ -1792,7 +1812,7 @@
struct timeval tstart, tend, tdiff;
unsigned int ii, ncomp, ncomps;
off_t offset, length, synced;
- bool dorewind;
+ bool dorewind, directreads;
int syncext;
ncomps = HAST_NCOMPONENTS;
@@ -1799,6 +1819,7 @@
dorewind = true;
synced = 0;
offset = -1;
+ directreads = false;
for (;;) {
mtx_lock(&sync_lock);
@@ -1870,6 +1891,8 @@
event_send(res, EVENT_SYNCDONE);
}
mtx_lock(&metadata_lock);
+ if (res->hr_syncsrc == HAST_SYNCSRC_SECONDARY)
+ directreads = true;
res->hr_syncsrc = HAST_SYNCSRC_UNDEF;
res->hr_primary_localcnt =
res->hr_secondary_remotecnt;
@@ -1883,6 +1906,10 @@
mtx_unlock(&metadata_lock);
}
rw_unlock(&hio_remote_lock[ncomp]);
+ if (directreads) {
+ directreads = false;
+ enable_direct_reads(res);
+ }
continue;
}
pjdlog_debug(2, "sync: Taking free request.");
Modified: trunk/sbin/hastd/proto_common.c
===================================================================
--- trunk/sbin/hastd/proto_common.c 2016-09-15 20:39:01 UTC (rev 8033)
+++ trunk/sbin/hastd/proto_common.c 2016-09-15 20:41:03 UTC (rev 8034)
@@ -181,7 +181,7 @@
return (errno);
cmsg = CMSG_FIRSTHDR(&msg);
- if (cmsg->cmsg_level != SOL_SOCKET ||
+ if (cmsg == NULL || cmsg->cmsg_level != SOL_SOCKET ||
cmsg->cmsg_type != SCM_RIGHTS) {
return (EINVAL);
}
More information about the Midnightbsd-cvs
mailing list