Skip to content

Commit 5ffbef8

Browse files
committed
Fix #33229: don't fetch all proxies for getUserProxies
1 parent ace8f1a commit 5ffbef8

9 files changed

Lines changed: 62 additions & 15 deletions

File tree

src/main/java/eu/openanalytics/containerproxy/RedisStoreConfiguration.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -200,11 +200,6 @@ public RedisTemplate<String, OAuth2AuthorizedClient> oAuth2AuthorizedClientRedis
200200
return template;
201201
}
202202

203-
@Bean
204-
public RedisTemplate<String, String> unClaimSeatIdsTemplate(RedisConnectionFactory connectionFactory) {
205-
return createRedisTemplate(connectionFactory, String.class);
206-
}
207-
208203
@Bean
209204
public RedisTemplate<String, Seat> seatsTemplate(RedisConnectionFactory connectionFactory) {
210205
return createRedisTemplate(connectionFactory, Seat.class);

src/main/java/eu/openanalytics/containerproxy/model/runtime/runtimevalues/HttpHeadersKey.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ public class HttpHeadersKey extends RuntimeValueKey<HttpHeaders> {
2727

2828
public static final HttpHeadersKey inst = new HttpHeadersKey();
2929

30+
private final ObjectMapper objectMapper = new ObjectMapper();
31+
3032
public HttpHeadersKey() {
3133
super("openanalytics.eu/sp-http-headers",
3234
"SHINYPROXY_HTTP_HEADERS",
@@ -41,7 +43,6 @@ public HttpHeadersKey() {
4143

4244
@Override
4345
public HttpHeaders deserializeFromString(String value) {
44-
ObjectMapper objectMapper = new ObjectMapper();
4546
try {
4647
return objectMapper.readValue(value, HttpHeaders.class);
4748
} catch (JsonProcessingException e) {
@@ -51,7 +52,6 @@ public HttpHeaders deserializeFromString(String value) {
5152

5253
@Override
5354
public String serializeToString(HttpHeaders value) {
54-
ObjectMapper objectMapper = new ObjectMapper();
5555
try {
5656
return objectMapper.writeValueAsString(value);
5757
} catch (JsonProcessingException e) {

src/main/java/eu/openanalytics/containerproxy/model/runtime/runtimevalues/ParameterNamesKey.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
public class ParameterNamesKey extends RuntimeValueKey<ParameterNames> {
2828

2929
public static final ParameterNamesKey inst = new ParameterNamesKey();
30+
private final ObjectMapper objectMapper = new ObjectMapper();
3031

3132
public ParameterNamesKey() {
3233
super("openanalytics.eu/sp-parameters-names",
@@ -42,7 +43,6 @@ public ParameterNamesKey() {
4243

4344
@Override
4445
public ParameterNames deserializeFromString(String value) {
45-
ObjectMapper objectMapper = new ObjectMapper();
4646
try {
4747
return objectMapper.readValue(value, ParameterNames.class);
4848
} catch (JsonProcessingException e) {
@@ -52,7 +52,6 @@ public ParameterNames deserializeFromString(String value) {
5252

5353
@Override
5454
public String serializeToString(ParameterNames value) {
55-
ObjectMapper objectMapper = new ObjectMapper();
5655
try {
5756
return objectMapper.writeValueAsString(value);
5857
} catch (JsonProcessingException e) {

src/main/java/eu/openanalytics/containerproxy/model/runtime/runtimevalues/ParameterValuesKey.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
public class ParameterValuesKey extends RuntimeValueKey<ParameterValues> {
2828

2929
public static final ParameterValuesKey inst = new ParameterValuesKey();
30+
private final ObjectMapper objectMapper = new ObjectMapper();
3031

3132
public ParameterValuesKey() {
3233
super("openanalytics.eu/sp-parameters",
@@ -42,7 +43,6 @@ public ParameterValuesKey() {
4243

4344
@Override
4445
public ParameterValues deserializeFromString(String value) {
45-
ObjectMapper objectMapper = new ObjectMapper();
4646
try {
4747
return objectMapper.readValue(value, ParameterValues.class);
4848
} catch (JsonProcessingException e) {
@@ -52,7 +52,6 @@ public ParameterValues deserializeFromString(String value) {
5252

5353
@Override
5454
public String serializeToString(ParameterValues value) {
55-
ObjectMapper objectMapper = new ObjectMapper();
5655
try {
5756
return objectMapper.writeValueAsString(value);
5857
} catch (JsonProcessingException e) {

src/main/java/eu/openanalytics/containerproxy/model/runtime/runtimevalues/PortMappingsKey.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
public class PortMappingsKey extends RuntimeValueKey<PortMappings> {
2828

2929
public static final PortMappingsKey inst = new PortMappingsKey();
30+
private final ObjectMapper objectMapper = new ObjectMapper();
3031

3132
private PortMappingsKey() {
3233
super("openanalytics.eu/sp-port-mappings",
@@ -42,7 +43,6 @@ private PortMappingsKey() {
4243

4344
@Override
4445
public PortMappings deserializeFromString(String value) {
45-
ObjectMapper objectMapper = new ObjectMapper();
4646
try {
4747
return objectMapper.readValue(value, PortMappings.class);
4848
} catch (JsonProcessingException e) {
@@ -52,7 +52,6 @@ public PortMappings deserializeFromString(String value) {
5252

5353
@Override
5454
public String serializeToString(PortMappings value) {
55-
ObjectMapper objectMapper = new ObjectMapper();
5655
try {
5756
return objectMapper.writeValueAsString(value);
5857
} catch (JsonProcessingException e) {

src/main/java/eu/openanalytics/containerproxy/model/store/IProxyStore.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import eu.openanalytics.containerproxy.model.runtime.Proxy;
2424

2525
import java.util.Collection;
26+
import java.util.List;
2627

2728
/**
2829
* Interface to manage Active Proxies in the ProxyService.
@@ -38,4 +39,6 @@ public interface IProxyStore {
3839
void updateProxy(Proxy proxy);
3940

4041
Proxy getProxy(String proxyId);
42+
43+
List<Proxy> getUserProxies(String userId);
4144
}

src/main/java/eu/openanalytics/containerproxy/model/store/memory/MemoryProxyStore.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,22 @@
2020
*/
2121
package eu.openanalytics.containerproxy.model.store.memory;
2222

23+
import com.google.common.collect.ArrayListMultimap;
24+
import com.google.common.collect.ListMultimap;
25+
import com.google.common.collect.Multimaps;
2326
import eu.openanalytics.containerproxy.model.runtime.Proxy;
2427
import eu.openanalytics.containerproxy.model.store.IProxyStore;
2528

29+
import java.util.ArrayList;
2630
import java.util.Collection;
2731
import java.util.Collections;
32+
import java.util.List;
2833
import java.util.concurrent.ConcurrentHashMap;
2934

3035
public class MemoryProxyStore implements IProxyStore {
3136

3237
private final ConcurrentHashMap<String, Proxy> activeProxies = new ConcurrentHashMap<>();
38+
private final ListMultimap<String, String> userProxies = Multimaps.synchronizedListMultimap(ArrayListMultimap.create());
3339

3440
@Override
3541
public Collection<Proxy> getAllProxies() {
@@ -39,11 +45,13 @@ public Collection<Proxy> getAllProxies() {
3945
@Override
4046
public void addProxy(Proxy proxy) {
4147
activeProxies.put(proxy.getId(), proxy);
48+
userProxies.put(proxy.getUserId(), proxy.getId());
4249
}
4350

4451
@Override
4552
public void removeProxy(Proxy proxy) {
4653
activeProxies.remove(proxy.getId());
54+
userProxies.remove(proxy.getUserId(), proxy.getId());
4755
}
4856

4957
@Override
@@ -56,4 +64,17 @@ public Proxy getProxy(String proxyId) {
5664
return activeProxies.get(proxyId);
5765
}
5866

67+
@Override
68+
public List<Proxy> getUserProxies(String userId) {
69+
List<Proxy> result = new ArrayList<>();
70+
List<String> ids = userProxies.get(userId);
71+
for (String proxyId : ids) {
72+
Proxy proxy = activeProxies.get(proxyId);
73+
if (proxy != null && proxy.getUserId().equalsIgnoreCase(userId)) {
74+
result.add(proxy);
75+
}
76+
}
77+
return result;
78+
}
79+
5980
}

src/main/java/eu/openanalytics/containerproxy/model/store/redis/RedisProxyStore.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,33 +24,46 @@
2424
import eu.openanalytics.containerproxy.model.runtime.Proxy;
2525
import eu.openanalytics.containerproxy.model.store.IProxyStore;
2626
import eu.openanalytics.containerproxy.service.IdentifierService;
27+
import eu.openanalytics.containerproxy.util.ProxyHashMap;
2728
import eu.openanalytics.containerproxy.util.ProxyMappingManager;
2829
import org.apache.logging.log4j.LogManager;
2930
import org.apache.logging.log4j.Logger;
3031
import org.springframework.context.event.EventListener;
3132
import org.springframework.data.redis.core.HashOperations;
3233
import org.springframework.data.redis.core.RedisTemplate;
34+
import org.springframework.data.redis.core.SetOperations;
3335

3436
import javax.annotation.PostConstruct;
3537
import javax.inject.Inject;
38+
import java.util.ArrayList;
3639
import java.util.List;
40+
import java.util.Set;
41+
import java.util.concurrent.ConcurrentHashMap;
3742

3843
public class RedisProxyStore implements IProxyStore {
3944

4045
private final Logger logger = LogManager.getLogger(RedisProxyStore.class);
4146
@Inject
4247
private RedisTemplate<String, Proxy> redisTemplate;
4348
@Inject
49+
private RedisTemplate<String, String> userProxyTemplate;
50+
@Inject
4451
private ProxyMappingManager mappingManager;
4552
@Inject
4653
private IdentifierService identifierService;
4754
private String redisKey;
4855
private HashOperations<String, String, Proxy> ops; // TODO refactor to bound?
56+
private SetOperations<String, String> userProxyOps;
57+
58+
private final ConcurrentHashMap<String, Proxy> cache = ProxyHashMap.create();
59+
private String userProxyRedisKey;
4960

5061
@PostConstruct
5162
public void init() {
5263
redisKey = "shinyproxy_" + identifierService.realmId + "__active_proxies";
5364
ops = redisTemplate.opsForHash();
65+
userProxyRedisKey = "shinyproxy_user_proxies__";
66+
userProxyOps = userProxyTemplate.opsForSet();
5467
}
5568

5669
@Override
@@ -65,13 +78,15 @@ public void addProxy(Proxy proxy) {
6578
logger.debug("Add proxy {}", proxy.getId());
6679
ops.put(redisKey, proxy.getId(), proxy);
6780
updateMappings(proxy.getId(), proxy);
81+
userProxyOps.add(userProxyRedisKey + proxy.getUserId(), proxy.getId());
6882
}
6983

7084
@Override
7185
public void removeProxy(Proxy proxy) {
7286
logger.debug("Remove proxy {}", proxy.getId());
7387
ops.delete(redisKey, proxy.getId());
7488
updateMappings(proxy.getId(), proxy);
89+
userProxyOps.remove(userProxyRedisKey + proxy.getUserId(), proxy.getId());
7590
}
7691

7792
@Override
@@ -89,6 +104,22 @@ public Proxy getProxy(String proxyId) {
89104
return proxy;
90105
}
91106

107+
@Override
108+
public List<Proxy> getUserProxies(String userId) {
109+
List<Proxy> result = new ArrayList<>();
110+
Set<String> ids = userProxyOps.members(userProxyRedisKey + userId);
111+
if (ids == null) {
112+
return result;
113+
}
114+
List<Proxy> proxies = ops.multiGet(redisKey, ids);
115+
for (Proxy proxy : proxies) {
116+
if (proxy != null && proxy.getUserId().equalsIgnoreCase(userId)) {
117+
result.add(proxy);
118+
}
119+
}
120+
return result;
121+
}
122+
92123
@EventListener
93124
public void onProxyStopped(ProxyStopEvent event) {
94125
logger.debug("Redis: remove mappings (event) {}", event.getProxyId());

src/main/java/eu/openanalytics/containerproxy/service/ProxyService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ public Stream<Proxy> getUserProxiesBySpecId(String specId) {
195195
* @return A List of matching proxies, may be empty.
196196
*/
197197
public List<Proxy> getUserProxies() {
198-
return proxyStore.getAllProxies().stream().filter(p -> userService.isOwner(p)).toList();
198+
return proxyStore.getUserProxies(userService.getCurrentUserId());
199199
}
200200

201201
/**
@@ -204,7 +204,7 @@ public List<Proxy> getUserProxies() {
204204
* @return A List of matching proxies, may be empty.
205205
*/
206206
public List<Proxy> getUserProxies(String userId) {
207-
return proxyStore.getAllProxies().stream().filter(p -> p.getUserId().equals(userId)).toList();
207+
return proxyStore.getUserProxies(userId);
208208
}
209209

210210
/**

0 commit comments

Comments
 (0)