diff --git a/scm-core/src/main/java/sonia/scm/repository/util/CachingAllWorkdirProvider.java b/scm-core/src/main/java/sonia/scm/repository/util/CachingAllWorkdirProvider.java index 75fcf24799..e66f2fb7ae 100644 --- a/scm-core/src/main/java/sonia/scm/repository/util/CachingAllWorkdirProvider.java +++ b/scm-core/src/main/java/sonia/scm/repository/util/CachingAllWorkdirProvider.java @@ -24,6 +24,9 @@ package sonia.scm.repository.util; +import com.google.common.base.Stopwatch; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import sonia.scm.util.IOUtil; import javax.inject.Inject; @@ -34,6 +37,8 @@ import java.util.concurrent.ConcurrentHashMap; public class CachingAllWorkdirProvider implements CacheSupportingWorkdirProvider { + private static final Logger LOG = LoggerFactory.getLogger(CachingAllWorkdirProvider.class); + private final Map workdirs = new ConcurrentHashMap<>(); private final WorkdirProvider workdirProvider; @@ -48,19 +53,27 @@ public class CachingAllWorkdirProvider implements CacheSupportingWorkdirProvider String id = createWorkdirContext.getScmRepository().getId(); File existingWorkdir = workdirs.remove(id); if (existingWorkdir != null) { + Stopwatch stopwatch = Stopwatch.createStarted(); try { - return createWorkdirContext.getReclaimer().reclaim(existingWorkdir); + SimpleWorkdirFactory.ParentAndClone reclaimed = createWorkdirContext.getReclaimer().reclaim(existingWorkdir); + LOG.debug("reclaimed workdir for {} in path {} in {}", createWorkdirContext.getScmRepository().getNamespaceAndName(), existingWorkdir, stopwatch.stop()); + return reclaimed; } catch (SimpleWorkdirFactory.ReclaimFailedException e) { + LOG.debug("failed to relaim workdir for {} in path {} in {}", createWorkdirContext.getScmRepository().getNamespaceAndName(), existingWorkdir, stopwatch.stop(), e); deleteWorkdir(existingWorkdir); } } - return createNewWorkdir(createWorkdirContext.getInitializer(), id); + return createNewWorkdir(createWorkdirContext); } - public SimpleWorkdirFactory.ParentAndClone createNewWorkdir(SimpleWorkdirFactory.WorkdirInitializer initializer, String id) throws IOException { + private SimpleWorkdirFactory.ParentAndClone createNewWorkdir(CreateWorkdirContext createWorkdirContext) throws IOException { + String id = createWorkdirContext.getScmRepository().getId(); + Stopwatch stopwatch = Stopwatch.createStarted(); File newWorkdir = workdirProvider.createNewWorkdir(); workdirs.put(id, newWorkdir); - return initializer.initialize(newWorkdir); + SimpleWorkdirFactory.ParentAndClone parentAndClone = createWorkdirContext.getInitializer().initialize(newWorkdir); + LOG.debug("initialized new workdir for {} in path {} in {}", createWorkdirContext.getScmRepository().getNamespaceAndName(), newWorkdir, stopwatch.stop()); + return parentAndClone; } @Override