Skip to content

Commit

Permalink
refactor: locks to manage concurrent project access
Browse files Browse the repository at this point in the history
Signed-off-by: Jonathan Howard <[email protected]>
  • Loading branch information
jhoward-lm committed Feb 17, 2025
1 parent 6cad00c commit d6ecd8c
Showing 1 changed file with 46 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.locks.Lock;

import com.google.common.util.concurrent.Striped;

import org.dependencytrack.integrations.AbstractIntegrationPoint;
import org.dependencytrack.integrations.PermissionsSyncer;
Expand All @@ -44,9 +47,12 @@ public class GitLabSyncer extends AbstractIntegrationPoint implements Permission
private static final String ROLE_CLAIM_PREFIX = "https://gitlab.org/claims/groups/";

Check warning on line 47 in src/main/java/org/dependencytrack/integrations/gitlab/GitLabSyncer.java

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

src/main/java/org/dependencytrack/integrations/gitlab/GitLabSyncer.java#L47

Avoid unused private fields such as 'ROLE_CLAIM_PREFIX'.

private final OidcUser user;
private final Striped<Lock> locks;

private GitLabClient gitLabClient;

public GitLabSyncer(final OidcUser user, final GitLabClient gitlabClient) {
this.locks = Striped.lock(128);
this.user = user;
this.gitLabClient = gitlabClient;
}
Expand Down Expand Up @@ -96,20 +102,28 @@ private List<Project> createProjects(List<GitLabProject> gitLabProjects) {
List<Project> projects = new ArrayList<>();

for (var gitLabProject : gitLabProjects) {
Project project = qm.getProject(gitLabProject.getFullPath(), null);
final Lock lock = locks.get(gitLabProject.getFullPath());
lock.lock();

if (project == null) {
LOGGER.debug("Creating project " + gitLabProject.getFullPath());
try {
Project project = qm.getProject(gitLabProject.getFullPath(), null);

project = new Project();
project.setName(gitLabProject.getFullPath());
project = qm.persist(project);
}
if (project == null) {
LOGGER.debug("Creating project " + gitLabProject.getFullPath());

project.setActive(project.getLastBomImport() != null);
if (!project.isActive() && project.getInactiveSince() == null)
project.setInactiveSince(new Date());
projects.add(qm.updateProject(project, false));
project = new Project();
project.setName(gitLabProject.getFullPath());
project = qm.persist(project);
}

project.setActive(project.getLastBomImport() != null);
if (!project.isActive() && project.getInactiveSince() == null)
project.setInactiveSince(new Date());

projects.add(qm.updateProject(project, false));
} finally {
lock.unlock();
}
}

return projects;
Expand All @@ -127,21 +141,27 @@ private List<Team> createProjectTeams(Project project) {

for (var role : GitLabRole.values()) {
final String teamName = "%s_%s".formatted(project.getName(), role.name());

Team team = qm.getTeam(teamName);
team = team != null ? team : qm.createTeam(teamName);

var permissions = gitLabClient.getRolePermissions(role).stream()
.map(rolePermission -> qm.getPermission(rolePermission.name()))
.filter(permission -> permission != null)
.distinct()
.toList();

team.setPermissions(permissions);
project.addAccessTeam(team);
qm.updateProject(project, false);

teams.add(team);
final Lock lock = locks.get(project.getName());
lock.lock();

try {
Team team = qm.getTeam(teamName);
team = team != null ? team : qm.createTeam(teamName);

var permissions = gitLabClient.getRolePermissions(role).stream()
.map(rolePermission -> qm.getPermission(rolePermission.name()))
.filter(permission -> permission != null)
.distinct()
.toList();

team.setPermissions(permissions);
project.addAccessTeam(team);
qm.updateProject(project, false);

teams.add(team);
} finally {
lock.unlock();
}
}

return teams;
Expand Down

0 comments on commit d6ecd8c

Please sign in to comment.