]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crush: prevent formation of a loop
authorSage Weil <sage@inktank.com>
Wed, 20 Mar 2013 14:59:26 +0000 (07:59 -0700)
committerSage Weil <sage@inktank.com>
Fri, 22 Mar 2013 22:15:37 +0000 (15:15 -0700)
If we are adding an item, ensure it cannot form a loop in the tree/map/
DAG.

Signed-off-by: Sage Weil <sage@inktank.com>
src/crush/CrushWrapper.cc

index 766fad6e0afe32e9dc8a8da6992bc88ee673cd36..bb23901223612cb4b2a53c3dbe39ec31c5b0bd59 100644 (file)
@@ -305,6 +305,13 @@ int CrushWrapper::insert_item(CephContext *cct, int item, float weight, string n
        return -EEXIST;
       }
     
+    // are we forming a loop?
+    if (subtree_contains(cur, b->id)) {
+      ldout(cct, 1) << "insert_item " << cur << " already contains " << b->id
+                   << "; cannot form loop" << dendl;
+      return -ELOOP;
+    }
+
     ldout(cct, 5) << "insert_item adding " << cur << " weight " << weight
                  << " to bucket " << id << dendl;
     int r = crush_bucket_add_item(b, cur, 0);