[sheepdog] [RFC PATCH 3/3] sheep: introduce journal file to boost IO performance

MORITA Kazutaka morita.kazutaka at gmail.com
Mon Nov 5 08:50:03 CET 2012


At Sat,  3 Nov 2012 23:09:47 +0800,
Liu Yuan wrote:
> diff --git a/include/util.h b/include/util.h
> index 5fb19c2..a0d8186 100644
> --- a/include/util.h
> +++ b/include/util.h
> @@ -38,6 +38,7 @@
>  #endif
>  
>  #define notrace __attribute__((no_instrument_function))
> +#define __packed __attribute((packed))
>  
>  #define uninitialized_var(x) (x = x)
>  
> @@ -68,6 +69,10 @@ static inline void *zalloc(size_t size)
>  	return calloc(1, size);
>  }
>  
> +#define __round_mask(x, y) ((__typeof__(x))((y)-1))
> +#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)

Can I use roundup() which is already defined in util.h?


> diff --git a/sheep/journal_file.c b/sheep/journal_file.c
> new file mode 100644
> index 0000000..110a034
> --- /dev/null
> +++ b/sheep/journal_file.c
> @@ -0,0 +1,386 @@
> +/*
> + * Copyright (C) 2012 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 <errno.h>
> +#include <fcntl.h>
> +#include <sys/stat.h>
> +#include <sys/types.h>
> +#include <unistd.h>
> +#include <pthread.h>
> +#include <stdint.h>
> +#include <sys/mman.h>
> +
> +#include "sheep_priv.h"
> +
> +struct journal_file {
> +	int fd;
> +	off_t pos;
> +	int commit_fd;
> +	uatomic_bool in_commit;
> +};
> +
> +struct journal_descriptor {
> +	uint32_t magic;
> +	uint64_t oid;
> +	uint64_t offset;
> +	uint64_t size;
> +	uint8_t create;
> +	uint8_t pad[479];
> +} __packed;

Though we use a packed attribute here, it looks better to align each
member on an 8-byte boundary so that GCC makes an efficient code.

  struct journal_descriptor {
  	uint32_t magic;
  	uint32_t reserved;
  	uint64_t oid;
  	uint64_t offset;
  	uint64_t size;
  	uint8_t create;
  	uint8_t __pad[475];
  } __packed;

> +
> +/* JOURNAL_DESC + JOURNAL_MARKER must be 512 algined for DIO */
> +#define JOURNAL_DESC_MAGIC 0xfee1900d
> +#define JOURNAL_DESC_SIZE 508
> +#define JOURNAL_MARKER_SIZE 4 /* Use marker to detect partial write */
> +#define JOURNAL_META_SIZE SECTOR_SIZE
> +
> +#define JOURNAL_FILE_SIZE (1024*1024*256) /* 256M */
> +#define JOURNAL_END_MARKER 0xdeadbeef
> +
> +static const char *jfile_name[2] = { "journal_file0", "journal_file1", };
> +static int jfile_fds[2];
> +
> +static struct journal_file jfile;
> +static pthread_spinlock_t jfile_lock;
> +
> +static int zero_out_jfile(int fd)
> +{
> +	char *buf;
> +	ssize_t wlen;
> +
> +	buf = valloc(JOURNAL_FILE_SIZE);
> +	memset(buf, 0, JOURNAL_FILE_SIZE);
> +	wlen = xpwrite(fd, buf, JOURNAL_FILE_SIZE, 0);

Isn't it efficent to use truncate and fallocate like as follows?

    ftruncate(fd, 0);
    prealloc(fd, JOURNAL_FILE_SIZE);


Thanks,

Kazutaka



More information about the sheepdog mailing list