Remove CapabilityControl from CurrentUser
Drop the capabilities reference from all user objects. Most global capabilities can be checked with the PermissionBackend. QoS, query limits, and emailing reviewers still require the capability object. Bundle its factory into the call sites that need it. Continue caching the CapabilityControl in an opaque property on the CurrentUser, and also in the DefaultPermissionBackend.WithUserImpl. Both of these sites reduce evaluations for critical properties like "administrateServer". Change-Id: I5aae8200e0a579ac1295a3fb7005703fd39d2696
This commit is contained in:
		
				
					committed by
					
						
						David Pursehouse
					
				
			
			
				
	
			
			
			
						parent
						
							f4001aa356
						
					
				
				
					commit
					6302ccb2bb
				
			@@ -20,6 +20,7 @@ import static java.util.concurrent.TimeUnit.MINUTES;
 | 
			
		||||
import static javax.servlet.http.HttpServletResponse.SC_SERVICE_UNAVAILABLE;
 | 
			
		||||
 | 
			
		||||
import com.google.gerrit.server.CurrentUser;
 | 
			
		||||
import com.google.gerrit.server.account.CapabilityControl;
 | 
			
		||||
import com.google.gerrit.server.config.GerritServerConfig;
 | 
			
		||||
import com.google.gerrit.server.git.QueueProvider;
 | 
			
		||||
import com.google.gerrit.server.git.WorkQueue.CancelableRunnable;
 | 
			
		||||
@@ -69,7 +70,6 @@ public class ProjectQoSFilter implements Filter {
 | 
			
		||||
  private static final Pattern URI_PATTERN = Pattern.compile(FILTER_RE);
 | 
			
		||||
 | 
			
		||||
  public static class Module extends ServletModule {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void configureServlets() {
 | 
			
		||||
      bind(QueueProvider.class).to(CommandExecutorQueueProvider.class).in(SINGLETON);
 | 
			
		||||
@@ -77,18 +77,20 @@ public class ProjectQoSFilter implements Filter {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private final CapabilityControl.Factory capabilityFactory;
 | 
			
		||||
  private final Provider<CurrentUser> user;
 | 
			
		||||
  private final QueueProvider queue;
 | 
			
		||||
 | 
			
		||||
  private final ServletContext context;
 | 
			
		||||
  private final long maxWait;
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  ProjectQoSFilter(
 | 
			
		||||
      CapabilityControl.Factory capabilityFactory,
 | 
			
		||||
      Provider<CurrentUser> user,
 | 
			
		||||
      QueueProvider queue,
 | 
			
		||||
      ServletContext context,
 | 
			
		||||
      @GerritServerConfig Config cfg) {
 | 
			
		||||
    this.capabilityFactory = capabilityFactory;
 | 
			
		||||
    this.user = user;
 | 
			
		||||
    this.queue = queue;
 | 
			
		||||
    this.context = context;
 | 
			
		||||
@@ -137,7 +139,8 @@ public class ProjectQoSFilter implements Filter {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private ScheduledThreadPoolExecutor getExecutor() {
 | 
			
		||||
    return queue.getQueue(user.get().getCapabilities().getQueueType());
 | 
			
		||||
    QueueProvider.QueueType qt = capabilityFactory.create(user.get()).getQueueType();
 | 
			
		||||
    return queue.getQueue(qt);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,6 @@ import com.google.gerrit.server.account.AccountCacheImpl;
 | 
			
		||||
import com.google.gerrit.server.account.AccountVisibility;
 | 
			
		||||
import com.google.gerrit.server.account.AccountVisibilityProvider;
 | 
			
		||||
import com.google.gerrit.server.account.CapabilityCollection;
 | 
			
		||||
import com.google.gerrit.server.account.CapabilityControl;
 | 
			
		||||
import com.google.gerrit.server.account.FakeRealm;
 | 
			
		||||
import com.google.gerrit.server.account.GroupCacheImpl;
 | 
			
		||||
import com.google.gerrit.server.account.GroupIncludeCacheImpl;
 | 
			
		||||
@@ -164,7 +163,6 @@ public class BatchProgramModule extends FactoryModule {
 | 
			
		||||
    install(MergeabilityCacheImpl.module());
 | 
			
		||||
    install(TagCache.module());
 | 
			
		||||
    factory(CapabilityCollection.Factory.class);
 | 
			
		||||
    factory(CapabilityControl.Factory.class);
 | 
			
		||||
    factory(ChangeData.Factory.class);
 | 
			
		||||
    factory(ProjectState.Factory.class);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user