Hi!
Some questions about how the workqueues... work.
Have I got it right?
How are files installed during an update?
----------------------------------------
We acquire a write lock
We crawl the wc
We tell the repos about our state
The repo runs an editor
open_root(): We set status to _status_incomplete
open_directory(): We set status t _status_incomplete.
close_file(): We run the wq
close_directory(): We run the wq
close_edit(): Remove status_incomplete
release write_lock
What if we get interrupted?
----------------------------
We have this incoming change:
M A/B/lambda
M A/B/beta
But we only process lambda and get cancelled before we start processing
beta. Then there's no wq started for beta. How does the wq know that the
update isn't complete? Or is the status that tells us that the update is
not complete? E.g. the workqueues provide write atomicity but it's the
status that tells us if the whole operation has succeded?
I think it works like this:
------------------------------
* If the next operation tries to acquire a write lock it will fail and
tell the user to run 'svn cleanup'
* svn_wc_cleanup() will run all remaining work items in the different
workqueues (will be one queue when we have one db).
* Something detects that the update is incomplete and resumes it *or*
something detects that the update is incomplete and reverts what has
been done so far.
I assume that the best thing would have been if all items could have
been placed in one workqueue and then be run but that we don't do that
since we don't want to increase the memory usage or slow down the system
by writing a lot of tempfiles holding the incoming changes.
My problem is that I haven't found the code parts that deals with
status_incomplete. I only see:
If write locks already held -> run the items left in the workqueues.
Thanks,
Daniel
Received on 2010-06-24 09:29:29 CEST