[Bugs] [Bug 1471031] dht_(f)xattrop does not implement migration checks
bugzilla at redhat.com
bugzilla at redhat.com
Mon Dec 4 06:04:04 UTC 2017
https://bugzilla.redhat.com/show_bug.cgi?id=1471031
Nithya Balachandran <nbalacha at redhat.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |kdhananj at redhat.com
Flags| |needinfo?(kdhananj at redhat.c
| |om)
--- Comment #5 from Nithya Balachandran <nbalacha at redhat.com> ---
We may run into issues with dht_migrate_file and xattrops sent by the shard
xlator where ,as the xattrop is an ADD operation, so this the wrong value could
end up being set.
file = data file
file' = linkto file
Time Source Target
-----------------------------------------------------------------------
t0 file file'
(shard.size = x1)
t1 file (listxattr) file'
(shard.size = x1)
t2 file file' (setxattr)
shard.size=x1 shard.size=x1
t3 file (xattrop (ADD)) file'
shard.size = x2 (shard.size = x1)
[operation not performed on the target as this is not marked PHASE1 yet]
Now, a write + xattrop is performed after the S+T bits have been set.
t4 file (S+T) (xattrop(ADD)) file'
shard.size = x3 (shard.size = x3')
The operation is now performed on the target as well but the value will be
different as it is an ADD performed in a different initial value.
Convert target to data file
t5 file (S+T) file
shard.size = x3 (shard.size = x3')
A write + xattrop is now performed but is sent only to the target file (as it
is now a data file on the hashed subvol)
t6 file (S +T) file xattrop(ADD))
shard.size = x3 shard.size = x4
Copy xattrs again from src to target
t7 file (S + T ) listxattr file (setxattr
shard.size = x3 shard.size=x3
Convert source to linkto
t8 file' file
shard.size= x3 (shard.size = x3)
The listxattr+setxattr at t7 would fix the race at t3. However, it introduces
its own race and hence possible file corruption.
A possible solution would be to:
1. Set the S+T bits before performing the initial listxattr + setxattr. This
does not fix the race where xattrops may reach the dst out of order.
2. Set only the Posix ACLS in the second setxattr.
Initially I thought the f/xattrops need only check for PHASE2 and that the
xattrs could be copied across from the second listxattr+setxattr values.
However, that leaves a window where the values could go out of sync.
A write could hit the src before the dst linkto as been converted to a data
file. After the dst has been converted to a data file but before the
listxattr+setxattr, a lookup from somewhere could update the inode ctx to point
to the new hashed subvol (dst) and the xattrop would be sent only on the dst.
However, if phase1 checks were not implemented, this add would be on the wrong
value and the listxattr+setxattr would then overwrite it with the wrong value.
@Krutika, is the above understanding of how xattrops work with shard correct?
--
You are receiving this mail because:
You are on the CC list for the bug.
Unsubscribe from this bug https://bugzilla.redhat.com/token.cgi?t=2p0On922rr&a=cc_unsubscribe
More information about the Bugs
mailing list