Skip to content

Commit c20b8a0

Browse files
authored
perf(sql): set up indices (#870)
* chore(sql): set up indices for perf reset discoverynode sequence increment to 50 to satisfy schema validator * DiscoveryNode indices * filter node name at query level instead of application-side
1 parent 864df23 commit c20b8a0

File tree

6 files changed

+63
-59
lines changed

6 files changed

+63
-59
lines changed

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

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@
2121
import java.util.Map;
2222
import java.util.Objects;
2323
import java.util.Optional;
24+
import java.util.function.Consumer;
2425
import java.util.function.Predicate;
2526

27+
import io.cryostat.discovery.NodeType.BaseNodeType;
2628
import io.cryostat.targets.Target;
2729

2830
import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -41,6 +43,7 @@
4143
import jakarta.persistence.Entity;
4244
import jakarta.persistence.EntityListeners;
4345
import jakarta.persistence.FetchType;
46+
import jakarta.persistence.Index;
4447
import jakarta.persistence.JoinColumn;
4548
import jakarta.persistence.ManyToOne;
4649
import jakarta.persistence.NamedQueries;
@@ -51,6 +54,7 @@
5154
import jakarta.persistence.PostRemove;
5255
import jakarta.persistence.PostUpdate;
5356
import jakarta.persistence.PrePersist;
57+
import jakarta.persistence.Table;
5458
import jakarta.validation.constraints.NotBlank;
5559
import jakarta.validation.constraints.NotNull;
5660
import org.hibernate.annotations.JdbcTypeCode;
@@ -64,6 +68,7 @@
6468
name = "DiscoveryNode.byTypeWithName",
6569
query = "from DiscoveryNode where nodeType = :nodeType and name = :name")
6670
})
71+
@Table(indexes = {@Index(columnList = "nodeType"), @Index(columnList = "nodeType, name")})
6772
public class DiscoveryNode extends PanacheEntity {
6873

6974
public static final String NODE_TYPE = "nodeType";
@@ -119,24 +124,22 @@ public static DiscoveryNode getUniverse() {
119124
}
120125

121126
public static Optional<DiscoveryNode> getRealm(String name) {
122-
return getUniverse().children.stream().filter(n -> name.equals(n.name)).findFirst();
127+
return DiscoveryNode.<DiscoveryNode>find(
128+
"#DiscoveryNode.byTypeWithName",
129+
Parameters.with("nodeType", BaseNodeType.REALM.getKind()).and("name", name))
130+
.firstResultOptional();
123131
}
124132

125133
public static Optional<DiscoveryNode> getChild(
126134
DiscoveryNode node, Predicate<DiscoveryNode> predicate) {
127135
return node.children.stream().filter(predicate).findFirst();
128136
}
129137

130-
public static Optional<DiscoveryNode> getNode(Predicate<DiscoveryNode> predicate) {
131-
List<DiscoveryNode> nodes = listAll();
132-
return nodes.stream().filter(predicate).findFirst();
133-
}
134-
135-
public static List<DiscoveryNode> findAllByNodeType(NodeType nodeType) {
136-
return DiscoveryNode.find(DiscoveryNode.NODE_TYPE, nodeType.getKind()).list();
137-
}
138-
139-
public static DiscoveryNode environment(String name, NodeType nodeType) {
138+
static DiscoveryNode byTypeWithName(
139+
NodeType nodeType,
140+
String name,
141+
Predicate<DiscoveryNode> predicate,
142+
Consumer<DiscoveryNode> customizer) {
140143
var kind = nodeType.getKind();
141144
return DiscoveryNode.<DiscoveryNode>find(
142145
"#DiscoveryNode.byTypeWithName",
@@ -153,32 +156,29 @@ public static DiscoveryNode environment(String name, NodeType nodeType) {
153156
node.labels = new HashMap<>();
154157
node.children = new ArrayList<>();
155158
node.target = null;
159+
customizer.accept(node);
156160
node.persist();
157161
return node;
158162
}));
159163
}
160164

165+
public static List<DiscoveryNode> findAllByNodeType(NodeType nodeType) {
166+
return DiscoveryNode.find(DiscoveryNode.NODE_TYPE, nodeType.getKind()).list();
167+
}
168+
169+
public static DiscoveryNode environment(String name, NodeType nodeType) {
170+
return byTypeWithName(nodeType, name, n -> true, n -> {});
171+
}
172+
161173
public static DiscoveryNode target(Target target, NodeType nodeType) {
162-
var kind = nodeType.getKind();
163-
var connectUrl = target.connectUrl.toString();
164-
return DiscoveryNode.<DiscoveryNode>find(
165-
"#DiscoveryNode.byTypeWithName",
166-
Parameters.with("nodeType", kind).and("name", connectUrl))
167-
.firstResultOptional()
168-
.orElseGet(
169-
() ->
170-
QuarkusTransaction.joiningExisting()
171-
.call(
172-
() -> {
173-
DiscoveryNode node = new DiscoveryNode();
174-
node.name = connectUrl;
175-
node.nodeType = kind;
176-
node.labels = new HashMap<>(target.labels);
177-
node.children = null;
178-
node.target = target;
179-
node.persist();
180-
return node;
181-
}));
174+
return byTypeWithName(
175+
nodeType,
176+
target.connectUrl.toString(),
177+
n -> true,
178+
n -> {
179+
n.target = target;
180+
n.labels.putAll(target.labels);
181+
});
182182
}
183183

184184
@Override

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

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -505,29 +505,19 @@ private Pair<HasMetadata, DiscoveryNode> queryForNode(
505505
nodeType.getQueryFunction().apply(client).apply(namespace).apply(name);
506506

507507
DiscoveryNode node =
508-
DiscoveryNode.getNode(
509-
n -> {
510-
return nodeType.getKind().equals(n.nodeType)
511-
&& name.equals(n.name)
512-
&& namespace.equals(
513-
n.labels.get(DISCOVERY_NAMESPACE_LABEL_KEY));
514-
})
515-
.orElseGet(
516-
() -> {
517-
DiscoveryNode newNode = new DiscoveryNode();
518-
newNode.name = name;
519-
newNode.nodeType = nodeType.getKind();
520-
newNode.children = new ArrayList<>();
521-
newNode.target = null;
522-
Map<String, String> labels =
523-
kubeObj != null
524-
? kubeObj.getMetadata().getLabels()
525-
: new HashMap<>();
526-
// Add namespace to label to retrieve node later
527-
labels.put(DISCOVERY_NAMESPACE_LABEL_KEY, namespace);
528-
newNode.labels = labels;
529-
return newNode;
530-
});
508+
DiscoveryNode.byTypeWithName(
509+
nodeType,
510+
name,
511+
n -> namespace.equals(n.labels.get(DISCOVERY_NAMESPACE_LABEL_KEY)),
512+
n -> {
513+
Map<String, String> labels =
514+
kubeObj != null
515+
? kubeObj.getMetadata().getLabels()
516+
: new HashMap<>();
517+
// Add namespace to label to retrieve node later
518+
labels.put(DISCOVERY_NAMESPACE_LABEL_KEY, namespace);
519+
n.labels.putAll(labels);
520+
});
531521
return Pair.of(kubeObj, node);
532522
}
533523

src/main/java/io/cryostat/recordings/ActiveRecording.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -146,11 +146,6 @@ public static ActiveRecording from(
146146
return recording;
147147
}
148148

149-
public static ActiveRecording getByName(String name) {
150-
Objects.requireNonNull(name);
151-
return find("name", name).singleResult();
152-
}
153-
154149
public void setMetadata(Metadata metadata) {
155150
this.metadata = metadata;
156151
}

src/main/java/io/cryostat/rules/Rule.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,14 @@
3434
import jakarta.persistence.Entity;
3535
import jakarta.persistence.EntityListeners;
3636
import jakarta.persistence.FetchType;
37+
import jakarta.persistence.Index;
3738
import jakarta.persistence.JoinColumn;
3839
import jakarta.persistence.OneToOne;
3940
import jakarta.persistence.PostPersist;
4041
import jakarta.persistence.PostRemove;
4142
import jakarta.persistence.PostUpdate;
4243
import jakarta.persistence.PrePersist;
44+
import jakarta.persistence.Table;
4345
import jakarta.validation.constraints.Min;
4446
import jakarta.validation.constraints.NotBlank;
4547
import jakarta.validation.constraints.NotNull;
@@ -49,6 +51,7 @@
4951

5052
@Entity
5153
@EntityListeners(Rule.Listener.class)
54+
@Table(indexes = {@Index(columnList = "name")})
5255
@SuppressFBWarnings(
5356
value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD",
5457
justification =

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import jakarta.persistence.Column;
4949
import jakarta.persistence.Entity;
5050
import jakarta.persistence.EntityListeners;
51+
import jakarta.persistence.Index;
5152
import jakarta.persistence.JoinColumn;
5253
import jakarta.persistence.NamedQueries;
5354
import jakarta.persistence.NamedQuery;
@@ -57,6 +58,7 @@
5758
import jakarta.persistence.PostRemove;
5859
import jakarta.persistence.PostUpdate;
5960
import jakarta.persistence.PrePersist;
61+
import jakarta.persistence.Table;
6062
import jakarta.validation.constraints.NotBlank;
6163
import jakarta.validation.constraints.NotNull;
6264
import org.apache.commons.lang3.StringUtils;
@@ -67,6 +69,11 @@
6769
@Entity
6870
@EntityListeners(Target.Listener.class)
6971
@NamedQueries({@NamedQuery(name = "Target.unconnected", query = "from Target where jvmId is null")})
72+
@Table(
73+
indexes = {
74+
@Index(columnList = "jvmId"),
75+
@Index(columnList = "connectUrl"),
76+
})
7077
public class Target extends PanacheEntity {
7178

7279
public static final String TARGET_JVM_DISCOVERY = "TargetJvmDiscovery";
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,10 @@
1+
alter sequence DiscoveryNode_SEQ increment by 50;
2+
3+
create index on Target (jvmId);
4+
create index on Target (connectUrl);
5+
6+
create index on DiscoveryNode (nodeType);
7+
create index on DiscoveryNode (nodeType, name);
8+
9+
create index on Rule (name);
110
alter table Rule add column metadata jsonb default '{"labels":{}}';

0 commit comments

Comments
 (0)