]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crush/builder: break out new version 1 of crush_calc_straw
authorSage Weil <sage@redhat.com>
Tue, 2 Dec 2014 22:49:42 +0000 (14:49 -0800)
committerSage Weil <sage@redhat.com>
Fri, 13 Feb 2015 16:30:45 +0000 (08:30 -0800)
No change, yet.

Signed-off-by: Sage Weil <sage@redhat.com>
(cherry picked from commit 7c1203635f2b5911f281ce3a441905df6e9bd103)

src/crush/builder.c

index 12f18b5509882a5c5e00e8be736e0f411298ebc6..64137dab4f18e03359f82097868484d01309281a 100644 (file)
@@ -441,43 +441,91 @@ int crush_calc_straw(struct crush_map *map, struct crush_bucket_straw *bucket)
 
        i=0;
        while (i < size) {
-               /* zero weight items get 0 length straws! */
-               if (weights[reverse[i]] == 0) {
-                       bucket->straws[reverse[i]] = 0;
+               if (map->straw_calc_version == 0) {
+                       /* zero weight items get 0 length straws! */
+                       if (weights[reverse[i]] == 0) {
+                               bucket->straws[reverse[i]] = 0;
+                               i++;
+                               continue;
+                       }
+
+                       /* set this item's straw */
+                       bucket->straws[reverse[i]] = straw * 0x10000;
+                       dprintk("item %d at %d weight %d straw %d (%lf)\n",
+                               bucket->h.items[reverse[i]],
+                               reverse[i], weights[reverse[i]],
+                               bucket->straws[reverse[i]], straw);
                        i++;
-                       continue;
-               }
+                       if (i == size)
+                               break;
 
-               /* set this item's straw */
-               bucket->straws[reverse[i]] = straw * 0x10000;
-               dprintk("item %d at %d weight %d straw %d (%lf)\n",
-                       bucket->h.items[reverse[i]],
-                       reverse[i], weights[reverse[i]],
-                       bucket->straws[reverse[i]], straw);
-               i++;
-               if (i == size) break;
-
-               /* same weight as previous? */
-               if (weights[reverse[i]] == weights[reverse[i-1]]) {
-                       /*dprintk("same as previous\n");*/
-                       continue;
-               }
+                       /* same weight as previous? */
+                       if (weights[reverse[i]] == weights[reverse[i-1]]) {
+                               dprintk("same as previous\n");
+                               continue;
+                       }
 
-               /* adjust straw for next guy */
-               wbelow += ((double)weights[reverse[i-1]] - lastw) * numleft;
-               for (j=i; j<size; j++)
-                       if (weights[reverse[j]] == weights[reverse[i]])
-                               numleft--;
-                       else
+                       /* adjust straw for next guy */
+                       wbelow += ((double)weights[reverse[i-1]] - lastw) *
+                               numleft;
+                       for (j=i; j<size; j++)
+                               if (weights[reverse[j]] == weights[reverse[i]])
+                                       numleft--;
+                               else
+                                       break;
+                       wnext = numleft * (weights[reverse[i]] -
+                                          weights[reverse[i-1]]);
+                       pbelow = wbelow / (wbelow + wnext);
+                       dprintk("wbelow %lf  wnext %lf  pbelow %lf  numleft %d\n",
+                               wbelow, wnext, pbelow, numleft);
+
+                       straw *= pow((double)1.0 / pbelow, (double)1.0 /
+                                    (double)numleft);
+
+                       lastw = weights[reverse[i-1]];
+               } else if (map->straw_calc_version >= 1) {
+                       /* zero weight items get 0 length straws! */
+                       if (weights[reverse[i]] == 0) {
+                               bucket->straws[reverse[i]] = 0;
+                               i++;
+                               continue;
+                       }
+
+                       /* set this item's straw */
+                       bucket->straws[reverse[i]] = straw * 0x10000;
+                       dprintk("item %d at %d weight %d straw %d (%lf)\n",
+                               bucket->h.items[reverse[i]],
+                               reverse[i], weights[reverse[i]],
+                               bucket->straws[reverse[i]], straw);
+                       i++;
+                       if (i == size)
                                break;
-               wnext = numleft * (weights[reverse[i]] - weights[reverse[i-1]]);
-               pbelow = wbelow / (wbelow + wnext);
-               dprintk("wbelow %lf  wnext %lf  pbelow %lf  numleft %d\n",
-                       wbelow, wnext, pbelow, numleft);
 
-               straw *= pow((double)1.0 / pbelow, (double)1.0 / (double)numleft);
+                       /* same weight as previous? */
+                       if (weights[reverse[i]] == weights[reverse[i-1]]) {
+                               dprintk("same as previous\n");
+                               continue;
+                       }
 
-               lastw = weights[reverse[i-1]];
+                       /* adjust straw for next guy */
+                       wbelow += ((double)weights[reverse[i-1]] - lastw) *
+                               numleft;
+                       for (j=i; j<size; j++)
+                               if (weights[reverse[j]] == weights[reverse[i]])
+                                       numleft--;
+                               else
+                                       break;
+                       wnext = numleft * (weights[reverse[i]] -
+                                          weights[reverse[i-1]]);
+                       pbelow = wbelow / (wbelow + wnext);
+                       dprintk("wbelow %lf  wnext %lf  pbelow %lf  numleft %d\n",
+                               wbelow, wnext, pbelow, numleft);
+
+                       straw *= pow((double)1.0 / pbelow, (double)1.0 /
+                                    (double)numleft);
+
+                       lastw = weights[reverse[i-1]];
+               }
        }
 
        free(reverse);