use cached thread pool for async hooks to improve memory consumption

This commit is contained in:
Sebastian Sdorra
2012-08-12 21:52:24 +02:00
parent 5963cbd536
commit 7c770d8874

View File

@@ -72,6 +72,8 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@@ -105,18 +107,19 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
* @param repositoryHooksProvider * @param repositoryHooksProvider
*/ */
@Inject @Inject
public DefaultRepositoryManager( public DefaultRepositoryManager(ScmConfiguration configuration,
ScmConfiguration configuration, SCMContextProvider contextProvider, SCMContextProvider contextProvider,
Provider<WebSecurityContext> securityContextProvider, Provider<WebSecurityContext> securityContextProvider,
RepositoryDAO repositoryDAO, Set<RepositoryHandler> handlerSet, RepositoryDAO repositoryDAO, Set<RepositoryHandler> handlerSet,
Provider<Set<RepositoryListener>> repositoryListenersProvider, Provider<Set<RepositoryListener>> repositoryListenersProvider,
Provider<Set<RepositoryHook>> repositoryHooksProvider) Provider<Set<RepositoryHook>> repositoryHooksProvider)
{ {
this.configuration = configuration; this.configuration = configuration;
this.securityContextProvider = securityContextProvider; this.securityContextProvider = securityContextProvider;
this.repositoryDAO = repositoryDAO; this.repositoryDAO = repositoryDAO;
this.repositoryListenersProvider = repositoryListenersProvider; this.repositoryListenersProvider = repositoryListenersProvider;
this.repositoryHooksProvider = repositoryHooksProvider; this.repositoryHooksProvider = repositoryHooksProvider;
this.executorService = Executors.newCachedThreadPool();
handlerMap = new HashMap<String, RepositoryHandler>(); handlerMap = new HashMap<String, RepositoryHandler>();
types = new HashSet<Type>(); types = new HashSet<Type>();
@@ -137,6 +140,8 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
@Override @Override
public void close() throws IOException public void close() throws IOException
{ {
executorService.shutdown();
for (RepositoryHandler handler : handlerMap.values()) for (RepositoryHandler handler : handlerMap.values())
{ {
IOUtil.close(handler); IOUtil.close(handler);
@@ -154,12 +159,12 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
* @throws RepositoryException * @throws RepositoryException
*/ */
public void create(Repository repository, boolean createRepository) public void create(Repository repository, boolean createRepository)
throws RepositoryException, IOException throws RepositoryException, IOException
{ {
if (logger.isInfoEnabled()) if (logger.isInfoEnabled())
{ {
logger.info("create repository {} of type {}", repository.getName(), logger.info("create repository {} of type {}", repository.getName(),
repository.getType()); repository.getType());
} }
SecurityUtil.assertIsAdmin(securityContextProvider); SecurityUtil.assertIsAdmin(securityContextProvider);
@@ -194,7 +199,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
*/ */
@Override @Override
public void create(Repository repository) public void create(Repository repository)
throws RepositoryException, IOException throws RepositoryException, IOException
{ {
create(repository, true); create(repository, true);
} }
@@ -210,12 +215,12 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
*/ */
@Override @Override
public void delete(Repository repository) public void delete(Repository repository)
throws RepositoryException, IOException throws RepositoryException, IOException
{ {
if (logger.isInfoEnabled()) if (logger.isInfoEnabled())
{ {
logger.info("delete repository {} of type {}", repository.getName(), logger.info("delete repository {} of type {}", repository.getName(),
repository.getType()); repository.getType());
} }
assertIsOwner(repository); assertIsOwner(repository);
@@ -223,7 +228,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
if (configuration.isEnableRepositoryArchive() &&!repository.isArchived()) if (configuration.isEnableRepositoryArchive() &&!repository.isArchived())
{ {
throw new RepositoryIsNotArchivedException( throw new RepositoryIsNotArchivedException(
"Repository could not deleted, because it is not archived."); "Repository could not deleted, because it is not archived.");
} }
if (repositoryDAO.contains(repository)) if (repositoryDAO.contains(repository))
@@ -235,7 +240,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
else else
{ {
throw new RepositoryException( throw new RepositoryException(
"repository ".concat(repository.getName()).concat(" not found")); "repository ".concat(repository.getName()).concat(" not found"));
} }
fireEvent(repository, HandlerEvent.DELETE); fireEvent(repository, HandlerEvent.DELETE);
@@ -253,7 +258,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
*/ */
@Override @Override
public void fireHookEvent(String type, String name, RepositoryHookEvent event) public void fireHookEvent(String type, String name, RepositoryHookEvent event)
throws RepositoryNotFoundException throws RepositoryNotFoundException
{ {
Repository repository = repositoryDAO.get(type, name); Repository repository = repositoryDAO.get(type, name);
@@ -276,7 +281,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
*/ */
@Override @Override
public void fireHookEvent(String id, RepositoryHookEvent event) public void fireHookEvent(String id, RepositoryHookEvent event)
throws RepositoryNotFoundException throws RepositoryNotFoundException
{ {
Repository repository = repositoryDAO.get(id); Repository repository = repositoryDAO.get(id);
@@ -299,7 +304,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
*/ */
@Override @Override
public void importRepository(Repository repository) public void importRepository(Repository repository)
throws RepositoryException, IOException throws RepositoryException, IOException
{ {
create(repository, false); create(repository, false);
} }
@@ -339,12 +344,12 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
*/ */
@Override @Override
public void modify(Repository repository) public void modify(Repository repository)
throws RepositoryException, IOException throws RepositoryException, IOException
{ {
if (logger.isInfoEnabled()) if (logger.isInfoEnabled())
{ {
logger.info("modify repository {} of type {}", repository.getName(), logger.info("modify repository {} of type {}", repository.getName(),
repository.getType()); repository.getType());
} }
AssertUtil.assertIsValid(repository); AssertUtil.assertIsValid(repository);
@@ -363,7 +368,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
else else
{ {
throw new RepositoryException( throw new RepositoryException(
"repository ".concat(repository.getName()).concat(" not found")); "repository ".concat(repository.getName()).concat(" not found"));
} }
fireEvent(repository, HandlerEvent.MODIFY); fireEvent(repository, HandlerEvent.MODIFY);
@@ -380,7 +385,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
*/ */
@Override @Override
public void refresh(Repository repository) public void refresh(Repository repository)
throws RepositoryException, IOException throws RepositoryException, IOException
{ {
AssertUtil.assertIsNotNull(repository); AssertUtil.assertIsNotNull(repository);
assertIsReader(repository); assertIsReader(repository);
@@ -395,7 +400,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
else else
{ {
throw new RepositoryException( throw new RepositoryException(
"repository ".concat(repository.getName()).concat(" not found")); "repository ".concat(repository.getName()).concat(" not found"));
} }
} }
@@ -513,10 +518,10 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
*/ */
@Override @Override
public Collection<Repository> getAll(Comparator<Repository> comparator, public Collection<Repository> getAll(Comparator<Repository> comparator,
int start, int limit) int start, int limit)
{ {
return Util.createSubCollection(repositoryDAO.getAll(), comparator, return Util.createSubCollection(repositoryDAO.getAll(), comparator,
new CollectionAppender<Repository>() new CollectionAppender<Repository>()
{ {
@Override @Override
public void append(Collection<Repository> collection, Repository item) public void append(Collection<Repository> collection, Repository item)
@@ -553,7 +558,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
*/ */
@Override @Override
public BlameViewer getBlameViewer(Repository repository) public BlameViewer getBlameViewer(Repository repository)
throws RepositoryException throws RepositoryException
{ {
AssertUtil.assertIsNotNull(repository); AssertUtil.assertIsNotNull(repository);
@@ -579,7 +584,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
*/ */
@Override @Override
public ChangesetViewer getChangesetViewer(Repository repository) public ChangesetViewer getChangesetViewer(Repository repository)
throws RepositoryException throws RepositoryException
{ {
AssertUtil.assertIsNotNull(repository); AssertUtil.assertIsNotNull(repository);
isReader(repository); isReader(repository);
@@ -621,7 +626,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
*/ */
@Override @Override
public DiffViewer getDiffViewer(Repository repository) public DiffViewer getDiffViewer(Repository repository)
throws RepositoryException throws RepositoryException
{ {
AssertUtil.assertIsNotNull(repository); AssertUtil.assertIsNotNull(repository);
@@ -697,7 +702,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
if ((repository == null) && logger.isDebugEnabled()) if ((repository == null) && logger.isDebugEnabled())
{ {
logger.debug("could not find repository with type {} and uri {}", type, logger.debug("could not find repository with type {} and uri {}", type,
uri); uri);
} }
return repository; return repository;
@@ -773,7 +778,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
*/ */
@Override @Override
public RepositoryBrowser getRepositoryBrowser(Repository repository) public RepositoryBrowser getRepositoryBrowser(Repository repository)
throws RepositoryException throws RepositoryException
{ {
AssertUtil.assertIsNotNull(repository); AssertUtil.assertIsNotNull(repository);
isReader(repository); isReader(repository);
@@ -807,15 +812,14 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
{ {
if (hook.isAsync()) if (hook.isAsync())
{ {
new Thread(new RepositoryHookTask(hook, event)).start(); executorService.execute(new RepositoryHookTask(hook, event));
} }
else else
{ {
if (logger.isDebugEnabled()) if (logger.isDebugEnabled())
{ {
Object[] args = new Object[] { event.getType(), Object[] args = new Object[] { event.getType(),
hook.getClass().getName(), hook.getClass().getName(), event.getRepository().getName() };
event.getRepository().getName() };
logger.debug("execute {} hook {} for repository {}", args); logger.debug("execute {} hook {} for repository {}", args);
} }
@@ -833,7 +837,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
* @param handler * @param handler
*/ */
private void addHandler(SCMContextProvider contextProvider, private void addHandler(SCMContextProvider contextProvider,
RepositoryHandler handler) RepositoryHandler handler)
{ {
AssertUtil.assertIsNotNull(handler); AssertUtil.assertIsNotNull(handler);
@@ -844,13 +848,13 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
if (handlerMap.containsKey(type.getName())) if (handlerMap.containsKey(type.getName()))
{ {
throw new ConfigurationException( throw new ConfigurationException(
type.getName().concat("allready registered")); type.getName().concat("allready registered"));
} }
if (logger.isInfoEnabled()) if (logger.isInfoEnabled())
{ {
logger.info("added RepositoryHandler {} for type {}", handler.getClass(), logger.info("added RepositoryHandler {} for type {}", handler.getClass(),
type); type);
} }
handlerMap.put(type.getName(), handler); handlerMap.put(type.getName(), handler);
@@ -867,7 +871,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
private void assertIsOwner(Repository repository) private void assertIsOwner(Repository repository)
{ {
PermissionUtil.assertPermission(repository, securityContextProvider, PermissionUtil.assertPermission(repository, securityContextProvider,
PermissionType.OWNER); PermissionType.OWNER);
} }
/** /**
@@ -879,7 +883,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
private void assertIsReader(Repository repository) private void assertIsReader(Repository repository)
{ {
PermissionUtil.assertPermission(repository, securityContextProvider, PermissionUtil.assertPermission(repository, securityContextProvider,
PermissionType.READ); PermissionType.READ);
} }
//~--- get methods ---------------------------------------------------------- //~--- get methods ----------------------------------------------------------
@@ -896,7 +900,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
* @throws RepositoryException * @throws RepositoryException
*/ */
private RepositoryHandler getHandler(Repository repository) private RepositoryHandler getHandler(Repository repository)
throws RepositoryException throws RepositoryException
{ {
String type = repository.getType(); String type = repository.getType();
RepositoryHandler handler = handlerMap.get(type); RepositoryHandler handler = handlerMap.get(type);
@@ -904,7 +908,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
if (handler == null) if (handler == null)
{ {
throw new RepositoryHandlerNotFoundException( throw new RepositoryHandlerNotFoundException(
"could not find handler for ".concat(type)); "could not find handler for ".concat(type));
} }
else if (!handler.isConfigured()) else if (!handler.isConfigured())
{ {
@@ -949,7 +953,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
private boolean isReader(Repository repository) private boolean isReader(Repository repository)
{ {
return PermissionUtil.hasPermission(repository, securityContextProvider, return PermissionUtil.hasPermission(repository, securityContextProvider,
PermissionType.READ); PermissionType.READ);
} }
//~--- fields --------------------------------------------------------------- //~--- fields ---------------------------------------------------------------
@@ -957,6 +961,9 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
/** Field description */ /** Field description */
private ScmConfiguration configuration; private ScmConfiguration configuration;
/** Field description */
private ExecutorService executorService;
/** Field description */ /** Field description */
private Map<String, RepositoryHandler> handlerMap; private Map<String, RepositoryHandler> handlerMap;