commit ab6186ae7d9e4f25db5401fc5953073c1c27ce86 from: Stefan Sperling via: Thomas Adam date: Fri Oct 15 19:22:03 2021 UTC avoid opening delta base objects in genpack() just to find their size commit - e39a17e2af24e9e217862e7c5221afe33a65aa24 commit + ab6186ae7d9e4f25db5401fc5953073c1c27ce86 blob - ab321670f87d99ceb8e97a9fd709bab32f675dfe blob + 0182edd3af82986f364ff86ab43cee6b3b88f795 --- lib/pack_create.c +++ lib/pack_create.c @@ -54,6 +54,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 */ @@ -194,6 +195,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); @@ -1119,7 +1121,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; @@ -1189,11 +1191,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); @@ -1201,8 +1199,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); @@ -1251,8 +1247,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; }