Skip to content

Commit e540abb

Browse files
committed
fix metadata fetch and gc
1 parent fb27fd4 commit e540abb

File tree

3 files changed

+66
-13
lines changed

3 files changed

+66
-13
lines changed

modules/zeta/backend/pack-objects.go

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,40 @@ func pruneObjects(ctx context.Context, opts *PackOptions, fo *fileStorer, object
194194
return count
195195
}
196196

197+
const (
198+
MaxLooseObjects = 2048
199+
MaxPacks = 4
200+
MinPackSize = 200 << 20 // 200M
201+
)
202+
203+
func hasTidyPacks(root string) bool {
204+
packDir := filepath.Join(root, "pack")
205+
entries, err := os.ReadDir(packDir)
206+
if err != nil {
207+
return false
208+
}
209+
var count int
210+
var hasTidyPack bool
211+
for _, e := range entries {
212+
if e.IsDir() {
213+
continue
214+
}
215+
name := e.Name()
216+
if !strings.HasSuffix(name, ".pack") {
217+
continue
218+
}
219+
count++
220+
si, err := e.Info()
221+
if err != nil {
222+
return false
223+
}
224+
if si.Size() < MinPackSize {
225+
hasTidyPack = true
226+
}
227+
}
228+
return hasTidyPack && count > 1
229+
}
230+
197231
func packObjectsInternal(ctx context.Context, opts *PackOptions, root string, meta bool) error {
198232
fo := newFileStorer(root, "", opts.CompressionALGO)
199233
packs, err := pack.NewScanner(root)
@@ -217,7 +251,7 @@ func packObjectsInternal(ctx context.Context, opts *PackOptions, root string, me
217251
step = "metadata"
218252
}
219253

220-
if len(looseObjects) == 0 {
254+
if len(looseObjects) == 0 && !hasTidyPacks(root) {
221255
// no small loose objects, skipped.
222256
opts.Printf("Pack %s objects: no smaller loose object, skipping packing.\n", step)
223257
return nil

pkg/serve/protocol/pack.go

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -329,15 +329,38 @@ func (p *Packer) WriteSparseTree(ctx context.Context, oid plumbing.Hash, m Spars
329329
return nil
330330
}
331331

332-
func (p *Packer) WriteDeepenMetadata(ctx context.Context, current *object.Commit, deepenFrom, have plumbing.Hash, deepen int) error {
333-
if deepen == -1 {
334-
deepen = math.MaxInt
335-
}
332+
func (p *Packer) newCommitIter(ctx context.Context, current *object.Commit, deepenFrom, have plumbing.Hash) object.CommitIter {
336333
haves := map[plumbing.Hash]bool{
337334
deepenFrom: true,
338335
have: true,
339336
}
340-
iter := object.NewCommitIterBSF(current, haves, nil)
337+
if !have.IsZero() {
338+
if cc, err := p.Commit(ctx, have); err == nil {
339+
if bases, err := current.MergeBase(ctx, cc); err == nil {
340+
for _, b := range bases {
341+
haves[b.Hash] = true
342+
}
343+
}
344+
}
345+
}
346+
if !deepenFrom.IsZero() {
347+
if cc, err := p.Commit(ctx, deepenFrom); err == nil {
348+
if bases, err := current.MergeBase(ctx, cc); err == nil {
349+
for _, b := range bases {
350+
haves[b.Hash] = true
351+
}
352+
353+
}
354+
}
355+
}
356+
return object.NewCommitIterBSF(current, haves, nil)
357+
}
358+
359+
func (p *Packer) WriteDeepenMetadata(ctx context.Context, current *object.Commit, deepenFrom, have plumbing.Hash, deepen int) error {
360+
if deepen == -1 {
361+
deepen = math.MaxInt
362+
}
363+
iter := p.newCommitIter(ctx, current, deepenFrom, have)
341364
defer iter.Close()
342365
for range deepen {
343366
cc, err := iter.Next(ctx)
@@ -363,11 +386,7 @@ func (p *Packer) WriteDeepenSparseMetadata(ctx context.Context, current *object.
363386
deepen = math.MaxInt
364387
}
365388
m := NewSparseTreeMatcher(paths)
366-
haves := map[plumbing.Hash]bool{
367-
deepenFrom: true,
368-
have: true,
369-
}
370-
iter := object.NewCommitIterBSF(current, haves, nil)
389+
iter := p.newCommitIter(ctx, current, deepenFrom, have)
371390
defer iter.Close()
372391
for range deepen {
373392
cc, err := iter.Next(ctx)

pkg/zeta/worktree_pull.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,13 @@ func (w *Worktree) Pull(ctx context.Context, opts *PullOptions) error {
7171
return nil
7272
}
7373

74-
fasfForward, err := w.isFastForward(ctx, current.Hash(), fo.FETCH_HEAD, ignoreParents)
74+
fastForward, err := w.isFastForward(ctx, current.Hash(), fo.FETCH_HEAD, ignoreParents)
7575
if err != nil {
7676
die_error("check fast-forward error: %v", err)
7777
return err
7878
}
7979
branchName := currentName.BranchName()
80-
if fasfForward {
80+
if fastForward {
8181
newRev := fo.FETCH_HEAD
8282
if !opts.FF {
8383
messagePrefix := fmt.Sprintf("Merge branch '%s of %s' into %s", branchName, w.cleanedRemote(), branchName)

0 commit comments

Comments
 (0)