From efb7bdb0827d9f942afb18ac21721fcee70cbf36 Mon Sep 17 00:00:00 2001 From: Giannakos Filippos Date: Thu, 1 Nov 2012 11:38:26 +0200 Subject: [PATCH] fix missing map object creation in volume creation, plus map size, map error handling --- xseg/peers/user/mt-mapperd.c | 34 +++++++++++++++++++++++++++++----- xseg/tools/vlmc | 7 ++++++- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/xseg/peers/user/mt-mapperd.c b/xseg/peers/user/mt-mapperd.c index 913479f..a453a8d 100644 --- a/xseg/peers/user/mt-mapperd.c +++ b/xseg/peers/user/mt-mapperd.c @@ -1074,6 +1074,7 @@ static inline void put_map(struct map *map) mn->flags &= MF_OBJECT_DESTROYED; put_mapnode(mn); //matchin mn->ref = 1 on mn init put_mapnode(mn); //matcing get_mapnode; + //assert mn->ref == 0; } } mn = find_object(map, 0); @@ -1714,7 +1715,7 @@ void * handle_clone(struct peer_req *pr) if (xclone->targetlen){ r = map_action(do_clone, pr, xclone->target, xclone->targetlen, MF_LOAD); } else { - if (!pr->req->size){ + if (!xclone->size){ r = -1; } else { struct map *map; @@ -1733,18 +1734,41 @@ void * handle_clone(struct peer_req *pr) r = -1; goto out; } + map->size = xclone->size; //populate_map with zero objects; - uint64_t nr_objs = pr->req->size / block_size; - if (pr->req->size % block_size) + uint64_t nr_objs = xclone->size / block_size; + if (xclone->size % block_size) nr_objs++; + + struct map_node *map_nodes = calloc(nr_objs, sizeof(struct map_node)); + if (!map_nodes){ + do_dropcache(pr, map); + r = -1; + goto out; + } uint64_t i; for (i = 0; i < nr_objs; i++) { - + strncpy(map_nodes[i].object, zero_block, strlen(zero_block)); //this should be SHA256_DIGEST_SIZE *2 + map_nodes[i].objectlen = strlen(zero_block); + map_nodes[i].object[map_nodes[i].objectlen] = 0; //NULL terminate + map_nodes[i].flags = 0; + map_nodes[i].objectidx = i; + map_nodes[i].map = map; + map_nodes[i].ref = 1; + map_nodes[i].waiters = 0; + map_nodes[i].cond = st_cond_new(); //FIXME errcheck; + r = insert_object(map, &map_nodes[i]); + if (r < 0){ + do_dropcache(pr, map); + r = -1; + goto out; + } } r = write_map(pr, map); if (r < 0){ XSEGLOG2(&lc, E, "Cannot write map %s", map->volume); - put_map(map); + do_dropcache(pr, map); + goto out; } XSEGLOG2(&lc, I, "Volume %s created", map->volume); r = 0; diff --git a/xseg/tools/vlmc b/xseg/tools/vlmc index ee12c5e..1fcb75c 100755 --- a/xseg/tools/vlmc +++ b/xseg/tools/vlmc @@ -7,13 +7,18 @@ from subprocess import call, check_call def vlmc_create(args): name = args.name[0] - size = args.size << 20 + size = args.size snap = args.snap if size == None and snap == None: print >> sys.stderr, "At least one of the size/snap args must be provided" sys.exit(-1) + if size: + size = size << 20 + else: + size = 0 + cmd = [XSEG_HOME + "/peers/user/vlmc-xseg", "%s" % SPEC, "create", "--name", "%s" % name] if snap != None: cmd.extend(["--snap", "%s" % snap]) -- 1.7.10.4