Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [jgit-dev] Creating new refs on a repository with 100k packed-refs is slow

On 2020-10-06 12:16, kaushikl@xxxxxxxxxxxxxx wrote:
Hi,

We have noticed that creating a new ref takes ~600ms on a repository
with around 100k packed-refs.

My test repository:

    $ git count-objects -v
    count: 0
    size: 0
    in-pack: 100042
    packs: 1
    size-pack: 9734
    prune-packable: 0
    garbage: 0
    size-garbage: 0

    $ find refs/ -type f | wc -l
    0

Specs:

    Machine has 32 cores and 250G RAM.

    $ uname -r
    4.4.0-165-generic

    $ lsb_release -a
    No LSB modules are available.
    Distributor ID:    Ubuntu
    Description:    Ubuntu 16.04.6 LTS
    Release:    16.04
    Codename:    xenial

    Jgit version is 5.9

    $ java -version
    openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-8u242-b08-0ubuntu3~16.04-b08)
    OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)

Consider a small program[1] which creates a ref 'simple'. On executing
the program on my test repository, I see output:

simple: 677 ms

This seems slow. Is this expected behavior with jgit?


Adding repo-discuss@xxxxxxxxxxxxxxxx to Cc as this seems to be affecting notedb migration times of large projects.



[1]
package test;

import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;

import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;

public class Test {
  public static void main(String[] args) {
    try {
      String path = null;
      if (args.length == 1) {
        path = args[0];
      } else {
        System.out.println("Repo path must be specified.");
        System.exit(1);
      }
      String branch = "simple";
      try (Git git = Git.open(new File(path))) {
        Repository repo = git.getRepository();
        RevWalk walk = new RevWalk(repo);
        RevCommit commit =
walk.parseCommit(repo.exactRef("refs/heads/master").getObjectId());
        long startTimeInNanoSecs = System.nanoTime();
git.branchCreate().setName(branch).setStartPoint(commit).call(); long estimatedTimeInNanoSecs = System.nanoTime() - startTimeInNanoSecs;
        System.out.println(branch + ": " +
TimeUnit.NANOSECONDS.toMillis(estimatedTimeInNanoSecs) + " ms");
      }
    } catch (IllegalStateException | GitAPIException | IOException e) {
      e.printStackTrace();
    }
  }
}
_______________________________________________
jgit-dev mailing list
jgit-dev@xxxxxxxxxxx
To unsubscribe from this list, visit
https://www.eclipse.org/mailman/listinfo/jgit-dev


Back to the top