Skip to content

Commit de92781

Browse files
committed
Merge branch 'ps/reftable-detach'
Isolates the reftable subsystem from the rest of Git's codebase by using fewer pieces of Git's infrastructure. * ps/reftable-detach: reftable/system: provide thin wrapper for lockfile subsystem reftable/stack: drop only use of `get_locked_file_path()` reftable/system: provide thin wrapper for tempfile subsystem reftable/stack: stop using `fsync_component()` directly reftable/system: stop depending on "hash.h" reftable: explicitly handle hash format IDs reftable/system: move "dir.h" to its only user
2 parents 35f4038 + 988e7f5 commit de92781

27 files changed

+506
-229
lines changed

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2722,6 +2722,7 @@ REFTABLE_OBJS += reftable/pq.o
27222722
REFTABLE_OBJS += reftable/reader.o
27232723
REFTABLE_OBJS += reftable/record.o
27242724
REFTABLE_OBJS += reftable/stack.o
2725+
REFTABLE_OBJS += reftable/system.o
27252726
REFTABLE_OBJS += reftable/tree.o
27262727
REFTABLE_OBJS += reftable/writer.o
27272728

refs/reftable-backend.c

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "../object.h"
1616
#include "../path.h"
1717
#include "../refs.h"
18+
#include "../reftable/reftable-basics.h"
1819
#include "../reftable/reftable-stack.h"
1920
#include "../reftable/reftable-record.h"
2021
#include "../reftable/reftable-error.h"
@@ -23,6 +24,7 @@
2324
#include "../setup.h"
2425
#include "../strmap.h"
2526
#include "../trace2.h"
27+
#include "../write-or-die.h"
2628
#include "parse.h"
2729
#include "refs-internal.h"
2830

@@ -272,6 +274,11 @@ static int reftable_be_config(const char *var, const char *value,
272274
return 0;
273275
}
274276

277+
static int reftable_be_fsync(int fd)
278+
{
279+
return fsync_component(FSYNC_COMPONENT_REFERENCE, fd);
280+
}
281+
275282
static struct ref_store *reftable_be_init(struct repository *repo,
276283
const char *gitdir,
277284
unsigned int store_flags)
@@ -289,11 +296,21 @@ static struct ref_store *reftable_be_init(struct repository *repo,
289296
refs->store_flags = store_flags;
290297
refs->log_all_ref_updates = repo_settings_get_log_all_ref_updates(repo);
291298

292-
refs->write_options.hash_id = repo->hash_algo->format_id;
299+
switch (repo->hash_algo->format_id) {
300+
case GIT_SHA1_FORMAT_ID:
301+
refs->write_options.hash_id = REFTABLE_HASH_SHA1;
302+
break;
303+
case GIT_SHA256_FORMAT_ID:
304+
refs->write_options.hash_id = REFTABLE_HASH_SHA256;
305+
break;
306+
default:
307+
BUG("unknown hash algorithm %d", repo->hash_algo->format_id);
308+
}
293309
refs->write_options.default_permissions = calc_shared_perm(0666 & ~mask);
294310
refs->write_options.disable_auto_compact =
295311
!git_env_bool("GIT_TEST_REFTABLE_AUTOCOMPACTION", 1);
296312
refs->write_options.lock_timeout_ms = 100;
313+
refs->write_options.fsync = reftable_be_fsync;
297314

298315
git_config(reftable_be_config, &refs->write_options);
299316

reftable/basics.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -271,14 +271,15 @@ int common_prefix_size(struct reftable_buf *a, struct reftable_buf *b)
271271
return p;
272272
}
273273

274-
int hash_size(uint32_t id)
274+
int hash_size(enum reftable_hash id)
275275
{
276+
if (!id)
277+
return REFTABLE_HASH_SIZE_SHA1;
276278
switch (id) {
277-
case 0:
278-
case GIT_SHA1_FORMAT_ID:
279-
return GIT_SHA1_RAWSZ;
280-
case GIT_SHA256_FORMAT_ID:
281-
return GIT_SHA256_RAWSZ;
279+
case REFTABLE_HASH_SHA1:
280+
return REFTABLE_HASH_SIZE_SHA1;
281+
case REFTABLE_HASH_SHA256:
282+
return REFTABLE_HASH_SIZE_SHA256;
282283
}
283284
abort();
284285
}

reftable/basics.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,14 @@ char *reftable_strdup(const char *str);
148148
/* Find the longest shared prefix size of `a` and `b` */
149149
int common_prefix_size(struct reftable_buf *a, struct reftable_buf *b);
150150

151-
int hash_size(uint32_t id);
151+
int hash_size(enum reftable_hash id);
152+
153+
/*
154+
* Format IDs that identify the hash function used by a reftable. Note that
155+
* these constants end up on disk and thus mustn't change. The format IDs are
156+
* "sha1" and "s256" in big endian, respectively.
157+
*/
158+
#define REFTABLE_FORMAT_ID_SHA1 ((uint32_t) 0x73686131)
159+
#define REFTABLE_FORMAT_ID_SHA256 ((uint32_t) 0x73323536)
152160

