Skip to content

Commit caed673

Browse files
committed
HHH-18942 JFR events for collection recreate/update/remove
1 parent ad1a86f commit caed673

File tree

9 files changed

+338
-48
lines changed

9 files changed

+338
-48
lines changed

hibernate-core/src/main/java/org/hibernate/action/internal/CollectionRecreateAction.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
import org.hibernate.HibernateException;
88
import org.hibernate.collection.spi.PersistentCollection;
99
import org.hibernate.engine.spi.SharedSessionContractImplementor;
10+
import org.hibernate.event.spi.EventManager;
1011
import org.hibernate.event.spi.EventSource;
12+
import org.hibernate.event.spi.HibernateMonitoringEvent;
1113
import org.hibernate.event.spi.PostCollectionRecreateEvent;
1214
import org.hibernate.event.spi.PostCollectionRecreateEventListener;
1315
import org.hibernate.event.spi.PreCollectionRecreateEvent;
@@ -42,14 +44,26 @@ public void execute() throws HibernateException {
4244
final PersistentCollection<?> collection = getCollection();
4345
preRecreate();
4446
final SharedSessionContractImplementor session = getSession();
45-
getPersister().recreate( collection, getKey(), session);
47+
final CollectionPersister persister = getPersister();
48+
final Object key = getKey();
49+
final EventManager eventManager = session.getEventManager();
50+
final HibernateMonitoringEvent event = eventManager.beginCollectionRecreateEvent();
51+
boolean success = false;
52+
try {
53+
persister.recreate( collection, key, session );
54+
success = true;
55+
}
56+
finally {
57+
eventManager.completeCollectionRecreateEvent( event, key, persister.getRole(), success, session );
58+
}
59+
4660
session.getPersistenceContextInternal().getCollectionEntry( collection ).afterAction( collection );
4761
evict();
4862
postRecreate();
4963

5064
final StatisticsImplementor statistics = session.getFactory().getStatistics();
5165
if ( statistics.isStatisticsEnabled() ) {
52-
statistics.recreateCollection( getPersister().getRole() );
66+
statistics.recreateCollection( persister.getRole() );
5367
}
5468
}
5569

