modify FindIndex to compare uuids
authorJeffrey Altman <jaltman@your-file-system.com>
Tue, 7 Dec 2010 04:24:18 +0000 (23:24 -0500)
committerDerrick Brashear <shadow@dementia.org>
Tue, 7 Dec 2010 17:21:51 +0000 (09:21 -0800)
If FindIndex is provided a server address and entry has a valid
uuid, obtain the uuid for 'server' and use that search for a
matching entry.

This modification is necessary in order to permit operations
against multi-homed servers in split horizon DNS configurations.

Change-Id: I8929c500eb4f71c8cf0aa8328bc3b3a0345368aa
Reviewed-on: http://gerrit.openafs.org/3468
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>

src/volser/lockprocs.c

index 7ab1c57..f4ad9af 100644 (file)
@@ -32,6 +32,7 @@
 #include <afs/vlserver.h>
 #include <afs/nfs.h>
 #include <afs/afsint.h>
+#include <ubik.h>
 #include "volint.h"
 #include "volser.h"
 #include "lockdata.h"
@@ -39,6 +40,8 @@
 #include "vsutils_prototypes.h"
 #include "lockprocs_prototypes.h"
 
+struct ubik_client *cstruct;
+
 /* Finds an index in VLDB entry that matches the volume type, server, and partition.
  * If type is zero, will match first index of ANY type (RW, BK, or RO).
  * If server is zero, will match first index of ANY server and partition
@@ -49,13 +52,34 @@ FindIndex(struct uvldbentry *entry, afs_uint32 server, afs_int32 part, afs_int32
 {
     int e;
     afs_int32 error = 0;
+    afsUUID m_uuid;
+    int uuid_valid = 0;
+
+    if (server && !afs_uuid_is_nil(&entry->serverNumber[0])) {
+        afs_int32 vcode, m_uniq=0;
+        bulkaddrs m_addrs;
+        ListAddrByAttributes m_attrs;
+        afs_int32 m_nentries;
+
+        m_attrs.Mask = VLADDR_IPADDR;
+        m_attrs.ipaddr = htonl(server);
+        m_nentries = 0;
+        m_addrs.bulkaddrs_val = 0;
+        m_addrs.bulkaddrs_len = 0;
+        vcode =
+            ubik_VL_GetAddrsU( cstruct, 0, &m_attrs,
+                               &m_uuid,
+                               &m_uniq, &m_nentries,
+                               &m_addrs);
+        uuid_valid = (vcode == 0);
+    }
 
     for (e = 0; (e < entry->nServers) && !error; e++) {
        if (!type || (entry->serverFlags[e] & type)) {
            if ((!server || (entry->serverPartition[e] == part))
                && (!server
-                   || VLDB_IsSameAddrs(entry->serverUnique[e], server,
-                                       &error)))
+                    || (uuid_valid && afs_uuid_equal(&m_uuid, &entry->serverNumber[e]))
+                   || VLDB_IsSameAddrs(entry->serverUnique[e], server, &error)))
                break;
            if (type == ITSRWVOL)
                return -1;      /* quit when we are looking for RW entry (there's only 1) */