[sheepdog] [PATCH v3 2/9] sheep: introduce ledger objects
Liu Yuan
namei.unix at gmail.com
Thu Feb 27 10:53:11 CET 2014
On Sun, Feb 23, 2014 at 02:28:21PM +0900, Hitoshi Mitake wrote:
> This introduces ledger objects, which keeps track of the number of
> outstanding references of each generation. Sheep decrements a
> generational reference count with a gateway request SD_OP_DECREF_OBJ,
> and reclaims objects when there is no generational reference.
>
> Cc: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
> Cc: Valerio Pachera <sirio81 at gmail.com>
> Cc: Alessandro Bolgia <alessandro at extensys.it>
> Signed-off-by: Hitoshi Mitake <mitake.hitoshi at lab.ntt.co.jp>
> ---
> include/internal_proto.h | 2 ++
> include/sheepdog_proto.h | 28 ++++++++++++++-
> sheep/gateway.c | 5 +++
> sheep/ops.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++
> sheep/sheep_priv.h | 5 +++
> sheep/store.c | 25 ++++++++++++++
> 6 files changed, 154 insertions(+), 1 deletion(-)
>
> diff --git a/include/internal_proto.h b/include/internal_proto.h
> index 460264c..8582817 100644
> --- a/include/internal_proto.h
> +++ b/include/internal_proto.h
> @@ -99,6 +99,8 @@
> #define SD_OP_SET_LOGLEVEL 0xBA
> #define SD_OP_NFS_CREATE 0xBB
> #define SD_OP_NFS_DELETE 0xBC
> +#define SD_OP_DECREF_OBJ 0xBD
> +#define SD_OP_DECREF_PEER 0xBE
>
> /* internal flags for hdr.flags, must be above 0x80 */
> #define SD_FLAG_CMD_RECOVERY 0x0080
> diff --git a/include/sheepdog_proto.h b/include/sheepdog_proto.h
> index 39d57aa..a1db359 100644
> --- a/include/sheepdog_proto.h
> +++ b/include/sheepdog_proto.h
> @@ -92,6 +92,7 @@
> #define VMSTATE_BIT (UINT64_C(1) << 62)
> #define VDI_ATTR_BIT (UINT64_C(1) << 61)
> #define VDI_BTREE_BIT (UINT64_C(1) << 60)
> +#define LEDGER_BIT (UINT64_C(1) << 59)
> #define OLD_MAX_DATA_OBJS (1ULL << 20)
> #define MAX_DATA_OBJS (1ULL << 32)
> #define MAX_CHILDREN 1024U
> @@ -111,6 +112,7 @@
> #define SD_INODE_DATA_INDEX_SIZE (sizeof(uint32_t) * SD_INODE_DATA_INDEX)
> #define SD_INODE_HEADER_SIZE offsetof(struct sd_inode, data_vdi_id)
> #define SD_ATTR_OBJ_SIZE (sizeof(struct sheepdog_vdi_attr))
> +#define SD_LEDGER_OBJ_SIZE (UINT64_C(1) << 22)
> #define CURRENT_VDI_ID 0
>
> #define STORE_LEN 16
> @@ -164,6 +166,11 @@ struct sd_req {
> /* others mean true */
> uint8_t copy_policy;
> } vdi_state;
> + struct {
> + uint64_t oid;
> + uint32_t generation;
> + uint32_t count;
> + } ref;
>
> uint32_t __pad[8];
> };
> @@ -401,10 +408,16 @@ static inline bool is_vdi_btree_obj(uint64_t oid)
> return !!(oid & VDI_BTREE_BIT);
> }
>
> +static inline bool is_ledger_object(uint64_t oid)
> +{
> + return !!(oid & LEDGER_BIT);
> +}
> +
> static inline bool is_data_obj(uint64_t oid)
> {
> return !is_vdi_obj(oid) && !is_vmstate_obj(oid) &&
> - !is_vdi_attr_obj(oid) && !is_vdi_btree_obj(oid);
> + !is_vdi_attr_obj(oid) && !is_vdi_btree_obj(oid) &&
> + !is_ledger_object(oid);
> }
>
> static inline size_t count_data_objs(const struct sd_inode *inode)
> @@ -423,6 +436,9 @@ static inline size_t get_objsize(uint64_t oid)
> if (is_vdi_btree_obj(oid))
> return SD_INODE_DATA_INDEX_SIZE;
>
> + if (is_ledger_object(oid))
> + return SD_LEDGER_OBJ_SIZE;
> +
> return SD_DATA_OBJ_SIZE;
> }
>
> @@ -473,4 +489,14 @@ static inline __attribute__((used)) void __sd_proto_build_bug_ons(void)
> BUILD_BUG_ON(sizeof(struct sd_rsp) != SD_RSP_SIZE);
> }
>
> +static inline uint64_t ledger_oid_to_data_oid(uint64_t oid)
> +{
> + return ~LEDGER_BIT & oid;
> +}
> +
> +static inline uint64_t data_oid_to_ledger_oid(uint64_t oid)
> +{
> + return LEDGER_BIT | oid;
> +}
> +
> #endif
> diff --git a/sheep/gateway.c b/sheep/gateway.c
> index f0f716a..bfd3912 100644
> --- a/sheep/gateway.c
> +++ b/sheep/gateway.c
> @@ -648,3 +648,8 @@ int gateway_remove_obj(struct request *req)
> {
> return gateway_forward_request(req);
> }
> +
> +int gateway_decref_object(struct request *req)
> +{
> + return gateway_forward_request(req);
> +}
> diff --git a/sheep/ops.c b/sheep/ops.c
> index cc70c8c..660c021 100644
> --- a/sheep/ops.c
> +++ b/sheep/ops.c
> @@ -1037,6 +1037,83 @@ static inline int local_nfs_delete(struct request *req)
>
> #endif
>
> +int peer_decref_object(struct request *req)
> +{
> + struct sd_req *hdr = &req->rq;
> + int ret;
> + uint32_t epoch = hdr->epoch;
> + uint64_t ledger_oid = hdr->ref.oid;
> + uint64_t data_oid = ledger_oid_to_data_oid(ledger_oid);
> + uint32_t generation = hdr->ref.generation;
> + uint32_t count = hdr->ref.count;
> + uint32_t *ledger = NULL, *zero = xzalloc(SD_LEDGER_OBJ_SIZE);
> + bool exist = false, locked = false;
> + static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
use sd_mutex please
Thanks
Yuan
More information about the sheepdog
mailing list