Re: [PATCH RFC 2/2] ceph: truncate the file contents when needed when file scrypted

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 9/14/21 3:34 AM, Jeff Layton wrote:
On Mon, 2021-09-13 at 13:42 +0800, Xiubo Li wrote:
On 9/10/21 7:46 PM, Jeff Layton wrote:
On Fri, 2021-09-10 at 10:30 +0800, Xiubo Li wrote:
On 9/9/21 8:48 PM, Jeff Layton wrote:
On Thu, 2021-09-09 at 11:38 +0800, Xiubo Li wrote:
On 9/8/21 9:57 PM, Jeff Layton wrote:
On Wed, 2021-09-08 at 17:37 +0800, Xiubo Li wrote:
On 9/8/21 12:26 AM, Jeff Layton wrote:
On Fri, 2021-09-03 at 16:15 +0800,xiubli@xxxxxxxxxx  wrote:
[...]
I spent hours and went through the mds Locker related code on the weekends.

  From the mds/lock.cc code, for mds filelock for example in the LOCK_MIX
state and some interim transition states to LOCK_MIX it will allow
different clients could hold any of Fw or Fr caps. But the Fb/Fc will be
disabled. Checked the mds/Locker.cc code, found that the mds filelock
could to switch LOCK_MIX state in some cases when there has one client
wants Fw and another client wants any of Fr and Fw.

In this case I think the Linux advisory or mandatory locks are necessary
to keep the file contents concurrency. In multiple processes' concurrent
read/write or write/write cases without the Linux advisory/mandatory
locks the file contents' concurrency won't be guaranteed, so the logic
is the same here ?

If so, couldn't we just assume the Fw vs Fw and Fr vs Fw caps should be
exclusive in correct use case ? For example, just after the mds filelock
state switches to LOCK_MIX, if clientA gets the advisory file lock and
the Fw caps, and even another clientB could be successfully issued the
Fr caps, the clientB won't do any read because it should be still stuck
and be waiting for the advisory file lock.

I'm not sure I like that idea. Basically, that would change the meaning
of the what Frw caps represent, in a way that is not really consistent
with how they have been used before.

We could gate that new behavior on the new feature flags, but it sounds
pretty tough.

I think we have a couple of options:

1) we could just make the clients request and wait on Fx caps when they
do a truncate. They might stall for a bit if there is contention, but it
would ensure consistency and the client could be completely in charge of
the truncate. [a]

For this approach do you mean holding the Fx caps when doing a truncate ?

If so, I am afraid it won't work.

Because only in loner mode will the kclient could be issued the Fx caps, if we can get the Fx caps in the kclient then in MDS the filelock will be in LOCK_EXCL state.

And then if we send MDS the setattr request to truncate the size, then in the MDS it will try to xlock the filelock, then it will try to switch the filelock's state to LOCK_XLOCK, during which it must revoke the Frxrw caps from the kclient. That means the kclient will wait for the setattr request to finish by holding the Fx caps while the MDS will wait for the kclient to release the Fx caps.



2) we could rev the protocol, and have the client send along the last
block to be written along with the SETATTR request. Maybe we even
consider just adding a new TRUNCATE call independent of SETATTR. The MDS
would remain in complete control of it at that point.

The other ideas I've considered seem more complex and don't offer any
significant advantages that I can see.

[a]: Side question: why does buffering a truncate require Fx and not Fb?
How do Fx and Fb interact?

IIRC, Frw don't have the same exclusionary relationship
that (e.g.) Asx has. To exclude Fr, you may need Fb.

(Side note: these rules really need to be codified into a document
somewhere. I started that with the capabilities doc in the ceph tree,
but it's light on details of the FILE caps)
Yeah, that doc is light on the details for now.


And if after clientB have been issued the Fw caps and have modified that
block and still not flushed back, a new clientC comes and wants to read
the file, so the Fw caps must be revoked from clientB and the dirty data
will be flushed, and then when releasing the Fw caps to the MDS, it will
update the new fscrypt_file meta together.

I haven't see which case will be racy yet. Or did I miss some cases or
something important ?


We also need to consider how legacy, non-fscrypt-capable clients will
interact with files that have this field set. If one comes in and writes
to or truncates one of these files, it's liable to leave a real mess.
The simplest solution may be to just bar them from doing anything with
fscrypted files aside from deleting them -- maybe we'd allow them to
acquire Fr caps but not Fw?
For the legacy, non-fscrypt-capable clients, the reading contents should
be encrypted any way, so there won't be any problem even if that
specified block is not RMWed yet and it should ignore this field.

Right, and I think we have to allow those clients to request Fr caps so
that they have the ability to backup and archive encrypted files without
needing the key. The cephfs-mirror-daemon, in particular, may need this.

But for write case, I think the MDS should fail it in the open() stage
if the mode has any of Write/Truncate, etc, and only Read/Buffer-read,
etc are allowed. Or if we change the mds/Locker.cc code by not allowing
it to issue the Fw caps to the legacy/non-fscrypt-capable clients, after
the file is successfully opened with Write mode, it should be stuck
forever when writing data to the file by waiting the Fw caps, which will
never come ?

Yes. Those clients should be barred from making any changes to file
contents or doing anything that might result in a new dentry being
attached to an existing inode.

We need to allow them to read files, and unlink them, but that's really
about it.

Really, it comes down to the fact that truncates are supposed to be an
atomic operation, but we need to perform actions in two different
places.

Hmmm...it's worse than that even -- if the truncate changes it so that
the last block is in an entirely different object, then there are 3
places that will need to coordinate access.

Tricky.




[Index of Archives]     [CEPH Users]     [Ceph Large]     [Ceph Dev]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux