Skip to content

Commit a266ca0

Browse files
author
SendaoYan
committed
8323196: jdk/jfr/api/consumer/filestream/TestOrdered.java failed with "Events are not ordered! Reuse = false"
Backport-of: bdd96604ae55ba0cd3cd3363e2ba44205d8aa3aa
1 parent 5623e10 commit a266ca0

File tree

1 file changed

+37
-21
lines changed

1 file changed

+37
-21
lines changed

test/jdk/jdk/jfr/api/consumer/filestream/TestOrdered.java

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.util.List;
3030
import java.util.concurrent.CyclicBarrier;
3131
import java.util.concurrent.atomic.AtomicBoolean;
32+
import java.util.concurrent.atomic.AtomicInteger;
3233
import java.util.concurrent.atomic.AtomicReference;
3334

3435
import jdk.jfr.Event;
@@ -143,28 +144,43 @@ private static void printTimestamp(Instant timestamp) {
143144
}
144145

145146
private static Path makeUnorderedRecording() throws Exception {
146-
CyclicBarrier barrier = new CyclicBarrier(THREAD_COUNT + 1);
147-
148-
try (Recording r = new Recording()) {
149-
r.start();
150-
List<Emitter> emitters = new ArrayList<>();
151-
for (int i = 0; i < THREAD_COUNT; i++) {
152-
Emitter e = new Emitter(barrier);
153-
e.start();
154-
emitters.add(e);
155-
}
156-
// Thread buffers should now have one event each
157-
barrier.await();
158-
// Add another event to each thread buffer, so
159-
// events are bound to come out of order when they
160-
// are flushed
161-
for (Emitter e : emitters) {
162-
e.join();
147+
while (true) {
148+
CyclicBarrier barrier = new CyclicBarrier(THREAD_COUNT + 1);
149+
try (Recording r = new Recording()) {
150+
r.start();
151+
List<Emitter> emitters = new ArrayList<>();
152+
for (int i = 0; i < THREAD_COUNT; i++) {
153+
Emitter e = new Emitter(barrier);
154+
e.start();
155+
emitters.add(e);
156+
}
157+
// Thread buffers should now have one event each
158+
barrier.await();
159+
// Add another event to each thread buffer, so
160+
// events are bound to come out of order when they
161+
// are flushed
162+
for (Emitter e : emitters) {
163+
e.join();
164+
}
165+
r.stop();
166+
Path p = Utils.createTempFile("recording", ".jfr");
167+
r.dump(p);
168+
// Order is only guaranteed within a segment.
169+
int segments = countSegments(p);
170+
if (segments < 2) {
171+
return p;
172+
}
173+
System.out.println("File contains more than one segment (" + segments + "). Retrying.");
163174
}
164-
r.stop();
165-
Path p = Utils.createTempFile("recording", ".jfr");
166-
r.dump(p);
167-
return p;
175+
}
176+
}
177+
178+
private static int countSegments(Path file) throws Exception {
179+
AtomicInteger segments = new AtomicInteger();
180+
try (EventStream es = EventStream.openFile(file)) {
181+
es.onFlush(segments::incrementAndGet);
182+
es.start();
183+
return segments.get();
168184
}
169185
}
170186
}

0 commit comments

Comments
 (0)