From 8d7250cfe11d025c1925441fc321bbf9564c5823 Mon Sep 17 00:00:00 2001 From: Arnie Reynoso Date: Wed, 23 Jul 2014 13:37:40 -0700 Subject: [PATCH] Linux: Addresses timed-out NameServer requests in LAD This commit fixes the issue in SDOCM00112106 on the Linux side. It adds a sequence number to NameServer message so that responses can be properly identified. --- linux/src/daemon/NameServer_daemon.c | 111 +++++++++++++++------------ 1 file changed, 61 insertions(+), 50 deletions(-) diff --git a/linux/src/daemon/NameServer_daemon.c b/linux/src/daemon/NameServer_daemon.c index abaf757..7cd2bad 100644 --- a/linux/src/daemon/NameServer_daemon.c +++ b/linux/src/daemon/NameServer_daemon.c @@ -969,6 +969,8 @@ Int NameServer_getRemote(NameServer_Handle handle, int numBytes; int err; int i; + static int seqNum = 0; + Bool done = FALSE; /* Set Timeout to wait: */ tv.tv_sec = 0; @@ -990,6 +992,7 @@ Int NameServer_getRemote(NameServer_Handle handle, nsMsg.request = NAMESERVER_REQUEST; nsMsg.requestStatus = 0; nsMsg.valueLen = *len; + nsMsg.seqNum = seqNum++; strncpy((char *)nsMsg.instanceName, obj->name, strlen(obj->name) + 1); strncpy((char *)nsMsg.name, name, strlen(name) + 1); @@ -1006,65 +1009,73 @@ Int NameServer_getRemote(NameServer_Handle handle, goto exit; } - /* Block on waitFd for signal from listener thread: */ - waitFd = NameServer_module->waitFd; - FD_ZERO(&rfds); - FD_SET(waitFd, &rfds); - maxfd = waitFd + 1; - LOG1("NameServer_getRemote: pending on waitFd: %d\n", waitFd) - ret = select(maxfd, &rfds, NULL, NULL, &tv); - if (ret == -1) { - LOG0("NameServer_getRemote: select failed.") - status = NameServer_E_FAIL; - goto exit; - } - else if (!ret) { - LOG0("NameServer_getRemote: select timed out.\n") - status = NameServer_E_TIMEOUT; - goto exit; - } + while (!done) { + /* Block on waitFd for signal from listener thread: */ + waitFd = NameServer_module->waitFd; + FD_ZERO(&rfds); + FD_SET(waitFd, &rfds); + maxfd = waitFd + 1; + LOG1("NameServer_getRemote: pending on waitFd: %d\n", waitFd) + ret = select(maxfd, &rfds, NULL, NULL, &tv); + if (ret == -1) { + LOG0("NameServer_getRemote: select failed.") + status = NameServer_E_FAIL; + goto exit; + } + else if (!ret) { + LOG0("NameServer_getRemote: select timed out.\n") + status = NameServer_E_TIMEOUT; + goto exit; + } - if (FD_ISSET(waitFd, &rfds)) { - /* Read, just to balance the write: */ - numBytes = read(waitFd, &buf, sizeof(uint64_t)); + if (FD_ISSET(waitFd, &rfds)) { + /* Read, just to balance the write: */ + numBytes = read(waitFd, &buf, sizeof(uint64_t)); - /* Process response: */ - replyMsg = &NameServer_module->nsMsg; + /* Process response: */ + replyMsg = &NameServer_module->nsMsg; - if (replyMsg->requestStatus) { - /* name is found */ + if (replyMsg->seqNum != seqNum - 1) { + /* Ignore responses without current sequence # */ + continue; + } - /* set length to amount of data that was copied */ - *len = replyMsg->valueLen; + if (replyMsg->requestStatus) { + /* name is found */ - /* set the contents of value */ - if (*len <= sizeof (Bits32)) { - *(UInt32 *)value = (UInt32)replyMsg->value; - LOG2("NameServer_getRemote: Reply from: %d, %s:", - procId, (String)replyMsg->instanceName) - LOG2("%s, value: 0x%x...\n", - (String)replyMsg->name, *(UInt32 *)value) - } - else { - memcpy(value, replyMsg->valueBuf, *len); - LOG2("NameServer_getRemote: Reply from: %d, %s:", - procId, (String)replyMsg->instanceName) - for (i = 0; i < *len/4; i++) { - LOG2("%s, value buffer content: 0x%x...\n", - (String)replyMsg->name, ((uint32_t *)value)[i]) + /* set length to amount of data that was copied */ + *len = replyMsg->valueLen; + + /* set the contents of value */ + if (*len <= sizeof (Bits32)) { + *(UInt32 *)value = (UInt32)replyMsg->value; + LOG2("NameServer_getRemote: Reply from: %d, %s:", + procId, (String)replyMsg->instanceName) + LOG2("%s, value: 0x%x...\n", + (String)replyMsg->name, *(UInt32 *)value) + } + else { + memcpy(value, replyMsg->valueBuf, *len); + LOG2("NameServer_getRemote: Reply from: %d, %s:", + procId, (String)replyMsg->instanceName) + for (i = 0; i < *len/4; i++) { + LOG2("%s, value buffer content: 0x%x...\n", + (String)replyMsg->name, ((uint32_t *)value)[i]) + } } - } - goto exit; - } - else { - /* name is not found */ - LOG2("NameServer_getRemote: value for %s:%s not found.\n", - (String)replyMsg->instanceName, (String)replyMsg->name) + goto exit; + } + else { + /* name is not found */ + LOG2("NameServer_getRemote: value for %s:%s not found.\n", + (String)replyMsg->instanceName, (String)replyMsg->name) - /* set status to not found */ - status = NameServer_E_NOTFOUND; + /* set status to not found */ + status = NameServer_E_NOTFOUND; + } } + done= TRUE; } exit: -- 2.39.2