All pastes #1390318 Raw Edit

Anonymous

public text v1 · immutable
#1390318 ·published 2009-04-13 06:19 UTC
rendered paste body
Index: src/afs/afs_server.c
===================================================================
RCS file: /cvs/openafs/src/afs/afs_server.c,v
retrieving revision 1.43.4.11
diff -u -r1.43.4.11 afs_server.c
--- src/afs/afs_server.c	18 Mar 2009 13:41:35 -0000	1.43.4.11
+++ src/afs/afs_server.c	13 Apr 2009 06:17:35 -0000
@@ -940,6 +940,55 @@
     }
 }				/*afs_SortServers */
 
+/*
+ * For Summer of Code Patch, should make the server rank random
+ */
+void
+afs_SortServersRand(struct server *aservers[], int count)
+{
+    struct server *ts, *index;
+    int i, j, low, k, l;
+
+    AFS_STATCNT(afs_SortServers);
+
+    for (i = 0; i < count; i++) {
+	if (!aservers[i])
+	    break;
+	aservers[i]->addr->sa_iprank = afs_randomMod15();
+
+	for (low = i, j = i + 1; j <= count; j++) {
+	    if ((!aservers[j]) || (!aservers[j]->addr))
+		break;
+	    if ((!aservers[low]) || (!aservers[low]->addr))
+		break;
+	    if (aservers[j]->addr->sa_iprank < aservers[low]->addr->sa_iprank) {
+		low = j;
+	    }
+	}
+	if (low != i) {
+	    ts = aservers[i];
+	    aservers[i] = aservers[low];
+	    aservers[low] = ts;
+	}
+    }
+
+    for (k=1; k < count; k++)
+    {
+	/*index = aservers[k];*/
+	memcpy(aservers[k], index, sizeof(index));
+	l = k;
+	while ((l > 0) && (aservers[l-1]->addr->sa_iprank > index->addr->sa_iprank))
+	{
+		/*aservers[l] = aservers[l-1];*/
+		memcpy(aservers[l-1], aservers[l], sizeof(aservers[l]));
+		l = l - 1;
+	}
+	memcpy(index, aservers[l], sizeof(aservers[l]));
+	/*aservers[l] = index;*/
+    }
+
+}				/*afs_SortServers */
+
 /* afs_SetServerPrefs is rather system-dependent.  It pokes around in kernel
    data structures to determine what the local IP addresses and subnet masks 
    are in order to choose which server(s) are on the local subnet.