]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
ebofs: -ENOSPC in apply_transaction
authorSage Weil <sage@newdream.net>
Mon, 6 Oct 2008 23:36:56 +0000 (16:36 -0700)
committerSage Weil <sage@newdream.net>
Tue, 7 Oct 2008 19:10:27 +0000 (12:10 -0700)
src/ebofs/Ebofs.cc
src/os/ObjectStore.h

index 38b7ae98621af45a322d83e921d630c0ae4b3624..9c22d20087b879fee9227a5dbcf4d13bed153487 100644 (file)
@@ -2467,6 +2467,13 @@ unsigned Ebofs::apply_transaction(Transaction& t, Context *onsafe)
 
 unsigned Ebofs::_apply_transaction(Transaction& t)
 {
+  // verify we have enough space
+  if (t.disk_space_required() > get_free_blocks()*EBOFS_BLOCK_SIZE) {
+    derr(0) << "apply_transaction needs " << t.disk_space_required() << " bytes > "
+           << (get_free_blocks()*EBOFS_BLOCK_SIZE) << " free" << dendl;
+    return -ENOSPC;
+  }
+
   // do ops
   unsigned r = 0;  // bit fields indicate which ops failed.
   int bit = 1;
index 6881eda75e9a0fd1e48897a7090f618978ec8605..4fde2157252772d3b4af4d43850cdf918b5e8af5 100644 (file)
@@ -118,6 +118,15 @@ public:
     int get_len() { return len ? len : ops.size(); }
     int get_btrfs_len() { return blen; }
 
+    __u64 disk_space_required() {
+      // be conservative!
+      __u64 s = 16384 +
+       (ops.size() + oids.size() + cids.size() + lengths.size()) * 4096;
+      for (vector<bufferlist>::iterator p = bls.begin(); p != bls.end(); p++)
+       s += bls.size() + 4096;
+      return s;      
+    }
+
     bool have_op() {
       return opp < ops.size();
     }