Просмотр исходного кода

Merge pull request #60 from overleaf/sk-gc-before-swap

Run GC before swap
Shane Kilkelly 7 лет назад
Родитель
Сommit
980a2ab98f

+ 7 - 0
services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/repo/FSGitRepoStore.java

@@ -139,6 +139,13 @@ public class FSGitRepoStore implements RepoStore {
         return Tar.bz2.zip(getDotGitForProject(projectName), sizePtr);
     }
 
+    @Override
+    public void gcProject(String projectName) throws IOException {
+        Project.checkValidProjectName(projectName);
+        ProjectRepo repo = getExistingRepo(projectName);
+        repo.runGC();
+    }
+
     @Override
     public void remove(String projectName) throws IOException {
         Project.checkValidProjectName(projectName);

+ 2 - 0
services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/repo/RepoStore.java

@@ -50,6 +50,8 @@ public interface RepoStore {
         return bzip2Project(projectName, null);
     }
 
+    void gcProject(String projectName) throws IOException;
+
     /**
      * Called after {@link #bzip2Project(String, long[])}'s has been safely
      * uploaded to the swap store. Removes all traces of the project from disk,

+ 4 - 2
services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/bridge/swap/job/SwapJobImpl.java

@@ -118,10 +118,11 @@ public class SwapJobImpl implements SwapJob {
                 (totalSize = repoStore.totalSize()) > lowWatermarkBytes &&
                 (numProjects = dbStore.getNumUnswappedProjects()) > minProjects
         ) {
+            String projectName = dbStore.getOldestUnswappedProject();
             try {
-                evict(dbStore.getOldestUnswappedProject());
+                evict(projectName);
             } catch (IOException e) {
-                Log.warn("Exception while swapping, giving up", e);
+                Log.warn("[{}] Exception while swapping, giving up", projectName, e);
             }
         }
         if (totalSize > lowWatermarkBytes) {
@@ -161,6 +162,7 @@ public class SwapJobImpl implements SwapJob {
         Preconditions.checkNotNull(projName, "projName was null");
         Log.info("Evicting project: {}", projName);
         try (LockGuard __ = lock.lockGuard(projName)) {
+            repoStore.gcProject(projName);
             long[] sizePtr = new long[1];
             try (InputStream blob = repoStore.bzip2Project(projName, sizePtr)) {
                 swapStore.upload(projName, blob, sizePtr[0]);