Merge branch 'ds/close-object-store'

The commit-graph file is now part of the "files that the runtime
may keep open file descriptors on, all of which would need to be
closed when done with the object store", and the file descriptor to
an existing commit-graph file now is closed before "gc" finalizes a
new instance to replace it.

* ds/close-object-store:
  packfile: rename close_all_packs to close_object_store
  packfile: close commit-graph in close_all_packs
  commit-graph: use raw_object_store when closing
This commit is contained in:
Junio C Hamano 2019-07-09 15:25:37 -07:00
Родитель e1168940ce 2d511cfc0b
Коммит 5cb7c73589
14 изменённых файлов: 21 добавлений и 18 удалений

Просмотреть файл

@ -1801,7 +1801,7 @@ next:
*/ */
if (!state->rebasing) { if (!state->rebasing) {
am_destroy(state); am_destroy(state);
close_all_packs(the_repository->objects); close_object_store(the_repository->objects);
run_command_v_opt(argv_gc_auto, RUN_GIT_CMD); run_command_v_opt(argv_gc_auto, RUN_GIT_CMD);
} }
} }

Просмотреть файл

@ -1252,7 +1252,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
transport_disconnect(transport); transport_disconnect(transport);
if (option_dissociate) { if (option_dissociate) {
close_all_packs(the_repository->objects); close_object_store(the_repository->objects);
dissociate_from_references(); dissociate_from_references();
} }

Просмотреть файл

@ -1680,7 +1680,7 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
string_list_clear(&list, 0); string_list_clear(&list, 0);
close_all_packs(the_repository->objects); close_object_store(the_repository->objects);
argv_array_pushl(&argv_gc_auto, "gc", "--auto", NULL); argv_array_pushl(&argv_gc_auto, "gc", "--auto", NULL);
if (verbosity < 0) if (verbosity < 0)

Просмотреть файл

@ -653,7 +653,7 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
gc_before_repack(); gc_before_repack();
if (!repository_format_precious_objects) { if (!repository_format_precious_objects) {
close_all_packs(the_repository->objects); close_object_store(the_repository->objects);
if (run_command_v_opt(repack.argv, RUN_GIT_CMD)) if (run_command_v_opt(repack.argv, RUN_GIT_CMD))
die(FAILED_RUN, repack.argv[0]); die(FAILED_RUN, repack.argv[0]);
@ -681,7 +681,7 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
report_garbage = report_pack_garbage; report_garbage = report_pack_garbage;
reprepare_packed_git(the_repository); reprepare_packed_git(the_repository);
if (pack_garbage.nr > 0) { if (pack_garbage.nr > 0) {
close_all_packs(the_repository->objects); close_object_store(the_repository->objects);
clean_pack_garbage(); clean_pack_garbage();
} }

Просмотреть файл

@ -453,7 +453,7 @@ static void finish(struct commit *head_commit,
* We ignore errors in 'gc --auto', since the * We ignore errors in 'gc --auto', since the
* user should see them. * user should see them.
*/ */
close_all_packs(the_repository->objects); close_object_store(the_repository->objects);
run_command_v_opt(argv_gc_auto, RUN_GIT_CMD); run_command_v_opt(argv_gc_auto, RUN_GIT_CMD);
} }
} }

Просмотреть файл

