|
|
d1681e |
From 6c176a6f9743ab0518619f784a1fc5ac9562b991 Mon Sep 17 00:00:00 2001
|
|
|
d1681e |
From: Pranith Kumar K <pkarampu@redhat.com>
|
|
|
d1681e |
Date: Tue, 18 Jul 2017 18:39:01 +0530
|
|
|
d1681e |
Subject: [PATCH 076/128] cluster/ec: Handle parallel get_size_version
|
|
|
d1681e |
|
|
|
d1681e |
upstream patch: https://review.gluster.org/#/c/17820/
|
|
|
d1681e |
|
|
|
d1681e |
>Updates #251
|
|
|
d1681e |
>Change-Id: I6244014dbc90af3239d63d75a064ae22ec12a054
|
|
|
d1681e |
>Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
|
|
|
d1681e |
|
|
|
d1681e |
BUG: 1459101
|
|
|
d1681e |
Change-Id: I6244014dbc90af3239d63d75a064ae22ec12a054
|
|
|
d1681e |
Signed-off-by: Sunil Kumar Acharya <sheggodu@redhat.com>
|
|
|
d1681e |
Reviewed-on: https://code.engineering.redhat.com/gerrit/123551
|
|
|
d1681e |
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
|
|
d1681e |
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
|
|
|
d1681e |
Reviewed-by: Ashish Pandey <aspandey@redhat.com>
|
|
|
d1681e |
---
|
|
|
d1681e |
xlators/cluster/ec/src/ec-common.c | 151 +++++++++++++++++++++++--------------
|
|
|
d1681e |
xlators/cluster/ec/src/ec-common.h | 8 +-
|
|
|
d1681e |
xlators/cluster/ec/src/ec-types.h | 3 +-
|
|
|
d1681e |
3 files changed, 103 insertions(+), 59 deletions(-)
|
|
|
d1681e |
|
|
|
d1681e |
diff --git a/xlators/cluster/ec/src/ec-common.c b/xlators/cluster/ec/src/ec-common.c
|
|
|
d1681e |
index 732d422..6963907 100644
|
|
|
d1681e |
--- a/xlators/cluster/ec/src/ec-common.c
|
|
|
d1681e |
+++ b/xlators/cluster/ec/src/ec-common.c
|
|
|
d1681e |
@@ -21,6 +21,10 @@
|
|
|
d1681e |
#include "ec.h"
|
|
|
d1681e |
#include "ec-messages.h"
|
|
|
d1681e |
|
|
|
d1681e |
+#define EC_XATTROP_ALL_WAITING_FLAGS (EC_FLAG_WAITING_XATTROP |\
|
|
|
d1681e |
+ EC_FLAG_WAITING_DATA_DIRTY |\
|
|
|
d1681e |
+ EC_FLAG_WAITING_METADATA_DIRTY)
|
|
|
d1681e |
+
|
|
|
d1681e |
uint32_t
|
|
|
d1681e |
ec_select_first_by_read_policy (ec_t *ec, ec_fop_data_t *fop)
|
|
|
d1681e |
{
|
|
|
d1681e |
@@ -882,11 +886,11 @@ void ec_lock_prepare_fd(ec_fop_data_t *fop, fd_t *fd, uint32_t flags)
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
gf_boolean_t
|
|
|
d1681e |
-ec_config_check (ec_fop_data_t *fop, ec_config_t *config)
|
|
|
d1681e |
+ec_config_check (xlator_t *xl, ec_config_t *config)
|
|
|
d1681e |
{
|
|
|
d1681e |
ec_t *ec;
|
|
|
d1681e |
|
|
|
d1681e |
- ec = fop->xl->private;
|
|
|
d1681e |
+ ec = xl->private;
|
|
|
d1681e |
if ((config->version != EC_CONFIG_VERSION) ||
|
|
|
d1681e |
(config->algorithm != EC_CONFIG_ALGORITHM) ||
|
|
|
d1681e |
(config->gf_word_size != EC_GF_BITS) ||
|
|
|
d1681e |
@@ -911,11 +915,11 @@ ec_config_check (ec_fop_data_t *fop, ec_config_t *config)
|
|
|
d1681e |
!ec_is_power_of_2(config->gf_word_size) ||
|
|
|
d1681e |
((config->chunk_size * 8) % (config->gf_word_size * data_bricks)
|
|
|
d1681e |
!= 0)) {
|
|
|
d1681e |
- gf_msg (fop->xl->name, GF_LOG_ERROR, EINVAL,
|
|
|
d1681e |
+ gf_msg (xl->name, GF_LOG_ERROR, EINVAL,
|
|
|
d1681e |
EC_MSG_INVALID_CONFIG,
|
|
|
d1681e |
"Invalid or corrupted config");
|
|
|
d1681e |
} else {
|
|
|
d1681e |
- gf_msg (fop->xl->name, GF_LOG_ERROR, EINVAL,
|
|
|
d1681e |
+ gf_msg (xl->name, GF_LOG_ERROR, EINVAL,
|
|
|
d1681e |
EC_MSG_INVALID_CONFIG,
|
|
|
d1681e |
"Unsupported config "
|
|
|
d1681e |
"(V=%u, A=%u, W=%u, "
|
|
|
d1681e |
@@ -962,24 +966,28 @@ ec_prepare_update_cbk (call_frame_t *frame, void *cookie,
|
|
|
d1681e |
{
|
|
|
d1681e |
struct list_head list;
|
|
|
d1681e |
ec_fop_data_t *fop = cookie, *parent, *tmp;
|
|
|
d1681e |
- ec_lock_link_t *link = fop->data;
|
|
|
d1681e |
+ ec_lock_link_t *parent_link = fop->data;
|
|
|
d1681e |
+ ec_lock_link_t *link = NULL;
|
|
|
d1681e |
ec_lock_t *lock = NULL;
|
|
|
d1681e |
ec_inode_t *ctx;
|
|
|
d1681e |
gf_boolean_t release = _gf_false;
|
|
|
d1681e |
+ uint64_t waiting_flags = 0;
|
|
|
d1681e |
+ uint64_t dirty[EC_VERSION_SIZE] = {0, 0};
|
|
|
d1681e |
|
|
|
d1681e |
- lock = link->lock;
|
|
|
d1681e |
- parent = link->fop;
|
|
|
d1681e |
+ lock = parent_link->lock;
|
|
|
d1681e |
+ parent = parent_link->fop;
|
|
|
d1681e |
ctx = lock->ctx;
|
|
|
d1681e |
|
|
|
d1681e |
INIT_LIST_HEAD(&list);
|
|
|
d1681e |
+ waiting_flags = parent_link->waiting_flags & EC_XATTROP_ALL_WAITING_FLAGS;
|
|
|
d1681e |
|
|
|
d1681e |
LOCK(&lock->loc.inode->lock);
|
|
|
d1681e |
|
|
|
d1681e |
list_for_each_entry(link, &lock->owners, owner_list) {
|
|
|
d1681e |
- if ((link->fop->flags & EC_FLAG_WAITING_XATTROP) != 0) {
|
|
|
d1681e |
- link->fop->flags ^= EC_FLAG_WAITING_XATTROP;
|
|
|
d1681e |
-
|
|
|
d1681e |
- list_add_tail(&link->fop->cbk_list, &list);
|
|
|
d1681e |
+ if ((link->waiting_flags & waiting_flags) != 0) {
|
|
|
d1681e |
+ link->waiting_flags ^= (link->waiting_flags & waiting_flags);
|
|
|
d1681e |
+ if ((link->waiting_flags & EC_XATTROP_ALL_WAITING_FLAGS) == 0)
|
|
|
d1681e |
+ list_add_tail(&link->fop->cbk_list, &list);
|
|
|
d1681e |
}
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
@@ -991,8 +999,7 @@ ec_prepare_update_cbk (call_frame_t *frame, void *cookie,
|
|
|
d1681e |
goto unlock;
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
- if (parent->flags & EC_FLAG_QUERY_METADATA) {
|
|
|
d1681e |
- parent->flags ^= EC_FLAG_QUERY_METADATA;
|
|
|
d1681e |
+ if (waiting_flags & EC_FLAG_WAITING_XATTROP) {
|
|
|
d1681e |
op_errno = -ec_dict_del_array(dict, EC_XATTR_VERSION,
|
|
|
d1681e |
ctx->pre_version,
|
|
|
d1681e |
EC_VERSION_SIZE);
|
|
|
d1681e |
@@ -1036,7 +1043,7 @@ ec_prepare_update_cbk (call_frame_t *frame, void *cookie,
|
|
|
d1681e |
goto unlock;
|
|
|
d1681e |
}
|
|
|
d1681e |
} else {
|
|
|
d1681e |
- if (!ec_config_check(parent, &ctx->config)) {
|
|
|
d1681e |
+ if (!ec_config_check(parent->xl, &ctx->config)) {
|
|
|
d1681e |
gf_msg (this->name, GF_LOG_ERROR, EINVAL,
|
|
|
d1681e |
EC_MSG_CONFIG_XATTR_INVALID,
|
|
|
d1681e |
"Invalid config xattr");
|
|
|
d1681e |
@@ -1051,12 +1058,22 @@ ec_prepare_update_cbk (call_frame_t *frame, void *cookie,
|
|
|
d1681e |
ctx->have_info = _gf_true;
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
- ec_set_dirty_flag (fop->data, ctx, ctx->dirty);
|
|
|
d1681e |
+ ec_set_dirty_flag (fop->data, ctx, dirty);
|
|
|
d1681e |
+ if (dirty[EC_METADATA_TXN] &&
|
|
|
d1681e |
+ (waiting_flags & EC_FLAG_WAITING_METADATA_DIRTY)) {
|
|
|
d1681e |
+ GF_ASSERT (!ctx->dirty[EC_METADATA_TXN]);
|
|
|
d1681e |
+ ctx->dirty[EC_METADATA_TXN] = 1;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+
|
|
|
d1681e |
+ if (dirty[EC_DATA_TXN] &&
|
|
|
d1681e |
+ (waiting_flags & EC_FLAG_WAITING_DATA_DIRTY)) {
|
|
|
d1681e |
+ GF_ASSERT (!ctx->dirty[EC_DATA_TXN]);
|
|
|
d1681e |
+ ctx->dirty[EC_DATA_TXN] = 1;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
op_errno = 0;
|
|
|
d1681e |
unlock:
|
|
|
d1681e |
- lock->getting_xattr = _gf_false;
|
|
|
d1681e |
|
|
|
d1681e |
- UNLOCK(&lock->loc.inode->lock);
|
|
|
d1681e |
+ lock->waiting_flags ^= waiting_flags;
|
|
|
d1681e |
|
|
|
d1681e |
if (op_errno == 0) {
|
|
|
d1681e |
/* If the fop fails on any of the good bricks, it is important to mark
|
|
|
d1681e |
@@ -1066,33 +1083,24 @@ unlock:
|
|
|
d1681e |
release = _gf_true;
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
- /* lock->release is a critical field that is checked and modified most
|
|
|
d1681e |
- * of the time inside a locked region. This use here is safe because we
|
|
|
d1681e |
- * are in a modifying fop and we currently don't allow two modifying
|
|
|
d1681e |
- * fops to be processed concurrently, so no one else could be checking
|
|
|
d1681e |
- * or modifying it.*/
|
|
|
d1681e |
- if (link->update[0] && !link->dirty[0]) {
|
|
|
d1681e |
+ if (parent_link->update[0] && !parent_link->dirty[0]) {
|
|
|
d1681e |
lock->release |= release;
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
- if (link->update[1] && !link->dirty[1]) {
|
|
|
d1681e |
+ if (parent_link->update[1] && !parent_link->dirty[1]) {
|
|
|
d1681e |
lock->release |= release;
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
/* We don't allow the main fop to be executed on bricks that have not
|
|
|
d1681e |
* succeeded the initial xattrop. */
|
|
|
d1681e |
- parent->mask &= fop->good;
|
|
|
d1681e |
ec_lock_update_good (lock, fop);
|
|
|
d1681e |
|
|
|
d1681e |
/*As of now only data healing marks bricks as healing*/
|
|
|
d1681e |
lock->healing |= fop->healing;
|
|
|
d1681e |
- if (ec_is_data_fop (parent->id)) {
|
|
|
d1681e |
- parent->healing |= fop->healing;
|
|
|
d1681e |
- }
|
|
|
d1681e |
- } else {
|
|
|
d1681e |
- ec_fop_set_error(parent, op_errno);
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
+ UNLOCK(&lock->loc.inode->lock);
|
|
|
d1681e |
+
|
|
|
d1681e |
while (!list_empty(&list)) {
|
|
|
d1681e |
tmp = list_entry(list.next, ec_fop_data_t, cbk_list);
|
|
|
d1681e |
list_del_init(&tmp->cbk_list);
|
|
|
d1681e |
@@ -1104,16 +1112,50 @@ unlock:
|
|
|
d1681e |
if (ec_is_data_fop (tmp->id)) {
|
|
|
d1681e |
tmp->healing |= fop->healing;
|
|
|
d1681e |
}
|
|
|
d1681e |
- } else {
|
|
|
d1681e |
- ec_fop_set_error(tmp, op_errno);
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
- ec_resume(tmp, 0);
|
|
|
d1681e |
+ ec_resume(tmp, op_errno);
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
return 0;
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
+static uint64_t
|
|
|
d1681e |
+ec_set_xattrop_flags_and_params (ec_lock_t *lock, ec_lock_link_t *link,
|
|
|
d1681e |
+ uint64_t *dirty)
|
|
|
d1681e |
+{
|
|
|
d1681e |
+ uint64_t oldflags = 0;
|
|
|
d1681e |
+ uint64_t newflags = 0;
|
|
|
d1681e |
+ ec_inode_t *ctx = lock->ctx;
|
|
|
d1681e |
+
|
|
|
d1681e |
+ oldflags = lock->waiting_flags & EC_XATTROP_ALL_WAITING_FLAGS;
|
|
|
d1681e |
+
|
|
|
d1681e |
+ if (lock->query && !ctx->have_info) {
|
|
|
d1681e |
+ lock->waiting_flags |= EC_FLAG_WAITING_XATTROP;
|
|
|
d1681e |
+ link->waiting_flags |= EC_FLAG_WAITING_XATTROP;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+
|
|
|
d1681e |
+ if (dirty[EC_DATA_TXN]) {
|
|
|
d1681e |
+ if (oldflags & EC_FLAG_WAITING_DATA_DIRTY) {
|
|
|
d1681e |
+ dirty[EC_DATA_TXN] = 0;
|
|
|
d1681e |
+ } else {
|
|
|
d1681e |
+ lock->waiting_flags |= EC_FLAG_WAITING_DATA_DIRTY;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+ link->waiting_flags |= EC_FLAG_WAITING_DATA_DIRTY;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+
|
|
|
d1681e |
+ if (dirty[EC_METADATA_TXN]) {
|
|
|
d1681e |
+ if (oldflags & EC_FLAG_WAITING_METADATA_DIRTY) {
|
|
|
d1681e |
+ dirty[EC_METADATA_TXN] = 0;
|
|
|
d1681e |
+ } else {
|
|
|
d1681e |
+ lock->waiting_flags |= EC_FLAG_WAITING_METADATA_DIRTY;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+ link->waiting_flags |= EC_FLAG_WAITING_METADATA_DIRTY;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+ newflags = lock->waiting_flags & EC_XATTROP_ALL_WAITING_FLAGS;
|
|
|
d1681e |
+ return oldflags ^ newflags;
|
|
|
d1681e |
+}
|
|
|
d1681e |
+
|
|
|
d1681e |
void ec_get_size_version(ec_lock_link_t *link)
|
|
|
d1681e |
{
|
|
|
d1681e |
loc_t loc;
|
|
|
d1681e |
@@ -1124,7 +1166,6 @@ void ec_get_size_version(ec_lock_link_t *link)
|
|
|
d1681e |
dict_t *xdata = NULL;
|
|
|
d1681e |
ec_t *ec = NULL;
|
|
|
d1681e |
int32_t error = 0;
|
|
|
d1681e |
- gf_boolean_t getting_xattr;
|
|
|
d1681e |
gf_boolean_t set_dirty = _gf_false;
|
|
|
d1681e |
uint64_t allzero[EC_VERSION_SIZE] = {0, 0};
|
|
|
d1681e |
uint64_t dirty[EC_VERSION_SIZE] = {0, 0};
|
|
|
d1681e |
@@ -1132,6 +1173,7 @@ void ec_get_size_version(ec_lock_link_t *link)
|
|
|
d1681e |
ctx = lock->ctx;
|
|
|
d1681e |
fop = link->fop;
|
|
|
d1681e |
ec = fop->xl->private;
|
|
|
d1681e |
+ uint64_t changed_flags = 0;
|
|
|
d1681e |
|
|
|
d1681e |
if (ec->optimistic_changelog &&
|
|
|
d1681e |
!(ec->node_mask & ~link->lock->good_mask) && !ec_is_data_fop (fop->id))
|
|
|
d1681e |
@@ -1159,19 +1201,20 @@ void ec_get_size_version(ec_lock_link_t *link)
|
|
|
d1681e |
|
|
|
d1681e |
LOCK(&lock->loc.inode->lock);
|
|
|
d1681e |
|
|
|
d1681e |
- getting_xattr = lock->getting_xattr;
|
|
|
d1681e |
- lock->getting_xattr = _gf_true;
|
|
|
d1681e |
- if (getting_xattr) {
|
|
|
d1681e |
- fop->flags |= EC_FLAG_WAITING_XATTROP;
|
|
|
d1681e |
-
|
|
|
d1681e |
- ec_sleep(fop);
|
|
|
d1681e |
+ changed_flags = ec_set_xattrop_flags_and_params (lock, link, dirty);
|
|
|
d1681e |
+ if (link->waiting_flags) {
|
|
|
d1681e |
+ /* This fop needs to wait until all its flags are cleared which
|
|
|
d1681e |
+ * potentially can be cleared by other xattrops that are already
|
|
|
d1681e |
+ * wound*/
|
|
|
d1681e |
+ ec_sleep(fop);
|
|
|
d1681e |
+ } else {
|
|
|
d1681e |
+ GF_ASSERT (!changed_flags);
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
UNLOCK(&lock->loc.inode->lock);
|
|
|
d1681e |
|
|
|
d1681e |
- if (getting_xattr) {
|
|
|
d1681e |
+ if (!changed_flags)
|
|
|
d1681e |
goto out;
|
|
|
d1681e |
- }
|
|
|
d1681e |
|
|
|
d1681e |
dict = dict_new();
|
|
|
d1681e |
if (dict == NULL) {
|
|
|
d1681e |
@@ -1179,17 +1222,7 @@ void ec_get_size_version(ec_lock_link_t *link)
|
|
|
d1681e |
goto out;
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
- if (lock->loc.inode->ia_type == IA_IFREG ||
|
|
|
d1681e |
- lock->loc.inode->ia_type == IA_INVAL) {
|
|
|
d1681e |
- xdata = dict_new();
|
|
|
d1681e |
- if (xdata == NULL || dict_set_int32 (xdata, GF_GET_SIZE, 1)) {
|
|
|
d1681e |
- error = -ENOMEM;
|
|
|
d1681e |
- goto out;
|
|
|
d1681e |
- }
|
|
|
d1681e |
- }
|
|
|
d1681e |
-
|
|
|
d1681e |
- if (lock->query && !ctx->have_info) {
|
|
|
d1681e |
- fop->flags |= EC_FLAG_QUERY_METADATA;
|
|
|
d1681e |
+ if (changed_flags & EC_FLAG_WAITING_XATTROP) {
|
|
|
d1681e |
/* Once we know that an xattrop will be needed,
|
|
|
d1681e |
* we try to get all available information in a
|
|
|
d1681e |
* single call. */
|
|
|
d1681e |
@@ -1208,9 +1241,17 @@ void ec_get_size_version(ec_lock_link_t *link)
|
|
|
d1681e |
if (error != 0) {
|
|
|
d1681e |
goto out;
|
|
|
d1681e |
}
|
|
|
d1681e |
+
|
|
|
d1681e |
+ xdata = dict_new();
|
|
|
d1681e |
+ if (xdata == NULL || dict_set_int32 (xdata, GF_GET_SIZE, 1)) {
|
|
|
d1681e |
+ error = -ENOMEM;
|
|
|
d1681e |
+ goto out;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+
|
|
|
d1681e |
}
|
|
|
d1681e |
}
|
|
|
d1681e |
- if (set_dirty) {
|
|
|
d1681e |
+
|
|
|
d1681e |
+ if (memcmp (allzero, dirty, sizeof (allzero))) {
|
|
|
d1681e |
error = ec_dict_set_array(dict, EC_XATTR_DIRTY, dirty,
|
|
|
d1681e |
EC_VERSION_SIZE);
|
|
|
d1681e |
if (error != 0) {
|
|
|
d1681e |
@@ -1943,7 +1984,7 @@ int32_t ec_update_size_version_done(call_frame_t * frame, void * cookie,
|
|
|
d1681e |
ctx->have_size = _gf_true;
|
|
|
d1681e |
}
|
|
|
d1681e |
if ((ec_dict_del_config(xdata, EC_XATTR_CONFIG, &ctx->config) == 0) &&
|
|
|
d1681e |
- ec_config_check(fop->parent, &ctx->config)) {
|
|
|
d1681e |
+ ec_config_check(fop->xl, &ctx->config)) {
|
|
|
d1681e |
ctx->have_config = _gf_true;
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
diff --git a/xlators/cluster/ec/src/ec-common.h b/xlators/cluster/ec/src/ec-common.h
|
|
|
d1681e |
index a03a590..8f5d20a 100644
|
|
|
d1681e |
--- a/xlators/cluster/ec/src/ec-common.h
|
|
|
d1681e |
+++ b/xlators/cluster/ec/src/ec-common.h
|
|
|
d1681e |
@@ -27,9 +27,11 @@ typedef enum {
|
|
|
d1681e |
|
|
|
d1681e |
#define EC_CONFIG_ALGORITHM 0
|
|
|
d1681e |
|
|
|
d1681e |
-#define EC_FLAG_LOCK_SHARED 0x0001
|
|
|
d1681e |
-#define EC_FLAG_WAITING_XATTROP 0x0002
|
|
|
d1681e |
-#define EC_FLAG_QUERY_METADATA 0x0004
|
|
|
d1681e |
+#define EC_FLAG_LOCK_SHARED 0x0001
|
|
|
d1681e |
+
|
|
|
d1681e |
+#define EC_FLAG_WAITING_XATTROP 0x0001
|
|
|
d1681e |
+#define EC_FLAG_WAITING_DATA_DIRTY 0x0002
|
|
|
d1681e |
+#define EC_FLAG_WAITING_METADATA_DIRTY 0x0004
|
|
|
d1681e |
|
|
|
d1681e |
#define EC_SELFHEAL_BIT 62
|
|
|
d1681e |
|
|
|
d1681e |
diff --git a/xlators/cluster/ec/src/ec-types.h b/xlators/cluster/ec/src/ec-types.h
|
|
|
d1681e |
index 3e93a1a..5601f96 100644
|
|
|
d1681e |
--- a/xlators/cluster/ec/src/ec-types.h
|
|
|
d1681e |
+++ b/xlators/cluster/ec/src/ec-types.h
|
|
|
d1681e |
@@ -227,8 +227,8 @@ struct _ec_lock {
|
|
|
d1681e |
uintptr_t healing;
|
|
|
d1681e |
uint32_t refs_owners; /* Refs for fops owning the lock */
|
|
|
d1681e |
uint32_t refs_pending; /* Refs assigned to fops being prepared */
|
|
|
d1681e |
+ uint32_t waiting_flags; /*Track xattrop/dirty marking*/
|
|
|
d1681e |
gf_boolean_t acquired;
|
|
|
d1681e |
- gf_boolean_t getting_xattr;
|
|
|
d1681e |
gf_boolean_t unlock_now;
|
|
|
d1681e |
gf_boolean_t release;
|
|
|
d1681e |
gf_boolean_t query;
|
|
|
d1681e |
@@ -250,6 +250,7 @@ struct _ec_lock_link {
|
|
|
d1681e |
gf_boolean_t optimistic_changelog;
|
|
|
d1681e |
loc_t *base;
|
|
|
d1681e |
uint64_t size;
|
|
|
d1681e |
+ uint32_t waiting_flags;
|
|
|
d1681e |
};
|
|
|
d1681e |
|
|
|
d1681e |
struct _ec_fop_data {
|
|
|
d1681e |
--
|
|
|
d1681e |
1.8.3.1
|
|
|
d1681e |
|