Skip to content

Commit

Permalink
reduce the maximum size of vdi attributes from 4 MB to 64 KB
Browse files Browse the repository at this point in the history
This allows us to make simple_store_read()/write() fail when it cannot
read/write full length data.

This patch can also remove SD_FLAG_CMD_TRUNCATE.

Signed-off-by: MORITA Kazutaka <morita.kazutaka@lab.ntt.co.jp>
  • Loading branch information
kazum committed Nov 18, 2011
1 parent 9cecc57 commit 1769d1a
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 51 deletions.
47 changes: 20 additions & 27 deletions collie/vdi.c
Expand Up @@ -792,18 +792,16 @@ static int find_vdi_attr_oid(char *vdiname, char *tag, uint32_t snapid,
struct sd_vdi_rsp *rsp = (struct sd_vdi_rsp *)&hdr;
int fd, ret;
unsigned int wlen, rlen;
struct sheepdog_vdi_attr *vattr;
struct sheepdog_vdi_attr vattr;

vattr = zalloc(SD_ATTR_HEADER_SIZE + value_len);
if (!vattr)
return SD_RES_NO_MEM;

strncpy(vattr->name, vdiname, SD_MAX_VDI_LEN);
strncpy(vattr->tag, vdi_cmd_data.snapshot_tag, SD_MAX_VDI_TAG_LEN);
vattr->snap_id = vdi_cmd_data.snapshot_id;
strncpy(vattr->key, key, SD_MAX_VDI_ATTR_KEY_LEN);
if (value && value_len)
memcpy(vattr->value, value, value_len);
strncpy(vattr.name, vdiname, SD_MAX_VDI_LEN);
strncpy(vattr.tag, vdi_cmd_data.snapshot_tag, SD_MAX_VDI_TAG_LEN);
vattr.snap_id = vdi_cmd_data.snapshot_id;
strncpy(vattr.key, key, SD_MAX_VDI_ATTR_KEY_LEN);
if (value && value_len) {
vattr.value_len = value_len;
memcpy(vattr.value, value, value_len);
}

fd = connect_to(sdhost, sdport);
if (fd < 0) {
Expand All @@ -813,7 +811,7 @@ static int find_vdi_attr_oid(char *vdiname, char *tag, uint32_t snapid,

memset(&hdr, 0, sizeof(hdr));
hdr.opcode = SD_OP_GET_VDI_ATTR;
wlen = SD_ATTR_HEADER_SIZE + value_len;
wlen = SD_ATTR_OBJ_SIZE;
rlen = 0;
hdr.proto_ver = SD_PROTO_VER;
hdr.data_length = wlen;
Expand All @@ -826,7 +824,7 @@ static int find_vdi_attr_oid(char *vdiname, char *tag, uint32_t snapid,
if (delete)
hdr.flags |= SD_FLAG_CMD_DEL;

ret = exec_req(fd, (struct sd_req *)&hdr, vattr, &wlen, &rlen);
ret = exec_req(fd, (struct sd_req *)&hdr, &vattr, &wlen, &rlen);
if (ret) {
ret = SD_RES_EIO;
goto out;
Expand Down Expand Up @@ -915,7 +913,8 @@ static int vdi_getattr(int argc, char **argv)
int ret;
uint64_t oid, attr_oid = 0;
uint32_t vid = 0, nr_copies = 0;
char *vdiname = argv[optind++], *key, *value;
char *vdiname = argv[optind++], *key;
struct sheepdog_vdi_attr vattr;

key = argv[optind++];
if (!key) {
Expand All @@ -939,22 +938,16 @@ static int vdi_getattr(int argc, char **argv)
}

oid = attr_oid;
value = malloc(SD_MAX_VDI_ATTR_VALUE_LEN);
if (!value) {
fprintf(stderr, "failed to allocate memory\n");
return EXIT_SYSFAIL;
}

ret = sd_read_object(oid, value, SD_MAX_VDI_ATTR_VALUE_LEN,
SD_ATTR_HEADER_SIZE);
if (ret == SD_RES_SUCCESS) {
printf("%s", value);
free(value);
return EXIT_SUCCESS;
ret = sd_read_object(oid, &vattr, SD_ATTR_OBJ_SIZE, 0);
if (ret != SD_RES_SUCCESS) {
fprintf(stderr, "failed to read attr oid, %s\n",
sd_strerror(ret));
return EXIT_SYSFAIL;
}

free(value);
return EXIT_FAILURE;
xwrite(STDOUT_FILENO, vattr.value, vattr.value_len);
return EXIT_SUCCESS;
}

static int vdi_read(int argc, char **argv)
Expand Down
9 changes: 4 additions & 5 deletions include/sheepdog_proto.h
Expand Up @@ -31,7 +31,6 @@

#define SD_FLAG_CMD_WRITE 0x01
#define SD_FLAG_CMD_COW 0x02
#define SD_FLAG_CMD_TRUNCATE 0x04

#define SD_RES_SUCCESS 0x00 /* Success */
#define SD_RES_UNKNOWN 0x01 /* Unknown error */
Expand Down Expand Up @@ -80,7 +79,7 @@
#define SD_MAX_VDI_LEN 256U
#define SD_MAX_VDI_TAG_LEN 256U
#define SD_MAX_VDI_ATTR_KEY_LEN 256U
#define SD_MAX_VDI_ATTR_VALUE_LEN (UINT64_C(1) << 22)
#define SD_MAX_VDI_ATTR_VALUE_LEN 65536U
#define SD_NR_VDIS (1U << 24)
#define SD_DATA_OBJ_SIZE (UINT64_C(1) << 22)
#define SD_MAX_VDI_SIZE (SD_DATA_OBJ_SIZE * MAX_DATA_OBJS)
Expand All @@ -89,7 +88,7 @@
#define SD_INODE_SIZE (sizeof(struct sheepdog_inode))
#define SD_INODE_HEADER_SIZE (sizeof(struct sheepdog_inode) - \
sizeof(uint32_t) * MAX_DATA_OBJS)
#define SD_ATTR_HEADER_SIZE (sizeof(struct sheepdog_vdi_attr))
#define SD_ATTR_OBJ_SIZE (sizeof(struct sheepdog_vdi_attr))
#define CURRENT_VDI_ID 0

struct sd_req {
Expand Down Expand Up @@ -191,9 +190,9 @@ struct sheepdog_vdi_attr {
char tag[SD_MAX_VDI_TAG_LEN];
uint64_t ctime;
uint32_t snap_id;
uint32_t pad;
uint32_t value_len;
char key[SD_MAX_VDI_ATTR_KEY_LEN];
char value[0];
char value[SD_MAX_VDI_ATTR_VALUE_LEN];
};

/*
Expand Down
9 changes: 0 additions & 9 deletions sheep/simple_store.c
Expand Up @@ -106,15 +106,6 @@ static int simple_store_open(uint64_t oid, struct siocb *iocb, int create)
}
}
}
if (iocb->flags & SD_FLAG_CMD_TRUNCATE) {
ret = ftruncate(iocb->fd, iocb->offset + iocb->length);
if (ret) {
eprintf("%m\n");
ret = SD_RES_EIO;
close(iocb->fd);
goto out;
}
}

ret = SD_RES_SUCCESS;
out:
Expand Down
24 changes: 14 additions & 10 deletions sheep/vdi.c
Expand Up @@ -655,21 +655,22 @@ int get_vdi_attr(uint32_t epoch, struct sheepdog_vdi_attr *vattr, int data_len,
{
struct sheepdog_vnode_list_entry *entries = NULL;
struct sheepdog_vdi_attr tmp_attr;
uint64_t oid;
uint64_t oid, hval;
uint32_t end;
int ret, nr_zones, nr_vnodes;
int value_len;

value_len = data_len - SD_ATTR_HEADER_SIZE;

vattr->ctime = ctime;

ret = get_ordered_sd_vnode_list(&entries, &nr_vnodes, &nr_zones);
if (ret != SD_RES_SUCCESS)
goto out;

*attrid = fnv_64a_buf(vattr, SD_ATTR_HEADER_SIZE, FNV1A_64_INIT);
*attrid &= (UINT64_C(1) << VDI_SPACE_SHIFT) - 1;
/* we cannot include value_len for calculating the hash value */
hval = fnv_64a_buf(vattr->name, sizeof(vattr->name), FNV1A_64_INIT);
hval = fnv_64a_buf(vattr->tag, sizeof(vattr->tag), hval);
hval = fnv_64a_buf(&vattr->snap_id, sizeof(vattr->snap_id), hval);
hval = fnv_64a_buf(vattr->key, sizeof(vattr->key), hval);
*attrid = hval & ((UINT64_C(1) << VDI_SPACE_SHIFT) - 1);

end = *attrid - 1;
while (*attrid != end) {
Expand All @@ -690,7 +691,11 @@ int get_vdi_attr(uint32_t epoch, struct sheepdog_vdi_attr *vattr, int data_len,
if (ret < 0)
return -ret;

if (memcmp(&tmp_attr, vattr, sizeof(tmp_attr)) == 0) {
/* compare attribute header */
if (strcmp(tmp_attr.name, vattr->name) == 0 &&
strcmp(tmp_attr.tag, vattr->tag) == 0 &&
tmp_attr.snap_id == vattr->snap_id &&
strcmp(tmp_attr.key, vattr->key) == 0) {
if (excl)
ret = SD_RES_VDI_EXIST;
else if (delete) {
Expand All @@ -704,9 +709,8 @@ int get_vdi_attr(uint32_t epoch, struct sheepdog_vdi_attr *vattr, int data_len,
ret = SD_RES_SUCCESS;
} else if (write) {
ret = write_object(entries, nr_vnodes, nr_zones,
epoch, oid, vattr->value,
value_len, SD_ATTR_HEADER_SIZE,
SD_FLAG_CMD_TRUNCATE, copies, 0);
epoch, oid, (char *)vattr,
SD_ATTR_OBJ_SIZE, 0, 0, copies, 0);

if (ret)
ret = SD_RES_EIO;
Expand Down

0 comments on commit 1769d1a

Please sign in to comment.