HA support for entity visit info

This commit is contained in:
Robin Shen 2022-11-19 17:06:59 +08:00
parent 0e58e3c2f5
commit 13d0201e9e
16 changed files with 397 additions and 312 deletions

View File

@ -235,10 +235,10 @@ import io.onedev.server.infomanager.CommitInfoManager;
import io.onedev.server.infomanager.DefaultCommitInfoManager;
import io.onedev.server.infomanager.DefaultIssueInfoManager;
import io.onedev.server.infomanager.DefaultPullRequestInfoManager;
import io.onedev.server.infomanager.DefaultUserInfoManager;
import io.onedev.server.infomanager.DefaultVisitInfoManager;
import io.onedev.server.infomanager.IssueInfoManager;
import io.onedev.server.infomanager.PullRequestInfoManager;
import io.onedev.server.infomanager.UserInfoManager;
import io.onedev.server.infomanager.VisitInfoManager;
import io.onedev.server.jetty.DefaultJettyLauncher;
import io.onedev.server.jetty.JettyLauncher;
import io.onedev.server.job.DefaultJobManager;
@ -443,7 +443,7 @@ public class CoreModule extends AbstractPluginModule {
bind(RoleManager.class).to(DefaultRoleManager.class);
bind(CommitInfoManager.class).to(DefaultCommitInfoManager.class);
bind(IssueInfoManager.class).to(DefaultIssueInfoManager.class);
bind(UserInfoManager.class).to(DefaultUserInfoManager.class);
bind(VisitInfoManager.class).to(DefaultVisitInfoManager.class);
bind(BatchWorkManager.class).to(DefaultBatchWorkManager.class);
bind(WorkExecutor.class).to(DefaultWorkExecutor.class);
bind(GroupManager.class).to(DefaultGroupManager.class);

View File

@ -1,228 +0,0 @@
package io.onedev.server.infomanager;
import java.io.File;
import java.util.Date;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.joda.time.DateTime;
import com.google.common.collect.Lists;
import io.onedev.server.event.codecomment.CodeCommentEvent;
import io.onedev.server.event.entity.EntityRemoved;
import io.onedev.server.event.issue.IssueEvent;
import io.onedev.server.event.pubsub.Listen;
import io.onedev.server.event.pullrequest.PullRequestCodeCommentEvent;
import io.onedev.server.event.pullrequest.PullRequestEvent;
import io.onedev.server.model.CodeComment;
import io.onedev.server.model.Issue;
import io.onedev.server.model.PullRequest;
import io.onedev.server.model.User;
import io.onedev.server.persistence.annotation.Transactional;
import io.onedev.server.storage.StorageManager;
import jetbrains.exodus.env.Environment;
import jetbrains.exodus.env.Store;
import jetbrains.exodus.env.Transaction;
import jetbrains.exodus.env.TransactionalComputable;
import jetbrains.exodus.env.TransactionalExecutable;
/**
* Store project visit information here as we only need to load a single database to sort projects based on user
* visit information
*
* @author robin
*
*/
@Singleton
public class DefaultUserInfoManager extends AbstractMultiEnvironmentManager implements UserInfoManager {
private static final int INFO_VERSION = 6;
private static final String PULL_REQUEST_VISIT_STORE = "pullRequestVisit";
private static final String PULL_REQUEST_CODE_COMMENTS_VISIT_STORE = "pullRequestCodeCommentsVisit";
private static final String CODE_COMMENT_VISIT_STORE = "codeCommentVisit";
private static final String ISSUE_VISIT_STORE = "issueVisit";
private final StorageManager storageManager;
@Inject
public DefaultUserInfoManager(StorageManager storageManager) {
this.storageManager = storageManager;
}
@Transactional
@Listen
public void on(EntityRemoved event) {
if (event.getEntity() instanceof User)
removeEnv(event.getEntity().getId().toString());
}
@Override
protected File getEnvDir(String envKey) {
return storageManager.getUserInfoDir(Long.valueOf(envKey));
}
@Override
protected int getEnvVersion() {
return INFO_VERSION;
}
@Override
public void visitIssue(User user, Issue issue) {
Environment env = getEnv(issue.getProject().getId().toString());
Store store = getStore(env, ISSUE_VISIT_STORE);
env.executeInTransaction(new TransactionalExecutable() {
@Override
public void execute(Transaction txn) {
long time = new DateTime().plusSeconds(1).getMillis();
writeLong(store, txn, new LongsByteIterable(Lists.newArrayList(user.getId(), issue.getId())), time);
}
});
}
@Override
public void visitPullRequest(User user, PullRequest request) {
Environment env = getEnv(request.getTargetProject().getId().toString());
Store store = getStore(env, PULL_REQUEST_VISIT_STORE);
env.executeInTransaction(new TransactionalExecutable() {
@Override
public void execute(Transaction txn) {
long time = new DateTime().plusSeconds(1).getMillis();
writeLong(store, txn, new LongsByteIterable(Lists.newArrayList(user.getId(), request.getId())), time);
}
});
}
@Override
public void visitCodeComment(User user, CodeComment comment) {
Environment env = getEnv(comment.getProject().getId().toString());
Store store = getStore(env, CODE_COMMENT_VISIT_STORE);
env.executeInTransaction(new TransactionalExecutable() {
@Override
public void execute(Transaction txn) {
long time = new DateTime().plusSeconds(1).getMillis();
writeLong(store, txn, new LongsByteIterable(Lists.newArrayList(user.getId(), comment.getId())), time);
}
});
}
@Override
public Date getPullRequestVisitDate(User user, PullRequest request) {
Environment env = getEnv(request.getTargetProject().getId().toString());
Store store = getStore(env, PULL_REQUEST_VISIT_STORE);
return env.computeInTransaction(new TransactionalComputable<Date>() {
@Override
public Date compute(Transaction txn) {
long millis = readLong(store, txn, new LongsByteIterable(Lists.newArrayList(user.getId(), request.getId())), -1);
if (millis != -1)
return new Date(millis);
else
return null;
}
});
}
@Override
public Date getIssueVisitDate(User user, Issue issue) {
Environment env = getEnv(issue.getProject().getId().toString());
Store store = getStore(env, ISSUE_VISIT_STORE);
return env.computeInTransaction(new TransactionalComputable<Date>() {
@Override
public Date compute(Transaction txn) {
long millis = readLong(store, txn, new LongsByteIterable(Lists.newArrayList(user.getId(), issue.getId())), -1);
if (millis != -1)
return new Date(millis);
else
return null;
}
});
}
@Override
public Date getCodeCommentVisitDate(User user, CodeComment comment) {
Environment env = getEnv(comment.getProject().getId().toString());
Store store = getStore(env, CODE_COMMENT_VISIT_STORE);
return env.computeInTransaction(new TransactionalComputable<Date>() {
@Override
public Date compute(Transaction txn) {
long millis = readLong(store, txn, new LongsByteIterable(Lists.newArrayList(user.getId(), comment.getId())), -1);
if (millis != -1)
return new Date(millis);
else
return null;
}
});
}
@Listen
public void on(IssueEvent event) {
if (event.getUser() != null)
visitIssue(event.getUser(), event.getIssue());
}
@Listen
public void on(CodeCommentEvent event) {
if (event.getUser() != null)
visitCodeComment(event.getUser(), event.getComment());
}
@Listen
public void on(PullRequestEvent event) {
if (event.getUser() != null) {
visitPullRequest(event.getUser(), event.getRequest());
if (event instanceof PullRequestCodeCommentEvent)
visitPullRequestCodeComments(event.getUser(), event.getRequest());
}
}
@Override
public void visitPullRequestCodeComments(User user, PullRequest request) {
Environment env = getEnv(request.getTargetProject().getId().toString());
Store store = getStore(env, PULL_REQUEST_CODE_COMMENTS_VISIT_STORE);
env.executeInTransaction(new TransactionalExecutable() {
@Override
public void execute(Transaction txn) {
long time = new DateTime().plusSeconds(1).getMillis();
writeLong(store, txn, new LongsByteIterable(Lists.newArrayList(user.getId(), request.getId())), time);
}
});
}
@Override
public Date getPullRequestCodeCommentsVisitDate(User user, PullRequest request) {
Environment env = getEnv(request.getTargetProject().getId().toString());
Store store = getStore(env, PULL_REQUEST_CODE_COMMENTS_VISIT_STORE);
return env.computeInTransaction(new TransactionalComputable<Date>() {
@Override
public Date compute(Transaction txn) {
long millis = readLong(store, txn, new LongsByteIterable(Lists.newArrayList(user.getId(), request.getId())), -1);
if (millis != -1)
return new Date(millis);
else
return null;
}
});
}
}

View File

@ -0,0 +1,368 @@
package io.onedev.server.infomanager;
import java.io.File;
import java.io.ObjectStreamException;
import java.io.Serializable;
import java.util.Date;
import java.util.UUID;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.joda.time.DateTime;
import com.google.common.collect.Lists;
import io.onedev.commons.loader.ManagedSerializedForm;
import io.onedev.commons.utils.FileUtils;
import io.onedev.server.cluster.ClusterManager;
import io.onedev.server.cluster.ClusterTask;
import io.onedev.server.entitymanager.ProjectManager;
import io.onedev.server.event.codecomment.CodeCommentEvent;
import io.onedev.server.event.entity.EntityRemoved;
import io.onedev.server.event.issue.IssueEvent;
import io.onedev.server.event.pubsub.Listen;
import io.onedev.server.event.pullrequest.PullRequestCodeCommentEvent;
import io.onedev.server.event.pullrequest.PullRequestEvent;
import io.onedev.server.model.CodeComment;
import io.onedev.server.model.Issue;
import io.onedev.server.model.Project;
import io.onedev.server.model.PullRequest;
import io.onedev.server.model.User;
import io.onedev.server.persistence.annotation.Transactional;
import io.onedev.server.storage.StorageManager;
import jetbrains.exodus.env.Environment;
import jetbrains.exodus.env.Store;
import jetbrains.exodus.env.Transaction;
import jetbrains.exodus.env.TransactionalComputable;
import jetbrains.exodus.env.TransactionalExecutable;
/**
* Store project visit information here as we only need to load a single database to sort projects based on user
* visit information
*
* @author robin
*
*/
@Singleton
public class DefaultVisitInfoManager extends AbstractMultiEnvironmentManager
implements VisitInfoManager, Serializable {
private static final int INFO_VERSION = 6;
private static final String INFO_DIR = "visit";
private static final String PULL_REQUEST_STORE = "pullRequest";
private static final String PULL_REQUEST_CODE_COMMENT_STORE = "pullRequestCodeComment";
private static final String CODE_COMMENT_STORE = "codeComment";
private static final String ISSUE_STORE = "issue";
private final StorageManager storageManager;
private final ProjectManager projectManager;
private final ClusterManager clusterManager;
@Inject
public DefaultVisitInfoManager(StorageManager storageManager, ProjectManager projectManager,
ClusterManager clusterManager) {
this.storageManager = storageManager;
this.projectManager = projectManager;
this.clusterManager = clusterManager;
}
public Object writeReplace() throws ObjectStreamException {
return new ManagedSerializedForm(VisitInfoManager.class);
}
@Transactional
@Listen
public void on(EntityRemoved event) {
if (event.getEntity() instanceof Project) {
Long projectId = event.getEntity().getId();
UUID storageServerUUID = projectManager.getStorageServerUUID(projectId, false);
if (storageServerUUID != null) {
clusterManager.runOnServer(storageServerUUID, new ClusterTask<Void>() {
private static final long serialVersionUID = 1L;
@Override
public Void call() throws Exception {
removeEnv(projectId.toString());
return null;
}
});
}
}
}
@Override
protected File getEnvDir(String envKey) {
File infoDir = new File(storageManager.getProjectInfoDir(Long.valueOf(envKey)), INFO_DIR);
FileUtils.createDir(infoDir);
return infoDir;
}
@Override
protected int getEnvVersion() {
return INFO_VERSION;
}
@Override
public void visitIssue(User user, Issue issue) {
Long projectId = issue.getProject().getId();
Long userId = user.getId();
Long issueId = issue.getId();
projectManager.submitToProjectServer(projectId, new ClusterTask<Void>() {
private static final long serialVersionUID = 1L;
@Override
public Void call() throws Exception {
Environment env = getEnv(projectId.toString());
Store store = getStore(env, ISSUE_STORE);
env.executeInTransaction(new TransactionalExecutable() {
@Override
public void execute(Transaction txn) {
long time = new DateTime().plusSeconds(1).getMillis();
writeLong(store, txn, new LongsByteIterable(Lists.newArrayList(userId, issueId)), time);
}
});
return null;
}
});
}
@Override
public void visitPullRequest(User user, PullRequest request) {
Long projectId = request.getProject().getId();
Long userId = user.getId();
Long requestId = request.getId();
projectManager.submitToProjectServer(projectId, new ClusterTask<Void>() {
private static final long serialVersionUID = 1L;
@Override
public Void call() throws Exception {
Environment env = getEnv(projectId.toString());
Store store = getStore(env, PULL_REQUEST_STORE);
env.executeInTransaction(new TransactionalExecutable() {
@Override
public void execute(Transaction txn) {
long time = new DateTime().plusSeconds(1).getMillis();
writeLong(store, txn, new LongsByteIterable(Lists.newArrayList(userId, requestId)), time);
}
});
return null;
}
});
}
@Override
public void visitCodeComment(User user, CodeComment comment) {
Long projectId = comment.getProject().getId();
Long userId = user.getId();
Long commentId = comment.getId();
projectManager.submitToProjectServer(projectId, new ClusterTask<Void>() {
private static final long serialVersionUID = 1L;
@Override
public Void call() throws Exception {
Environment env = getEnv(projectId.toString());
Store store = getStore(env, CODE_COMMENT_STORE);
env.executeInTransaction(new TransactionalExecutable() {
@Override
public void execute(Transaction txn) {
long time = new DateTime().plusSeconds(1).getMillis();
writeLong(store, txn, new LongsByteIterable(Lists.newArrayList(userId, commentId)), time);
}
});
return null;
}
});
}
@Override
public void visitPullRequestCodeComments(User user, PullRequest request) {
Long userId = user.getId();
Long projectId = request.getProject().getId();
Long requestId = request.getId();
projectManager.submitToProjectServer(projectId, new ClusterTask<Void>() {
private static final long serialVersionUID = 1L;
@Override
public Void call() throws Exception {
Environment env = getEnv(projectId.toString());
Store store = getStore(env, PULL_REQUEST_CODE_COMMENT_STORE);
env.executeInTransaction(new TransactionalExecutable() {
@Override
public void execute(Transaction txn) {
long time = new DateTime().plusSeconds(1).getMillis();
writeLong(store, txn, new LongsByteIterable(Lists.newArrayList(userId, requestId)), time);
}
});
return null;
}
});
}
@Override
public Date getPullRequestVisitDate(User user, PullRequest request) {
Long userId = user.getId();
Long requestId = request.getId();
Long projectId = request.getProject().getId();
return projectManager.runOnProjectServer(projectId, new ClusterTask<Date>() {
private static final long serialVersionUID = 1L;
@Override
public Date call() throws Exception {
Environment env = getEnv(projectId.toString());
Store store = getStore(env, PULL_REQUEST_STORE);
return env.computeInTransaction(new TransactionalComputable<Date>() {
@Override
public Date compute(Transaction txn) {
long millis = readLong(store, txn, new LongsByteIterable(Lists.newArrayList(userId, requestId)), -1);
if (millis != -1)
return new Date(millis);
else
return null;
}
});
}
});
}
@Override
public Date getIssueVisitDate(User user, Issue issue) {
Long userId = user.getId();
Long projectId = issue.getProject().getId();
Long issueId = issue.getId();
return projectManager.runOnProjectServer(projectId, new ClusterTask<Date>() {
private static final long serialVersionUID = 1L;
@Override
public Date call() throws Exception {
Environment env = getEnv(projectId.toString());
Store store = getStore(env, ISSUE_STORE);
return env.computeInTransaction(new TransactionalComputable<Date>() {
@Override
public Date compute(Transaction txn) {
long millis = readLong(store, txn, new LongsByteIterable(Lists.newArrayList(userId, issueId)), -1);
if (millis != -1)
return new Date(millis);
else
return null;
}
});
}
});
}
@Override
public Date getCodeCommentVisitDate(User user, CodeComment comment) {
Long projectId = comment.getProject().getId();
Long commentId = comment.getId();
Long userId = user.getId();
return projectManager.runOnProjectServer(projectId, new ClusterTask<Date>() {
private static final long serialVersionUID = 1L;
@Override
public Date call() throws Exception {
Environment env = getEnv(projectId.toString());
Store store = getStore(env, CODE_COMMENT_STORE);
return env.computeInTransaction(new TransactionalComputable<Date>() {
@Override
public Date compute(Transaction txn) {
long millis = readLong(store, txn, new LongsByteIterable(Lists.newArrayList(userId, commentId)), -1);
if (millis != -1)
return new Date(millis);
else
return null;
}
});
}
});
}
@Override
public Date getPullRequestCodeCommentsVisitDate(User user, PullRequest request) {
Long userId = user.getId();
Long projectId = request.getProject().getId();
Long requestId = request.getId();
return projectManager.runOnProjectServer(projectId, new ClusterTask<Date>() {
private static final long serialVersionUID = 1L;
@Override
public Date call() throws Exception {
Environment env = getEnv(projectId.toString());
Store store = getStore(env, PULL_REQUEST_CODE_COMMENT_STORE);
return env.computeInTransaction(new TransactionalComputable<Date>() {
@Override
public Date compute(Transaction txn) {
long millis = readLong(store, txn, new LongsByteIterable(Lists.newArrayList(userId, requestId)), -1);
if (millis != -1)
return new Date(millis);
else
return null;
}
});
}
});
}
@Listen
public void on(IssueEvent event) {
if (event.getUser() != null)
visitIssue(event.getUser(), event.getIssue());
}
@Listen
public void on(CodeCommentEvent event) {
if (event.getUser() != null)
visitCodeComment(event.getUser(), event.getComment());
}
@Listen
public void on(PullRequestEvent event) {
if (event.getUser() != null) {
visitPullRequest(event.getUser(), event.getRequest());
if (event instanceof PullRequestCodeCommentEvent)
visitPullRequestCodeComments(event.getUser(), event.getRequest());
}
}
}

View File

@ -9,7 +9,7 @@ import io.onedev.server.model.Issue;
import io.onedev.server.model.PullRequest;
import io.onedev.server.model.User;
public interface UserInfoManager {
public interface VisitInfoManager {
void visitPullRequest(User user, PullRequest request);

View File

@ -30,7 +30,7 @@ import com.google.common.collect.Lists;
import io.onedev.server.OneDev;
import io.onedev.server.attachment.AttachmentStorageSupport;
import io.onedev.server.git.service.GitService;
import io.onedev.server.infomanager.UserInfoManager;
import io.onedev.server.infomanager.VisitInfoManager;
import io.onedev.server.model.support.CompareContext;
import io.onedev.server.model.support.LastUpdate;
import io.onedev.server.model.support.Mark;
@ -246,7 +246,7 @@ public class CodeComment extends ProjectBelonging implements AttachmentStorageSu
public boolean isVisitedAfter(Date date) {
User user = SecurityUtils.getUser();
if (user != null) {
Date visitDate = OneDev.getInstance(UserInfoManager.class).getCodeCommentVisitDate(user, this);
Date visitDate = OneDev.getInstance(VisitInfoManager.class).getCodeCommentVisitDate(user, this);
return visitDate != null && visitDate.getTime()>date.getTime();
} else {
return true;

View File

@ -61,7 +61,7 @@ import io.onedev.server.entitymanager.UserManager;
import io.onedev.server.entityreference.Referenceable;
import io.onedev.server.infomanager.CommitInfoManager;
import io.onedev.server.infomanager.PullRequestInfoManager;
import io.onedev.server.infomanager.UserInfoManager;
import io.onedev.server.infomanager.VisitInfoManager;
import io.onedev.server.model.support.EntityWatch;
import io.onedev.server.model.support.LastUpdate;
import io.onedev.server.model.support.ProjectBelonging;
@ -570,7 +570,7 @@ public class Issue extends ProjectBelonging implements Referenceable, Attachment
public boolean isVisitedAfter(Date date) {
User user = SecurityUtils.getUser();
if (user != null) {
Date visitDate = OneDev.getInstance(UserInfoManager.class).getIssueVisitDate(user, this);
Date visitDate = OneDev.getInstance(VisitInfoManager.class).getIssueVisitDate(user, this);
return visitDate != null && visitDate.getTime()>date.getTime();
} else {
return true;

View File

@ -53,7 +53,7 @@ import io.onedev.server.entitymanager.UserManager;
import io.onedev.server.entityreference.Referenceable;
import io.onedev.server.git.GitUtils;
import io.onedev.server.git.service.GitService;
import io.onedev.server.infomanager.UserInfoManager;
import io.onedev.server.infomanager.VisitInfoManager;
import io.onedev.server.model.support.BranchProtection;
import io.onedev.server.model.support.EntityWatch;
import io.onedev.server.model.support.LabelSupport;
@ -743,7 +743,7 @@ public class PullRequest extends ProjectBelonging
public boolean isVisitedAfter(Date date) {
User user = SecurityUtils.getUser();
if (user != null) {
Date visitDate = OneDev.getInstance(UserInfoManager.class).getPullRequestVisitDate(user, this);
Date visitDate = OneDev.getInstance(VisitInfoManager.class).getPullRequestVisitDate(user, this);
return visitDate != null && visitDate.getTime()>date.getTime();
} else {
return true;
@ -753,7 +753,7 @@ public class PullRequest extends ProjectBelonging
public boolean isCodeCommentsVisitedAfter(Date date) {
User user = SecurityUtils.getUser();
if (user != null) {
Date visitDate = OneDev.getInstance(UserInfoManager.class).getPullRequestCodeCommentsVisitDate(user, this);
Date visitDate = OneDev.getInstance(VisitInfoManager.class).getPullRequestCodeCommentsVisitDate(user, this);
return visitDate != null && visitDate.getTime()>date.getTime();
} else {
return true;

View File

@ -25,7 +25,7 @@ import io.onedev.server.event.issue.IssueCommented;
import io.onedev.server.event.issue.IssueEvent;
import io.onedev.server.event.issue.IssueOpened;
import io.onedev.server.event.pubsub.Listen;
import io.onedev.server.infomanager.UserInfoManager;
import io.onedev.server.infomanager.VisitInfoManager;
import io.onedev.server.mail.MailManager;
import io.onedev.server.markdown.MarkdownManager;
import io.onedev.server.markdown.MentionParser;
@ -55,11 +55,11 @@ public class IssueNotificationManager extends AbstractNotificationManager {
private final UserManager userManager;
private final UserInfoManager userInfoManager;
private final VisitInfoManager userInfoManager;
@Inject
public IssueNotificationManager(MarkdownManager markdownManager, MailManager mailManager,
IssueWatchManager watchManager, UserInfoManager userInfoManager, UserManager userManager,
IssueWatchManager watchManager, VisitInfoManager userInfoManager, UserManager userManager,
SettingManager settingManager, IssueAuthorizationManager authorizationManager) {
super(markdownManager, settingManager);
this.mailManager = mailManager;

View File

@ -34,7 +34,7 @@ import io.onedev.server.event.pullrequest.PullRequestReviewRequested;
import io.onedev.server.event.pullrequest.PullRequestReviewerRemoved;
import io.onedev.server.event.pullrequest.PullRequestUnassigned;
import io.onedev.server.event.pullrequest.PullRequestUpdated;
import io.onedev.server.infomanager.UserInfoManager;
import io.onedev.server.infomanager.VisitInfoManager;
import io.onedev.server.mail.MailManager;
import io.onedev.server.markdown.MarkdownManager;
import io.onedev.server.markdown.MentionParser;
@ -68,13 +68,13 @@ public class PullRequestNotificationManager extends AbstractNotificationManager
private final PullRequestWatchManager pullRequestWatchManager;
private final UserInfoManager userInfoManager;
private final VisitInfoManager userInfoManager;
private final UserManager userManager;
@Inject
public PullRequestNotificationManager(MailManager mailManager, MarkdownManager markdownManager,
PullRequestWatchManager pullRequestWatchManager, UserInfoManager userInfoManager,
PullRequestWatchManager pullRequestWatchManager, VisitInfoManager userInfoManager,
UserManager userManager, SettingManager settingManager) {
super(markdownManager, settingManager);
this.mailManager = mailManager;

View File

@ -25,7 +25,6 @@ import io.onedev.server.event.pubsub.Listen;
import io.onedev.server.event.system.SystemStarting;
import io.onedev.server.model.Build;
import io.onedev.server.model.Project;
import io.onedev.server.model.User;
import io.onedev.server.persistence.TransactionManager;
import io.onedev.server.persistence.annotation.Transactional;
@ -70,12 +69,6 @@ public class DefaultStorageManager implements StorageManager, Serializable {
return new File(getProjectsDir(), String.valueOf(projectId));
}
private File getUserDir(Long userId) {
File userDir = new File(getUsersDir(), String.valueOf(userId));
FileUtils.createDir(userDir);
return userDir;
}
private File getProjectSubdir(Long projectId, String subdirName) {
File projectDir = getProjectDir(projectId);
if (projectDir.exists()) {
@ -106,7 +99,7 @@ public class DefaultStorageManager implements StorageManager, Serializable {
public File getProjectAttachmentDir(Long projectId) {
return getProjectSubdir(projectId, "attachment");
}
private File getBuildsDir(Long projectId) {
return getProjectSubdir(projectId, "builds");
}
@ -131,13 +124,6 @@ public class DefaultStorageManager implements StorageManager, Serializable {
FileUtils.createDir(new File(buildDir, Build.ARTIFACTS_DIR));
}
@Override
public File getInfoDir() {
File infoDir = new File(Bootstrap.getSiteDir(), "info");
FileUtils.createDir(infoDir);
return infoDir;
}
@Override
public File getIndexDir() {
File indexDir = new File(Bootstrap.getSiteDir(), "index");
@ -155,14 +141,6 @@ public class DefaultStorageManager implements StorageManager, Serializable {
FileUtils.deleteDir(projectDir);
}
}
for (File userDir: getUsersDir().listFiles()) {
if (new File(userDir, OLD_DELETE_MARK1).exists()
|| new File(userDir, OLD_DELETE_MARK2).exists()
|| new File(userDir, DELETE_MARK).exists()) {
logger.info("Deleting directory marked for deletion: " + userDir);
FileUtils.deleteDir(userDir);
}
}
}
@Transactional
@ -235,22 +213,6 @@ public class DefaultStorageManager implements StorageManager, Serializable {
}
if (event.getEntity() instanceof User) {
transactionManager.runAfterCommit(new ClusterRunnable() {
private static final long serialVersionUID = 1L;
@Override
public void run() {
try {
new File(getUserDir(id), DELETE_MARK).createNewFile();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
});
}
}
@Override
@ -261,18 +223,5 @@ public class DefaultStorageManager implements StorageManager, Serializable {
throw new RuntimeException(e);
}
}
private File getUsersDir() {
File usersDir = new File(Bootstrap.getSiteDir(), "users");
FileUtils.createDir(usersDir);
return usersDir;
}
@Override
public File getUserInfoDir(Long userId) {
File infoDir = new File(getUserDir(userId), "info");
FileUtils.createDir(infoDir);
return infoDir;
}
}

View File

@ -36,8 +36,6 @@ public interface StorageManager {
void initArtifactsDir(Long projectId, Long buildNumber);
File getInfoDir();
File getIndexDir();
/**
@ -48,8 +46,6 @@ public interface StorageManager {
*/
File getProjectAttachmentDir(Long projectId);
File getUserInfoDir(Long userId);
/**
* Get directory to store build related files such as logs, artifacts and reports
*

View File

@ -43,7 +43,7 @@ import io.onedev.server.entitymanager.CodeCommentReplyManager;
import io.onedev.server.entitymanager.CodeCommentStatusChangeManager;
import io.onedev.server.entitymanager.UrlManager;
import io.onedev.server.entitymanager.UserManager;
import io.onedev.server.infomanager.UserInfoManager;
import io.onedev.server.infomanager.VisitInfoManager;
import io.onedev.server.model.CodeComment;
import io.onedev.server.model.CodeCommentReply;
import io.onedev.server.model.CodeCommentStatusChange;
@ -431,7 +431,7 @@ public abstract class CodeCommentPanel extends Panel {
prevActivityContainer = newActivityContainer;
}
OneDev.getInstance(UserInfoManager.class).visitCodeComment(SecurityUtils.getUser(), getComment());
OneDev.getInstance(VisitInfoManager.class).visitCodeComment(SecurityUtils.getUser(), getComment());
}
@Override
@ -447,7 +447,7 @@ public abstract class CodeCommentPanel extends Panel {
@Override
protected void onBeforeRender() {
if (SecurityUtils.getUser() != null)
OneDev.getInstance(UserInfoManager.class).visitCodeComment(SecurityUtils.getUser(), getComment());
OneDev.getInstance(VisitInfoManager.class).visitCodeComment(SecurityUtils.getUser(), getComment());
super.onBeforeRender();
}

View File

@ -21,7 +21,7 @@ import org.apache.wicket.request.cycle.RequestCycle;
import io.onedev.server.OneDev;
import io.onedev.server.entitymanager.IssueManager;
import io.onedev.server.entitymanager.SettingManager;
import io.onedev.server.infomanager.UserInfoManager;
import io.onedev.server.infomanager.VisitInfoManager;
import io.onedev.server.model.Issue;
import io.onedev.server.model.Project;
import io.onedev.server.model.support.inputspec.InputContext;
@ -319,7 +319,7 @@ abstract class CardDetailPanel extends GenericPanel<Issue> implements InputConte
@Override
public void onEndRequest(RequestCycle cycle) {
if (SecurityUtils.getUser() != null)
OneDev.getInstance(UserInfoManager.class).visitIssue(SecurityUtils.getUser(), getIssue());
OneDev.getInstance(VisitInfoManager.class).visitIssue(SecurityUtils.getUser(), getIssue());
}
@Override

View File

@ -32,7 +32,7 @@ import io.onedev.server.OneDev;
import io.onedev.server.entitymanager.IssueLinkManager;
import io.onedev.server.entitymanager.IssueManager;
import io.onedev.server.entitymanager.SettingManager;
import io.onedev.server.infomanager.UserInfoManager;
import io.onedev.server.infomanager.VisitInfoManager;
import io.onedev.server.model.Issue;
import io.onedev.server.model.Project;
import io.onedev.server.model.support.inputspec.InputContext;
@ -273,7 +273,7 @@ public abstract class IssueDetailPage extends ProjectIssuesPage implements Input
@Override
public void onEndRequest(RequestCycle cycle) {
if (SecurityUtils.getUser() != null)
OneDev.getInstance(UserInfoManager.class).visitIssue(SecurityUtils.getUser(), getIssue());
OneDev.getInstance(VisitInfoManager.class).visitIssue(SecurityUtils.getUser(), getIssue());
}
@Override

View File

@ -67,7 +67,7 @@ import io.onedev.server.entitymanager.PullRequestWatchManager;
import io.onedev.server.entityreference.Referenceable;
import io.onedev.server.git.GitUtils;
import io.onedev.server.git.service.RefFacade;
import io.onedev.server.infomanager.UserInfoManager;
import io.onedev.server.infomanager.VisitInfoManager;
import io.onedev.server.model.AbstractEntity;
import io.onedev.server.model.Build;
import io.onedev.server.model.Project;
@ -680,7 +680,7 @@ public abstract class PullRequestDetailPage extends ProjectPage implements PullR
@Override
public void onEndRequest(RequestCycle cycle) {
if (SecurityUtils.getUser() != null)
OneDev.getInstance(UserInfoManager.class).visitPullRequest(SecurityUtils.getUser(), getPullRequest());
OneDev.getInstance(VisitInfoManager.class).visitPullRequest(SecurityUtils.getUser(), getPullRequest());
}
@Override

View File

@ -17,7 +17,7 @@ import org.apache.wicket.request.mapper.parameter.PageParameters;
import com.google.common.collect.Sets;
import io.onedev.server.OneDev;
import io.onedev.server.infomanager.UserInfoManager;
import io.onedev.server.infomanager.VisitInfoManager;
import io.onedev.server.model.Project;
import io.onedev.server.model.PullRequest;
import io.onedev.server.security.SecurityUtils;
@ -151,7 +151,7 @@ public class PullRequestCodeCommentsPage extends PullRequestDetailPage {
@Override
public void onEndRequest(RequestCycle cycle) {
if (SecurityUtils.getUser() != null)
OneDev.getInstance(UserInfoManager.class).visitPullRequestCodeComments(SecurityUtils.getUser(), getPullRequest());
OneDev.getInstance(VisitInfoManager.class).visitPullRequestCodeComments(SecurityUtils.getUser(), getPullRequest());
}
@Override