ignite-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Konstantin Boudnik <...@apache.org>
Subject Re: IGFS concurrency issue
Date Wed, 07 Oct 2015 03:57:39 GMT
IIRC NN should be locking on these ops anyway, shouldn't it? The situation is
no different if multiple clients are doing these operations
near-simultaneously. Unless I missed something here...

On Thu, Sep 24, 2015 at 11:28AM, Sergi Vladykin wrote:
> May be just check that they are not parent-child within the tx?
> 
> Sergi
> Igniters,
> 
> We revealed concurrency problem in IGFS and I would like to discuss
> possible solutions to it.
> 
> Consider the following file system structure:
> root
> |-- A
> |   |-- B
> |   |   |-- C
> |   |-- D
> 
> ... two concurrent operations in different threads:
> T1: move(/A/B, /A/D);
> T2: move(/A/D, /A/B/C);
> 
> ... and how IGFS handles it now:
> T1: verify that "/A/B" and "/A/D" exist, they are not child-parent to each
> other, etc. -> OK.
> T2: do the same for "A/D" and "A/B/C" -> OK.
> T1: get IDs of "/A", "/A/B" and "/A/D" to lock them later inside tx.
> T2: get IDs of "/A", "/A/D", "/A/B" and "/A/B/C" to lock them later inside
> tx.
> 
> T1: Start pessimistic tx, lock IDs of "/A", "/A/B", "/A/D", perform move ->
> OK.
> root
> |-- A
> |   |-- D
> |   |   |-- B
> |   |   |   |-- C
> 
> T2: Start pessimistic tx, lock IDs of "/A", "/A/D", "/A/B" and
> "/A/B/C" (*directory
> structure already changed at this time!*), perform move -> OK.
> root
> |-- A
> B
> |-- D
> |   |-- C
> |   |   |-- B (loop!)
> 
> File system is corrupted. Folders B, C and D are not reacheable from root.
> 
> To fix this now we additionaly check if directory structure is still
> valid *inside
> transaction*. It works, no more corruptions. But it requres taking locks on
> the whole paths *including root*. So move, delete and mkdirs opeartions *can
> no longer be concurrent*.
> 
> Probably there is a way to relax this while still ensuring consistency, but
> I do not see how. One idea is to store real path inside each entry. This
> way we will be able to ensure that it is still at a valid location without
> blocking parents, so concurrnecy will be restored. But we will have to
> propagate strucutral changes to children. E.g. move of a folder with 100
> items will lead to update of >100 cache entries. Not so good.
> 
> Any other ideas?
> 
> Vladimir.

Mime
View raw message