|  |  | 
|  | 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 | 
|  |  |