153161
#endif

reftable/merged.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ static void iterator_from_merged_iter(struct reftable_iterator *it,
181181

182182
int reftable_merged_table_new(struct reftable_merged_table **dest,
183183
struct reftable_reader **readers, size_t n,
184-
uint32_t hash_id)
184+
enum reftable_hash hash_id)
185185
{
186186
struct reftable_merged_table *m = NULL;
187187
uint64_t last_max = 0;
@@ -293,7 +293,7 @@ int reftable_merged_table_init_log_iterator(struct reftable_merged_table *mt,
293293
return merged_table_init_iter(mt, it, BLOCK_TYPE_LOG);
294294
}
295295

296-
uint32_t reftable_merged_table_hash_id(struct reftable_merged_table *mt)
296+
enum reftable_hash reftable_merged_table_hash_id(struct reftable_merged_table *mt)
297297
{
298298
return mt->hash_id;
299299
}

reftable/merged.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,12 @@ license that can be found in the LICENSE file or at
1010
#define MERGED_H
1111

1212
#include "system.h"
13+
#include "reftable-basics.h"
1314

1415
struct reftable_merged_table {
1516
struct reftable_reader **readers;
1617
size_t readers_len;
17-
uint32_t hash_id;
18+
enum reftable_hash hash_id;
1819

1920
/* If unset, produce deletions. This is useful for compaction. For the
2021
* full stack, deletions should be produced. */

reftable/reader.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ static int reader_get_block(struct reftable_reader *r,
6767
return block_source_read_block(&r->source, dest, off, sz);
6868
}
6969

70-
uint32_t reftable_reader_hash_id(struct reftable_reader *r)
70+
enum reftable_hash reftable_reader_hash_id(struct reftable_reader *r)
7171
{
7272
return r->hash_id;
7373
}
@@ -107,18 +107,20 @@ static int parse_footer(struct reftable_reader *r, uint8_t *footer,
107107
f += 8;
108108

109109
if (r->version == 1) {
110-
r->hash_id = GIT_SHA1_FORMAT_ID;
110+
r->hash_id = REFTABLE_HASH_SHA1;
111111
} else {
112-
r->hash_id = get_be32(f);
113-
switch (r->hash_id) {
114-
case GIT_SHA1_FORMAT_ID:
112+
switch (get_be32(f)) {
113+
case REFTABLE_FORMAT_ID_SHA1:
114+
r->hash_id = REFTABLE_HASH_SHA1;
115115
break;
116-
case GIT_SHA256_FORMAT_ID:
116+
case REFTABLE_FORMAT_ID_SHA256:
117+
r->hash_id = REFTABLE_HASH_SHA256;
117118
break;
118119
default:
119120
err = REFTABLE_FORMAT_ERROR;
120121
goto done;
121122
}
123+
122124
f += 4;
123125
}
124126

reftable/reader.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ struct reftable_reader {
3737
/* Size of the file, excluding the footer. */
3838
uint64_t size;
3939

40-
/* 'sha1' for SHA1, 's256' for SHA-256 */
41-
uint32_t hash_id;
40+
/* The hash function used for ref records. */
41+
enum reftable_hash hash_id;
4242

4343
uint32_t block_size;
4444
uint64_t min_update_index;

reftable/reftable-basics.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,19 @@
1111

1212
#include <stddef.h>
1313

14+
/*
15+
* Hash functions understood by the reftable library. Note that the values are
16+
* arbitrary and somewhat random such that we can easily detect cases where the
17+
* hash hasn't been properly set up.
18+
*/
19+
enum reftable_hash {
20+
REFTABLE_HASH_SHA1 = 89,
21+
REFTABLE_HASH_SHA256 = 247,
22+
};
23+
#define REFTABLE_HASH_SIZE_SHA1 20
24+
#define REFTABLE_HASH_SIZE_SHA256 32
25+
#define REFTABLE_HASH_SIZE_MAX REFTABLE_HASH_SIZE_SHA256
26+
1427
/* Overrides the functions to use for memory management. */
1528
void reftable_set_alloc(void *(*malloc)(size_t),
1629
void *(*realloc)(void *, size_t), void (*free)(void *));

reftable/reftable-merged.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ struct reftable_reader;
3434
*/
3535
int reftable_merged_table_new(struct reftable_merged_table **dest,
3636
struct reftable_reader **readers, size_t n,
37-
uint32_t hash_id);
37+
enum reftable_hash hash_id);
3838

3939
/* Initialize a merged table iterator for reading refs. */
4040
int reftable_merged_table_init_ref_iterator(struct reftable_merged_table *mt,
@@ -56,6 +56,6 @@ reftable_merged_table_min_update_index(struct reftable_merged_table *mt);
5656
void reftable_merged_table_free(struct reftable_merged_table *m);
5757

5858
/* return the hash ID of the merged table. */
59-
uint32_t reftable_merged_table_hash_id(struct reftable_merged_table *m);
59+
enum reftable_hash reftable_merged_table_hash_id(struct reftable_merged_table *m);
6060

6161
#endif

0 commit comments

Comments
 (0)