[Sheepdog] fix calculation of free disk spaces

MORITA Kazutaka morita.kazutaka at lab.ntt.co.jp
Mon Feb 15 03:31:02 CET 2010


On Sat, Feb 13, 2010 at 5:02 AM, Piavlo <piavka at cs.bgu.ac.il> wrote:
> I've just build against the current next branch. The fd leak seems to be
> solved,

Thanks!
I've applied the fixes to the master branch.

> but  disk spaces are still not reported correctly
>
> fire-srv3 ~ # shepherd info -t sheep
> Id      Size    Used    Use%
>  0      12G     0G        0%
>  1      11G     0G        0%
>  2      13G     0G        0%
>
> Total   36G     0G        0%, total virtual VDI Size    5G

Thanks for your reporting.
Can you apply the following patch or pull the current next branch?

Regards,

Kazutaka Morita

==
>From ff5a9ac9761350f7a118dd49e6aa8e9ecc679437 Mon Sep 17 00:00:00 2001
From: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
Date: Mon, 15 Feb 2010 11:18:38 +0900
Subject: [PATCH] collie: fix a calculation of disk usage

Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
 collie/store.c |   11 ++++++-----
 1 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/collie/store.c b/collie/store.c
index 4761ce5..131b9e8 100644
--- a/collie/store.c
+++ b/collie/store.c
@@ -37,7 +37,7 @@ static mode_t def_fmode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP;
 int nr_sobjs;
 struct work_queue *dobj_queue;
 
-static int stat_sheep(uint64_t *store_size, uint64_t *store_free)
+static int stat_sheep(uint64_t *store_size, uint64_t *store_free, uint32_t epoch)
 {
 	struct statvfs vs;
 	int ret;
@@ -45,13 +45,14 @@ static int stat_sheep(uint64_t *store_size, uint64_t *store_free)
 	struct dirent *d;
 	uint64_t used = 0;
 	struct stat s;
-	char path[1024];
+	char path[1024], store_dir[1024];
 
 	ret = statvfs(mnt_path, &vs);
 	if (ret)
 		return SD_RES_EIO;
 
-	dir = opendir(obj_path);
+	snprintf(store_dir, sizeof(store_dir), "%s%08u", obj_path, epoch);
+	dir = opendir(store_dir);
 	if (!dir)
 		return SD_RES_EIO;
 
@@ -59,7 +60,7 @@ static int stat_sheep(uint64_t *store_size, uint64_t *store_free)
 		if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
 			continue;
 
-		snprintf(path, sizeof(path), "%s%s", obj_path, d->d_name);
+		snprintf(path, sizeof(path), "%s/%s", store_dir, d->d_name);
 
 		ret = stat(path, &s);
 		if (ret)
@@ -560,7 +561,7 @@ void store_queue_request(struct work *work, int idx)
 	}
 
 	if (opcode == SD_OP_STAT_SHEEP) {
-		ret = stat_sheep(&nrsp->store_size, &nrsp->store_free);
+		ret = stat_sheep(&nrsp->store_size, &nrsp->store_free, epoch);
 		goto out;
 	}
 
-- 
1.5.6.5



More information about the sheepdog mailing list