static int
-storeDirSelectSwapDirRoundRobin(const StoreEntry * unused)
+storeDirSelectSwapDirRoundRobin(const StoreEntry * e)
 {
     static int dirn = 0;
     int i;
+    int load;
     SwapDir *sd;
-    /*
-     * yes, the '<=' is intentional.  If all dirs are full we want to
-     * make sure 'dirn' advances every time this gets called, otherwise
-     * we get stuck on one dir.
-     */
+    ssize_t objsize = (ssize_t) objectLen(e);
     for (i = 0; i <= Config.cacheSwap.n_configured; i++) {
        if (++dirn >= Config.cacheSwap.n_configured)
            dirn = 0;
        sd = &Config.cacheSwap.swapDirs[dirn];
+       if (sd->flags.read_only)
+           continue;
        if (sd->cur_size > sd->max_size)
            continue;
+       if (!storeDirValidSwapDirSize(i, objsize))
+           continue;
+       /* check for error or overload condition */
+       load = sd->checkobj(sd, e);
+       if (load < 0 || load > 1000) {
+           continue;
+       }
        return dirn;
     }
-    return dirn;
+    return -1;
 }
This change bothers me quite a bit.
First of all, there is no mention of changes to
storeDirSelectSwapDirRoundRobin in the commit messages.
I don't want storeDirSelectSwapDirRoundRobin to return -1, EVER.
And I don't think that round-robin should care about the load.
The underlying storage system can refuse to open the file if it
wants to, so for the round-robin case I think checking the "load"
is worthless.
If you don't like the way this selection algorithm works, please
don't change it.  Write another one and give it a different name
like 'almost-round-robin'.
The read-only check is a good thing of course.
Duane W.
Received on Sat Mar 03 2001 - 19:29:52 MST
This archive was generated by hypermail pre-2.1.9 : Tue Dec 09 2003 - 16:13:36 MST