首页 > 解决方案 > Spring Cloud Config 服务中的 JGit 错误:org.eclipse.jgit.errors.MissingObjectException:缺少树

问题描述

部署在我们内部环境中的 Spring Cloud 配置服务最近开始返回 500 错误,用于检索属性的简单请求。我看到的问题与此处报告的问题相同:

https://github.com/spring-cloud/spring-cloud-config/issues/522

Github 问题提到了一个修复,但显然它仍然被破坏。深入研究 JGit 库的源代码。起初它看起来像是文件系统的问题。所以我试图在我的本地系统上触发问题,但没有成功。更改 git 克隆属性文件的所有权或删除文件/目录等内容,但会导致代码的其他部分出错。所以我试图深入挖掘代码并查看下面的代码:

org.eclipse.jgit.internal.storage.file.WindowCursor(版本 org.eclipse.jgit 5.1.3.201810200350-r)

    public ObjectLoader open(AnyObjectId objectId, int typeHint)
            throws MissingObjectException, IncorrectObjectTypeException,
            IOException {
        final ObjectLoader ldr = db.openObject(this, objectId);
        if (ldr == null) {
            if (typeHint == OBJ_ANY)
                throw new MissingObjectException(objectId.copy(),
                        JGitText.get().unknownObjectType2);
            throw new MissingObjectException(objectId.copy(), typeHint);
        }

ldr对象从openObject调用中返回为 null。导航到 openObject 调用有很多原因可以返回 null。我不确定如何触发任何这些情况,因为代码引用了超出我对 Git 对象理解的内容。堆栈跟踪中的错误表明 git 对象丢失,但肯定不是因为重新启动 Spring Cloud 配置服务有效。

如果有人熟悉 Git 或 JGit,他们是否了解什么是坏的以及如何解决它?

Spring Cloud config version 2.2.3.RELEASE
Spring Boot version 2.3.2.RELEASE
Service deployed on an AWS EC2 instance
org.eclipse.jgit.errors.MissingObjectException: Missing tree <git_object_id>
    at org.eclipse.jgit.internal.storage.file.WindowCursor.open(WindowCursor.java:170) ~[org.eclipse.jgit-5.1.3.201810200350-r.jar!/:5.1.3.201810200350-r]
    at org.eclipse.jgit.treewalk.CanonicalTreeParser.reset(CanonicalTreeParser.java:224) ~[org.eclipse.jgit-5.1.3.201810200350-r.jar!/:5.1.3.201810200350-r]
    at org.eclipse.jgit.treewalk.CanonicalTreeParser.createSubtreeIterator0(CanonicalTreeParser.java:259) ~[org.eclipse.jgit-5.1.3.201810200350-r.jar!/:5.1.3.201810200350-r]
    at org.eclipse.jgit.treewalk.CanonicalTreeParser.createSubtreeIterator(CanonicalTreeParser.java:237) ~[org.eclipse.jgit-5.1.3.201810200350-r.jar!/:5.1.3.201810200350-r]
    at org.eclipse.jgit.treewalk.CanonicalTreeParser.createSubtreeIterator(CanonicalTreeParser.java:1) ~[org.eclipse.jgit-5.1.3.201810200350-r.jar!/:5.1.3.201810200350-r]
    at org.eclipse.jgit.treewalk.TreeWalk.enterSubtree(TreeWalk.java:1303) ~[org.eclipse.jgit-5.1.3.201810200350-r.jar!/:5.1.3.201810200350-r]
    at org.eclipse.jgit.treewalk.TreeWalk.next(TreeWalk.java:859) ~[org.eclipse.jgit-5.1.3.201810200350-r.jar!/:5.1.3.201810200350-r]
    at org.eclipse.jgit.lib.IndexDiff.diff(IndexDiff.java:445) ~[org.eclipse.jgit-5.1.3.201810200350-r.jar!/:5.1.3.201810200350-r]
    at org.eclipse.jgit.lib.IndexDiff.diff(IndexDiff.java:386) ~[org.eclipse.jgit-5.1.3.201810200350-r.jar!/:5.1.3.201810200350-r]
    at org.eclipse.jgit.api.StatusCommand.call(StatusCommand.java:155) ~[org.eclipse.jgit-5.1.3.201810200350-r.jar!/:5.1.3.201810200350-r]
    at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.shouldPull(JGitEnvironmentRepository.java:427) ~[spring-cloud-config-server-2.2.3.RELEASE.jar!/:2.2.3.RELEASE]
    at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.refresh(JGitEnvironmentRepository.java:269) ~[spring-cloud-config-server-2.2.3.RELEASE.jar!/:2.2.3.RELEASE]
    at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.getLocations(JGitEnvironmentRepository.java:246) ~[spring-cloud-config-server-2.2.3.RELEASE.jar!/:2.2.3.RELEASE]
    at org.springframework.cloud.config.server.environment.MultipleJGitEnvironmentRepository.getLocations(MultipleJGitEnvironmentRepository.java:146) ~[spring-cloud-config-server-2.2.3.RELEASE.jar!/:2.2.3.RELEASE]
    at org.springframework.cloud.config.server.environment.AbstractScmEnvironmentRepository.findOne(AbstractScmEnvironmentRepository.java:57) ~[spring-cloud-config-server-2.2.3.RELEASE.jar!/:2.2.3.RELEASE]
    at org.springframework.cloud.config.server.environment.MultipleJGitEnvironmentRepository.findOne(MultipleJGitEnvironmentRepository.java:187) ~[spring-cloud-config-server-2.2.3.RELEASE.jar!/:2.2.3.RELEASE]
    at org.springframework.cloud.config.server.environment.CompositeEnvironmentRepository.findOne(CompositeEnvironmentRepository.java:58) ~[spring-cloud-config-server-2.2.3.RELEASE.jar!/:2.2.3.RELEASE]
    at org.springframework.cloud.config.server.environment.EnvironmentEncryptorEnvironmentRepository.findOne(EnvironmentEncryptorEnvironmentRepository.java:61) ~[spring-cloud-config-server-2.2.3.RELEASE.jar!/:2.2.3.RELEASE]
    at org.springframework.cloud.config.server.environment.EnvironmentController.getEnvironment(EnvironmentController.java:136) ~[spring-cloud-config-server-2.2.3.RELEASE.jar!/:2.2.3.RELEASE]
    at org.springframework.cloud.config.server.environment.EnvironmentController.labelledIncludeOrigin(EnvironmentController.java:129) ~[spring-cloud-config-server-2.2.3.RELEASE.jar!/:2.2.3.RELEASE]

标签: gitamazon-web-servicesspring-cloudspring-cloud-configjgit

解决方案


推荐阅读