commit 600b755ed0123e8da4404f6cf4354d152355ac4d from: Stefan Sperling date: Thu Oct 14 20:30:26 2021 UTC avoid opening delta base objects in genpack() just to find their size commit - b4e0802fabd9a36f320a70b8aa668a66533cfb08 commit + 600b755ed0123e8da4404f6cf4354d152355ac4d blob - c3c388afd5a6cd1ee493a25dae36c7e13d0845ce blob + dce64b25f35227709c626d4d561698c07375c735 --- lib/pack_create.c +++ lib/pack_create.c @@ -56,6 +56,7 @@ struct got_pack_meta { struct got_object_id id; char *path; int obj_type; + off_t size; time_t mtime; /* The best delta we picked */ @@ -196,6 +197,7 @@ pick_deltas(struct got_pack_meta **meta, int nmeta, in err = got_object_raw_open(&raw, repo, &m->id, 8192); if (err) goto done; + m->size = raw->size; err = got_deltify_init(&m->dtab, raw->f, raw->hdrlen, raw->size + raw->hdrlen); @@ -1121,7 +1123,7 @@ genpack(uint8_t *pack_sha1, FILE *packfile, off_t nd; SHA1_CTX ctx; struct got_pack_meta *m; - struct got_raw_object *raw = NULL, *base_raw = NULL; + struct got_raw_object *raw = NULL; FILE *delta_file = NULL; char buf[32]; size_t outlen, n; @@ -1191,11 +1193,7 @@ genpack(uint8_t *pack_sha1, FILE *packfile, err = got_error_from_errno("fseeko"); goto done; } - err = got_object_raw_open(&base_raw, repo, - &m->prev->id, 8192); - if (err) - goto done; - err = encodedelta(m, raw, base_raw->size, delta_file); + err = encodedelta(m, raw, m->prev->size, delta_file); if (err) goto done; nd = ftello(delta_file); @@ -1203,8 +1201,6 @@ genpack(uint8_t *pack_sha1, FILE *packfile, err = got_error_from_errno("fseeko"); goto done; } - got_object_raw_close(base_raw); - base_raw = NULL; if (use_offset_deltas && m->prev->off != 0) { err = packhdr(&nh, buf, sizeof(buf), GOT_OBJ_TYPE_OFFSET_DELTA, nd); @@ -1253,8 +1249,6 @@ done: err = got_error_from_errno("fclose"); if (raw) got_object_raw_close(raw); - if (base_raw) - got_object_raw_close(base_raw); return err; }