diff options
author | Pavan Sondur <pavan@gluster.com> | 2010-08-22 14:08:43 +0000 |
---|---|---|
committer | Anand V. Avati <avati@dev.gluster.com> | 2010-08-22 22:27:40 -0700 |
commit | 63f9e2a49573a0b539c0082fd0c08c1b4d4db983 (patch) | |
tree | d697fb49e1a713bf1d83f4d8275857b0f0f1faa4 /xlators/cluster/afr/src/afr.h | |
parent | 37ec7db018979d04d02ae5670b53dbed7a498ba8 (diff) |
cluster/afr: Use 2 phase locking for transactions and self heal.
Signed-off-by: Pavan Vilas Sondur <pavan@gluster.com>
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 960 ()
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=960
Diffstat (limited to 'xlators/cluster/afr/src/afr.h')
-rw-r--r-- | xlators/cluster/afr/src/afr.h | 122 |
1 files changed, 113 insertions, 9 deletions
diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h index ea7b3ba8955..6df8c697ca6 100644 --- a/xlators/cluster/afr/src/afr.h +++ b/xlators/cluster/afr/src/afr.h @@ -73,6 +73,9 @@ typedef struct _afr_private { unsigned int metadata_lock_server_count; unsigned int entry_lock_server_count; + gf_boolean_t inodelk_trace; + gf_boolean_t entrylk_trace; + gf_boolean_t strict_readdir; unsigned int wait_count; /* # of servers to wait for success */ @@ -134,7 +137,7 @@ typedef struct { int active_source; int active_sinks; int *success; - int *locked_nodes; + unsigned char *locked_nodes; int lock_count; mode_t impunging_entry_mode; @@ -173,6 +176,32 @@ typedef enum { AFR_FLUSH_TRANSACTION, /* flush */ } afr_transaction_type; +typedef enum { + AFR_TRANSACTION_LK, + AFR_SELFHEAL_LK, +} transaction_lk_type_t; + +typedef enum { + AFR_LOCK_OP, + AFR_UNLOCK_OP, +} afr_lock_op_type_t; + +typedef enum { + AFR_DATA_SELF_HEAL_LK, + AFR_METADATA_SELF_HEAL_LK, + AFR_ENTRY_SELF_HEAL_LK, +}selfheal_lk_type_t; + +typedef enum { + AFR_INODELK_TRANSACTION, + AFR_INODELK_NB_TRANSACTION, + AFR_ENTRYLK_TRANSACTION, + AFR_ENTRYLK_NB_TRANSACTION, + AFR_INODELK_SELFHEAL, + AFR_INODELK_NB_SELFHEAL, + AFR_ENTRYLK_SELFHEAL, + AFR_ENTRYLK_NB_SELFHEAL, +} afr_lock_call_type_t; /* xattr format: trusted.afr.volume = [x y z] @@ -207,6 +236,37 @@ typedef enum { AFR_CHILD_DOWN_FLUSH, } afr_flush_type; +typedef struct { + loc_t *lk_loc; + struct flock lk_flock; + + const char *lk_basename; + const char *lower_basename; + const char *higher_basename; + char lower_locked; + char higher_locked; + + unsigned char *locked_nodes; + unsigned char *lower_locked_nodes; + unsigned char *inode_locked_nodes; + unsigned char *entry_locked_nodes; + + selfheal_lk_type_t selfheal_lk_type; + transaction_lk_type_t transaction_lk_type; + + int32_t lock_count; + int32_t inodelk_lock_count; + int32_t entrylk_lock_count; + + uint64_t lock_number; + int32_t lk_call_count; + + int32_t lock_op_ret; + int32_t lock_op_errno; + + int (*lock_cbk) (call_frame_t *, xlator_t *); + +} afr_internal_lock_t; typedef struct _afr_local { unsigned int call_count; @@ -244,6 +304,8 @@ typedef struct _afr_local { int32_t inodelk_count; int32_t entrylk_count; + afr_internal_lock_t internal_lock; + dict_t *dict; int (*up_down_flush_cbk) (call_frame_t *, xlator_t *); @@ -513,9 +575,6 @@ typedef struct _afr_local { struct { off_t start, len; - unsigned char *locked_nodes; - int lock_count; - char *basename; char *new_basename; @@ -597,6 +656,29 @@ afr_notify (xlator_t *this, int32_t event, void afr_set_lk_owner (call_frame_t *frame, xlator_t *this); +int +afr_set_lock_number (call_frame_t *frame, xlator_t *this); + + +loc_t * +lower_path (loc_t *l1, const char *b1, loc_t *l2, const char *b2); + +int32_t +afr_unlock (call_frame_t *frame, xlator_t *this); + +int +afr_nonblocking_entrylk (call_frame_t *frame, xlator_t *this); + +int +afr_nonblocking_inodelk (call_frame_t *frame, xlator_t *this); + +int +afr_blocking_lock (call_frame_t *frame, xlator_t *this); + +int +afr_internal_lock_finish (call_frame_t *frame, xlator_t *this); + + int pump_start (call_frame_t *frame, xlator_t *this); int @@ -716,6 +798,10 @@ AFR_LOCAL_INIT (afr_local_t *local, afr_private_t *priv) local->op_ret = -1; local->op_errno = EUCLEAN; + local->internal_lock.lock_op_ret = -1; + local->internal_lock.lock_op_errno = EUCLEAN; + + return 0; } @@ -764,7 +850,7 @@ afr_transaction_local_init (afr_local_t *local, afr_private_t *priv) local->pending = GF_CALLOC (sizeof (*local->pending), priv->child_count, gf_afr_mt_int32_t); - + if (!local->pending) { return -ENOMEM; } @@ -776,15 +862,33 @@ afr_transaction_local_init (afr_local_t *local, afr_private_t *priv) if (!local->pending[i]) return -ENOMEM; } - - local->transaction.locked_nodes = GF_CALLOC (sizeof (*local->transaction.locked_nodes), - priv->child_count, - gf_afr_mt_char); + + local->internal_lock.inode_locked_nodes = + GF_CALLOC (sizeof (*local->internal_lock.inode_locked_nodes), + priv->child_count, + gf_afr_mt_char); + + local->internal_lock.entry_locked_nodes = + GF_CALLOC (sizeof (*local->internal_lock.entry_locked_nodes), + priv->child_count, + gf_afr_mt_char); + + local->internal_lock.locked_nodes = + GF_CALLOC (sizeof (*local->internal_lock.locked_nodes), + priv->child_count, + gf_afr_mt_char); + + local->internal_lock.lower_locked_nodes + = GF_CALLOC (sizeof (*local->internal_lock.lower_locked_nodes), + priv->child_count, + gf_afr_mt_char); local->transaction.child_errno = GF_CALLOC (sizeof (*local->transaction.child_errno), priv->child_count, gf_afr_mt_int32_t); + local->internal_lock.transaction_lk_type = AFR_TRANSACTION_LK; + return 0; } |