[sheepdog] [PATCH v2 04/12] sheep: remove farm from sheep
Kai Zhang
kyle at zelin.io
Tue May 14 09:16:42 CEST 2013
Signed-off-by: Kai Zhang <kyle at zelin.io>
---
sheep/Makefile.am | 10 +-
sheep/farm/farm.c | 271 -----------------------------------------------
sheep/farm/farm.h | 68 ------------
sheep/farm/sha1_file.c | 273 ------------------------------------------------
sheep/farm/snap.c | 152 ---------------------------
sheep/farm/trunk.c | 139 ------------------------
sheep/ops.c | 62 -----------
sheep/sheep_priv.h | 6 +-
sheep/store.c | 1 -
9 files changed, 7 insertions(+), 975 deletions(-)
delete mode 100644 sheep/farm/farm.c
delete mode 100644 sheep/farm/farm.h
delete mode 100644 sheep/farm/sha1_file.c
delete mode 100644 sheep/farm/snap.c
delete mode 100644 sheep/farm/trunk.c
diff --git a/sheep/Makefile.am b/sheep/Makefile.am
index 32bc1c0..566e50b 100644
--- a/sheep/Makefile.am
+++ b/sheep/Makefile.am
@@ -37,22 +37,20 @@ if BUILD_ZOOKEEPER
sheep_SOURCES += cluster/zookeeper.c
endif
-sheep_SOURCES += farm/sha1_file.c farm/trunk.c farm/snap.c farm/farm.c
-
if BUILD_TRACE
sheep_SOURCES += trace/trace.c trace/mcount.S trace/stabs.c trace/graph.c
endif
-sheep_LDADD = ../lib/libsheepdog.a -lpthread -lm\
+sheep_LDADD = ../lib/libsheepdog.a -lpthread -lm\
$(libcpg_LIBS) $(libcfg_LIBS) $(libacrd_LIBS) $(LIBS)
sheep_DEPENDENCIES = ../lib/libsheepdog.a
-noinst_HEADERS = work.h sheep_priv.h cluster.h farm/farm.h trace/trace.h
+noinst_HEADERS = work.h sheep_priv.h cluster.h trace/trace.h
-EXTRA_DIST =
+EXTRA_DIST =
-all-local:
+all-local:
@echo Built sheep
clean-local:
diff --git a/sheep/farm/farm.c b/sheep/farm/farm.c
deleted file mode 100644
index cca8bbd..0000000
--- a/sheep/farm/farm.c
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * Copyright (C) 2011 Taobao Inc.
- *
- * Liu Yuan <namei.unix at gmail.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version
- * 2 as published by the Free Software Foundation.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <pthread.h>
-#include <linux/limits.h>
-#include <sys/file.h>
-#include <sys/types.h>
-#include <sys/xattr.h>
-
-#include "farm.h"
-#include "sheep_priv.h"
-#include "sheepdog_proto.h"
-#include "sheep.h"
-
-char farm_obj_dir[PATH_MAX];
-char farm_dir[PATH_MAX];
-
-static int create_directory(const char *p)
-{
- int i, ret = 0;
- struct strbuf buf = STRBUF_INIT;
-
- strbuf_addstr(&buf, p);
- strbuf_addstr(&buf, "/.farm");
- if (xmkdir(buf.buf, 0755) < 0) {
- sd_eprintf("%m");
- ret = -1;
- goto err;
- }
-
- if (!strlen(farm_dir))
- strbuf_copyout(&buf, farm_dir, sizeof(farm_dir));
-
- strbuf_addstr(&buf, "/objects");
- if (xmkdir(buf.buf, 0755) < 0) {
- sd_eprintf("%m");
- ret = -1;
- goto err;
- }
- for (i = 0; i < 256; i++) {
- strbuf_addf(&buf, "/%02x", i);
- if (xmkdir(buf.buf, 0755) < 0) {
- sd_eprintf("%m");
- ret = -1;
- goto err;
- }
- strbuf_remove(&buf, buf.len - 3, 3);
- }
-
- if (!strlen(farm_obj_dir))
- strbuf_copyout(&buf, farm_obj_dir, sizeof(farm_obj_dir));
-err:
- strbuf_release(&buf);
- return ret;
-}
-
-static int get_trunk_sha1(uint32_t epoch, unsigned char *outsha1)
-{
- int i, nr_logs = -1, ret = -1;
- struct snap_log *log_buf, *log_free = NULL;
- void *snap_buf = NULL;
- struct sha1_file_hdr hdr;
-
- log_free = log_buf = snap_log_read(&nr_logs);
- sd_dprintf("%d", nr_logs);
- if (nr_logs < 0)
- goto out;
-
- for (i = 0; i < nr_logs; i++, log_buf++) {
- if (log_buf->epoch != epoch)
- continue;
- snap_buf = snap_file_read(log_buf->sha1, &hdr);
- if (!snap_buf)
- goto out;
- memcpy(outsha1, snap_buf, SHA1_LEN);
- ret = 0;
- break;
- }
-out:
- free(log_free);
- free(snap_buf);
- return ret;
-}
-
-static int farm_init(void)
-{
- sd_dprintf("use farm store driver");
- if (create_directory(obj_path) < 0)
- goto err;
-
- if (!is_xattr_enabled(obj_path)) {
- sd_eprintf("xattrs are not enabled on %s", obj_path);
- goto err;
- }
-
- if (snap_init() < 0)
- goto err;
-
- if (default_init() < 0)
- goto err;
-
- return SD_RES_SUCCESS;
-err:
- return SD_RES_EIO;
-}
-
-static int farm_snapshot(const struct siocb *iocb)
-{
- unsigned char snap_sha1[SHA1_LEN];
- unsigned char trunk_sha1[SHA1_LEN];
- struct sd_node nodes[SD_MAX_NODES];
- int nr_nodes;
- void *buffer;
- int log_nr, ret = SD_RES_EIO, epoch;
-
- buffer = snap_log_read(&log_nr);
- if (!buffer)
- goto out;
-
- epoch = log_nr + 1;
- sd_dprintf("user epoch %d", epoch);
-
- nr_nodes = epoch_log_read(sys->epoch, nodes, sizeof(nodes));
- if (nr_nodes < 0)
- goto out;
-
- if (trunk_file_write(trunk_sha1) < 0)
- goto out;
-
- if (snap_file_write(sys->epoch, nodes, nr_nodes,
- trunk_sha1, snap_sha1) < 0)
- goto out;
-
- if (snap_log_write(epoch, snap_sha1) < 0)
- goto out;
-
- ret = SD_RES_SUCCESS;
-out:
- free(buffer);
- return ret;
-}
-
-static int restore_objects_from_snap(uint32_t epoch)
-{
- struct sha1_file_hdr hdr;
- struct trunk_entry *trunk_buf, *trunk_free = NULL;
- unsigned char trunk_sha1[SHA1_LEN];
- uint64_t nr_trunks, i;
- int ret = SD_RES_EIO;
-
- if (get_trunk_sha1(epoch, trunk_sha1) < 0)
- goto out;
-
- trunk_free = trunk_buf = trunk_file_read(trunk_sha1, &hdr);
- if (!trunk_buf)
- goto out;
-
- nr_trunks = hdr.priv;
- ret = SD_RES_SUCCESS;
- for (i = 0; i < nr_trunks; i++, trunk_buf++) {
- struct sha1_file_hdr h;
- struct siocb io = { 0 };
- uint64_t oid;
- void *buffer = NULL;
-
- oid = trunk_buf->oid;
- buffer = sha1_file_read(trunk_buf->sha1, &h);
- if (!buffer) {
- sd_eprintf("oid %"PRIx64" not restored", oid);
- goto out;
- }
- io.length = h.size;
- io.buf = buffer;
- ret = default_create_and_write(oid, &io);
- if (ret != SD_RES_SUCCESS) {
- sd_eprintf("oid %"PRIx64" not restored", oid);
- goto out;
- } else
- sd_dprintf("oid %"PRIx64" restored", oid);
-
- free(buffer);
- }
-out:
- free(trunk_free);
- return ret;
-}
-
-static int rm_object(uint64_t oid, char *path, void *arg)
-{
- char p[PATH_MAX];
- int ret = SD_RES_SUCCESS;
-
- snprintf(p, sizeof(p), "%s/%"PRIx64, path, oid);
- if (unlink(path) < 0) {
- sd_eprintf("failed to remove cached object %m");
- if (errno == ENOENT)
- return SD_RES_SUCCESS;
- ret = SD_RES_EIO;
- goto out;
- }
-out:
- return ret;
-}
-
-static int farm_restore(const struct siocb *iocb)
-{
- int ret = SD_RES_EIO, epoch = iocb->epoch;
-
- sd_dprintf("try recover user epoch %d", epoch);
-
- /* Remove all the objects of WD and object cache */
- for_each_object_in_wd(rm_object, true, NULL);
- if (sys->enable_object_cache)
- object_cache_format();
-
- ret = restore_objects_from_snap(epoch);
- if (ret != SD_RES_SUCCESS)
- goto out;
-out:
- return ret;
-}
-
-static int farm_get_snap_file(struct siocb *iocb)
-{
- int ret = SD_RES_EIO;
- void *buffer = NULL;
- size_t size;
- int nr;
-
- sd_dprintf("try get snap file");
- buffer = snap_log_read(&nr);
- if (!buffer)
- goto out;
- size = nr * sizeof(struct snap_log);
- memcpy(iocb->buf, buffer, size);
- iocb->length = size;
- ret = SD_RES_SUCCESS;
-out:
- free(buffer);
- return ret;
-}
-
-static struct store_driver farm = {
- .name = "farm",
- .init = farm_init,
- .exist = default_exist,
- .create_and_write = default_create_and_write,
- .write = default_write,
- .read = default_read,
- .link = default_link,
- .update_epoch = default_update_epoch,
- .snapshot = farm_snapshot,
- .cleanup = default_cleanup,
- .restore = farm_restore,
- .get_snap_file = farm_get_snap_file,
- .format = default_format,
- .purge_obj = default_purge_obj,
- .remove_object = default_remove_object,
-};
-
-add_store_driver(farm);
diff --git a/sheep/farm/farm.h b/sheep/farm/farm.h
deleted file mode 100644
index 0fbdf12..0000000
--- a/sheep/farm/farm.h
+++ /dev/null
@@ -1,68 +0,0 @@
-#ifndef FARM_H
-#define FARM_H
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <inttypes.h>
-#include <memory.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <sys/mman.h>
-#include <linux/limits.h>
-
-#include "sheepdog_proto.h"
-#include "sheep.h"
-#include "logger.h"
-#include "strbuf.h"
-#include "sha1.h"
-
-#define HEX_LEN 40
-#define NAME_LEN HEX_LEN
-
-#define TAG_LEN 6
-#define TAG_DATA "data\0\0"
-#define TAG_TRUNK "trunk\0"
-#define TAG_SNAP "snap\0\0"
-
-struct sha1_file_hdr {
- char tag[TAG_LEN];
- uint64_t size;
- uint64_t priv;
- uint64_t reserved;
-};
-
-struct trunk_entry {
- uint64_t oid;
- unsigned char sha1[SHA1_LEN];
-};
-
-/* farm.c */
-extern char farm_dir[PATH_MAX];
-extern char farm_obj_dir[PATH_MAX];
-
-/* sha1_file.c */
-char *sha1_to_path(const unsigned char *sha1);
-int sha1_file_write(unsigned char *buf, unsigned len, unsigned char *);
-void *sha1_file_read(const unsigned char *sha1, struct sha1_file_hdr *);
-char *sha1_to_hex(const unsigned char *sha1);
-int get_sha1_hex(const char *hex, unsigned char *sha1);
-int sha1_file_try_delete(const unsigned char *sha1);
-
-/* trunk.c */
-int trunk_init(void);
-int trunk_file_write(unsigned char *outsha1);
-void *trunk_file_read(unsigned char *sha1, struct sha1_file_hdr *);
-
-/* snap.c */
-int snap_init(void);
-void *snap_file_read(unsigned char *sha1, struct sha1_file_hdr *outhdr);
-int snap_file_write(uint32_t epoch, struct sd_node *nodes, int nr_nodes,
- unsigned char *trunksha1, unsigned char *outsha1);
-int snap_log_truncate(void);
-void *snap_log_read(int *);
-int snap_log_write(uint32_t epoch, unsigned char *sha1);
-
-#endif
diff --git a/sheep/farm/sha1_file.c b/sheep/farm/sha1_file.c
deleted file mode 100644
index 3883d95..0000000
--- a/sheep/farm/sha1_file.c
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright (C) 2011 Taobao Inc.
- *
- * Liu Yuan <namei.unix at gmail.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version
- * 2 as published by the Free Software Foundation.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/*
- * sha1_file provide us some useful features:
- *
- * - Regardless of object type, all objects are all in deflated with zlib,
- * and have a header that not only specifies their tag, but also size
- * information about the data in the object.
- *
- * - the general consistency of an object can always be tested independently
- * of the contents or the type of the object: all objects can be validated
- * by verifying that their hashes match the content of the file.
- */
-#include <sys/types.h>
-#include <sys/xattr.h>
-
-#include "farm.h"
-#include "util.h"
-
-static inline char *get_object_directory(void)
-{
- return farm_obj_dir;
-}
-
-static void fill_sha1_path(char *pathbuf, const unsigned char *sha1)
-{
- int i;
- for (i = 0; i < SHA1_LEN; i++) {
- static const char hex[] = "0123456789abcdef";
- unsigned int val = sha1[i];
- char *pos = pathbuf + i*2 + (i > 0);
- *pos++ = hex[val >> 4];
- *pos = hex[val & 0xf];
- }
-}
-
-char *sha1_to_path(const unsigned char *sha1)
-{
-
- static char buf[PATH_MAX];
- const char *objdir;
- int len;
-
- objdir = get_object_directory();
- len = strlen(objdir);
-
- /* '/' + sha1(2) + '/' + sha1(38) + '\0' */
- memcpy(buf, objdir, len);
- buf[len] = '/';
- buf[len+3] = '/';
- buf[len+42] = '\0';
- fill_sha1_path(buf + len + 1, sha1);
- return buf;
-}
-
-#define CNAME "user.farm.count"
-#define CSIZE sizeof(uint32_t)
-
-static void get_sha1_file(char *name)
-{
- uint32_t count;
- if (getxattr(name, CNAME, &count, CSIZE) < 0) {
- if (errno == ENODATA) {
- count = 1;
- if (setxattr(name, CNAME, &count, CSIZE, 0) < 0)
- panic("%m");
- return;
- } else
- panic("%m");
- }
- count++;
- if (setxattr(name, CNAME, &count, CSIZE, 0) < 0)
- panic("%m");
-}
-
-static int put_sha1_file(char *name)
-{
- uint32_t count;
-
- if (getxattr(name, CNAME, &count, CSIZE) < 0) {
- if (errno == ENOENT) {
- sd_dprintf("sha1 file doesn't exist");
- return -1;
- } else
- panic("%m");
- }
-
- count--;
- if (count == 0) {
- if (unlink(name) < 0) {
- sd_dprintf("%m");
- return -1;
- }
- sd_dprintf("%s deleted", name);
- } else {
- if (setxattr(name, CNAME, &count, CSIZE, 0) < 0)
- panic("%m");
- }
- return 0;
-}
-
-static int sha1_buffer_write(const unsigned char *sha1, void *buf, unsigned int size)
-{
- char *filename = sha1_to_path(sha1);
- int fd, ret = 0, len;
-
- fd = open(filename, O_WRONLY | O_CREAT | O_EXCL, 0666);
- if (fd < 0) {
- if (errno != EEXIST)
- ret = -1;
- goto err_open;
- }
- len = xwrite(fd, buf, size);
- if (len != size) {
- sd_dprintf("%m");
- close(fd);
- return -1;
- }
-
- close(fd);
- get_sha1_file(filename);
-err_open:
- return ret;
-}
-
-int sha1_file_write(unsigned char *buf, unsigned len, unsigned char *outsha1)
-{
- unsigned char sha1[SHA1_LEN];
- struct sha1_ctx c;
-
- sha1_init(&c);
- sha1_update(&c, buf, len);
- sha1_final(&c, sha1);
-
- if (sha1_buffer_write(sha1, buf, len) < 0)
- return -1;
- if (outsha1)
- memcpy(outsha1, sha1, SHA1_LEN);
- return 0;
-}
-
-static void *map_sha1_file(const unsigned char *sha1, unsigned long *size)
-{
- char *filename = sha1_to_path(sha1);
- int fd = open(filename, O_RDONLY);
- struct stat st;
- void *map;
-
- if (fd < 0) {
- perror(filename);
- return NULL;
- }
- if (fstat(fd, &st) < 0) {
- sd_dprintf("%m");
- close(fd);
- return NULL;
- }
- map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
- close(fd);
- if (map == MAP_FAILED) {
- sd_dprintf("%m");
- return NULL;
- }
- *size = st.st_size;
- return map;
-}
-
-static void *unpack_sha1_file(void *map, unsigned long mapsize, struct sha1_file_hdr *hdr)
-{
- int hdr_len;
- char *buf;
-
- memcpy(hdr, map, sizeof(*hdr));
- hdr_len = sizeof(*hdr);
- buf = valloc(hdr->size);
- if (!buf) {
- sd_dprintf("%m");
- return NULL;
- }
-
- memcpy(buf, (char *)map + hdr_len, mapsize - hdr_len);
- return buf;
-}
-
-static int verify_sha1_file(const unsigned char *sha1, void *buf, unsigned long len)
-{
- unsigned char tmp[SHA1_LEN];
- struct sha1_ctx c;
-
- sha1_init(&c);
- sha1_update(&c, buf, len);
- sha1_final(&c, tmp);
-
- if (memcmp((char *)tmp, (char *)sha1, SHA1_LEN) != 0) {
- sd_dprintf("failed, %s != %s", sha1_to_hex(sha1),
- sha1_to_hex(tmp));
- return -1;
- }
- return 0;
-}
-
-void *sha1_file_read(const unsigned char *sha1, struct sha1_file_hdr *hdr)
-{
- unsigned long mapsize;
- void *map, *buf;
-
- map = map_sha1_file(sha1, &mapsize);
- if (map) {
- if (verify_sha1_file(sha1, map, mapsize) < 0)
- return NULL;
- buf = unpack_sha1_file(map, mapsize, hdr);
- munmap(map, mapsize);
- return buf;
- }
- return NULL;
-}
-
-int sha1_file_try_delete(const unsigned char *sha1)
-{
- char *filename = sha1_to_path(sha1);
-
- return put_sha1_file(filename);
-}
-
-static unsigned hexval(char c)
-{
- if (c >= '0' && c <= '9')
- return c - '0';
- if (c >= 'a' && c <= 'f')
- return c - 'a' + 10;
- if (c >= 'A' && c <= 'F')
- return c - 'A' + 10;
- return ~0;
-}
-
-int get_sha1_hex(const char *hex, unsigned char *sha1)
-{
- int i;
- for (i = 0; i < SHA1_LEN; i++) {
- unsigned int val = (hexval(hex[0]) << 4) | hexval(hex[1]);
- if (val & ~0xff)
- return -1;
- *sha1++ = val;
- hex += 2;
- }
- return 0;
-}
-
-char *sha1_to_hex(const unsigned char *sha1)
-{
- static char buffer[50];
- static const char hex[] = "0123456789abcdef";
- char *buf = buffer;
- int i;
-
- for (i = 0; i < SHA1_LEN; i++) {
- unsigned int val = *sha1++;
- *buf++ = hex[val >> 4];
- *buf++ = hex[val & 0xf];
- }
- return buffer;
-}
diff --git a/sheep/farm/snap.c b/sheep/farm/snap.c
deleted file mode 100644
index 0cc18ba..0000000
--- a/sheep/farm/snap.c
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (C) 2011 Taobao Inc.
- *
- * Liu Yuan <namei.unix at gmail.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version
- * 2 as published by the Free Software Foundation.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/*
- * Snap object is the meta data that describes the snapshot, either triggered
- * by recovery logic or end users.
- */
-#include <time.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
-#include "farm.h"
-#include "sheep_priv.h"
-
-int snap_init(void)
-{
- int fd, ret = 0;
- struct strbuf buf = STRBUF_INIT;
-
- strbuf_addstr(&buf, farm_dir);
- strbuf_addf(&buf, "/%s", "user_snap");
-
- fd = open(buf.buf, O_CREAT | O_EXCL, 0666);
- if (fd < 0) {
- if (errno != EEXIST) {
- ret = -1;
- goto out;
- }
- } else
- close(fd);
-
-out:
- strbuf_release(&buf);
- return ret;
-}
-
-int snap_log_write(uint32_t epoch, unsigned char *sha1)
-{
- int fd, ret = -1;
- struct strbuf buf = STRBUF_INIT;
- struct snap_log log = { .epoch = epoch,
- .time = time(NULL) };
-
- memcpy(log.sha1, sha1, SHA1_LEN);
- strbuf_addstr(&buf, farm_dir);
- strbuf_addf(&buf, "/%s", "user_snap");
-
- fd = open(buf.buf, O_WRONLY | O_APPEND);
- if (fd < 0) {
- sd_dprintf("%m");
- goto out;
- }
-
- strbuf_reset(&buf);
- strbuf_add(&buf, &log, sizeof(log));
- ret = xwrite(fd, buf.buf, buf.len);
- if (ret != buf.len)
- ret = -1;
-
- close(fd);
-out:
- strbuf_release(&buf);
- return ret;
-}
-
-void *snap_log_read(int *out_nr)
-{
- struct strbuf buf = STRBUF_INIT;
- struct stat st;
- void *buffer = NULL;
- int len, fd;
-
- strbuf_addstr(&buf, farm_dir);
- strbuf_addf(&buf, "/%s", "user_snap");
-
- fd = open(buf.buf, O_RDONLY);
- if (fd < 0) {
- sd_dprintf("%m");
- goto out;
- }
- if (fstat(fd, &st) < 0) {
- sd_dprintf("%m");
- goto out_close;
- }
-
- len = st.st_size;
- buffer = xmalloc(len);
- len = xread(fd, buffer, len);
- if (len != st.st_size) {
- free(buffer);
- buffer = NULL;
- goto out_close;
- }
- *out_nr = len / sizeof(struct snap_log);
-out_close:
- close(fd);
-out:
- strbuf_release(&buf);
- return buffer;
-}
-
-void *snap_file_read(unsigned char *sha1, struct sha1_file_hdr *outhdr)
-{
- void *buffer = NULL;
-
- sd_dprintf("%s", sha1_to_hex(sha1));
- buffer = sha1_file_read(sha1, outhdr);
- if (!buffer)
- return NULL;
- if (strcmp(outhdr->tag, TAG_SNAP) != 0) {
- free(buffer);
- return NULL;
- }
-
- return buffer;
-}
-
-int snap_file_write(uint32_t epoch, struct sd_node *nodes, int nr_nodes,
- unsigned char *trunksha1, unsigned char *outsha1)
-{
- int ret = 0;
- struct strbuf buf = STRBUF_INIT;
- struct sha1_file_hdr hdr = {};
-
- memcpy(hdr.tag, TAG_SNAP, TAG_LEN);
- hdr.size = nr_nodes * sizeof(*nodes) + SHA1_LEN;
- hdr.priv = epoch;
- hdr.reserved = 0;
-
- strbuf_add(&buf, &hdr, sizeof(hdr));
- strbuf_add(&buf, trunksha1, SHA1_LEN);
- strbuf_add(&buf, (char *)nodes, nr_nodes * sizeof(*nodes));
- if (sha1_file_write((void *)buf.buf, buf.len, outsha1) < 0) {
- ret = -1;
- goto err;
- }
-
- sd_dprintf("epoch: %" PRIu32 ", sha1: %s", epoch, sha1_to_hex(outsha1));
-err:
- strbuf_release(&buf);
- return ret;
-}
diff --git a/sheep/farm/trunk.c b/sheep/farm/trunk.c
deleted file mode 100644
index eaa4193..0000000
--- a/sheep/farm/trunk.c
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (C) 2011 Taobao Inc.
- *
- * Liu Yuan <namei.unix at gmail.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version
- * 2 as published by the Free Software Foundation.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/*
- * Trunk object is meta data that describes the structure of the data objects
- * at the time of snapshot being taken. It ties data objects together into a
- * flat directory structure.
- */
-#include <pthread.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
-#include "farm.h"
-#include "strbuf.h"
-#include "list.h"
-#include "util.h"
-#include "sheepdog_proto.h"
-#include "sheep_priv.h"
-
-static int fill_entry_new_sha1(struct trunk_entry *entry)
-{
- struct strbuf buf = STRBUF_INIT;
- int fd, ret = 0;
- struct sha1_file_hdr hdr = { .priv = 0 };
-
- memcpy(hdr.tag, TAG_DATA, TAG_LEN);
- strbuf_addstr(&buf, get_object_path(entry->oid));
- strbuf_addf(&buf, "/%016" PRIx64, entry->oid);
- fd = open(buf.buf, O_RDONLY);
- if (fd < 0) {
- sd_dprintf("%m, %s", buf.buf);
- ret = -1;
- goto out;
- }
- strbuf_reset(&buf);
- if (!strbuf_read(&buf, fd, SD_DATA_OBJ_SIZE) == SD_DATA_OBJ_SIZE) {
- sd_dprintf("strbuf_read fail to read full");
- ret = -1;
- goto out_close;
- }
- hdr.size = buf.len;
- strbuf_insert(&buf, 0, &hdr, sizeof(hdr));
-
- if (sha1_file_write((void *)buf.buf, buf.len, entry->sha1) < 0) {
- ret = -1;
- goto out_close;
- }
- sd_dprintf("data sha1:%s, %"PRIx64, sha1_to_hex(entry->sha1),
- entry->oid);
-out_close:
- close(fd);
-out:
- strbuf_release(&buf);
- return ret;
-}
-
-static int inc_object_nr(uint64_t oid, char *wd, void *arg)
-{
- uint64_t *object_nr = arg;
-
- (*object_nr)++;
-
- return SD_RES_SUCCESS;
-}
-
-static int init_trunk_entry(uint64_t oid, char *path, void *arg)
-{
- struct trunk_entry entry = {};
- struct strbuf *buf = arg;
-
- entry.oid = oid;
- if (fill_entry_new_sha1(&entry) < 0)
- return SD_RES_UNKNOWN;
-
- strbuf_add(buf, &entry, sizeof(struct trunk_entry));
- return SD_RES_SUCCESS;
-}
-
-int trunk_file_write(unsigned char *outsha1)
-{
- struct strbuf buf;
- struct sha1_file_hdr hdr = {};
- uint64_t data_size, object_nr = 0;
- int ret = 0;
-
- /* Add the hdr first */
- for_each_object_in_wd(inc_object_nr, false, &object_nr);
- if (ret != SD_RES_SUCCESS) {
- ret = -1;
- goto out;
- }
- data_size = sizeof(struct trunk_entry) * object_nr;
- hdr.size = data_size;
- hdr.priv = object_nr;
- memcpy(hdr.tag, TAG_TRUNK, TAG_LEN);
- strbuf_init(&buf, sizeof(hdr) + data_size);
- strbuf_add(&buf, &hdr, sizeof(hdr));
-
- ret = for_each_object_in_wd(init_trunk_entry, false, &buf);
- if (ret != SD_RES_SUCCESS) {
- ret = -1;
- goto out;
- }
-
- if (sha1_file_write((void *)buf.buf, buf.len, outsha1) < 0) {
- ret = -1;
- goto out;
- }
- sd_dprintf("trunk sha1: %s", sha1_to_hex(outsha1));
-out:
- strbuf_release(&buf);
- return ret;
-}
-
-void *trunk_file_read(unsigned char *sha1, struct sha1_file_hdr *outhdr)
-{
- void *buffer;
-
- sd_dprintf("%s", sha1_to_hex(sha1));
- buffer = sha1_file_read(sha1, outhdr);
- if (!buffer)
- return NULL;
- if (strcmp(outhdr->tag, TAG_TRUNK) != 0) {
- free(buffer);
- return NULL;
- }
-
- return buffer;
-}
diff --git a/sheep/ops.c b/sheep/ops.c
index e40fc65..56bcf62 100644
--- a/sheep/ops.c
+++ b/sheep/ops.c
@@ -591,20 +591,6 @@ err:
panic("failed in force recovery");
}
-static int cluster_snapshot(const struct sd_req *req, struct sd_rsp *rsp,
- void *data)
-{
- int ret;
- struct siocb iocb = { 0 };
-
- if (sd_store->snapshot)
- ret = sd_store->snapshot(&iocb);
- else
- ret = SD_RES_NO_SUPPORT;
-
- return ret;
-}
-
static int cluster_cleanup(const struct sd_req *req, struct sd_rsp *rsp,
void *data)
{
@@ -761,33 +747,6 @@ static int local_md_unplug(const struct sd_req *req, struct sd_rsp *rsp,
return md_unplug_disks(disks);
}
-static int cluster_restore(const struct sd_req *req, struct sd_rsp *rsp,
- void *data)
-{
- int ret;
- struct siocb iocb = { .epoch = req->obj.tgt_epoch };
-
- if (sd_store->restore)
- ret = sd_store->restore(&iocb);
- else
- ret = SD_RES_NO_SUPPORT;
- return ret;
-}
-
-static int local_get_snap_file(struct request *req)
-{
- int ret;
- struct siocb iocb = { .buf = req->data };
-
- if (sd_store->get_snap_file) {
- ret = sd_store->get_snap_file(&iocb);
- req->rp.data_length = iocb.length;
- } else
- ret = SD_RES_NO_SUPPORT;
-
- return ret;
-}
-
/* Return SD_RES_INVALID_PARMS to ask client not to send flush req again */
static int local_flush_vdi(struct request *req)
{
@@ -1051,20 +1010,6 @@ static struct sd_op_template sd_ops[] = {
.process_main = cluster_force_recover_main,
},
- [SD_OP_SNAPSHOT] = {
- .name = "SNAPSHOT",
- .type = SD_OP_TYPE_CLUSTER,
- .force = true,
- .process_main = cluster_snapshot,
- },
-
- [SD_OP_RESTORE] = {
- .name = "RESTORE",
- .type = SD_OP_TYPE_CLUSTER,
- .force = true,
- .process_main = cluster_restore,
- },
-
[SD_OP_CLEANUP] = {
.name = "CLEANUP",
.type = SD_OP_TYPE_CLUSTER,
@@ -1177,13 +1122,6 @@ static struct sd_op_template sd_ops[] = {
.process_work = local_get_epoch,
},
- [SD_OP_GET_SNAP_FILE] = {
- .name = "GET_SNAP_FILE",
- .type = SD_OP_TYPE_LOCAL,
- .force = true,
- .process_work = local_get_snap_file,
- },
-
[SD_OP_FLUSH_VDI] = {
.name = "FLUSH_VDI",
.type = SD_OP_TYPE_LOCAL,
diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
index ab2636a..003532a 100644
--- a/sheep/sheep_priv.h
+++ b/sheep/sheep_priv.h
@@ -26,6 +26,9 @@
#include "rbtree.h"
#include "strbuf.h"
+#define HEX_LEN 40
+#define NAME_LEN HEX_LEN
+
struct client_info {
struct connection conn;
@@ -171,10 +174,7 @@ struct store_driver {
int (*update_epoch)(uint32_t epoch);
int (*purge_obj)(void);
/* Operations for snapshot */
- int (*snapshot)(const struct siocb *);
int (*cleanup)(void);
- int (*restore)(const struct siocb *);
- int (*get_snap_file)(struct siocb *);
};
int default_init(void);
diff --git a/sheep/store.c b/sheep/store.c
index 28e2ab7..4bcdaca 100644
--- a/sheep/store.c
+++ b/sheep/store.c
@@ -26,7 +26,6 @@
#include "sheep_priv.h"
#include "strbuf.h"
#include "util.h"
-#include "farm/farm.h"
char *obj_path;
char *epoch_path;
--
1.7.1
More information about the sheepdog
mailing list