From: Sage Weil Date: Mon, 6 Oct 2008 23:36:56 +0000 (-0700) Subject: ebofs: -ENOSPC in apply_transaction X-Git-Tag: v0.4~9 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d301485223a31f15bd82b18e810f1659aaeb3d85;p=ceph.git ebofs: -ENOSPC in apply_transaction --- diff --git a/src/ebofs/Ebofs.cc b/src/ebofs/Ebofs.cc index 38b7ae98621a..9c22d20087b8 100644 --- a/src/ebofs/Ebofs.cc +++ b/src/ebofs/Ebofs.cc @@ -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; diff --git a/src/os/ObjectStore.h b/src/os/ObjectStore.h index 6881eda75e9a..4fde21572527 100644 --- a/src/os/ObjectStore.h +++ b/src/os/ObjectStore.h @@ -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::iterator p = bls.begin(); p != bls.end(); p++) + s += bls.size() + 4096; + return s; + } + bool have_op() { return opp < ops.size(); }