hibernate-core/src/main/java/org/hibernate/action/internal/CollectionRemoveAction.java

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
import org.hibernate.HibernateException;
99
import org.hibernate.collection.spi.PersistentCollection;
1010
import org.hibernate.engine.spi.SharedSessionContractImplementor;
11+
import org.hibernate.event.spi.EventManager;
1112
import org.hibernate.event.spi.EventSource;
13+
import org.hibernate.event.spi.HibernateMonitoringEvent;
1214
import org.hibernate.event.spi.PostCollectionRemoveEvent;
1315
import org.hibernate.event.spi.PostCollectionRemoveEventListener;
1416
import org.hibernate.event.spi.PreCollectionRemoveEvent;
@@ -108,8 +110,20 @@ public void execute() throws HibernateException {
108110
// is replaced by null or a different collection
109111
// (if the collection is uninitialized, Hibernate has no way of
110112
// knowing if the collection is actually empty without querying the db)
111-
getPersister().remove( getKey(), session );
113+
final CollectionPersister persister = getPersister();
114+
final Object key = getKey();
115+
final EventManager eventManager = session.getEventManager();
116+
final HibernateMonitoringEvent event = eventManager.beginCollectionRemoveEvent();
117+
boolean success = false;
118+
try {
119+
persister.remove( key, session );
120+
success = true;
121+
}
122+
finally {
123+
eventManager.completeCollectionRemoveEvent( event, key, persister.getRole(), success, session );
124+
}
112125
}
126+
113127
final PersistentCollection<?> collection = getCollection();
114128
if ( collection != null ) {
115129
session.getPersistenceContextInternal().getCollectionEntry( collection ).afterAction( collection );
@@ -130,12 +144,7 @@ private void preRemove() {
130144
}
131145

132146
private PreCollectionRemoveEvent newPreCollectionRemoveEvent() {
133-
return new PreCollectionRemoveEvent(
134-
getPersister(),
135-
getCollection(),
136-
eventSource(),
137-
affectedOwner
138-
);
147+
return new PreCollectionRemoveEvent( getPersister(), getCollection(), eventSource(), affectedOwner );
139148
}
140149

141150
private void postRemove() {
@@ -145,12 +154,7 @@ private void postRemove() {
145154
}
146155

147156
private PostCollectionRemoveEvent newPostCollectionRemoveEvent() {
148-
return new PostCollectionRemoveEvent(
149-
getPersister(),
150-
getCollection(),
151-
eventSource(),
152-
affectedOwner
153-
);
157+
return new PostCollectionRemoveEvent( getPersister(), getCollection(), eventSource(), affectedOwner );
154158
}
155159

156160
public Object getAffectedOwner() {

hibernate-core/src/main/java/org/hibernate/action/internal/CollectionUpdateAction.java

Lines changed: 38 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
import org.hibernate.HibernateException;
99
import org.hibernate.collection.spi.PersistentCollection;
1010
import org.hibernate.engine.spi.SharedSessionContractImplementor;
11+
import org.hibernate.event.spi.EventManager;
1112
import org.hibernate.event.spi.EventSource;
13+
import org.hibernate.event.spi.HibernateMonitoringEvent;
1214
import org.hibernate.event.spi.PostCollectionUpdateEvent;
1315
import org.hibernate.event.spi.PostCollectionUpdateEventListener;
1416
import org.hibernate.event.spi.PreCollectionUpdateEvent;
@@ -45,7 +47,7 @@ public CollectionUpdateAction(
4547

4648
@Override
4749
public void execute() throws HibernateException {
48-
final Object id = getKey();
50+
final Object key = getKey();
4951
final SharedSessionContractImplementor session = getSession();
5052
final CollectionPersister persister = getPersister();
5153
final PersistentCollection<?> collection = getCollection();
@@ -54,34 +56,45 @@ public void execute() throws HibernateException {
5456
preUpdate();
5557

5658
if ( !collection.wasInitialized() ) {
57-
// If there were queued operations, they would have been processed
58-
// and cleared by now.
59-
// The collection should still be dirty.
59+
// If there were queued operations, they would have
60+
// been processed and cleared by now.
6061
if ( !collection.isDirty() ) {
62+
// The collection should still be dirty.
6163
throw new AssertionFailure( "collection is not dirty" );
6264
}
63-
//do nothing - we only need to notify the cache...
65+
// Do nothing - we only need to notify the cache
6466
}
65-
else if ( !affectedByFilters && collection.empty() ) {
66-
if ( !emptySnapshot ) {
67-
persister.remove( id, session );
68-
}
69-
}
70-
else if ( collection.needsRecreate( persister ) ) {
71-
if ( affectedByFilters ) {
72-
throw new HibernateException( "cannot recreate collection while filter is enabled: "
73-
+ collectionInfoString( persister, collection, id, session )
74-
);
67+
else {
68+
final EventManager eventManager = session.getEventManager();
69+
final HibernateMonitoringEvent event = eventManager.beginCollectionUpdateEvent();
70+
boolean success = false;
71+
try {
72+
if ( !affectedByFilters && collection.empty() ) {
73+
if ( !emptySnapshot ) {
74+
persister.remove( key, session );
75+
}
76+
//TODO: else we really shouldn't have sent an update event to JFR
77+
}
78+
else if ( collection.needsRecreate( persister ) ) {
79+
if ( affectedByFilters ) {
80+
throw new HibernateException( "cannot recreate collection while filter is enabled: "
81+
+ collectionInfoString( persister, collection, key, session ) );
82+
}
83+
if ( !emptySnapshot ) {
84+
persister.remove( key, session );
85+
}
86+
persister.recreate( collection, key, session );
87+
}
88+
else {
89+
persister.deleteRows( collection, key, session );
90+
persister.updateRows( collection, key, session );
91+
persister.insertRows( collection, key, session );
92+
}
93+
success = true;
7594
}
76-
if ( !emptySnapshot ) {
77-
persister.remove( id, session );
95+
finally {
96+
eventManager.completeCollectionUpdateEvent( event, key, persister.getRole(), success, session );
7897
}
79-
persister.recreate( collection, id, session );
80-
}
81-
else {
82-
persister.deleteRows( collection, id, session );
83-
persister.updateRows( collection, id, session );
84-
persister.insertRows( collection, id, session );
8598
}
8699

87100
session.getPersistenceContextInternal().getCollectionEntry( collection ).afterAction( collection );
@@ -101,11 +114,7 @@ private void preUpdate() {
101114
}
102115

103116
private PreCollectionUpdateEvent newPreCollectionUpdateEvent() {
104-
return new PreCollectionUpdateEvent(
105-
getPersister(),
106-
getCollection(),
107-
eventSource()
108-
);
117+
return new PreCollectionUpdateEvent( getPersister(), getCollection(), eventSource() );
109118
}
110119

111120
private void postUpdate() {
@@ -115,11 +124,7 @@ private void postUpdate() {
115124
}
116125

117126
private PostCollectionUpdateEvent newPostCollectionUpdateEvent() {
118-
return new PostCollectionUpdateEvent(
119-
getPersister(),
120-
getCollection(),
121-
eventSource()
122-
);
127+
return new PostCollectionUpdateEvent( getPersister(), getCollection(), eventSource() );
123128
}
124129

125130
}

hibernate-core/src/main/java/org/hibernate/event/internal/EmptyEventManager.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
import org.hibernate.persister.collection.CollectionPersister;
1616
import org.hibernate.persister.entity.EntityPersister;
1717

18+
/**
19+
* An {@link EventManager} that ignores all events.
20+
*/
1821
public final class EmptyEventManager implements EventManager {
1922

2023
@Override
@@ -276,4 +279,34 @@ public void completeEntityDeleteEvent(
276279
SharedSessionContractImplementor session) {
277280

278281
}
282+
283+
@Override
284+
public HibernateMonitoringEvent beginCollectionRecreateEvent() {
285+
return null;
286+
}
287+
288+
@Override
289+
public void completeCollectionRecreateEvent(HibernateMonitoringEvent event, Object id, String role, boolean success, SharedSessionContractImplementor session) {
290+
291+
}
292+
293+
@Override
294+
public HibernateMonitoringEvent beginCollectionUpdateEvent() {
295+
return null;
296+
}
297+
298+
@Override
299+
public void completeCollectionUpdateEvent(HibernateMonitoringEvent event, Object id, String role, boolean success, SharedSessionContractImplementor session) {
300+
301+
}
302+
303+
@Override
304+
public HibernateMonitoringEvent beginCollectionRemoveEvent() {
305+
return null;
306+
}
307+
308+
@Override
309+
public void completeCollectionRemoveEvent(HibernateMonitoringEvent event, Object id, String role, boolean success, SharedSessionContractImplementor session) {
310+
311+
}
279312
}

hibernate-core/src/main/java/org/hibernate/event/spi/EventManager.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,18 @@ void completePrePartialFlush(
169169

170170
void completeEntityDeleteEvent(HibernateMonitoringEvent event, Object id, String entityName, boolean success, SharedSessionContractImplementor session);
171171

172+
HibernateMonitoringEvent beginCollectionRecreateEvent();
173+
174+
void completeCollectionRecreateEvent(HibernateMonitoringEvent event, Object id, String role, boolean success, SharedSessionContractImplementor session);
175+
176+
HibernateMonitoringEvent beginCollectionUpdateEvent();
177+
178+
void completeCollectionUpdateEvent(HibernateMonitoringEvent event, Object id, String role, boolean success, SharedSessionContractImplementor session);
179+
180+
HibernateMonitoringEvent beginCollectionRemoveEvent();
181+
182+
void completeCollectionRemoveEvent(HibernateMonitoringEvent event, Object id, String role, boolean success, SharedSessionContractImplementor session);
183+
172184
enum CacheActionDescription {
173185
ENTITY_INSERT( "Entity Insert" ),
174186
ENTITY_AFTER_INSERT( "Entity After Insert" ),
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.event.jfr.internal;
6+
7+
import jdk.jfr.Category;
8+
import jdk.jfr.Description;
9+
import jdk.jfr.Event;
10+
import jdk.jfr.Label;
11+
import jdk.jfr.Name;
12+
import jdk.jfr.StackTrace;
13+
import org.hibernate.event.spi.HibernateMonitoringEvent;
14+
import org.hibernate.internal.build.AllowNonPortable;
15+
16+
@Name(CollectionRecreateEvent.NAME)
17+
@Label("Collection Recreate")
18+
@Category("Hibernate ORM")
19+
@Description("Collection Recreate")
20+
@StackTrace
21+
@AllowNonPortable
22+
public class CollectionRecreateEvent extends Event implements HibernateMonitoringEvent {
23+
public static final String NAME = "org.hibernate.orm.CollectionRecreateEvent";
24+
25+
@Label("Session Identifier")
26+
public String sessionIdentifier;
27+
28+
@Label("Entity Identifier")
29+
public String id;
30+
31+
@Label("Collection Role")
32+
public String role;
33+
34+
@Label("Success")
35+
public boolean success;
36+
37+
@Override
38+
public String toString() {
39+
return NAME;
40+
}
41+
42+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.event.jfr.internal;
6+
7+
import jdk.jfr.Category;
8+
import jdk.jfr.Description;
9+
import jdk.jfr.Event;
10+
import jdk.jfr.Label;
11+
import jdk.jfr.Name;
12+
import jdk.jfr.StackTrace;
13+
import org.hibernate.event.spi.HibernateMonitoringEvent;
14+
import org.hibernate.internal.build.AllowNonPortable;
15+
16+
@Name(CollectionRemoveEvent.NAME)
17+
@Label("Collection Remove")
18+
@Category("Hibernate ORM")
19+
@Description("Collection Remove")
20+
@StackTrace
21+
@AllowNonPortable
22+
public class CollectionRemoveEvent extends Event implements HibernateMonitoringEvent {
23+
public static final String NAME = "org.hibernate.orm.CollectionRemoveEvent";
24+
25+
@Label("Session Identifier")
26+
public String sessionIdentifier;
27+
28+
@Label("Entity Identifier")
29+
public String id;
30+
31+
@Label("Collection Role")
32+
public String role;
33+
34+
@Label("Success")
35+
public boolean success;
36+
37+
@Override
38+
public String toString() {
39+
return NAME;
40+
}
41+
42+
}

0 commit comments

Comments
 (0)