[Sheepdog] [PATCH 1/3] collie: write node list log when epoch is incremented
MORITA Kazutaka
morita.kazutaka at lab.ntt.co.jp
Wed Dec 23 19:25:32 CET 2009
The past node lists are used to look up objects efficiently
Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
collie/collie.h | 6 +++++
collie/group.c | 13 ++++++++++++
collie/store.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 75 insertions(+), 0 deletions(-)
diff --git a/collie/collie.h b/collie/collie.h
index 3b2d871..f5dc30d 100644
--- a/collie/collie.h
+++ b/collie/collie.h
@@ -74,6 +74,12 @@ int create_listen_port(int port, void *data);
int init_store(char *dir);
+int read_node_list(uint32_t epoch, struct sheepdog_node_list_entry *entries,
+ int nr_nodes);
+
+int write_node_list(uint32_t epoch, struct sheepdog_node_list_entry *entries,
+ int nr_nodes);
+
int add_vdi(struct cluster_info *cluster,
char *name, int len, uint64_t size, uint64_t * added_oid,
uint64_t base_oid, uint32_t tag);
diff --git a/collie/group.c b/collie/group.c
index ced0a5e..01f959e 100644
--- a/collie/group.c
+++ b/collie/group.c
@@ -246,6 +246,8 @@ static void print_node_list(struct cluster_info *ci)
static void add_node(struct cluster_info *ci, uint32_t nodeid, uint32_t pid,
struct sheepdog_node_list_entry *sd_ent)
{
+ int nr_nodes;
+ struct sheepdog_node_list_entry entries[SD_MAX_NODES];
struct node *node;
node = zalloc(sizeof(*node));
@@ -257,6 +259,10 @@ static void add_node(struct cluster_info *ci, uint32_t nodeid, uint32_t pid,
node->pid = pid;
node->ent = *sd_ent;
list_add_tail(&node->list, &ci->node_list);
+
+ nr_nodes = build_node_list(&ci->node_list, entries);
+ write_node_list(ci->epoch + 1, entries, nr_nodes);
+
ci->epoch++;
}
@@ -528,12 +534,19 @@ static void __sd_confch(struct work *work, int idx)
for (i = 0; i < left_list_entries; i++) {
list_for_each_entry_safe(node, e, &ci->node_list, list) {
+ int nr_nodes;
+ struct sheepdog_node_list_entry entries[SD_MAX_NODES];
+
if (node->nodeid != left_list[i].nodeid ||
node->pid != left_list[i].pid)
continue;
list_del(&node->list);
free(node);
+
+ nr_nodes = build_node_list(&ci->node_list, entries);
+ write_node_list(ci->epoch + 1, entries, nr_nodes);
+
ci->epoch++;
}
}
diff --git a/collie/store.c b/collie/store.c
index 4e95469..aadddc5 100644
--- a/collie/store.c
+++ b/collie/store.c
@@ -622,6 +622,7 @@ int init_store(char *dir)
struct mntent *mnt;
struct stat s, ms;
FILE *fp;
+ char path[PATH_MAX];
ret = stat(dir, &s);
if (ret) {
@@ -650,6 +651,13 @@ int init_store(char *dir)
obj_dir = dir;
+ strcpy(path, dir);
+ strcat(path, "/epoch");
+ ret = mkdir(path, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP |
+ S_IWGRP | S_IXGRP);
+ if (ret && errno != EEXIST)
+ return 1;
+
fp = setmntent(MOUNTED, "r");
if (!fp)
return 1;
@@ -673,3 +681,51 @@ int init_store(char *dir)
return ret;
}
+
+int read_node_list(uint32_t epoch, struct sheepdog_node_list_entry *entries,
+ int nr_nodes)
+{
+ int ret;
+ int fd;
+ char path[PATH_MAX];
+
+ if (epoch <= 0)
+ return -1;
+
+ snprintf(path, sizeof(path), "%s/epoch/%x", obj_dir, epoch);
+ fd = open(path, O_RDONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
+ if (!fd)
+ return -1;
+
+ ret = pread64(fd, entries,
+ nr_nodes * sizeof(struct sheepdog_node_list_entry), 0);
+
+ close(fd);
+
+ return (ret / sizeof(struct sheepdog_node_list_entry));
+}
+
+int write_node_list(uint32_t epoch, struct sheepdog_node_list_entry *entries,
+ int nr_nodes)
+{
+ int ret;
+ int fd;
+ char path[PATH_MAX];
+
+ if (epoch <= 0)
+ return -1;
+
+ snprintf(path, sizeof(path), "%s/epoch/%x", obj_dir, epoch);
+ fd = open(path, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
+ if (!fd)
+ return -1;
+
+ ret = pwrite64(fd, entries,
+ nr_nodes * sizeof(struct sheepdog_node_list_entry), 0);
+ if (ret != nr_nodes * sizeof(struct sheepdog_node_list_entry))
+ return -1;
+
+ close(fd);
+
+ return nr_nodes;
+}
--
1.6.5
More information about the sheepdog
mailing list