Skip to content

Commit 185c280

Browse files
committed
softdelete experimentation
1 parent 8fa45d0 commit 185c280

File tree

9 files changed

+64
-20
lines changed

9 files changed

+64
-20
lines changed

src/main/java/io/cryostat/discovery/ContainerDiscovery.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,9 +259,8 @@ private Target toTarget(ContainerSpec desc) {
259259
return null;
260260
}
261261

262-
Target target = new Target();
262+
Target target = Target.createOrUndelete(connectUrl);
263263
target.activeRecordings = new ArrayList<>();
264-
target.connectUrl = connectUrl;
265264
target.alias = Optional.ofNullable(desc.Names.get(0)).orElse(desc.Id);
266265
target.labels = desc.Labels;
267266
target.annotations =

src/main/java/io/cryostat/discovery/CustomDiscovery.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,7 @@ public RestResponse<Target> createForm(
115115
@RestForm String password,
116116
@RestQuery boolean dryrun,
117117
@RestQuery boolean storeCredentials) {
118-
var target = new Target();
119-
target.connectUrl = connectUrl;
118+
var target = Target.createOrUndelete(connectUrl);
120119
target.alias = alias;
121120

122121
Credential credential = null;

src/main/java/io/cryostat/discovery/JDPDiscovery.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,8 @@ void handleJdpEvent(JvmDiscoveryEvent evt) {
113113

114114
switch (evt.getEventKind()) {
115115
case FOUND:
116-
Target target = new Target();
116+
Target target = Target.createOrUndelete(connectUrl);
117117
target.activeRecordings = new ArrayList<>();
118-
target.connectUrl = connectUrl;
119118
target.alias = evt.getJvmDescriptor().getMainClass();
120119
target.annotations =
121120
new Annotations(

src/main/java/io/cryostat/discovery/KubeApiDiscovery.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -616,9 +616,8 @@ public Target toTarget() {
616616
"/jndi/rmi://" + host + ':' + port.getPort() + "/jmxrmi");
617617
URI connectUrl = URI.create(jmxUrl.toString());
618618

619-
Target target = new Target();
619+
Target target = Target.createOrUndelete(connectUrl);
620620
target.activeRecordings = new ArrayList<>();
621-
target.connectUrl = connectUrl;
622621
target.alias = objRef.getName();
623622
target.labels = (obj != null ? obj.getMetadata().getLabels() : new HashMap<>());
624623
target.annotations =

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ public List<ProgramOption> getProgramOptions() {
302302
}
303303

304304
private String[] getJfrEventTypeIds(SimplifiedTarget st) {
305-
Target target = Target.find("id", st.id()).singleResult();
305+
var target = Target.getTargetById(st.id());
306306
try {
307307
return connectionManager.executeConnectedTask(
308308
target,

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

Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333

3434
import io.cryostat.discovery.DiscoveryNode;
3535
import io.cryostat.recordings.ActiveRecording;
36+
import io.cryostat.recordings.RecordingHelper;
3637
import io.cryostat.util.URIUtil;
3738
import io.cryostat.ws.MessagingServer;
3839
import io.cryostat.ws.Notification;
@@ -126,6 +127,37 @@ public String targetId() {
126127
return this.connectUrl.toString();
127128
}
128129

130+
public static Target createOrUndelete(URI connectUrl) {
131+
Objects.requireNonNull(connectUrl);
132+
var target =
133+
Panache.getSession()
134+
// ignore soft deletion field
135+
.createNativeQuery(
136+
"select * from Target where connectUrl = :connectUrl", Target.class)
137+
.setParameter("connectUrl", connectUrl.toString().getBytes())
138+
.uniqueResult();
139+
if (target == null) {
140+
target = new Target();
141+
target.connectUrl = connectUrl;
142+
} else {
143+
int updates =
144+
Panache.getSession()
145+
.createNativeQuery(
146+
"update target set deleted = false where id = :id",
147+
Target.class)
148+
.setParameter("id", target.id)
149+
.executeUpdate();
150+
if (updates != 1) {
151+
Logger.getLogger(Target.class)
152+
.warnv(
153+
"Attempted to undelete Target {0} with connectUrl={1}, but update"
154+
+ " affected {2} rows",
155+
target.id, connectUrl, updates);
156+
}
157+
}
158+
return target;
159+
}
160+
129161
public static List<Target> getTargetsIncludingDeleted() {
130162
return Panache.getSession()
131163
// ignore soft deletion field
@@ -134,27 +166,34 @@ public static List<Target> getTargetsIncludingDeleted() {
134166
}
135167

136168
public static Target getTargetById(long targetId) {
137-
return Panache.getSession()
138-
// ignore soft deletion field
139-
.createNativeQuery("select * from Target where id = :id", Target.class)
140-
.setParameter("id", targetId)
141-
.getSingleResult();
169+
return getTargetById(targetId, false);
170+
}
171+
172+
public static Target getTargetById(long targetId, boolean includeDeleted) {
173+
if (includeDeleted) {
174+
return Panache.getSession()
175+
.createNativeQuery("select * from Target where id = :id", Target.class)
176+
.setParameter("id", targetId)
177+
.getSingleResult();
178+
} else {
179+
return Target.find("id", targetId).singleResult();
180+
}
142181
}
143182

144183
public static Target getTargetByConnectUrl(URI connectUrl) {
145184
return Panache.getSession()
146185
// ignore soft deletion field
147186
.createNativeQuery(
148187
"select * from Target where connectUrl = :connectUrl", Target.class)
149-
.setParameter("connectUrl", connectUrl.toString())
188+
.setParameter("connectUrl", connectUrl.toString().getBytes())
150189
.getSingleResult();
151190
}
152191

153192
public static Optional<Target> getTargetByJvmId(String jvmId) {
154193
return Panache.getSession()
155194
// ignore soft deletion field
156195
.createNativeQuery("select * from Target where jvmId = :jvmId", Target.class)
157-
.setParameter("jvmId", jvmId)
196+
.setParameter("jvmId", jvmId.getBytes())
158197
.uniqueResultOptional();
159198
}
160199

@@ -309,8 +348,9 @@ public record TargetDiscovery(EventKind kind, Target serviceRef, String jvmId) {
309348
static class Listener {
310349

311350
@Inject URIUtil uriUtil;
312-
@Inject Logger logger;
351+
@Inject RecordingHelper recordingHelper;
313352
@Inject EventBus bus;
353+
@Inject Logger logger;
314354

315355
@PrePersist
316356
void prePersist(Target target) {
@@ -356,6 +396,7 @@ void postUpdate(Target target) {
356396
@PostRemove
357397
void postRemove(Target target) {
358398
notify(EventKind.LOST, target);
399+
target.activeRecordings.forEach(recordingHelper::deleteRecording);
359400
}
360401

361402
private void notify(EventKind eventKind, Target target) {

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,11 @@ public void execute(JobExecutionContext context) throws JobExecutionException {
4848
List<Target> targets;
4949
Long targetId = (Long) context.getJobDetail().getJobDataMap().get("targetId");
5050
if (targetId != null) {
51-
targets = List.of(Target.getTargetById(targetId));
51+
Target target = Target.findById(targetId);
52+
if (target == null) {
53+
return;
54+
}
55+
targets = List.of();
5256
} else {
5357
targets = Target.<Target>find("#Target.unconnected").list();
5458
}

src/main/resources/db/migration/V4.1.0__cryostat.sql

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,6 @@ alter table Rule add column metadata jsonb default '{"labels":{}}';
1313

1414
delete from DiscoveryNode where nodeType not in ('Universe', 'Realm');
1515
delete from Target where true;
16+
17+
alter table Target drop constraint FKl0dhd7qeayg54dcoblpww6x34;
18+
alter table Target drop constraint target_connecturl_key;

src/test/java/itest/TargetRecordingPatchTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package itest;
1717

18+
import java.util.List;
1819
import java.util.concurrent.CompletableFuture;
1920
import java.util.concurrent.CountDownLatch;
2021
import java.util.concurrent.ExecutorService;
@@ -34,7 +35,6 @@
3435
import itest.util.ITestCleanupFailedException;
3536
import org.hamcrest.MatcherAssert;
3637
import org.hamcrest.Matchers;
37-
import org.junit.jupiter.api.Assertions;
3838
import org.junit.jupiter.api.Test;
3939

4040
@QuarkusTest
@@ -121,7 +121,7 @@ void testSaveEmptyRecordingDoesNotArchiveRecordingFile() throws Exception {
121121
}
122122
});
123123
JsonArray listResp = listRespFuture1.get(REQUEST_TIMEOUT_SECONDS, TimeUnit.SECONDS);
124-
Assertions.assertTrue(listResp.isEmpty());
124+
MatcherAssert.assertThat(listResp.getList(), Matchers.equalTo(List.of()));
125125

126126
} finally {
127127
// Clean up recording

0 commit comments

Comments
 (0)