in src/main/java/com/googlesource/gerrit/plugins/lfs/locks/LfsProjectLocks.java [89:142]
LfsLock createLock(CurrentUser user, LfsCreateLockInput input) throws LfsException {
log.atFine().log("Create lock for %s in project %s", input.path, project);
String lockId = PathToLockId.CONVERTER.convert(input.path);
LfsLock lock = locks.getIfPresent(lockId);
if (lock != null) {
throw new LfsLockExistsException(lock);
}
lock =
new LfsLock(
lockId, input.path, LfsDateTime.now(), new LfsLockOwner(user.getUserName().get()));
LockFile fileLock = new LockFile(locksPath.resolve(lockId).toFile());
try {
if (!fileLock.lock()) {
log.atWarning().log("Cannot lock path [%s] in project %s", input.path, project);
throw new LfsLockExistsException(lock);
}
} catch (IOException e) {
String error =
String.format(
"Locking path [%s] in project %s failed with error %s",
input.path, project, e.getMessage());
log.atWarning().log(error);
throw new LfsException(error);
}
try {
try (OutputStreamWriter out = new OutputStreamWriter(fileLock.getOutputStream())) {
gson.toJson(lock, out);
} catch (IOException e) {
String error =
String.format(
"Locking path [%s] in project %s failed during write with error %s",
input.path, project, e.getMessage());
log.atWarning().log(error);
throw new LfsException(error);
}
if (!fileLock.commit()) {
String error =
String.format("Committing lock to path [%s] in project %s failed", input.path, project);
log.atWarning().log(error);
throw new LfsException(error);
}
// put lock object to cache while file lock is being hold so that
// there is no chance that other process performs lock operation
// in the meantime (either cache returns with existing object or
// LockFile.lock fails on locking attempt)
locks.put(lockId, lock);
} finally {
fileLock.unlock();
}
return lock;
}