Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,38 +17,47 @@

@Singleton
public class RequestGroupManager extends CuratorAsyncManager {
private static final String REQUEST_GROUP_ROOT = "/groups";

private final Transcoder<SingularityRequestGroup> requestGroupTranscoder;

@Inject
public RequestGroupManager(CuratorFramework curator, SingularityConfiguration configuration,
MetricRegistry metricRegistry, Transcoder<SingularityRequestGroup> requestGroupTranscoder) {
super(curator, configuration, metricRegistry);
this.requestGroupTranscoder = requestGroupTranscoder;
}

private String getRequestGroupPath(String requestGroupId) {
return ZKPaths.makePath(REQUEST_GROUP_ROOT, requestGroupId);
}

public List<String> getRequestGroupIds() {
return getChildren(REQUEST_GROUP_ROOT);
private static final String REQUEST_GROUP_ROOT = "/groups";

private final Transcoder<SingularityRequestGroup> requestGroupTranscoder;
private final SingularityWebCache webCache;

@Inject
public RequestGroupManager(CuratorFramework curator, SingularityConfiguration configuration,
MetricRegistry metricRegistry, Transcoder<SingularityRequestGroup> requestGroupTranscoder, SingularityWebCache webCache) {
super(curator, configuration, metricRegistry);
this.requestGroupTranscoder = requestGroupTranscoder;
this.webCache = webCache;
}

private String getRequestGroupPath(String requestGroupId) {
return ZKPaths.makePath(REQUEST_GROUP_ROOT, requestGroupId);
}

public List<String> getRequestGroupIds() {
return getChildren(REQUEST_GROUP_ROOT);
}

public List<SingularityRequestGroup> getRequestGroups(boolean useWebCache) {
if (useWebCache && webCache.useCachedRequestGroups()) {
return webCache.getRequestGroups();
}

public List<SingularityRequestGroup> getRequestGroups() {
return getAsyncChildren(REQUEST_GROUP_ROOT, requestGroupTranscoder);
List<SingularityRequestGroup> requestGroups = getAsyncChildren(REQUEST_GROUP_ROOT, requestGroupTranscoder);
if (useWebCache) {
webCache.cacheRequestGroups(requestGroups);
}
return requestGroups;
}

public Optional<SingularityRequestGroup> getRequestGroup(String requestGroupId) {
return getData(getRequestGroupPath(requestGroupId), requestGroupTranscoder);
}
public Optional<SingularityRequestGroup> getRequestGroup(String requestGroupId) {
return getData(getRequestGroupPath(requestGroupId), requestGroupTranscoder);
}

public SingularityCreateResult saveRequestGroup(SingularityRequestGroup requestGroup) {
return save(getRequestGroupPath(requestGroup.getId()), requestGroup, requestGroupTranscoder);
}
public SingularityCreateResult saveRequestGroup(SingularityRequestGroup requestGroup) {
return save(getRequestGroupPath(requestGroup.getId()), requestGroup, requestGroupTranscoder);
}

public SingularityDeleteResult deleteRequestGroup(String requestGroupId) {
return delete(getRequestGroupPath(requestGroupId));
}
public SingularityDeleteResult deleteRequestGroup(String requestGroupId) {
return delete(getRequestGroupPath(requestGroupId));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import com.google.inject.Singleton;
import com.hubspot.singularity.SingularityPendingTask;
import com.hubspot.singularity.SingularityPendingTaskId;
import com.hubspot.singularity.SingularityRequestGroup;
import com.hubspot.singularity.SingularityRequestWithState;
import com.hubspot.singularity.SingularityTask;
import com.hubspot.singularity.SingularityTaskCleanup;
Expand All @@ -33,6 +34,9 @@ public class SingularityWebCache {
private volatile Map<String, SingularityRequestWithState> cachedRequests;
private volatile long lastRequestsCache;

private volatile List<SingularityRequestGroup> cachedRequestGroups;
private volatile long lastRequestGroupsCache;

private final long cacheForMillis;

private final Meter cleanupHitMeter;
Expand All @@ -47,6 +51,9 @@ public class SingularityWebCache {
private final Meter requestsHitMeter;
private final Meter requestsMissMeter;

private final Meter requestGroupsHitMeter;
private final Meter requestGroupsMissMeter;

@Inject
public SingularityWebCache(SingularityConfiguration configuration, MetricRegistry metrics) {
this.cacheForMillis = configuration.getCacheForWebForMillis();
Expand All @@ -62,6 +69,9 @@ public SingularityWebCache(SingularityConfiguration configuration, MetricRegistr

this.requestsHitMeter = metrics.meter("zk.web.caches.requests.hits");
this.requestsMissMeter = metrics.meter("zk.web.caches.requests.miss");

this.requestGroupsHitMeter = metrics.meter("zk.web.caches.requests.hits");
this.requestGroupsMissMeter = metrics.meter("zk.web.caches.requests.miss");
}

public boolean useCachedPendingTasks() {
Expand All @@ -80,6 +90,10 @@ public boolean useCachedRequests() {
return useCache(lastRequestsCache);
}

public boolean useCachedRequestGroups() {
return useCache(lastRequestGroupsCache);
}

private boolean useCache(long lastCache) {
return lastCache >= 0 && (System.currentTimeMillis() - lastCache) < cacheForMillis;
}
Expand Down Expand Up @@ -118,6 +132,10 @@ public Optional<SingularityRequestWithState> getRequest(String requestId) {
return Optional.fromNullable(cachedRequests.get(requestId));
}

public List<SingularityRequestGroup> getRequestGroups() {
return new ArrayList<>(cachedRequestGroups);
}

public void cacheTaskCleanup(List<SingularityTaskCleanup> newTaskCleanup) {
cleanupMissMeter.mark();
cachedTaskCleanup = new ArrayList<>(newTaskCleanup);
Expand Down Expand Up @@ -154,4 +172,10 @@ public void cacheRequests(List<SingularityRequestWithState> requests) {
lastRequestsCache = System.currentTimeMillis();
}

public void cacheRequestGroups(List<SingularityRequestGroup> requestGroups) {
requestGroupsMissMeter.mark();
cachedRequestGroups = new ArrayList<>(requestGroups);
lastRequestGroupsCache = System.currentTimeMillis();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;

import com.google.common.base.Optional;
Expand Down Expand Up @@ -36,8 +37,8 @@ public RequestGroupResource(RequestGroupManager requestGroupManager, Singularity

@GET
@ApiOperation(value="Get a list of Singularity request groups")
public List<SingularityRequestGroup> getRequestGroupIds() {
return requestGroupManager.getRequestGroups();
public List<SingularityRequestGroup> getRequestGroupIds(@QueryParam("useWebCache") Boolean useWebCache) {
return requestGroupManager.getRequestGroups(useWebCache != null && useWebCache);
}

@GET
Expand Down
2 changes: 1 addition & 1 deletion SingularityUI/app/actions/api/requestGroups.es6
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { buildApiAction } from './base';
export const FetchGroups = buildApiAction(
'FETCH_REQUEST_GROUPS',
(catchStatusCodes = null) => ({
url: '/groups',
url: '/groups?useWebCache=true',
catchStatusCodes
})
);