[sheepdog] [PATCH v1 3/3] lib: add cache version of writer and reader
Liu Yuan
namei.unix at gmail.com
Mon Feb 17 08:00:38 CET 2014
On Mon, Feb 17, 2014 at 02:26:27PM +0800, Robin Dong wrote:
> From: Robin Dong <sanbai at taobao.com>
>
> Add new functions to repleace default writer and reader so it can cache
> entire ext-node when set_vid_for_btree() need to access ext-node.
>
> Signed-off-by: Robin Dong <sanbai at taobao.com>
> ---
> lib/sd_inode.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++
> sheep/http/oalloc.c | 4 +--
> 2 files changed, 98 insertions(+), 2 deletions(-)
>
> diff --git a/lib/sd_inode.c b/lib/sd_inode.c
> index 53035b0..809c3e5 100644
> --- a/lib/sd_inode.c
> +++ b/lib/sd_inode.c
> @@ -215,6 +215,92 @@ static void dump_btree(read_node_fn reader, struct sd_inode *inode)
> #endif
> }
>
> +static write_node_fn raw_writer;
> +static read_node_fn raw_reader;
> +
> +#define NUMBER_OF_CACHE 4
Why 4? If no rantionale, then you should comment 'no rantionale'
>
> +struct data_object_cache {
> + uint64_t oid;
> + unsigned char mem[SD_INODE_DATA_INDEX_SIZE];
> +} cache_array[NUMBER_OF_CACHE];
> +static int cache_idx;
> +
> +static void cache_init(void)
> +{
> + cache_idx = 0;
> +}
> +
> +static void cache_writeout(write_node_fn writer, int copies, int policy)
> +{
I think your cache is a transient cache that will be released after range set.
So better name it as cache_release(). And this is a inode cache, so would be
better use a prefix icache instead of a generic name 'cache'.
Does cache of the same inode support concurrent operations from different/same
nodes? comment about it in the source.
> + int i;
> + for (i = 0; i < cache_idx; i++) {
> + writer(cache_array[i].oid, cache_array[i].mem,
> + SD_INODE_DATA_INDEX_SIZE, 0, 0, copies, policy,
> + false, false);
> + }
> +}
> +
> +static void cache_insert(write_node_fn writer, int copies, int policy,
> + uint64_t oid, void *mem)
> +{
> + int i;
> + for (i = 0; i < cache_idx; i++) {
> + if (oid == cache_array[i].oid) {
> + memcpy(cache_array[i].mem, mem,
> + SD_INODE_DATA_INDEX_SIZE);
> + return;
> + }
> + }
> +
> + if (cache_idx == (NUMBER_OF_CACHE - 1)) {
> + sd_info("cache for B-tree is full, so write all out");
> + cache_writeout(writer, copies, policy);
> + cache_init();
> + }
> +
> + /* insert new cache */
> + cache_array[cache_idx].oid = oid;
> + memcpy(cache_array[cache_idx].mem, mem, SD_INODE_DATA_INDEX_SIZE);
> + cache_idx++;
> +}
> +
> +static void *cache_find(uint64_t oid)
> +{
> + int i;
> + for (i = 0; i < cache_idx; i++) {
> + if (cache_array[i].oid == oid)
> + return cache_array[i].mem;
> + }
> + return NULL;
> +}
> +
> +static int writer_c(uint64_t id, void *mem, unsigned int len, uint64_t offset,
> + uint32_t flags, int copies, int copy_policy, bool create,
> + bool direct)
name it explicitly as 'cache_{reader,writer}'
Thanks
Yuan
More information about the sheepdog
mailing list