Skip to content

Commit fceff9d

Browse files
authored
fix(credentials): ensure deletion occurs within transaction context (#755)
* fix(credentials): ensure deletion occurs within transaction context * avoid concurrent update exception * log everything in dev mode
1 parent 0f44d53 commit fceff9d

File tree

4 files changed

+42
-31
lines changed

4 files changed

+42
-31
lines changed

src/main/java/io/cryostat/JsonRequestFilter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@
1919
import java.io.IOException;
2020
import java.io.InputStream;
2121
import java.nio.charset.StandardCharsets;
22-
import java.util.HashMap;
2322
import java.util.Map;
2423
import java.util.Set;
24+
import java.util.concurrent.ConcurrentHashMap;
2525
import java.util.regex.Pattern;
2626

2727
import com.fasterxml.jackson.databind.JsonNode;
@@ -44,7 +44,7 @@ public class JsonRequestFilter implements ContainerRequestFilter {
4444
"/api/v4/matchExpressions",
4545
"/api/v4/graphql");
4646

47-
private final Map<String, Pattern> compiledPatterns = new HashMap<>();
47+
private final Map<String, Pattern> compiledPatterns = new ConcurrentHashMap<>();
4848
@Inject ObjectMapper objectMapper;
4949

5050
@Override

src/main/java/io/cryostat/expressions/MatchExpressionEvaluator.java

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import io.quarkus.cache.CacheResult;
3636
import io.quarkus.cache.CompositeCacheKey;
3737
import io.quarkus.logging.Log;
38+
import io.quarkus.narayana.jta.QuarkusTransaction;
3839
import io.quarkus.vertx.ConsumeEvent;
3940
import jakarta.annotation.Nullable;
4041
import jakarta.enterprise.context.ApplicationScoped;
@@ -174,34 +175,39 @@ public boolean applies(MatchExpression matchExpression, Target target) throws Sc
174175
}
175176

176177
public List<Target> getMatchedTargets(MatchExpression matchExpression) {
177-
var targets =
178-
Target.<Target>listAll().stream()
179-
.filter(
180-
target -> {
181-
try {
182-
return applies(matchExpression, target);
183-
} catch (ScriptException e) {
184-
logger.error(
185-
"Error while processing expression: "
186-
+ matchExpression,
187-
e);
188-
return false;
189-
}
190-
})
191-
.collect(Collectors.toList());
178+
return QuarkusTransaction.joiningExisting()
179+
.call(
180+
() -> {
181+
var targets =
182+
Target.<Target>listAll().stream()
183+
.filter(
184+
target -> {
185+
try {
186+
return applies(matchExpression, target);
187+
} catch (ScriptException e) {
188+
logger.error(
189+
"Error while processing"
190+
+ " expression: "
191+
+ matchExpression,
192+
e);
193+
return false;
194+
}
195+
})
196+
.collect(Collectors.toList());
192197

193-
var ids = new HashSet<>();
194-
var it = targets.iterator();
195-
while (it.hasNext()) {
196-
var t = it.next();
197-
if (ids.contains(t.jvmId)) {
198-
it.remove();
199-
continue;
200-
}
201-
ids.add(t.jvmId);
202-
}
198+
var ids = new HashSet<>();
199+
var it = targets.iterator();
200+
while (it.hasNext()) {
201+
var t = it.next();
202+
if (ids.contains(t.jvmId)) {
203+
it.remove();
204+
continue;
205+
}
206+
ids.add(t.jvmId);
207+
}
203208

204-
return targets;
209+
return targets;
210+
});
205211
}
206212

207213
@Name("io.cryostat.rules.MatchExpressionEvaluator.MatchExpressionApplies")

src/main/java/io/cryostat/targets/TargetUpdateService.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import jakarta.enterprise.context.ApplicationScoped;
3232
import jakarta.enterprise.event.Observes;
3333
import jakarta.inject.Inject;
34+
import jakarta.transaction.Transactional;
3435
import org.eclipse.microprofile.config.inject.ConfigProperty;
3536
import org.jboss.logging.Logger;
3637
import org.quartz.JobBuilder;
@@ -77,17 +78,20 @@ void onStop(@Observes ShutdownEvent evt) throws SchedulerException {
7778
scheduler.shutdown();
7879
}
7980

80-
@ConsumeEvent(Credential.CREDENTIALS_STORED)
81+
@ConsumeEvent(value = Credential.CREDENTIALS_STORED, blocking = true)
82+
@Transactional
8183
void onCredentialsStored(Credential credential) {
8284
updateTargetsForExpression(credential);
8385
}
8486

85-
@ConsumeEvent(Credential.CREDENTIALS_UPDATED)
87+
@ConsumeEvent(value = Credential.CREDENTIALS_UPDATED, blocking = true)
88+
@Transactional
8689
void onCredentialsUpdated(Credential credential) {
8790
updateTargetsForExpression(credential);
8891
}
8992

90-
@ConsumeEvent(Credential.CREDENTIALS_DELETED)
93+
@ConsumeEvent(value = Credential.CREDENTIALS_DELETED, blocking = true)
94+
@Transactional
9195
void onCredentialsDeleted(Credential credential) {
9296
updateTargetsForExpression(credential);
9397
}

src/main/resources/application-dev.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ quarkus.http.cors.access-control-allow-credentials=true
1212
# quarkus.http.cors.methods=GET,PUT,POST,PATCH,OPTIONS
1313
# quarkus.http.cors.access-control-max-age=1s
1414

15+
quarkus.log.level=ALL
1516
quarkus.hibernate-orm.log.sql=true
1617

1718
quarkus.log.category."org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext".level=DEBUG

0 commit comments

Comments
 (0)