src/jdk.jfr/share/classes/jdk/jfr/internal/consumer/Dispatcher.java
author egahlin
Fri, 27 Sep 2019 13:00:53 +0200
branchJEP-349-branch
changeset 58369 d55d1bd947c2
parent 58200 2d147d680311
permissions -rw-r--r--
Fix typos
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
58200
2d147d680311 Cleaning up
egahlin
parents: 58197
diff changeset
     1
/*
2d147d680311 Cleaning up
egahlin
parents: 58197
diff changeset
     2
 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
2d147d680311 Cleaning up
egahlin
parents: 58197
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
2d147d680311 Cleaning up
egahlin
parents: 58197
diff changeset
     4
 *
2d147d680311 Cleaning up
egahlin
parents: 58197
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
2d147d680311 Cleaning up
egahlin
parents: 58197
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
2d147d680311 Cleaning up
egahlin
parents: 58197
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
2d147d680311 Cleaning up
egahlin
parents: 58197
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
2d147d680311 Cleaning up
egahlin
parents: 58197
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
2d147d680311 Cleaning up
egahlin
parents: 58197
diff changeset
    10
 *
2d147d680311 Cleaning up
egahlin
parents: 58197
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
2d147d680311 Cleaning up
egahlin
parents: 58197
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
2d147d680311 Cleaning up
egahlin
parents: 58197
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
2d147d680311 Cleaning up
egahlin
parents: 58197
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
2d147d680311 Cleaning up
egahlin
parents: 58197
diff changeset
    15
 * accompanied this code).
2d147d680311 Cleaning up
egahlin
parents: 58197
diff changeset
    16
 *
2d147d680311 Cleaning up
egahlin
parents: 58197
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
2d147d680311 Cleaning up
egahlin
parents: 58197
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
2d147d680311 Cleaning up
egahlin
parents: 58197
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2d147d680311 Cleaning up
egahlin
parents: 58197
diff changeset
    20
 *
2d147d680311 Cleaning up
egahlin
parents: 58197
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2d147d680311 Cleaning up
egahlin
parents: 58197
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
2d147d680311 Cleaning up
egahlin
parents: 58197
diff changeset
    23
 * questions.
2d147d680311 Cleaning up
egahlin
parents: 58197
diff changeset
    24
 */
2d147d680311 Cleaning up
egahlin
parents: 58197
diff changeset
    25
58145
bc54ed8d908a Move implementation into jdk.jfr.internal.consumer
egahlin
parents: 58129
diff changeset
    26
package jdk.jfr.internal.consumer;
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    27
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    28
import java.time.Instant;
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    29
import java.util.ArrayList;
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    30
import java.util.List;
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    31
import java.util.function.Consumer;
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    32
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    33
import jdk.jfr.EventType;
58145
bc54ed8d908a Move implementation into jdk.jfr.internal.consumer
egahlin
parents: 58129
diff changeset
    34
import jdk.jfr.consumer.RecordedEvent;
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    35
import jdk.jfr.internal.LongMap;
58145
bc54ed8d908a Move implementation into jdk.jfr.internal.consumer
egahlin
parents: 58129
diff changeset
    36
import jdk.jfr.internal.consumer.ChunkParser.ParserConfiguration;
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    37
58145
bc54ed8d908a Move implementation into jdk.jfr.internal.consumer
egahlin
parents: 58129
diff changeset
    38
