Samuel Siebenmann created ZEPPELIN-5858:
-------------------------------------------

             Summary: Race condition between moveNote and saveNote causes 
duplicated notes
                 Key: ZEPPELIN-5858
                 URL: https://issues.apache.org/jira/browse/ZEPPELIN-5858
             Project: Zeppelin
          Issue Type: Bug
          Components: zeppelin-zengine
            Reporter: Samuel Siebenmann
         Attachments: NotebookServiceRaceConditionTest.java, 
VFSNotebookRepoWithDelay.java

Simultaneous execution of `moveNote` (e.g. `renameNote`) and `saveNote` (e.g. 
`insertParagraph`) can cause notes to get duplicated in the underlying notebook 
repo due to writes based on stale data. A unit test has been attached which 
reproduces the issue.

Thread diagram (as executed by the unit test):
||Main Thread||Thread 1 (saveNote)||Thread 2 (moveNote)||
|create note| | |
| | |initiate moveNote|
| | |note path & id are read|
| | |trigger move in notebookRepo|
| |initiate saveNote| |
| |note is read| |
| |trigger save in notebookRepo| |
| | |notebookRepo finishes move|
| | |note path of cached note is updated|
| |notebookRepo finishes save| |

Since the `saveNote` thread acts on stale note data it will write the note back 
to its old location. Thus, after both threads have terminated, the same note 
with the same noteId will exist with two different paths. 

The current synchronization does not prevent this issue since only `saveNote` 
is synchronized. Further, `loadAndProcessNote` only acquires the note's 
readLock, allowing both `move` and `save` threads to hold the lock at the same 
time.

The unit test is based on the NotebookServiceTest. To simulate delays in the 
underlying notebook repo that result in the thread interweaving described above 
a repo `VFSNotebookRepoWithDelay` has been created based on `VFSNotebookRepo` 
with minimal changes to simulate delays when writing files.

 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to