Lock the target repository even before it is initialized.
Instead of relying on the "git init" to fail when the repository
is already created from another thread, create the repository lock
before the "git init" and let any other thread fail nicely.
Change-Id: I17e15e46ec761980a7b503d58b1f5d8e5b7ccfc3
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ProjectRestEndpoint.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ProjectRestEndpoint.java
index 0e10a8d..8101e3e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ProjectRestEndpoint.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ProjectRestEndpoint.java
@@ -82,29 +82,28 @@
@Override
public void run() {
- try {
- git.openRepository(name);
- logger.append(format("Repository %s already exists.", name.get()));
- return;
- } catch (RepositoryNotFoundException e) {
- // Ideal, project doesn't exist
- } catch (IOException e) {
- logger.append(e.getMessage());
+ LockFile importing = lockForImport(name);
+ if (importing == null) {
return;
}
- Repository repo;
try {
- repo = git.createRepository(name);
- } catch(IOException e) {
- logger.append(format("Error: %s, skipping project %s", e, name.get()));
- return;
- }
- LockFile importing = getLockFile(name);
- try {
- if (!importing.lock()) {
- logger.append(format("Project %s is being imported from another session"
- + ", skipping", name.get()));
+ try {
+ git.openRepository(name);
+ logger.append(format("Repository %s already exists.", name.get()));
+ return;
+ } catch (RepositoryNotFoundException e) {
+ // Ideal, project doesn't exist
+ } catch (IOException e) {
+ logger.append(e.getMessage());
+ return;
+ }
+
+ Repository repo;
+ try {
+ repo = git.createRepository(name);
+ } catch(IOException e) {
+ logger.append(format("Error: %s, skipping project %s", e, name.get()));
return;
}
@@ -116,22 +115,36 @@
.call();
logger.append(format("[INFO] Project '%s' imported: %s",
name.get(), fetchResult.getMessages()));
+ } catch(IOException | GitAPIException e) {
+ logger.append(format("[ERROR] Unable to transfere project '%s' from"
+ + " source gerrit host '%s': %s",
+ name.get(), fromGerrit, e.getMessage()));
} finally {
- importing.unlock();
- importing.commit();
+ repo.close();
}
- } catch(IOException | GitAPIException e) {
- logger.append(format("[ERROR] Unable to transfere project '%s' from"
- + " source gerrit host '%s': %s",
- name.get(), fromGerrit, e.getMessage()));
+
} finally {
- repo.close();
+ importing.unlock();
+ importing.commit();
}
}
- private LockFile getLockFile(Project.NameKey project) {
+ private LockFile lockForImport(Project.NameKey project) {
File importStatus = new File(lockRoot, project.get());
- return new LockFile(importStatus, FS.DETECTED);
+ LockFile lockFile = new LockFile(importStatus, FS.DETECTED);
+ try {
+ if (lockFile.lock()) {
+ return lockFile;
+ } else {
+ logger.append(format("Project %s is being imported from another session"
+ + ", skipping", name.get()));
+ return null;
+ }
+ } catch (IOException e1) {
+ logger.append(format(
+ "Error while trying to lock the project %s for import", name.get()));
+ return null;
+ }
}
}