final class Dispatcher {
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    39
58197
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
    40
    final static class EventDispatcher {
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
    41
        private final static EventDispatcher[] NO_DISPATCHERS = new EventDispatcher[0];
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    42
58197
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
    43
        private final String eventName;
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
    44
        private final Consumer<RecordedEvent> action;
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    45
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    46
        public EventDispatcher(String eventName, Consumer<RecordedEvent> action) {
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    47
            this.eventName = eventName;
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    48
            this.action = action;
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    49
        }
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    50
58197
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
    51
        private void offer(RecordedEvent event) {
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    52
            action.accept(event);
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    53
        }
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    54
58197
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
    55
        private boolean accepts(EventType eventType) {
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    56
            return (eventName == null || eventType.getName().equals(eventName));
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    57
        }
58197
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
    58
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
    59
        public Consumer<RecordedEvent> getAction() {
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
    60
            return action;
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
    61
        }
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    62
    }
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    63
58197
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
    64
    private final Consumer<Throwable>[] errorActions;
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
    65
    private final Runnable[] flushActions;
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
    66
    private final Runnable[] closeActions;
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
    67
    private final EventDispatcher[] dispatchers;
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
    68
    private final LongMap<EventDispatcher[]> dispatcherLookup = new LongMap<>();
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    69
    final ParserConfiguration parserConfiguration;
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    70
    final Instant startTime;
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    71
    final Instant endTime;
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    72
    final long startNanos;
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    73
    final long endNanos;
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    74
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    75
    // Cache
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    76
    private EventType cacheEventType;
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    77
    private EventDispatcher[] cacheDispatchers;
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    78
58200
2d147d680311 Cleaning up
egahlin
parents: 58197
diff changeset
    79
    @SuppressWarnings({"rawtypes", "unchecked"})
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    80
    public Dispatcher(StreamConfiguration c) {
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    81
        this.flushActions = c.flushActions.toArray(new Runnable[0]);
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    82
        this.closeActions = c.closeActions.toArray(new Runnable[0]);
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    83
        this.errorActions = c.errorActions.toArray(new Consumer[0]);
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    84
        this.dispatchers = c.eventActions.toArray(new EventDispatcher[0]);
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    85
        this.parserConfiguration = new ParserConfiguration(0, Long.MAX_VALUE, c.reuse, c.ordered, buildFilter(dispatchers));
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    86
        this.startTime = c.startTime;
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    87
        this.endTime = c.endTime;
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    88
        this.startNanos = c.startNanos;
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    89
        this.endNanos = c.endNanos;
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    90
    }
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
    91
58197
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
    92
    public void runFlushActions() {
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
    93
        Runnable[] flushActions = this.flushActions;
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
    94
        for (int i = 0; i < flushActions.length; i++) {
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
    95
            try {
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
    96
                flushActions[i].run();
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
    97
            } catch (Exception e) {
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
    98
                handleError(e);
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
    99
            }
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
   100
        }
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
   101
    }
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
   102
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
   103
    public void runCloseActions() {
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
   104
        Runnable[] closeActions = this.closeActions;
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
   105
        for (int i = 0; i < closeActions.length; i++) {
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
   106
            try {
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
   107
                closeActions[i].run();
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
   108
            } catch (Exception e) {
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
   109
                handleError(e);
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
   110
            }
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
   111
        }
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
   112
    }
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
   113
58146
9f3aadcaa430 Rename InternalEventFulter to ParserFilter
egahlin
parents: 58145
diff changeset
   114
    private static ParserFilter buildFilter(EventDispatcher[] dispatchers) {
9f3aadcaa430 Rename InternalEventFulter to ParserFilter
egahlin
parents: 58145
diff changeset
   115
        ParserFilter ef = new ParserFilter();
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   116
        for (EventDispatcher ed : dispatchers) {
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   117
            String name = ed.eventName;
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   118
            if (name == null) {
58146
9f3aadcaa430 Rename InternalEventFulter to ParserFilter
egahlin
parents: 58145
diff changeset
   119
                return ParserFilter.ACCEPT_ALL;
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   120
            }
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   121
            ef.setThreshold(name, 0);
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   122
        }
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   123
        return ef;
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   124
    }
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   125
58197
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
   126
    void dispatch(RecordedEvent event) {
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   127
        EventType type = event.getEventType();
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   128
        EventDispatcher[] dispatchers = null;
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   129
        if (type == cacheEventType) {
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   130
            dispatchers = cacheDispatchers;
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   131
        } else {
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   132
            dispatchers = dispatcherLookup.get(type.getId());
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   133
            if (dispatchers == null) {
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   134
                List<EventDispatcher> list = new ArrayList<>();
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   135
                for (EventDispatcher e : this.dispatchers) {
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   136
                    if (e.accepts(type)) {
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   137
                        list.add(e);
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   138
                    }
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   139
                }
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   140
                dispatchers = list.isEmpty() ? EventDispatcher.NO_DISPATCHERS : list.toArray(new EventDispatcher[0]);
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   141
                dispatcherLookup.put(type.getId(), dispatchers);
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   142
            }
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   143
            cacheDispatchers = dispatchers;
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   144
        }
58153
0f7562601338 Describe and implement exception handling policy
egahlin
parents: 58146
diff changeset
   145
        // Expected behavior if exception occurs in onEvent:
0f7562601338 Describe and implement exception handling policy
egahlin
parents: 58146
diff changeset
   146
        //
0f7562601338 Describe and implement exception handling policy
egahlin
parents: 58146
diff changeset
   147
        // Synchronous:
0f7562601338 Describe and implement exception handling policy
egahlin
parents: 58146
diff changeset
   148
        //  - User has added onError action:
0f7562601338 Describe and implement exception handling policy
egahlin
parents: 58146
diff changeset
   149
        //     Catch exception, call onError and continue with next event
0f7562601338 Describe and implement exception handling policy
egahlin
parents: 58146
diff changeset
   150
        //     Let Errors propagate to caller of EventStream::start
0f7562601338 Describe and implement exception handling policy
egahlin
parents: 58146
diff changeset
   151
        //  - Default action
0f7562601338 Describe and implement exception handling policy
egahlin
parents: 58146
diff changeset
   152
        //     Catch exception, e.printStackTrace() and continue with next event
0f7562601338 Describe and implement exception handling policy
egahlin
parents: 58146
diff changeset
   153
        //     Let Errors propagate to caller of EventStream::start
0f7562601338 Describe and implement exception handling policy
egahlin
parents: 58146
diff changeset
   154
        //
0f7562601338 Describe and implement exception handling policy
egahlin
parents: 58146
diff changeset
   155
        // Asynchronous
0f7562601338 Describe and implement exception handling policy
egahlin
parents: 58146
diff changeset
   156
        //  - User has added onError action
0f7562601338 Describe and implement exception handling policy
egahlin
parents: 58146
diff changeset
   157
        //     Catch exception, call onError and continue with next event
0f7562601338 Describe and implement exception handling policy
egahlin
parents: 58146
diff changeset
   158
        //     Let Errors propagate, shutdown thread and stream
0f7562601338 Describe and implement exception handling policy
egahlin
parents: 58146
diff changeset
   159
        //  - Default action
0f7562601338 Describe and implement exception handling policy
egahlin
parents: 58146
diff changeset
   160
        //    Catch exception, e.printStackTrace() and continue with next event
0f7562601338 Describe and implement exception handling policy
egahlin
parents: 58146
diff changeset
   161
        //    Let Errors propagate and shutdown thread and stream
0f7562601338 Describe and implement exception handling policy
egahlin
parents: 58146
diff changeset
   162
        //
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   163
        for (int i = 0; i < dispatchers.length; i++) {
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   164
            try {
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   165
                dispatchers[i].offer(event);
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   166
            } catch (Exception e) {
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   167
                handleError(e);
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   168
            }
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   169
        }
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   170
    }
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   171
58197
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
   172
    private void handleError(Throwable e) {
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   173
        Consumer<?>[] consumers = this.errorActions;
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   174
        if (consumers.length == 0) {
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   175
            defaultErrorHandler(e);
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   176
            return;
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   177
        }
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   178
        for (int i = 0; i < consumers.length; i++) {
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   179
            @SuppressWarnings("unchecked")
58369
d55d1bd947c2 Fix typos
egahlin
parents: 58200
diff changeset
   180
            Consumer<Throwable> consumer = (Consumer<Throwable>) consumers[i];
d55d1bd947c2 Fix typos
egahlin
parents: 58200
diff changeset
   181
            consumer.accept(e);
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   182
        }
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   183
    }
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   184
58197
0ef79bd7fb5c Remove unused methods etc.
egahlin
parents: 58153
diff changeset
   185
    private void defaultErrorHandler(Throwable e) {
58129
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   186
        e.printStackTrace();
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   187
    }
7b751fe181a5 Restructure stream configuration
egahlin
parents:
diff changeset
   188
}