git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [RFC PATCH 00/19] object-store refactoring 3 (replace objects, main ref store)

From
René Scharfe <l.s.r@web.de>
Date
Apr 7, 2018, 04:58 UTC
Message-ID
<38962a15-1081-bbdb-b4c4-6b46222b5f64@web.de>
In-Reply-To
<20180406232136.253950-1-sbeller@google.com>
Am 07.04.2018 um 01:21 schrieb Stefan Beller:
> This applies on top of 464416a2eaadf84d2bfdf795007863d03b222b7c
> (sb/packfiles-in-repository).
> It is also available at https://github.com/stefanbeller/git/tree/object-store-3

This series conflicts with 1731a1e239 (replace_object: convert struct replace_object to object_id) and b383a13cc0 (Convert lookup_replace_object to struct object_id), which are in next.

> This series will bring the replacement mechanism (git replace)
> into the object store.
Good idea.
Show 24 quoted lines
>   $ git diff 464416a2eaadf84d2bfdf795007863d03b222b7c..HEAD -- object-store.h repository.h
> diff --git a/object-store.h b/object-store.h
> index fef33f345f..be90c02db6 100644
> --- a/object-store.h
> +++ b/object-store.h
> @@ -93,6 +93,22 @@ struct raw_object_store {
>          struct alternate_object_database *alt_odb_list;
>          struct alternate_object_database **alt_odb_tail;
>   
> +       /*
> +        * Objects that should be substituted by other objects
> +        * (see git-replace(1)).
> +        */
> +       struct replace_objects {
> +               /*
> +                * An array of replacements.  The array is kept sorted by the original
> +                * sha1.
> +                */
> +               struct replace_object **items;
> +
> +               int alloc, nr;
> +
> +               unsigned prepared : 1;
> +       } replacements;

An oidmap would be a better fit -- lookups should be quicker and memory consumption not much worse. I meant to submit something like this eventually after Brian's series lands:

-- >8 --
Subject: [PATCH] replace_object: use oidmap

Load the replace objects into an oidmap to allow for easy lookups in constant time.

Signed-off-by: Rene Scharfe <l.s.r@web.de>
---
This is on top of next.
 replace_object.c | 76 ++++++++++--------------------------------------
 1 file changed, 16 insertions(+), 60 deletions(-)
diff --git a/replace_object.c b/replace_object.c
index 336357394d..a757a5ebf2 100644
--- a/replace_object.c
+++ b/replace_object.c
@@ -1,54 +1,14 @@
 #include "cache.h"
-#include "sha1-lookup.h"
+#include "oidmap.h"
 #include "refs.h"
 #include "commit.h"
 
-/*
- * An array of replacements.  The array is kept sorted by the original
- * sha1.
- */
-static struct replace_object {
-	struct object_id original;
+struct replace_object {
+	struct oidmap_entry original;
 	struct object_id replacement;
-} **replace_object;
-
-static int replace_object_alloc, replace_object_nr;
+};
 
-static const unsigned char *replace_sha1_access(size_t index, void *table)
-{
-	struct replace_object **replace = table;
-	return replace[index]->original.hash;
-}
-
-static int replace_object_pos(const unsigned char *sha1)
-{
-	return sha1_pos(sha1, replace_object, replace_object_nr,
-			replace_sha1_access);
-}
-
-static int register_replace_object(struct replace_object *replace,
-				   int ignore_dups)
-{
-	int pos = replace_object_pos(replace->original.hash);
-
-	if (0 <= pos) {
-		if (ignore_dups)
-			free(replace);
-		else {
-			free(replace_object[pos]);
-			replace_object[pos] = replace;
-		}
-		return 1;
-	}
-	pos = -pos - 1;
-	ALLOC_GROW(replace_object, replace_object_nr + 1, replace_object_alloc);
-	replace_object_nr++;
-	if (pos < replace_object_nr)
-		MOVE_ARRAY(replace_object + pos + 1, replace_object + pos,
-			   replace_object_nr - pos - 1);
-	replace_object[pos] = replace;
-	return 0;
-}
+static struct oidmap replace_map = OIDMAP_INIT;
 
 static int register_replace_ref(const char *refname,
 				const struct object_id *oid,
@@ -59,7 +19,7 @@ static int register_replace_ref(const char *refname,
 	const char *hash = slash ? slash + 1 : refname;
 	struct replace_object *repl_obj = xmalloc(sizeof(*repl_obj));
 
-	if (get_oid_hex(hash, &repl_obj->original)) {
+	if (get_oid_hex(hash, &repl_obj->original.oid)) {
 		free(repl_obj);
 		warning("bad replace ref name: %s", refname);
 		return 0;
@@ -69,7 +29,7 @@ static int register_replace_ref(const char *refname,
 	oidcpy(&repl_obj->replacement, oid);
 
 	/* Register new object */
-	if (register_replace_object(repl_obj, 1))
+	if (oidmap_put(&replace_map, repl_obj))
 		die("duplicate replace ref: %s", refname);
 
 	return 0;
@@ -84,7 +44,7 @@ static void prepare_replace_object(void)
 
 	for_each_replace_ref(register_replace_ref, NULL);
 	replace_object_prepared = 1;
-	if (!replace_object_nr)
+	if (!replace_map.map.tablesize)
 		check_replace_refs = 0;
 }
 
@@ -100,21 +60,17 @@ static void prepare_replace_object(void)
  */
 const struct object_id *do_lookup_replace_object(const struct object_id *oid)
 {
-	int pos, depth = MAXREPLACEDEPTH;
+	int depth = MAXREPLACEDEPTH;
 	const struct object_id *cur = oid;
 
 	prepare_replace_object();
 
 	/* Try to recursively replace the object */
-	do {
-		if (--depth < 0)
-			die("replace depth too high for object %s",
-			    oid_to_hex(oid));
-
-		pos = replace_object_pos(cur->hash);
-		if (0 <= pos)
-			cur = &replace_object[pos]->replacement;
-	} while (0 <= pos);
-
-	return cur;
+	while (depth-- > 0) {
+		struct replace_object *repl_obj = oidmap_get(&replace_map, cur);
+		if (!repl_obj)
+			return cur;
+		cur = &repl_obj->replacement;
+	}
+	die("replace depth too high for object %s", oid_to_hex(oid));
 }
-- 
2.17.0
Previous: Stefan BellerNext: Stefan Beller
Message 25 of 91 in “object-store refactoring 3 (replace objects, main ref store)”
  1. 00/19 object-store refactoring 3 (replace objects, main ref store)Stefan Beller, Apr 6, 2018
  2. 01/19 replace_object.c: rename to use dash in file nameStefan Beller, Apr 6, 2018
  3. 02/19 replace-object: move replace_object to object storeStefan Beller, Apr 6, 2018
  4. Derrick StoleeApr 9, 2018
  5. 03/19 object-store: move lookup_replace_object to replace-object.hStefan Beller, Apr 6, 2018
  6. 08/19 replace-object: add repository argument to replace_object_posStefan Beller, Apr 6, 2018
  7. 09/19 replace-object: add repository argument to register_replace_objectStefan Beller, Apr 6, 2018
  8. 11/19 replace-object: add repository argument to do_lookup_replace_objectStefan Beller, Apr 6, 2018
  9. 12/19 replace-object: add repository argument to lookup_replace_objectStefan Beller, Apr 6, 2018
  10. 13/19 refs: store the main ref store inside the repository structStefan Beller, Apr 6, 2018
  11. Eric SunshineApr 7, 2018
  12. 15/19 replace-object: allow replace_object_pos to handle arbitrary repositoriesStefan Beller, Apr 6, 2018
  13. 14/19 refs: allow for_each_replace_ref to handle arbitrary repositoriesStefan Beller, Apr 6, 2018
  14. 17/19 replace-object: allow prepare_replace_object to handle arbitrary repositoriesStefan Beller, Apr 6, 2018
  15. 16/19 replace-object: allow register_replace_object to handle arbitrary repositoriesStefan Beller, Apr 6, 2018
  16. 19/19 replace-object: allow lookup_replace_object to handle arbitrary repositoriesStefan Beller, Apr 6, 2018
  17. 18/19 replace-object: allow do_lookup_replace_object to handle arbitrary repositoriesStefan Beller, Apr 6, 2018
  18. 10/19 replace-object: add repository argument to prepare_replace_objectStefan Beller, Apr 6, 2018
  19. 04/19 replace-object: move replace objects prepared flag to object storeStefan Beller, Apr 6, 2018
  20. 07/19 refs: add repository argument to for_each_replace_refStefan Beller, Apr 6, 2018
  21. 05/19 replace-object: check_replace_refs is safe in multi repo environmentStefan Beller, Apr 6, 2018
  22. 06/19 refs: add repository argument to get_main_ref_storeStefan Beller, Apr 6, 2018
  23. Eric SunshineApr 7, 2018
  24. Stefan BellerApr 9, 2018
  25. René ScharfeApr 7, 2018
  26. Stefan BellerApr 9, 2018
  27. Duy NguyenApr 7, 2018
  28. Stefan BellerApr 9, 2018
  29. Derrick StoleeApr 9, 2018
  30. 00/16 object-store refactoring 3 (replace objects, main ref store)Stefan Beller, Apr 9, 2018
  31. 01/16 replace_object: use oidmapStefan Beller, Apr 9, 2018
  32. Junio C HamanoApr 10, 2018
  33. 03/16 replace-object: move replace_map to object storeStefan Beller, Apr 9, 2018
  34. Junio C HamanoApr 10, 2018
  35. 02/16 replace_object.c: rename to use dash in file nameStefan Beller, Apr 9, 2018
  36. Junio C HamanoApr 10, 2018
  37. Stefan BellerApr 10, 2018
  38. 0/6 Rename files to use dashes instead of underscoresStefan Beller, Apr 10, 2018
  39. 1/6 write_or_die.c: rename to use dashes in file nameStefan Beller, Apr 10, 2018
  40. 2/6 unicode_width.h: rename to use dash in file nameStefan Beller, Apr 10, 2018
  41. 3/6 exec_cmd: rename to use dash in file nameStefan Beller, Apr 10, 2018
  42. 5/6 sha1_file.c: rename to use dash in file nameStefan Beller, Apr 10, 2018
  43. 6/6 replace_object.c: rename to use dash in file nameStefan Beller, Apr 10, 2018
  44. 4/6 sha1_name.c: rename to use dash in file nameStefan Beller, Apr 10, 2018
  45. Stefan BellerApr 10, 2018
  46. Johannes SchindelinApr 10, 2018
  47. Stefan BellerApr 10, 2018
  48. brian m. carlsonApr 11, 2018
  49. 04/16 object-store: move lookup_replace_object to replace-object.hStefan Beller, Apr 9, 2018
  50. 06/16 replace-object: check_replace_refs is safe in multi repo environmentStefan Beller, Apr 9, 2018
  51. Junio C HamanoApr 10, 2018
  52. 05/16 replace-object: eliminate replace objects prepared flagStefan Beller, Apr 9, 2018
  53. Junio C HamanoApr 10, 2018
  54. René ScharfeApr 10, 2018
  55. 07/16 refs: add repository argument to get_main_ref_storeStefan Beller, Apr 9, 2018
  56. Michael HaggertyApr 10, 2018
  57. Stefan BellerApr 10, 2018
  58. 08/16 refs: add repository argument to for_each_replace_refStefan Beller, Apr 9, 2018
  59. 09/16 replace-object: add repository argument to prepare_replace_objectStefan Beller, Apr 9, 2018
  60. 13/16 refs: allow for_each_replace_ref to handle arbitrary repositoriesStefan Beller, Apr 9, 2018
  61. 12/16 refs: store the main ref store inside the repository structStefan Beller, Apr 9, 2018
  62. Brandon WilliamsApr 9, 2018
  63. Stefan BellerApr 9, 2018
  64. Brandon WilliamsApr 9, 2018
  65. Michael HaggertyApr 10, 2018
  66. Stefan BellerApr 10, 2018
  67. 15/16 replace-object: allow do_lookup_replace_object to handle arbitrary repositoriesStefan Beller, Apr 9, 2018
  68. 14/16 replace-object: allow prepare_replace_object to handle arbitrary repositoriesStefan Beller, Apr 9, 2018
  69. 16/16 replace-object: allow lookup_replace_object to handle arbitrary repositoriesStefan Beller, Apr 9, 2018
  70. 11/16 replace-object: add repository argument to lookup_replace_objectStefan Beller, Apr 9, 2018
  71. 10/16 replace-object: add repository argument to do_lookup_replace_objectStefan Beller, Apr 9, 2018
  72. Brandon WilliamsApr 9, 2018
  73. Stefan BellerApr 9, 2018
  74. 00/15 replace_object.c: rename to use dash in file nameStefan Beller, Apr 12, 2018
  75. 01/15 replace_object: use oidmapStefan Beller, Apr 12, 2018
  76. 02/15 replace-object: move replace_map to object storeStefan Beller, Apr 12, 2018
  77. 03/15 object-store: move lookup_replace_object to replace-object.hStefan Beller, Apr 12, 2018
  78. 05/15 replace-object: check_replace_refs is safe in multi repo environmentStefan Beller, Apr 12, 2018
  79. 07/15 refs: add repository argument to for_each_replace_refStefan Beller, Apr 12, 2018
  80. 04/15 replace-object: eliminate replace objects prepared flagStefan Beller, Apr 12, 2018
  81. 13/15 replace-object: allow prepare_replace_object to handle arbitrary repositoriesStefan Beller, Apr 12, 2018
  82. 12/15 refs: allow for_each_replace_ref to handle arbitrary repositoriesStefan Beller, Apr 12, 2018
  83. 14/15 replace-object: allow do_lookup_replace_object to handle arbitrary repositoriesStefan Beller, Apr 12, 2018
  84. 15/15 replace-object: allow lookup_replace_object to handle arbitrary repositoriesStefan Beller, Apr 12, 2018
  85. 06/15 refs: add repository argument to get_main_ref_storeStefan Beller, Apr 12, 2018
  86. 11/15 refs: store the main ref store inside the repository structStefan Beller, Apr 12, 2018
  87. 08/15 replace-object: add repository argument to prepare_replace_objectStefan Beller, Apr 12, 2018
  88. 09/15 replace-object: add repository argument to do_lookup_replace_objectStefan Beller, Apr 12, 2018
  89. 10/15 replace-object: add repository argument to lookup_replace_objectStefan Beller, Apr 12, 2018
  90. Derrick StoleeApr 12, 2018
  91. Stefan BellerApr 9, 2018

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.