|
29 | 29 | import java.util.List;
|
30 | 30 | import java.util.concurrent.CyclicBarrier;
|
31 | 31 | import java.util.concurrent.atomic.AtomicBoolean;
|
| 32 | +import java.util.concurrent.atomic.AtomicInteger; |
32 | 33 | import java.util.concurrent.atomic.AtomicReference;
|
33 | 34 |
|
34 | 35 | import jdk.jfr.Event;
|
@@ -143,28 +144,43 @@ private static void printTimestamp(Instant timestamp) {
|
143 | 144 | }
|
144 | 145 |
|
145 | 146 | 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."); |
163 | 174 | }
|
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(); |
168 | 184 | }
|
169 | 185 | }
|
170 | 186 | }
|
0 commit comments