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

Added per-project synchronisation.

Winston Li 12 лет назад
Родитель
Сommit
08277baa77

+ 2 - 0
services/git-bridge/src/uk/ac/ic/wlgitbridge/bridge/WLBridgedProject.java

@@ -27,11 +27,13 @@ public class WLBridgedProject {
     }
 
     public void buildRepository() throws RepositoryNotFoundException, ServiceNotEnabledException, FailedConnectionException {
+        writeLatexDataSource.lockForProject(name);
         if (repository.getObjectDatabase().exists()) {
             updateRepositoryFromSnapshots(repository);
         } else {
             buildRepositoryFromScratch(repository);
         }
+        writeLatexDataSource.unlockForProject(name);
     }
 
     private void updateRepositoryFromSnapshots(Repository repository) throws ServiceNotEnabledException, RepositoryNotFoundException, FailedConnectionException {

+ 4 - 0
services/git-bridge/src/uk/ac/ic/wlgitbridge/bridge/WriteLatexDataSource.java

@@ -13,6 +13,10 @@ import java.util.List;
  */
 public interface WriteLatexDataSource {
 
+    void lockForProject(String projectName);
+
+    void unlockForProject(String projectName);
+
     /* Called by request thread. */
     public boolean repositoryExists(String projectName) throws FailedConnectionException;
     public List<WritableRepositoryContents> getWritableRepositories(String projectName) throws FailedConnectionException, InvalidProjectException;

+ 34 - 1
services/git-bridge/src/uk/ac/ic/wlgitbridge/writelatex/WriteLatexAPI.java

@@ -16,7 +16,11 @@ import uk.ac.ic.wlgitbridge.writelatex.api.request.push.exception.SnapshotPostEx
 import uk.ac.ic.wlgitbridge.writelatex.model.WLDataModel;
 
 import java.io.IOException;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
 
 /**
  * Created by Winston on 16/11/14.
@@ -25,20 +29,48 @@ public class WriteLatexAPI implements WriteLatexDataSource {
 
     private final WLDataModel dataModel;
     private final PostbackManager postbackManager;
+    private final Map<String, Lock> projectLocks;
+    private final Lock projectLocksLock;
 
     public WriteLatexAPI(WLDataModel dataModel) {
         this.dataModel = dataModel;
         postbackManager = new PostbackManager();
+        projectLocks = new HashMap<String, Lock>();
+        projectLocksLock = new ReentrantLock();
+    }
+
+    private Lock getLockForProjectName(String projectName) {
+        projectLocksLock.lock();
+        Lock lock = projectLocks.get(projectName);
+        if (lock == null) {
+            lock = new ReentrantLock();
+            projectLocks.put(projectName, lock);
+        }
+        projectLocksLock.unlock();
+        return lock;
+    }
+
+    @Override
+    public void lockForProject(String projectName) {
+        getLockForProjectName(projectName).lock();
+    }
+
+    @Override
+    public void unlockForProject(String projectName) {
+        getLockForProjectName(projectName).unlock();
     }
 
     @Override
     public boolean repositoryExists(String projectName) throws FailedConnectionException {
+        lockForProject(projectName);
         SnapshotGetDocRequest snapshotGetDocRequest = new SnapshotGetDocRequest(projectName);
         snapshotGetDocRequest.request();
         try {
             snapshotGetDocRequest.getResult().getVersionID();
         } catch (InvalidProjectException e) {
             return false;
+        } finally {
+            unlockForProject(projectName);
         }
         return true;
     }
@@ -46,7 +78,8 @@ public class WriteLatexAPI implements WriteLatexDataSource {
     @Override
     public List<WritableRepositoryContents> getWritableRepositories(String projectName) throws FailedConnectionException, InvalidProjectException {
         System.out.println("Fetching project: " + projectName);
-        return dataModel.updateProjectWithName(projectName);
+        List<WritableRepositoryContents> writableRepositoryContents = dataModel.updateProjectWithName(projectName);
+        return writableRepositoryContents;
     }
 
     @Override