git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: "Victoria Dye via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: stolee@gmail.com, gitster@pobox.com, Victoria Dye <vdye@github.com>
Subject: [PATCH v3 0/3] sparse-index: expand/collapse based on 'index.sparse'
Date: Wed, 27 Oct 2021 18:20:08 +0000	[thread overview]
Message-ID: <pull.1059.v3.git.1635358812.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.1059.v2.git.1634849307.gitgitgadget@gmail.com>

This series updates do_read_index to use the index.sparse config setting
when determining whether the index should be expanded or collapsed. If the
command & repo allow use of a sparse index, index.sparse is enabled, and a
full index is read from disk, the index is collapsed before returning to the
caller. Conversely, if index.sparse is disabled but the index read from disk
is sparse, the index is expanded before returning. This allows index.sparse
to control use of the sparse index in addition to its existing control over
how the index is written to disk. It also introduces the ability to
enable/disable the sparse index on a command-by-command basis (e.g.,
allowing a user to troubleshoot a sparse-aware command with '-c
index.sparse=false' [1]).

While testing this change, a bug was found in 'test-tool read-cache' in
which config settings for the repository were not initialized before
preparing the repo settings. This caused index.sparse to always be 'false'
when using the test helper in a cone-mode sparse checkout, breaking tests in
t1091 and t1092. The issue is fixed by moving prepare_repo_settings after
config setup.


Changes since V1
================

 * Add ensure_correct_sparsity function that ensures the index is sparse if
   the repository settings (including index.sparse) allow it, otherwise
   ensuring the index is expanded to full.
 * Restructure condition in do_read_index to, rather than check specifically
   for the index.sparse config setting, call ensure_correct_sparsity
   unconditionally when command_requires_full_index is false.


Changes since V2
================

 * Rename can_convert_to_sparse to is_sparse_index_allowed to more
   accurately reflect what the function returns.
 * Remove index-iterating checks from is_sparse_index_allowed, leaving only
   inexpensive checks on config settings & sparse checkout patterns. Checks
   are still part of convert_to_sparse to ensure it behaves exactly as it
   did before this series.
 * Restructure ensure_correct_sparsity for better readability.
 * Fix test_env variable scope.

[1]
https://lore.kernel.org/git/cc60c6e7-ecef-ae22-8ec7-ab290ff2b830@gmail.com/

Thanks! -Victoria

Victoria Dye (3):
  test-read-cache.c: prepare_repo_settings after config init
  sparse-index: add ensure_correct_sparsity function
  sparse-index: update do_read_index to ensure correct sparsity

 read-cache.c                             |  8 ++++++
 sparse-index.c                           | 33 +++++++++++++++++++++---
 sparse-index.h                           |  1 +
 t/helper/test-read-cache.c               |  5 ++--
 t/t1092-sparse-checkout-compatibility.sh | 31 ++++++++++++++++++++++
 5 files changed, 72 insertions(+), 6 deletions(-)


base-commit: f443b226ca681d87a3a31e245a70e6bc2769123c
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1059%2Fvdye%2Fsparse%2Findex-sparse-config-v3
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1059/vdye/sparse/index-sparse-config-v3
Pull-Request: https://github.com/gitgitgadget/git/pull/1059

Range-diff vs v2:

 1:  6974ce7e7f5 = 1:  6974ce7e7f5 test-read-cache.c: prepare_repo_settings after config init
 2:  0b6e6633bb2 ! 2:  9d6511db072 sparse-index: add ensure_correct_sparsity function
     @@ Metadata
       ## Commit message ##
          sparse-index: add ensure_correct_sparsity function
      
     -    The purpose of the `ensure_correct_sparsity` function is to provide a means
     -    of aligning the in-core index with the sparsity required by the repository
     -    settings and other properties of the index. The function will first attempt
     -    to convert the index to sparse, now with a "SPARSE_INDEX_VERIFY_ALLOWED"
     -    flag that forces the function to return a nonzero value if repository
     -    settings do not allow use of a sparse index. If a nonzero value is returned,
     -    the index is expanded to full with `ensure_full_index`.
     +    The `ensure_correct_sparsity` function is intended to provide a means of
     +    aligning the in-core index with the sparsity required by the repository
     +    settings and other properties of the index. The function first checks
     +    whether a sparse index is allowed (per repository & sparse checkout pattern
     +    settings). If the sparse index may be used, the index is converted to
     +    sparse; otherwise, it is explicitly expanded with `ensure_full_index`.
      
          Helped-by: Junio C Hamano <gitster@pobox.com>
          Signed-off-by: Victoria Dye <vdye@github.com>
     @@ sparse-index.c: static int index_has_unmerged_entries(struct index_state *istate
       }
       
      -int convert_to_sparse(struct index_state *istate, int flags)
     -+static int can_convert_to_sparse(struct index_state *istate, int flags)
     ++static int is_sparse_index_allowed(struct index_state *istate, int flags)
       {
     - 	int test_env;
     +-	int test_env;
      -	if (istate->sparse_index || !istate->cache_nr ||
      -	    !core_apply_sparse_checkout || !core_sparse_checkout_cone)
      +	if (!core_apply_sparse_checkout || !core_sparse_checkout_cone)
       		return 0;
       
       	if (!istate->repo)
     + 		istate->repo = the_repository;
     + 
     + 	if (!(flags & SPARSE_INDEX_MEMORY_ONLY)) {
     ++		int test_env;
     ++
     + 		/*
     + 		 * The sparse index is not (yet) integrated with a split index.
     + 		 */
      @@ sparse-index.c: int convert_to_sparse(struct index_state *istate, int flags)
     - 	if (cache_tree_update(istate, WRITE_TREE_MISSING_OK))
     + 	if (!istate->sparse_checkout_patterns->use_cone_patterns)
       		return 0;
       
      +	return 1;
     @@ sparse-index.c: int convert_to_sparse(struct index_state *istate, int flags)
      +
      +int convert_to_sparse(struct index_state *istate, int flags)
      +{
     -+	int verify = flags & SPARSE_INDEX_VERIFY_ALLOWED;
     -+
      +	/*
     -+	 * If validating with strict checks against whether the sparse index is
     -+	 * allowed, we want to check `can_convert_to_sparse` *before* exiting
     -+	 * early due to an already sparse or empty index.
     -+	 *
     -+	 * If not performing strict validation, the order is reversed to avoid
     -+	 * the more expensive checks in `can_convert_to_sparse` whenver possible.
     ++	 * If the index is already sparse, empty, or otherwise
     ++	 * cannot be converted to sparse, do not convert.
      +	 */
     -+	if (verify) {
     -+		if (!can_convert_to_sparse(istate, flags))
     -+			return -1;
     -+		else if (istate->sparse_index || !istate->cache_nr)
     -+			return 0;
     -+	} else if (istate->sparse_index || !istate->cache_nr ||
     -+		   !can_convert_to_sparse(istate, flags))
     ++	if (istate->sparse_index || !istate->cache_nr ||
     ++	    !is_sparse_index_allowed(istate, flags))
      +		return 0;
      +
     - 	remove_fsmonitor(istate);
     - 
     - 	trace2_region_enter("index", "convert_to_sparse", istate->repo);
     + 	/*
     + 	 * NEEDSWORK: If we have unmerged entries, then stay full.
     + 	 * Unmerged entries prevent the cache-tree extension from working.
      @@ sparse-index.c: void ensure_full_index(struct index_state *istate)
       	trace2_region_leave("index", "ensure_full_index", istate->repo);
       }
     @@ sparse-index.c: void ensure_full_index(struct index_state *istate)
      +void ensure_correct_sparsity(struct index_state *istate)
      +{
      +	/*
     -+	 * First check whether the index can be converted to sparse by attempting
     -+	 * to convert it with the SPARSE_INDEX_VERIFY_ALLOWED flag. If the
     -+	 * SPARSE_INDEX_VERIFY_ALLOWED checks indicate that the index cannot
     -+	 * be converted because repository settings and/or index properties
     -+	 * do not allow it, expand the index to full.
     ++	 * If the index can be sparse, make it sparse. Otherwise,
     ++	 * ensure the index is full.
      +	 */
     -+	if (convert_to_sparse(istate, SPARSE_INDEX_VERIFY_ALLOWED))
     ++	if (is_sparse_index_allowed(istate, 0))
     ++		convert_to_sparse(istate, 0);
     ++	else
      +		ensure_full_index(istate);
      +}
      +
     @@ sparse-index.c: void ensure_full_index(struct index_state *istate)
      
       ## sparse-index.h ##
      @@
     - 
       struct index_state;
       #define SPARSE_INDEX_MEMORY_ONLY (1 << 0)
     -+#define SPARSE_INDEX_VERIFY_ALLOWED (1 << 1)
       int convert_to_sparse(struct index_state *istate, int flags);
      +void ensure_correct_sparsity(struct index_state *istate);
       
 3:  437cf398256 = 3:  d6c3c694e1e sparse-index: update do_read_index to ensure correct sparsity

-- 
gitgitgadget

  parent reply	other threads:[~2021-10-27 18:20 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-15 19:54 [PATCH 0/2] sparse-index: expand/collapse based on 'index.sparse' Victoria Dye via GitGitGadget
2021-10-15 19:54 ` [PATCH 1/2] test-read-cache.c: prepare_repo_settings after config init Victoria Dye via GitGitGadget
2021-10-15 19:54 ` [PATCH 2/2] sparse-index: update index read to consider index.sparse config Victoria Dye via GitGitGadget
2021-10-15 21:53   ` Junio C Hamano
2021-10-17  1:21     ` Derrick Stolee
2021-10-17  5:58       ` Junio C Hamano
2021-10-17 19:33         ` Derrick Stolee
2021-10-18  1:15           ` Junio C Hamano
2021-10-18 13:25             ` Derrick Stolee
2021-10-18 14:14               ` Victoria Dye
2021-10-21 13:26                 ` Derrick Stolee
2021-10-18 16:09               ` Junio C Hamano
2021-10-21 20:48 ` [PATCH v2 0/3] sparse-index: expand/collapse based on 'index.sparse' Victoria Dye via GitGitGadget
2021-10-21 20:48   ` [PATCH v2 1/3] test-read-cache.c: prepare_repo_settings after config init Victoria Dye via GitGitGadget
2021-10-21 20:48   ` [PATCH v2 2/3] sparse-index: add ensure_correct_sparsity function Victoria Dye via GitGitGadget
2021-10-21 22:20     ` Junio C Hamano
2021-10-27 17:21       ` Victoria Dye
2021-10-21 20:48   ` [PATCH v2 3/3] sparse-index: update do_read_index to ensure correct sparsity Victoria Dye via GitGitGadget
2021-10-27 18:20   ` Victoria Dye via GitGitGadget [this message]
2021-10-27 18:20     ` [PATCH v3 1/3] test-read-cache.c: prepare_repo_settings after config init Victoria Dye via GitGitGadget
2021-10-27 18:20     ` [PATCH v3 2/3] sparse-index: add ensure_correct_sparsity function Victoria Dye via GitGitGadget
2021-10-27 20:07       ` Derrick Stolee
2021-10-27 21:32         ` Junio C Hamano
2021-10-28  1:24           ` Derrick Stolee
2021-10-29 13:43             ` Victoria Dye
2021-10-27 18:20     ` [PATCH v3 3/3] sparse-index: update do_read_index to ensure correct sparsity Victoria Dye via GitGitGadget
2021-10-27 20:08     ` [PATCH v3 0/3] sparse-index: expand/collapse based on 'index.sparse' Derrick Stolee
2021-10-29 13:51     ` [PATCH v4 0/4] " Victoria Dye via GitGitGadget
2021-10-29 13:51       ` [PATCH v4 1/4] test-read-cache.c: prepare_repo_settings after config init Victoria Dye via GitGitGadget
2021-10-29 13:51       ` [PATCH v4 2/4] sparse-index: avoid unnecessary cache tree clearing Victoria Dye via GitGitGadget
2021-10-29 18:45         ` Junio C Hamano
2021-10-29 19:00           ` Derrick Stolee
2021-10-29 20:01             ` Junio C Hamano
2021-10-29 13:51       ` [PATCH v4 3/4] sparse-index: add ensure_correct_sparsity function Victoria Dye via GitGitGadget
2021-10-29 13:51       ` [PATCH v4 4/4] sparse-index: update do_read_index to ensure correct sparsity Victoria Dye via GitGitGadget
2021-11-22 17:36         ` Elijah Newren
2021-11-22 18:59           ` Victoria Dye
2021-11-22 17:40       ` [PATCH v4 0/4] sparse-index: expand/collapse based on 'index.sparse' Elijah Newren
2021-11-23  0:20       ` [PATCH v5 " Victoria Dye via GitGitGadget
2021-11-23  0:20         ` [PATCH v5 1/4] test-read-cache.c: prepare_repo_settings after config init Victoria Dye via GitGitGadget
2021-11-23  0:20         ` [PATCH v5 2/4] sparse-index: avoid unnecessary cache tree clearing Victoria Dye via GitGitGadget
2021-11-23  0:20         ` [PATCH v5 3/4] sparse-index: add ensure_correct_sparsity function Victoria Dye via GitGitGadget
2021-11-23  0:20         ` [PATCH v5 4/4] sparse-index: update do_read_index to ensure correct sparsity Victoria Dye via GitGitGadget
2021-11-23 17:21         ` [PATCH v5 0/4] sparse-index: expand/collapse based on 'index.sparse' Elijah Newren

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=pull.1059.v3.git.1635358812.gitgitgadget@gmail.com \
    --to=gitgitgadget@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=stolee@gmail.com \
    --cc=vdye@github.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).