diff options
author | Krutika Dhananjay <kdhananj@redhat.com> | 2015-09-07 14:57:24 +0530 |
---|---|---|
committer | Pranith Kumar Karampuri <pkarampu@redhat.com> | 2015-09-22 22:51:38 -0700 |
commit | 5ad1add883ee54f83a42f0f6d6ae2c6e3f9a543a (patch) | |
tree | 74b1e7ff76ba333dc477947ebdb59f7ce521c21e /xlators/features/shard/src/shard.h | |
parent | 070d93afe63f377539b56ed646b714bb281bd240 (diff) |
features/shard: Performance improvements in IO path
This is patch 1/2 of the performance improvement work
for sharding in the IO path.
What this patch does:
Since the primary use-case where sharding is targeted -
VM store - is a single-writer workload, instead of
performing lookup on the base file everytime to gather the
size and block count from the backend in reads, writes and
truncate, now the size and block count is also cached and
kept up-to-date after every inode write in the inode ctx.
TO-DO:
Make changes in rename, link, unlink, [f]setattr and [f]stat
to keep the relevant iatt members up-to-date in the inode ctx.
Change-Id: Ica87d020dabc3a3dbccec814b26b01d6a629ff4d
BUG: 1258905
Signed-off-by: Krutika Dhananjay <kdhananj@redhat.com>
Reviewed-on: http://review.gluster.org/12126
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Diffstat (limited to 'xlators/features/shard/src/shard.h')
-rw-r--r-- | xlators/features/shard/src/shard.h | 43 |
1 files changed, 40 insertions, 3 deletions
diff --git a/xlators/features/shard/src/shard.h b/xlators/features/shard/src/shard.h index 8daf2272dd3..ce6952f91fd 100644 --- a/xlators/features/shard/src/shard.h +++ b/xlators/features/shard/src/shard.h @@ -24,6 +24,32 @@ #define SHARD_ROOT_GFID "be318638-e8a0-4c6d-977d-7a937aa84806" #define SHARD_INODE_LRU_LIMIT 4096 +/** + * Bit masks for the valid flag, which is used while updating ctx +**/ +#define SHARD_MASK_BLOCK_SIZE (1 << 0) +#define SHARD_MASK_PROT (1 << 1) +#define SHARD_MASK_NLINK (1 << 2) +#define SHARD_MASK_UID (1 << 3) +#define SHARD_MASK_GID (1 << 4) +#define SHARD_MASK_SIZE (1 << 6) +#define SHARD_MASK_BLOCKS (1 << 7) +#define SHARD_MASK_TIMES (1 << 8) +#define SHARD_MASK_OTHERS (1 << 9) + +#define SHARD_INODE_WRITE_MASK (SHARD_MASK_SIZE | SHARD_MASK_BLOCKS \ + | SHARD_MASK_TIMES) + +#define SHARD_LOOKUP_MASK (SHARD_MASK_PROT | SHARD_MASK_NLINK | SHARD_MASK_UID \ + | SHARD_MASK_GID | SHARD_MASK_TIMES \ + | SHARD_MASK_OTHERS) + +#define SHARD_ALL_MASK (SHARD_MASK_BLOCK_SIZE | SHARD_MASK_PROT \ + | SHARD_MASK_NLINK | SHARD_MASK_UID | SHARD_MASK_GID \ + | SHARD_MASK_SIZE | SHARD_MASK_BLOCKS \ + | SHARD_MASK_TIMES | SHARD_MASK_OTHERS) + + #define get_lowest_block(off, shard_size) ((off) / (shard_size)) #define get_highest_block(off, len, shard_size) \ (((((off)+(len)) == 0)?0:((off)+(len)-1)) / (shard_size)) @@ -130,6 +156,19 @@ } \ } while (0) +#define SHARD_TIME_UPDATE(ctx_sec, ctx_nsec, new_sec, new_nsec) do { \ + if (ctx_sec == new_sec) \ + ctx_nsec = new_nsec = max (new_nsec, ctx_nsec); \ + else if (ctx_sec > new_sec) { \ + new_sec = ctx_sec; \ + new_nsec = ctx_nsec; \ + } else { \ + ctx_sec = new_sec; \ + ctx_nsec = new_nsec; \ + } \ + } while (0) + + typedef struct shard_priv { uint64_t block_size; uuid_t dot_shard_gfid; @@ -199,7 +238,6 @@ typedef struct shard_local { gf_dirent_t entries_head; gf_boolean_t is_set_fsid; gf_boolean_t list_inited; - gf_boolean_t is_write_extending; shard_post_fop_handler_t handler; shard_post_lookup_shards_fop_handler_t pls_fop_handler; shard_post_resolve_fop_handler_t post_res_handler; @@ -213,10 +251,9 @@ typedef struct shard_local { } shard_local_t; typedef struct shard_inode_ctx { - uint32_t rdev; uint64_t block_size; /* The block size with which this inode is sharded */ - mode_t mode; + struct iatt stat; } shard_inode_ctx_t; #endif /* __SHARD_H__ */ |