@ -741,7 +741,7 @@ static int finish_rebase(struct rebase_options *opts)
delete_ref(NULL, "REBASE_HEAD", NULL, REF_NO_DEREF); delete_ref(NULL, "REBASE_HEAD", NULL, REF_NO_DEREF);
apply_autostash(opts); apply_autostash(opts);
close_all_packs(the_repository->objects); close_object_store(the_repository->objects);
/* /*
* We ignore errors in 'gc --auto', since the * We ignore errors in 'gc --auto', since the
* user should see them. * user should see them.

Просмотреть файл

@ -2042,7 +2042,7 @@ int cmd_receive_pack(int argc, const char **argv, const char *prefix)
proc.git_cmd = 1; proc.git_cmd = 1;
proc.argv = argv_gc_auto; proc.argv = argv_gc_auto;
close_all_packs(the_repository->objects); close_object_store(the_repository->objects);
if (!start_command(&proc)) { if (!start_command(&proc)) {
if (use_sideband) if (use_sideband)
copy_to_sideband(proc.err, -1, NULL); copy_to_sideband(proc.err, -1, NULL);

Просмотреть файл

@ -422,7 +422,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
if (!names.nr && !po_args.quiet) if (!names.nr && !po_args.quiet)
printf_ln(_("Nothing new to pack.")); printf_ln(_("Nothing new to pack."));
close_all_packs(the_repository->objects); close_object_store(the_repository->objects);
/* /*
* Ok we have prepared all new packfiles. * Ok we have prepared all new packfiles.

Просмотреть файл

@ -361,10 +361,10 @@ int generation_numbers_enabled(struct repository *r)
return !!first_generation; return !!first_generation;
} }
void close_commit_graph(struct repository *r) void close_commit_graph(struct raw_object_store *o)
{ {
free_commit_graph(r->objects->commit_graph); free_commit_graph(o->commit_graph);
r->objects->commit_graph = NULL; o->commit_graph = NULL;
} }
static int bsearch_graph(struct commit_graph *g, struct object_id *oid, uint32_t *pos) static int bsearch_graph(struct commit_graph *g, struct object_id *oid, uint32_t *pos)
@ -1093,7 +1093,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
stop_progress(&ctx->progress); stop_progress(&ctx->progress);
strbuf_release(&progress_title); strbuf_release(&progress_title);
close_commit_graph(ctx->r); close_commit_graph(ctx->r->objects);
finalize_hashfile(f, NULL, CSUM_HASH_IN_STREAM | CSUM_FSYNC); finalize_hashfile(f, NULL, CSUM_HASH_IN_STREAM | CSUM_FSYNC);
commit_lock_file(&lk); commit_lock_file(&lk);

Просмотреть файл

@ -82,7 +82,7 @@ int write_commit_graph(const char *obj_dir,
int verify_commit_graph(struct repository *r, struct commit_graph *g); int verify_commit_graph(struct repository *r, struct commit_graph *g);
void close_commit_graph(struct repository *); void close_commit_graph(struct raw_object_store *);
void free_commit_graph(struct commit_graph *); void free_commit_graph(struct commit_graph *);
#endif #endif

Просмотреть файл

@ -517,7 +517,7 @@ void raw_object_store_clear(struct raw_object_store *o)
o->loaded_alternates = 0; o->loaded_alternates = 0;
INIT_LIST_HEAD(&o->packed_git_mru); INIT_LIST_HEAD(&o->packed_git_mru);
close_all_packs(o); close_object_store(o);
o->packed_git = NULL; o->packed_git = NULL;
} }

Просмотреть файл

@ -16,6 +16,7 @@
#include "tree.h" #include "tree.h"
#include "object-store.h" #include "object-store.h"
#include "midx.h" #include "midx.h"
#include "commit-graph.h"
char *odb_pack_name(struct strbuf *buf, char *odb_pack_name(struct strbuf *buf,
const unsigned char *sha1, const unsigned char *sha1,
@ -336,7 +337,7 @@ void close_pack(struct packed_git *p)
close_pack_index(p); close_pack_index(p);
} }
void close_all_packs(struct raw_object_store *o) void close_object_store(struct raw_object_store *o)
{ {
struct packed_git *p; struct packed_git *p;
@ -350,6 +351,8 @@ void close_all_packs(struct raw_object_store *o)
close_midx(o->multi_pack_index); close_midx(o->multi_pack_index);
o->multi_pack_index = NULL; o->multi_pack_index = NULL;
} }
close_commit_graph(o);
} }
/* /*

Просмотреть файл

@ -90,7 +90,7 @@ uint32_t get_pack_fanout(struct packed_git *p, uint32_t value);
unsigned char *use_pack(struct packed_git *, struct pack_window **, off_t, unsigned long *); unsigned char *use_pack(struct packed_git *, struct pack_window **, off_t, unsigned long *);
void close_pack_windows(struct packed_git *); void close_pack_windows(struct packed_git *);
void close_pack(struct packed_git *); void close_pack(struct packed_git *);
void close_all_packs(struct raw_object_store *o); void close_object_store(struct raw_object_store *o);
void unuse_pack(struct pack_window **); void unuse_pack(struct pack_window **);
void clear_delta_base_cache(void); void clear_delta_base_cache(void);
struct packed_git *add_packed_git(const char *path, size_t path_len, int local); struct packed_git *add_packed_git(const char *path, size_t path_len, int local);

Просмотреть файл

@ -722,7 +722,7 @@ static void deepen_by_rev_list(struct packet_writer *writer, int ac,
{ {
struct commit_list *result; struct commit_list *result;
close_commit_graph(the_repository); close_commit_graph(the_repository->objects);
result = get_shallow_commits_by_rev_list(ac, av, SHALLOW, NOT_SHALLOW); result = get_shallow_commits_by_rev_list(ac, av, SHALLOW, NOT_SHALLOW);
send_shallow(writer, result); send_shallow(writer, result);
free_commit_list(result); free_commit_list(result);