csum-file: refactor finalize_hashfile() method
If we want to use a hashfile on the temporary file for a lockfile, then we need finalize_hashfile() to fully write the trailing hash but also keep the file descriptor open. Do this by adding a new CSUM_HASH_IN_STREAM flag along with a functional change that checks this flag before writing the checksum to the stream. This differs from previous behavior since it would be written if either CSUM_CLOSE or CSUM_FSYNC is provided. Signed-off-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
f2af9f5e02
commit
cfe83216e4
@ -837,9 +837,9 @@ static void write_pack_file(void)
|
|||||||
* If so, rewrite it like in fast-import
|
* If so, rewrite it like in fast-import
|
||||||
*/
|
*/
|
||||||
if (pack_to_stdout) {
|
if (pack_to_stdout) {
|
||||||
finalize_hashfile(f, oid.hash, CSUM_CLOSE);
|
finalize_hashfile(f, oid.hash, CSUM_HASH_IN_STREAM | CSUM_CLOSE);
|
||||||
} else if (nr_written == nr_remaining) {
|
} else if (nr_written == nr_remaining) {
|
||||||
finalize_hashfile(f, oid.hash, CSUM_FSYNC);
|
finalize_hashfile(f, oid.hash, CSUM_HASH_IN_STREAM | CSUM_FSYNC | CSUM_CLOSE);
|
||||||
} else {
|
} else {
|
||||||
int fd = finalize_hashfile(f, oid.hash, 0);
|
int fd = finalize_hashfile(f, oid.hash, 0);
|
||||||
fixup_pack_header_footer(fd, oid.hash, pack_tmp_name,
|
fixup_pack_header_footer(fd, oid.hash, pack_tmp_name,
|
||||||
|
@ -35,7 +35,7 @@ static void finish_bulk_checkin(struct bulk_checkin_state *state)
|
|||||||
unlink(state->pack_tmp_name);
|
unlink(state->pack_tmp_name);
|
||||||
goto clear_exit;
|
goto clear_exit;
|
||||||
} else if (state->nr_written == 1) {
|
} else if (state->nr_written == 1) {
|
||||||
finalize_hashfile(state->f, oid.hash, CSUM_FSYNC);
|
finalize_hashfile(state->f, oid.hash, CSUM_HASH_IN_STREAM | CSUM_FSYNC | CSUM_CLOSE);
|
||||||
} else {
|
} else {
|
||||||
int fd = finalize_hashfile(state->f, oid.hash, 0);
|
int fd = finalize_hashfile(state->f, oid.hash, 0);
|
||||||
fixup_pack_header_footer(fd, oid.hash, state->pack_tmp_name,
|
fixup_pack_header_footer(fd, oid.hash, state->pack_tmp_name,
|
||||||
|
@ -61,11 +61,11 @@ int finalize_hashfile(struct hashfile *f, unsigned char *result, unsigned int fl
|
|||||||
the_hash_algo->final_fn(f->buffer, &f->ctx);
|
the_hash_algo->final_fn(f->buffer, &f->ctx);
|
||||||
if (result)
|
if (result)
|
||||||
hashcpy(result, f->buffer);
|
hashcpy(result, f->buffer);
|
||||||
if (flags & (CSUM_CLOSE | CSUM_FSYNC)) {
|
if (flags & CSUM_HASH_IN_STREAM)
|
||||||
/* write checksum and close fd */
|
|
||||||
flush(f, f->buffer, the_hash_algo->rawsz);
|
flush(f, f->buffer, the_hash_algo->rawsz);
|
||||||
if (flags & CSUM_FSYNC)
|
if (flags & CSUM_FSYNC)
|
||||||
fsync_or_die(f->fd, f->name);
|
fsync_or_die(f->fd, f->name);
|
||||||
|
if (flags & CSUM_CLOSE) {
|
||||||
if (close(f->fd))
|
if (close(f->fd))
|
||||||
die_errno("%s: sha1 file error on close", f->name);
|
die_errno("%s: sha1 file error on close", f->name);
|
||||||
fd = 0;
|
fd = 0;
|
||||||
|
@ -27,8 +27,9 @@ extern void hashfile_checkpoint(struct hashfile *, struct hashfile_checkpoint *)
|
|||||||
extern int hashfile_truncate(struct hashfile *, struct hashfile_checkpoint *);
|
extern int hashfile_truncate(struct hashfile *, struct hashfile_checkpoint *);
|
||||||
|
|
||||||
/* finalize_hashfile flags */
|
/* finalize_hashfile flags */
|
||||||
#define CSUM_CLOSE 1
|
#define CSUM_CLOSE 1
|
||||||
#define CSUM_FSYNC 2
|
#define CSUM_FSYNC 2
|
||||||
|
#define CSUM_HASH_IN_STREAM 4
|
||||||
|
|
||||||
extern struct hashfile *hashfd(int fd, const char *name);
|
extern struct hashfile *hashfd(int fd, const char *name);
|
||||||
extern struct hashfile *hashfd_check(const char *name);
|
extern struct hashfile *hashfd_check(const char *name);
|
||||||
|
@ -535,7 +535,7 @@ void bitmap_writer_finish(struct pack_idx_entry **index,
|
|||||||
if (options & BITMAP_OPT_HASH_CACHE)
|
if (options & BITMAP_OPT_HASH_CACHE)
|
||||||
write_hash_cache(f, index, index_nr);
|
write_hash_cache(f, index, index_nr);
|
||||||
|
|
||||||
finalize_hashfile(f, NULL, CSUM_FSYNC);
|
finalize_hashfile(f, NULL, CSUM_HASH_IN_STREAM | CSUM_FSYNC | CSUM_CLOSE);
|
||||||
|
|
||||||
if (adjust_shared_perm(tmp_file.buf))
|
if (adjust_shared_perm(tmp_file.buf))
|
||||||
die_errno("unable to make temporary bitmap file readable");
|
die_errno("unable to make temporary bitmap file readable");
|
||||||
|
@ -170,8 +170,9 @@ const char *write_idx_file(const char *index_name, struct pack_idx_entry **objec
|
|||||||
}
|
}
|
||||||
|
|
||||||
hashwrite(f, sha1, the_hash_algo->rawsz);
|
hashwrite(f, sha1, the_hash_algo->rawsz);
|
||||||
finalize_hashfile(f, NULL, ((opts->flags & WRITE_IDX_VERIFY)
|
finalize_hashfile(f, NULL, CSUM_HASH_IN_STREAM | CSUM_CLOSE |
|
||||||
? CSUM_CLOSE : CSUM_FSYNC));
|
((opts->flags & WRITE_IDX_VERIFY)
|
||||||
|
? 0 : CSUM_FSYNC));
|
||||||
return index_name;
|
return index_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user