| |
| Call graphs of the use of the WC-1 temporary text base path. |
| |
| This is to help us eliminate the use of this path and replace it with a more |
| encapsulated way of referring to the new text base, as part of migration to a |
| WC-NG pristine text store. |
| |
| |
| NEW TEXT BASES IN COMMITS |
| ========================= |
| |
| This call graph shows all the routes by which the WC-1 temporary text base |
| path is obtained, and the extent to which it is propagated, within a commit. |
| |
| |
| svn_client_commit4() |
| |^[T] | [T] Terminates here |
| wc_to_repos_copy() |^[M] | |
| | |^ | [M] Multiple files |
| svn_client__do_commit() | |
| [N] |^ | [N] Not when caller is |
| |^ | wc_to_repos_copy() |
| |^ | |
| LIBSVN_CLIENT |^ | |
| .......................................................................... |
| LIBSVN_WC |^ | |
| |^ | |
| |^ +---+ |
| |^ | |
| svn_wc_transmit_text_deltas3() | |
| [N] |^ | |
| svn_wc__internal_transmit_text_deltas() | |
| [N] |^ | |
| |^ | |
| |^ { svn_wc_process_committed_queue2() } |
| |^ { svn_wc_process_committed4() } |
| |^ | |
| |^ svn_wc__process_committed_internal() |
| |^ | |
| |^ process_committed_leaf() |
| |^ |^ |v |
| |^ |^ svn_wc__wq_add_postcommit() |
| |^ |^ *v |
| |^ |^ *v |
| |^ |^ *v |
| |^ |^ WQ:OP_POSTCOMMIT |
| |^ |^ *v |
| |^ |^ *v |
| |^ |^ *v |
| |^ |^ run_postcommit() |
| |^ |^ |v |
| |^ |^ log_do_committed() |
| |^ |^ |v |
| |^ |^ install_committed_file() |
| |^ |^ |v |
| |^ |^ |v |
| svn_wc__text_base_deterministic_tmp_path() svn_wc__sync_text_base() |
| |^ |v |
| |^ [initialization] svn_io_rename() |
| |^ | + svn_io_set_file_read_only() |
| |^ make_adm_subdir() |
| |^ |^ |
| extend_with_adm_name(tmp=TRUE) |
| |
| |
| NEW TEXT BASES IN UPDATES |
| ========================= |
| |
| This call graph shows all the uses of a WC-1 temporary text base path |
| within the update editor. |
| |
| |
| repos_to_wc_copy() merge_file_added() |
| | | |
| | +-------------+ |
| LIBSVN_CLIENT | | |
| .......................................................................... |
| LIBSVN_WC | | |
| | | |
| svn_wc_add_repos_file4() { svn_wc_get_update_editor4() } |
| |^ |v { svn_wc_get_switch_editor4() } |
| |^ |v | [1] |
| |^ |v | |
| |^ |v make_editor() |
| |^ |v * [1] |
| |^ |v * |
| |^ |v * |
| |^ |v * |
| |^ |v ______ UPDATE/SWITCH EDITOR _____ |
| |^ |v | | |
| |^ |v | add_file_with_history() |
| |^ |v | |^ v |
| |^ |v apply_textdelta() |^ v |
| |^ |v [2] |^ v |^ FB->copied_text_base |
| |^ |v |^ v |^ v |
| |^ |v |^ v |^ v |
| |^ |v |^ HB->work_abspath |^ (to apply_textdelta |
| |^ |v |^ v |^ and close_file |
| |^ |v |^ v |^ and merge_file) |
| |^ |v |^ window_handler() [3] |^ [5] |
| |^ |v |^ v |^ |
| |^ |v |^ v |^ |
| |^ |v |^ FB->new_text_base_abspath |^ |
| |^ |v |^ v |^ |
| |^ |v |^ v |^ |
| |^ +---+ |^ close_file() [4] |^ |
| |^ |v |^ |v |^ |
| |^ install_text_base() |^ |v |^ |
| |^ (see below) |^ |v |^ |
| |^ |^ |v |^ |
| |^ +-------------+ |v |^ |
| +----------+ |^ +---------------------------------------+ |
| |^ |^ |^ |v |
| svn_wc__open_writable_base() |v |
| |^ |v |
| svn_wc__db_temp_wcroot_tempdir() |v |
| f/b svn_stream_open_unique() |v |
| |v |
| |v |
| merge_file() |
| |v |v |v |v |
| +--------+ |v |v +--------+ |
| |v +--+ +--+ |v |
| |v |v |v |v |
| svn_wc__internal_\ |v |v |v |v |
| versioned_file_modcheck() |v |v |v |
| |v | |v |v |v |
| svn_stream_open_readonly() | |v |v |v |
| | |v |v |v |
| compare_and_verify() |v |v |v |
| |v |v |v |
| svn_wc__loggy_copy() |v |v |
| |v |v |
| svn_wc__internal_merge() |v |
| |v |
| install_text_base() |
| |v |
| svn_wc__loggy_move() |
| + svn_wc__loggy_set_readonly() |
| |
| |
| NOTES |
| ===== |
| |
| All callers are shown if any are shown, except for deprecated wrappers. |
| |
| |,+---+ indicates function calling (downwards). |
| * * * * indicates transfer of control, not by direct function call. |
| ^,v,<,> indicates passing of the tmp text base path. |
| { ... } indicates a group of functions that all call the same sub-function. |
| |
| [T] Propagation terminates here. |
| [1] These just return an editor that points to |
| update_editor.c:apply_textdelta(). Calls to the editor are not shown. |
| [2] apply_textdelta() puts tmp text base path in HB->work_abspath only. |
| [3] window_handler() copies HB->work_abspath to |
| HB->fb->new_text_base_abspath when it is finished. (It writes data to |
| a stream, not to the path.) That is the only use of HB->work_abspath. |
| [4] close_file() passes FB->new_text_base_abspath to merge_file(). That |
| is the only use of FB->new_text_base_abspath. |
| [5] FB->copied_text_base is used in apply_textdelta(), close_file() and |
| merge_file(), but not in the same way as FB->new_text_base_abspath is |
| used by them which is the flow shown on the diagram. |
| |
| |
| CHANGES REQUIRED |
| ================ |
| |
| Goal: |
| |
| The goal is to move to a WC-NG method of installing a new text base. This |
| will require writing the new text base to a temporary location that is |
| determined by the new pristine store and may not necessarily have a |
| deterministic path. |
| |
| Observations: |
| |
| There are two high-level operations that install a new text base. |
| |
| 1. Commit |
| |
| 2. Update/switch |
| |
| The commit operation (1) is the one of primary interest, as it has a gap |
| in its data flow whereby the part of it that creates a temporary file does |
| not pass the name (or any other handle) of the file through to the part of |
| it that later needs to use this file. Instead it depends on being able |
| deterministically to derive the path to the temporary file from the path |
| to the working file. |
| |
| The update/switch operation (2) obtains a temporary file path once and |
| passes that path to all places where it needs to use it, which is sane. |
| The path need not be deterministic, it just needs to be atomically movable |
| into the final pristine location. |
| |
| The commit operation is totally independent from the update/switch |
| operation: they could use completely different methods of locating and |
| storing the temporary text base. |
| |
| A third high level operation, the WC-to-repository copy, involves a commit |
| but does not save a temporary text base file nor install a new text-base. |
| |
| Preferred Direction For Commit (1): |
| |
| As soon as all the content is written to the temp file, move it fully into |
| the pristine store, named by its checksum. Then later, in |
| install_committed_file(), make that pristine text become "this node's |
| base" by writing its checksum into the node's entry in the DB. |
| |
| To achieve this, we need to create a data flow of the text base id (its |
| SHA-1 checksum) from the transmit-text-deltas part of the commit to the |
| install-committed-file part of the commit. |
| |
| A text base that gets replaced and is then unused must be deleted from the |
| store at some point, but not necessarily as soon as it becomes unused. |
| The method of installing a new text base should use the Work Queue in such |
| a way as to enable unused text bases to be deleted without risk of |
| deleting a temporary text base that is about to go live. |
| |
| The initial scheme for removing unused text bases must be simple and |
| reliable. Probably this will involve deleting each unreferenced text base |
| as soon as it becomes unreferenced. |
| |
| Additional Changes Wanted: |
| |
| * svn_wc__db_global_commit() should be OUTSIDE the Work Queue. |
| |
| * "transmit_text_delta function is bogus and should go" |
| |
| "API gap between transmit and the commit finalization. The dataflow and |
| *assumptions* made are ridiculous, creating offhand dependencies across |
| the codebase." |
| |
| * update/switch should use the new pristine store |
| |