diff options
author | Xavi Hernandez <xhernandez@redhat.com> | 2018-05-15 11:37:16 +0200 |
---|---|---|
committer | Xavi Hernandez <xhernandez@redhat.com> | 2018-05-23 22:51:37 +0200 |
commit | 676aae1ef168cb7ecad4eecd71b079a5d4995247 (patch) | |
tree | df549c2927746791cc7a5cc803edafa48fac3773 /xlators/cluster/ec/src/ec-common.h | |
parent | 92839c5a4a6c87973e4f6f2f96b359e9c2a0f5c0 (diff) |
cluster/ec: Fix pre-op xattrop management
Multiple pre-op xattrop can be simultaneously being processed. On the cbk
it was checked if the fop was waiting for some specific data (like size and
version) and, if so, it was assumed that this answer should contain that
data.
This is not true, since a fop can be waiting for some data, but it may come
from the xattrop of another fop.
This patch differentiates between needing some information and providing it.
This is related to parallel writes. Disabling them fixed the problem, but
also prevented concurrent reads. A change has been made so that disabling
parallel writes still allows parallel reads.
Fixes: bz#1578325
Change-Id: I74772ad6b80b7b37805da93d5ec3ae099e96b041
Signed-off-by: Xavi Hernandez <xhernandez@redhat.com>
Diffstat (limited to 'xlators/cluster/ec/src/ec-common.h')
-rw-r--r-- | xlators/cluster/ec/src/ec-common.h | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/xlators/cluster/ec/src/ec-common.h b/xlators/cluster/ec/src/ec-common.h index 99e2f0653be..372be52470c 100644 --- a/xlators/cluster/ec/src/ec-common.h +++ b/xlators/cluster/ec/src/ec-common.h @@ -29,9 +29,31 @@ typedef enum { #define EC_FLAG_LOCK_SHARED 0x0001 -#define EC_FLAG_WAITING_XATTROP 0x0001 -#define EC_FLAG_WAITING_DATA_DIRTY 0x0002 -#define EC_FLAG_WAITING_METADATA_DIRTY 0x0004 +enum _ec_xattrop_flags { + EC_FLAG_XATTROP, + EC_FLAG_DATA_DIRTY, + EC_FLAG_METADATA_DIRTY, + + /* Add any new flag here, before EC_FLAG_MAX. The maximum number of + * flags that can be defined is 16. */ + + EC_FLAG_MAX +}; + +/* We keep two sets of flags. One to determine what's really providing the + * currect xattrop and the other to know what the parent fop of the xattrop + * needs to proceed. It might happen that a fop needs some information that + * is being already requested by a previous fop. The two sets are stored + * contiguously. */ + +#define EC_FLAG_NEEDS(_flag) (1 << (_flag)) +#define EC_FLAG_PROVIDES(_flag) (1 << ((_flag) + EC_FLAG_MAX)) + +#define EC_NEEDED_FLAGS(_flags) ((_flags) & ((1 << EC_FLAG_MAX) - 1)) + +#define EC_PROVIDED_FLAGS(_flags) EC_NEEDED_FLAGS((_flags) >> EC_FLAG_MAX) + +#define EC_FLAGS_HAVE(_flags, _flag) (((_flags) & (1 << (_flag))) != 0) #define EC_SELFHEAL_BIT 62 |