diff mbox

osd: compute full ratio from kb_avail

Message ID orli2v6he3.fsf@livre.home (mailing list archive)
State New, archived
Headers show

Commit Message

Alexandre Oliva Sept. 17, 2013, 7:23 a.m. UTC
On btrfs, kb_used + kb_avail can be much smaller than total kb, and
what really matters to avoid filling up the disk is how much space is
available, not how much we've used.  Thus, compute the ratio we use to
determine full or nearfull from kb_avail rather than from kb_used.

Signed-off-by: Alexandre Oliva <oliva@gnu.org>
---
 src/osd/OSD.cc |    7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

Comments

Sage Weil Sept. 17, 2013, 1:32 p.m. UTC | #1
Applied, thanks!

s

On Tue, 17 Sep 2013, Alexandre Oliva wrote:

> On btrfs, kb_used + kb_avail can be much smaller than total kb, and
> what really matters to avoid filling up the disk is how much space is
> available, not how much we've used.  Thus, compute the ratio we use to
> determine full or nearfull from kb_avail rather than from kb_used.
> 
> Signed-off-by: Alexandre Oliva <oliva@gnu.org>
> ---
>  src/osd/OSD.cc |    7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
> 
> diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc
> index 66364ec3..841f1c4 100644
> --- a/src/osd/OSD.cc
> +++ b/src/osd/OSD.cc
> @@ -2457,7 +2457,12 @@ void OSDService::check_nearfull_warning(const osd_stat_t &osd_stat)
>  
>    time_t now = ceph_clock_gettime(NULL);
>  
> -  float ratio = ((float)osd_stat.kb_used) / ((float)osd_stat.kb);
> +  // We base ratio on kb_avail rather than kb_used because they can
> +  // differ significantly e.g. on btrfs volumes with a large number of
> +  // chunks reserved for metadata, and for our purposes (avoiding
> +  // completely filling the disk) it's far more important to know how
> +  // much space is available to use than how much we've already used.
> +  float ratio = ((float)(osd_stat.kb - osd_stat.kb_avail)) / ((float)osd_stat.kb);
>    float nearfull_ratio = get_nearfull_ratio();
>    float full_ratio = get_full_ratio();
>    cur_ratio = ratio;
> 
> -- 
> Alexandre Oliva, freedom fighter    http://FSFLA.org/~lxoliva/
> You must be the change you wish to see in the world. -- Gandhi
> Be Free! -- http://FSFLA.org/   FSF Latin America board member
> Free Software Evangelist      Red Hat Brazil Compiler Engineer
> --
> To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> 
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc
index 66364ec3..841f1c4 100644
--- a/src/osd/OSD.cc
+++ b/src/osd/OSD.cc
@@ -2457,7 +2457,12 @@  void OSDService::check_nearfull_warning(const osd_stat_t &osd_stat)
 
   time_t now = ceph_clock_gettime(NULL);
 
-  float ratio = ((float)osd_stat.kb_used) / ((float)osd_stat.kb);
+  // We base ratio on kb_avail rather than kb_used because they can
+  // differ significantly e.g. on btrfs volumes with a large number of
+  // chunks reserved for metadata, and for our purposes (avoiding
+  // completely filling the disk) it's far more important to know how
+  // much space is available to use than how much we've already used.
+  float ratio = ((float)(osd_stat.kb - osd_stat.kb_avail)) / ((float)osd_stat.kb);
   float nearfull_ratio = get_nearfull_ratio();
   float full_ratio = get_full_ratio();
   cur_ratio = ratio;