[Sheepdog] [PATCH 17/18] collie: remove old epochs and objects after make fs
MORITA Kazutaka
morita.kazutaka at lab.ntt.co.jp
Thu Mar 11 07:48:16 CET 2010
We need to add '--force' option to remove old objects, but currently
collie always delete old objects when make fs is invoked.
Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
collie/group.c | 40 +++++++++++++++++++++++++++++++++++-----
1 files changed, 35 insertions(+), 5 deletions(-)
diff --git a/collie/group.c b/collie/group.c
index 676ddbb..1571c19 100644
--- a/collie/group.c
+++ b/collie/group.c
@@ -875,6 +875,12 @@ static void vdi_op_done(struct vdi_op_message *msg)
struct vm *vm;
struct request *req;
int ret = msg->rsp.result;
+ int i, latest_epoch, nr_nodes;
+ struct sheepdog_node_list_entry entry[SD_MAX_NODES];
+ uint64_t ctime, hval;
+
+ if (ret != SD_RES_SUCCESS)
+ goto out;
switch (hdr->opcode) {
case SD_OP_NEW_VDI:
@@ -910,11 +916,35 @@ static void vdi_op_done(struct vdi_op_message *msg)
case SD_OP_GET_VDI_INFO:
break;
case SD_OP_MAKE_FS:
- if (ret == SD_RES_SUCCESS) {
- sys->nr_sobjs = ((struct sd_so_req *)hdr)->copies;
- eprintf("%d\n", sys->nr_sobjs);
- }
+ sys->nr_sobjs = ((struct sd_so_req *)hdr)->copies;
+ eprintf("%d\n", sys->nr_sobjs);
+
+ ctime = ((struct sd_so_req *)hdr)->ctime;
+ set_cluster_ctime(ctime);
+ latest_epoch = get_latest_epoch();
+ for (i = 1; i <= latest_epoch; i++)
+ remove_epoch(i);
+
+ sys->epoch = 1;
+ sys->is_object_updated = 0;
+ nr_nodes = build_node_list(&sys->sd_node_list, entry);
+
+ dprintf("write epoch log, %d, %d\n", sys->epoch, nr_nodes);
+ ret = epoch_log_write(sys->epoch, (char *)entry,
+ nr_nodes * sizeof(struct sheepdog_node_list_entry));
+ if (ret < 0)
+ eprintf("can't write epoch %u\n", sys->epoch);
+ update_epoch_store(sys->epoch);
+ set_epoch_updated(sys->epoch, 1);
+
+ /* FIXME: free epoch tree */
+ INIT_TREE_VERTEX(&sys->epoch_tree_root, 0, 0);
+ hval = epoch_hash_val(sys->epoch, ctime, entry, nr_nodes);
+ add_epoch_log(sys->epoch, 0, hval, nr_nodes, entry, 1, ctime);
+
+ sys->status = SD_STATUS_OK;
+ break;
case SD_OP_SHUTDOWN:
sys->status = SD_STATUS_SHUTDOWN;
break;
@@ -924,7 +954,7 @@ static void vdi_op_done(struct vdi_op_message *msg)
eprintf("unknown operation %d\n", hdr->opcode);
ret = SD_RES_UNKNOWN;
}
-
+out:
if (node_cmp(&sys->this_node, &msg->header.from) != 0)
return;
--
1.5.6.5
More information about the sheepdog
mailing list