Modified index could not be written Could not delete file /git-repo/.git/index.lock
Hi everyone, we experience in our spring-cloud-config server following issue. I tried to search all issues here but none has mentioned anything regarding corrupted index.lock in local copy of the configuration repository. Our spring cloud server config properties
spring:
cloud:
config:
server:
git:
uri: ${GIT_ENDPOINT:https://our.bitbucket.server/scm/ic/configuration-repo.git}
username: ${GIT_USER}
password: ${GIT_PWD}
refresh-rate: 10
force-pull: true
clone-on-start: true
default-label: ${DEFAULT_BRANCH:develop}
delete-untracked-branches: true
basedir: /git-repo // it runs inside docker and we create extra directory with persmissios here RUN mkdir -p /git-repo RUN chmod 777 /git-repo, but it does have the same effect as no defining baseDir thus fallback to /tmp
We use force pull strategy, we tried as some suggestions provide the dedicated baseDir rather than default /tmp but the issues still persist
2021-04-19 06:31:39.748 ERROR 1 --- [o-8080-exec-572] o.e.jgit.internal.storage.file.LockFile : Unlocking LockFile '/git-repo/.git/index.lock' failed
java.io.IOException: Could not delete file /git-repo/.git/index.lock
at org.eclipse.jgit.util.FileUtils.delete(FileUtils.java:219) ~[org.eclipse.jgit-5.1.3.201810200350-r.jar:5.1.3.201810200350-r]
at org.eclipse.jgit.internal.storage.file.LockFile.unlock(LockFile.java:520) ~[org.eclipse.jgit-5.1.3.201810200350-r.jar:5.1.3.201810200350-r]
at org.eclipse.jgit.internal.storage.file.LockFile.commit(LockFile.java:456) ~[org.eclipse.jgit-5.1.3.201810200350-r.jar:5.1.3.201810200350-r]
at org.eclipse.jgit.dircache.DirCache.commit(DirCache.java:740) ~[org.eclipse.jgit-5.1.3.201810200350-r.jar:5.1.3.201810200350-r]
at org.eclipse.jgit.dircache.BaseDirCacheEditor.commit(BaseDirCacheEditor.java:278) ~[org.eclipse.jgit-5.1.3.201810200350-r.jar:5.1.3.201810200350-r]
at org.eclipse.jgit.dircache.DirCacheBuilder.commit(DirCacheBuilder.java:1) ~[org.eclipse.jgit-5.1.3.201810200350-r.jar:5.1.3.201810200350-r]
at org.eclipse.jgit.dircache.DirCacheCheckout.doCheckout(DirCacheCheckout.java:603) ~[org.eclipse.jgit-5.1.3.201810200350-r.jar:5.1.3.201810200350-r]
at org.eclipse.jgit.dircache.DirCacheCheckout.checkout(DirCacheCheckout.java:484) ~[org.eclipse.jgit-5.1.3.201810200350-r.jar:5.1.3.201810200350-r]
at org.eclipse.jgit.api.CheckoutCommand.call(CheckoutCommand.java:275) ~[org.eclipse.jgit-5.1.3.201810200350-r.jar:5.1.3.201810200350-r]
at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.checkout(JGitEnvironmentRepository.java:423) ~[spring-cloud-config-server-3.0.2.jar:3.0.2]
at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.refresh(JGitEnvironmentRepository.java:279) ~[spring-cloud-config-server-3.0.2.jar:3.0.2]
at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.getLocations(JGitEnvironmentRepository.java:244) ~[spring-cloud-config-server-3.0.2.jar:3.0.2]
at org.springframework.cloud.config.server.environment.AbstractScmEnvironmentRepository.findOne(AbstractScmEnvironmentRepository.java:55) ~[spring-cloud-config-server-3.0.2.jar:3.0.2]
at org.springframework.cloud.config.server.environment.CompositeEnvironmentRepository.findOne(CompositeEnvironmentRepository.java:64) ~[spring-cloud-config-server-3.0.2.jar:3.0.2]
at org.springframework.cloud.config.server.environment.EnvironmentEncryptorEnvironmentRepository.findOne(EnvironmentEncryptorEnvironmentRepository.java:61) ~[spring-cloud-config-server-3.0.2.jar:3.0.2]
at org.springframework.cloud.config.server.resource.ResourceController.retrieve(ResourceController.java:138) ~[spring-cloud-config-server-3.0.2.jar:3.0.2]
at org.springframework.cloud.config.server.resource.ResourceController.retrieve(ResourceController.java:106) ~[spring-cloud-config-server-3.0.2.jar:3.0.2]
at jdk.internal.reflect.GeneratedMethodAccessor84.invoke(Unknown Source) ~[na:na]
org.eclipse.jgit.errors.IndexWriteException: Modified index could not be written
at org.eclipse.jgit.dircache.DirCacheCheckout.doCheckout(DirCacheCheckout.java:604) ~[org.eclipse.jgit-5.1.3.201810200350-r.jar:5.1.3.201810200350-r]
at org.eclipse.jgit.dircache.DirCacheCheckout.checkout(DirCacheCheckout.java:484) ~[org.eclipse.jgit-5.1.3.201810200350-r.jar:5.1.3.201810200350-r]
at org.eclipse.jgit.api.CheckoutCommand.call(CheckoutCommand.java:275) ~[org.eclipse.jgit-5.1.3.201810200350-r.jar:5.1.3.201810200350-r]
at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.checkout(JGitEnvironmentRepository.java:423) ~[spring-cloud-config-server-3.0.2.jar:3.0.2]
at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.refresh(JGitEnvironmentRepository.java:279) ~[spring-cloud-config-server-3.0.2.jar:3.0.2]
at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.getLocations(JGitEnvironmentRepository.java:244) ~[spring-cloud-config-server-3.0.2.jar:3.0.2]
at org.springframework.cloud.config.server.environment.AbstractScmEnvironmentRepository.findOne(AbstractScmEnvironmentRepository.java:55) ~[spring-cloud-config-server-3.0.2.jar:3.0.2]
at org.springframework.cloud.config.server.environment.CompositeEnvironmentRepository.findOne(CompositeEnvironmentRepository.java:64) ~[spring-cloud-config-server-3.0.2.jar:3.0.2]
at org.springframework.cloud.config.server.environment.EnvironmentEncryptorEnvironmentRepository.findOne(EnvironmentEncryptorEnvironmentRepository.java:61) ~[spring-cloud-config-server-3.0.2.jar:3.0.2]
at org.springframework.cloud.config.server.resource.ResourceController.retrieve(ResourceController.java:138) ~[spring-cloud-config-server-3.0.2.jar:3.0.2]
at org.springframework.cloud.config.server.resource.ResourceController.retrieve(ResourceController.java:106) ~[spring-cloud-config-server-3.0.2.jar:3.0.2]
pom.xml excerpt
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2020.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Thank you in advance for any suggestion
Comment From: marecica2
I'm not sure if it relates somehow to Bitbucket merge strategy.
We are using -no-ff merge strategy on the configuration repository and we dont allow rewriting history neither force pushes into develop
and master
branches
Merge commit
--no-ff
DEFAULT
(default)
Always create a new merge commit and update the target branch to it, even if the source branch is already up to date with the target branch.
We do have after merging PRs as well lots of breaking CheckoutConflictException like this
org.eclipse.jgit.errors.CheckoutConflictException: Checkout conflict with files:
NP/public/schema.json
public/locales/en/resource.json
public/locales/nl/resource.json
at org.eclipse.jgit.dircache.DirCacheCheckout.doCheckout(DirCacheCheckout.java:516) ~[org.eclipse.jgit-5.1.3.201810200350-r.jar:5.1.3.201810200350-r]
at org.eclipse.jgit.dircache.DirCacheCheckout.checkout(DirCacheCheckout.java:484) ~[org.eclipse.jgit-5.1.3.201810200350-r.jar:5.1.3.201810200350-r]
at org.eclipse.jgit.api.CheckoutCommand.call(CheckoutCommand.java:275) ~[org.eclipse.jgit-5.1.3.201810200350-r.jar:5.1.3.201810200350-r]
Comment From: spencergibb
Can you recreate this issue outside of a docker image?
Comment From: spring-cloud-issues
If you would like us to look at this issue, please provide the requested information. If the information is not provided within the next 7 days this issue will be closed.
Comment From: marecica2
Can you recreate this issue outside of a docker image?
Unfortunately not. We run it inside k8s cluster and all changes on the underlying properties repository Our workaround for this issue is a custom aspectJ interceptor that does hard reset manually, which works but of couser isn't optimal solution. Is it known to happen only inside docker? Thank you for investigation
` @Component @Aspect @RequiredArgsConstructor @Slf4j public class ConflictAspect {
final private EnvironmentRepository repository;
@Around("execution(* org.springframework.cloud.config.server.resource.ResourceController.retrieve(..)) && args(name, profile, label, request, resolvePlaceholders)")
public Object interceptCall(ProceedingJoinPoint pjp, String name, String profile, String label,
ServletWebRequest request, boolean resolvePlaceholders) throws Throwable {
try {
return pjp.proceed();
} catch (Throwable err) {
if (err instanceof NoSuchResourceException) {
log.warn(err.getMessage());
throw err;
}
log.warn("Intercepted exception while retrieving git content", err);
try {
log.info("Trying to reset the repo..");
repository.reset(label);
log.info("Done repository reset");
} catch (Exception e) {
log.error("Unable to reset the repository");
throw e;
}
log.info("Retrying retrieval after repo reset...");
Object result = pjp.proceed();
log.info("Done.");
return result;
}
}
} `
Comment From: ryanjbaxter
Could you try this with Spring Cloud 2021.0.x or Spring Cloud 2022.0.x?
Comment From: spring-cloud-issues
If you would like us to look at this issue, please provide the requested information. If the information is not provided within the next 7 days this issue will be closed.
Comment From: spring-cloud-issues
Closing due to lack of requested feedback. If you would like us to look at this issue, please provide the requested information and we will re-open the issue.