chore: import upstream snapshot with attribution

This commit is contained in:
wehub-resource-sync
2026-07-13 13:17:40 +08:00
commit f1825c8ceb
10096 changed files with 2364182 additions and 0 deletions
+204
View File
@@ -0,0 +1,204 @@
load("@rules_python//python:defs.bzl", "py_library", "py_test")
load("//bazel:python.bzl", "py_test_run_all_subdirectory")
# This is a dummy test dependency that causes the above tests to be
# re-run if any of these files changes.
py_library(
name = "dashboard_lib",
srcs = glob(
["**/*.py"],
exclude = ["tests/*"],
),
)
py_library(
name = "conftest",
srcs = ["tests/conftest.py"],
visibility = [
"//python/ray/dashboard:__subpackages__",
],
deps = ["//python/ray/tests:conftest"],
)
py_test_run_all_subdirectory(
size = "medium",
include = ["**/test*.py"],
data = [
"modules/job/tests/backwards_compatibility_scripts/script.py",
"modules/job/tests/backwards_compatibility_scripts/test_backwards_compatibility.sh",
"modules/job/tests/pip_install_test-0.5-py3-none-any.whl",
"modules/tests/test_config_files/basic_runtime_env.yaml",
] + glob([
"modules/job/tests/subprocess_driver_scripts/*.py",
]),
exclude = [
"client/node_modules/**",
"modules/aggregator/tests/test_aggregator_agent.py",
"modules/job/tests/test_cli_integration.py",
"modules/job/tests/test_http_job_server.py",
"modules/job/tests/test_job_agent.py",
"modules/node/tests/test_node.py",
"tests/test_dashboard.py",
"tests/test_state_head.py",
"modules/serve/tests/**/*.py",
"modules/job/tests/test_job_manager.py",
],
extra_srcs = [],
tags = [
"exclusive",
"team:core",
],
deps = [":conftest"],
)
py_test(
name = "test_cli_integration",
size = "large",
srcs = ["modules/job/tests/test_cli_integration.py"],
tags = [
"exclusive",
"team:core",
],
deps = [":conftest"],
)
py_test(
name = "test_job_manager",
size = "large",
timeout = "eternal",
srcs = ["modules/job/tests/test_job_manager.py"],
tags = [
"exclusive",
"team:core",
],
deps = [":conftest"],
)
py_test(
name = "test_aggregator_agent",
size = "large",
srcs = ["modules/aggregator/tests/test_aggregator_agent.py"],
tags = [
"exclusive",
"team:core",
],
deps = [":conftest"],
)
py_test(
name = "test_http_job_server",
size = "large",
srcs = ["modules/job/tests/test_http_job_server.py"],
data = [
"modules/job/tests/backwards_compatibility_scripts/script.py",
"modules/job/tests/backwards_compatibility_scripts/test_backwards_compatibility.sh",
"modules/job/tests/pip_install_test-0.5-py3-none-any.whl",
"modules/tests/test_config_files/basic_runtime_env.yaml",
] + glob([
"modules/job/tests/subprocess_driver_scripts/*.py",
]),
tags = [
"exclusive",
"team:core",
],
deps = [":conftest"],
)
py_test(
name = "test_job_agent",
size = "large",
srcs = ["modules/job/tests/test_job_agent.py"],
data = [
"modules/job/tests/backwards_compatibility_scripts/script.py",
"modules/job/tests/backwards_compatibility_scripts/test_backwards_compatibility.sh",
"modules/job/tests/pip_install_test-0.5-py3-none-any.whl",
"modules/tests/test_config_files/basic_runtime_env.yaml",
] + glob([
"modules/job/tests/subprocess_driver_scripts/*.py",
]),
tags = [
"exclusive",
"team:core",
],
deps = [":conftest"],
)
py_test(
name = "test_node",
size = "medium",
srcs = ["modules/node/tests/test_node.py"],
tags = [
"exclusive",
"team:core",
],
deps = [":conftest"],
)
py_test(
name = "test_dashboard",
size = "large",
srcs = ["tests/test_dashboard.py"],
tags = [
"exclusive",
"minimal",
"team:core",
],
deps = [":conftest"],
)
py_test(
name = "test_dashboard_auth",
size = "large",
srcs = ["tests/test_dashboard_auth.py"],
tags = [
"exclusive",
"team:core",
],
deps = [":conftest"],
)
py_test(
name = "test_metrics_integration",
size = "medium",
srcs = ["modules/tests/test_metrics_integration.py"],
tags = [
"exclusive",
"team:clusters",
],
deps = [":conftest"],
)
py_test(
name = "test_state_head",
size = "small",
srcs = ["tests/test_state_head.py"],
tags = ["team:core"],
deps = [":conftest"],
)
py_test(
name = "test_serve_dashboard",
size = "enormous",
srcs = [
"modules/serve/tests/deploy_imperative_serve_apps.py",
"modules/serve/tests/test_serve_dashboard.py",
],
tags = ["team:serve"],
deps = [":conftest"],
)
py_test(
name = "test_serve_dashboard_2",
size = "enormous",
srcs = ["modules/serve/tests/test_serve_dashboard_2.py"],
tags = ["team:serve"],
deps = [":conftest"],
)
py_test(
name = "test_data_head",
size = "small",
srcs = ["modules/data/tests/test_data_head.py"],
tags = ["team:data"],
deps = [":conftest"],
)
View File
+526
View File
@@ -0,0 +1,526 @@
import argparse
import asyncio
import json
import logging
import os
import signal
import sys
import ray
import ray._private.ray_constants as ray_constants
import ray.dashboard.consts as dashboard_consts
import ray.dashboard.utils as dashboard_utils
from ray._common.network_utils import (
build_address,
get_all_interfaces_ip,
get_localhost_ip,
is_localhost,
)
from ray._common.utils import get_or_create_event_loop
from ray._private import logging_utils
from ray._private.process_watcher import create_check_raylet_task
from ray._private.ray_constants import AGENT_GRPC_MAX_MESSAGE_LENGTH
from ray._private.ray_logging import setup_component_logger
from ray._raylet import (
DASHBOARD_AGENT_LISTEN_PORT_NAME,
METRICS_AGENT_PORT_NAME,
METRICS_EXPORT_PORT_NAME,
GcsClient,
persist_port,
)
logger = logging.getLogger(__name__)
class DashboardAgent:
def __init__(
self,
node_ip_address,
grpc_port,
gcs_address,
cluster_id_hex,
minimal,
metrics_export_port=None,
node_manager_port=None,
events_export_addr=None,
listen_port=ray_constants.DEFAULT_DASHBOARD_AGENT_LISTEN_PORT,
disable_metrics_collection: bool = False,
is_head: bool = False,
*, # the following are required kwargs
object_store_name: str,
raylet_name: str,
log_dir: str,
temp_dir: str,
session_dir: str,
session_name: str,
):
"""Initialize the DashboardAgent object."""
# Public attributes are accessible for all agent modules.
assert node_ip_address is not None
self.ip = node_ip_address
self.minimal = minimal
assert gcs_address is not None
self.gcs_address = gcs_address
self.cluster_id_hex = cluster_id_hex
self.temp_dir = temp_dir
self.session_dir = session_dir
self.log_dir = log_dir
self.grpc_port = grpc_port
self.metrics_export_port = metrics_export_port
self.node_manager_port = node_manager_port
self.events_export_addr = events_export_addr
self.listen_port = listen_port
self.object_store_name = object_store_name
self.raylet_name = raylet_name
self.node_id = os.environ["RAY_NODE_ID"]
self.metrics_collection_disabled = disable_metrics_collection
self.session_name = session_name
# grpc server is None in mininal.
self.server = None
# http_server is None in minimal.
self.http_server = None
# Used by the agent and sub-modules.
self.gcs_client = GcsClient(
address=self.gcs_address,
cluster_id=self.cluster_id_hex,
)
self.is_head = is_head
if not self.minimal:
self._init_non_minimal()
else:
# Write -1 to indicate the service is not in use.
persist_port(
self.session_dir,
self.node_id,
METRICS_AGENT_PORT_NAME,
-1,
)
# This metric export port is run by reporter module
# which is not included in minimal mode.
persist_port(
self.session_dir,
self.node_id,
METRICS_EXPORT_PORT_NAME,
-1,
)
def _init_non_minimal(self):
from grpc import aio as aiogrpc
from ray._common.tls_utils import add_port_to_grpc_server
from ray._private.authentication.authentication_utils import (
is_token_auth_enabled,
)
from ray._private.authentication.grpc_authentication_server_interceptor import (
AsyncAuthenticationServerInterceptor,
)
from ray.dashboard.http_server_agent import HttpServerAgent
# We would want to suppress deprecating warnings from aiogrpc library
# with the usage of asyncio.get_event_loop() in python version >=3.10
# This could be removed once https://github.com/grpc/grpc/issues/32526
# is released, and we used higher versions of grpcio that that.
if sys.version_info.major >= 3 and sys.version_info.minor >= 10:
import warnings
with warnings.catch_warnings():
warnings.simplefilter("ignore", category=DeprecationWarning)
aiogrpc.init_grpc_aio()
else:
aiogrpc.init_grpc_aio()
# Add authentication interceptor if token auth is enabled
interceptors = []
if is_token_auth_enabled():
interceptors.append(AsyncAuthenticationServerInterceptor())
self.server = aiogrpc.server(
interceptors=interceptors,
options=(
("grpc.so_reuseport", 0),
(
"grpc.max_send_message_length",
AGENT_GRPC_MAX_MESSAGE_LENGTH,
), # noqa
(
"grpc.max_receive_message_length",
AGENT_GRPC_MAX_MESSAGE_LENGTH,
),
), # noqa
)
grpc_ip = (
get_localhost_ip() if is_localhost(self.ip) else get_all_interfaces_ip()
)
self.grpc_port = add_port_to_grpc_server(
self.server, build_address(grpc_ip, self.grpc_port)
)
persist_port(
self.session_dir,
self.node_id,
METRICS_AGENT_PORT_NAME,
self.grpc_port,
)
logger.info(
"Dashboard agent grpc address: %s",
build_address(self.ip, self.grpc_port),
)
# If the agent is not minimal it should start the http server
# to communicate with the dashboard in a head node.
# Http server is not started in the minimal version because
# it requires additional dependencies that are not
# included in the minimal ray package.
self.http_server = HttpServerAgent(self.ip, self.listen_port)
def _load_modules(self):
"""Load dashboard agent modules."""
modules = []
agent_cls_list = dashboard_utils.get_all_modules(
dashboard_utils.DashboardAgentModule
)
for cls in agent_cls_list:
logger.info(
"Loading %s: %s", dashboard_utils.DashboardAgentModule.__name__, cls
)
c = cls(self)
modules.append(c)
logger.info("Loaded %d modules.", len(modules))
return modules
@property
def http_session(self):
assert (
self.http_server
), "Accessing unsupported API (HttpServerAgent) in a minimal ray."
return self.http_server.http_session
def get_node_id(self) -> str:
return self.node_id
async def run(self):
# Start a grpc asyncio server.
if self.server:
await self.server.start()
modules = self._load_modules()
launch_http_server = True
if self.http_server:
try:
await self.http_server.start(modules)
# listen_port can be 0 for dynamic port assignment. get the actual bound port.
self.listen_port = self.http_server.http_port
except Exception as e:
# TODO(kevin85421): We should fail the agent if the HTTP server
# fails to start to avoid hiding the root cause. However,
# agent processes are not cleaned up correctly after some tests
# finish. If we fail the agent, the CI will always fail until
# we fix the leak.
logger.exception(
f"Failed to start HTTP server with exception: {e}. "
"The agent will stay alive but the HTTP service will be disabled.",
)
launch_http_server = False
# If the HTTP server fails to start or is not launched, we should
# persist -1 to indicate that the service is not available.
persist_port(
self.session_dir,
self.node_id,
DASHBOARD_AGENT_LISTEN_PORT_NAME,
self.listen_port if self.http_server and launch_http_server else -1,
)
if launch_http_server:
# Writes agent address to kv.
# DASHBOARD_AGENT_ADDR_NODE_ID_PREFIX: <node_id> -> (ip, http_port, grpc_port)
# DASHBOARD_AGENT_ADDR_IP_PREFIX: <ip> -> (node_id, http_port, grpc_port)
# -1 should indicate that http server is not started.
http_port = -1 if not self.http_server else self.http_server.http_port
grpc_port = -1 if not self.server else self.grpc_port
put_by_node_id = self.gcs_client.async_internal_kv_put(
f"{dashboard_consts.DASHBOARD_AGENT_ADDR_NODE_ID_PREFIX}{self.node_id}".encode(),
json.dumps([self.ip, http_port, grpc_port]).encode(),
True,
namespace=ray_constants.KV_NAMESPACE_DASHBOARD,
)
put_by_ip = self.gcs_client.async_internal_kv_put(
f"{dashboard_consts.DASHBOARD_AGENT_ADDR_IP_PREFIX}{self.ip}".encode(),
json.dumps([self.node_id, http_port, grpc_port]).encode(),
True,
namespace=ray_constants.KV_NAMESPACE_DASHBOARD,
)
await asyncio.gather(put_by_node_id, put_by_ip)
tasks = [m.run(self.server) for m in modules]
if sys.platform not in ["win32", "cygwin"]:
def callback(msg):
logger.info(
f"Terminated Raylet: ip={self.ip}, node_id={self.node_id}. {msg}"
)
check_parent_task = create_check_raylet_task(
self.log_dir, self.gcs_client, callback, loop
)
tasks.append(check_parent_task)
if self.server:
tasks.append(self.server.wait_for_termination())
else:
async def wait_forever():
while True:
await asyncio.sleep(3600)
tasks.append(wait_forever())
await asyncio.gather(*tasks)
if self.http_server:
await self.http_server.cleanup()
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Dashboard agent.")
parser.add_argument(
"--node-id",
required=True,
type=str,
help="the unique ID of this node.",
)
parser.add_argument(
"--node-ip-address",
required=True,
type=str,
help="the IP address of this node.",
)
parser.add_argument(
"--gcs-address", required=True, type=str, help="The address (ip:port) of GCS."
)
parser.add_argument(
"--cluster-id-hex",
required=True,
type=str,
help="The cluster id in hex.",
)
parser.add_argument(
"--metrics-export-port",
required=True,
type=int,
help="The port to expose metrics through Prometheus.",
)
parser.add_argument(
"--grpc-port",
required=True,
type=int,
help="The port on which the dashboard agent will receive GRPCs.",
)
parser.add_argument(
"--node-manager-port",
required=True,
type=int,
help="The port to use for starting the node manager",
)
parser.add_argument(
"--object-store-name",
required=True,
type=str,
default=None,
help="The socket name of the plasma store",
)
parser.add_argument(
"--listen-port",
required=False,
type=int,
default=ray_constants.DEFAULT_DASHBOARD_AGENT_LISTEN_PORT,
help="Port for HTTP server to listen on",
)
parser.add_argument(
"--raylet-name",
required=True,
type=str,
default=None,
help="The socket path of the raylet process",
)
parser.add_argument(
"--logging-level",
required=False,
type=lambda s: logging.getLevelName(s.upper()),
default=ray_constants.LOGGER_LEVEL,
choices=ray_constants.LOGGER_LEVEL_CHOICES,
help=ray_constants.LOGGER_LEVEL_HELP,
)
parser.add_argument(
"--logging-format",
required=False,
type=str,
default=ray_constants.LOGGER_FORMAT,
help=ray_constants.LOGGER_FORMAT_HELP,
)
parser.add_argument(
"--logging-filename",
required=False,
type=str,
default=dashboard_consts.DASHBOARD_AGENT_LOG_FILENAME,
help="Specify the name of log file, "
'log to stdout if set empty, default is "{}".'.format(
dashboard_consts.DASHBOARD_AGENT_LOG_FILENAME
),
)
parser.add_argument(
"--logging-rotate-bytes",
required=True,
type=int,
help="Specify the max bytes for rotating log file.",
)
parser.add_argument(
"--logging-rotate-backup-count",
required=True,
type=int,
help="Specify the backup count of rotated log file.",
)
parser.add_argument(
"--log-dir",
required=True,
type=str,
default=None,
help="Specify the path of log directory.",
)
parser.add_argument(
"--temp-dir",
required=True,
type=str,
default=None,
help="Specify the path of the temporary directory use by Ray process.",
)
parser.add_argument(
"--session-dir",
required=True,
type=str,
default=None,
help="Specify the path of this session.",
)
parser.add_argument(
"--minimal",
action="store_true",
help=(
"Minimal agent only contains a subset of features that don't "
"require additional dependencies installed when ray is installed "
"by `pip install 'ray[default]'`."
),
)
parser.add_argument(
"--disable-metrics-collection",
action="store_true",
help=("If this arg is set, metrics report won't be enabled from the agent."),
)
parser.add_argument(
"--head",
action="store_true",
help="Whether this node is the head node.",
)
parser.add_argument(
"--session-name",
required=False,
type=str,
default=None,
help="The current Ray session name.",
)
parser.add_argument(
"--stdout-filepath",
required=False,
type=str,
default="",
help="The filepath to dump dashboard agent stdout.",
)
parser.add_argument(
"--stderr-filepath",
required=False,
type=str,
default="",
help="The filepath to dump dashboard agent stderr.",
)
args = parser.parse_args()
try:
# Disable log rotation for windows platform.
logging_rotation_bytes = (
args.logging_rotate_bytes if sys.platform != "win32" else 0
)
logging_rotation_backup_count = (
args.logging_rotate_backup_count if sys.platform != "win32" else 1
)
logger = setup_component_logger(
logging_level=args.logging_level,
logging_format=args.logging_format,
log_dir=args.log_dir,
filename=args.logging_filename,
max_bytes=logging_rotation_bytes,
backup_count=logging_rotation_backup_count,
)
# Setup stdout/stderr redirect files if redirection enabled.
logging_utils.redirect_stdout_stderr_if_needed(
args.stdout_filepath,
args.stderr_filepath,
logging_rotation_bytes,
logging_rotation_backup_count,
)
# Initialize event loop, see Dashboard init code for caveat
# w.r.t grpc server init in the DashboardAgent initializer.
loop = get_or_create_event_loop()
agent = DashboardAgent(
args.node_ip_address,
args.grpc_port,
args.gcs_address,
args.cluster_id_hex,
args.minimal,
temp_dir=args.temp_dir,
session_dir=args.session_dir,
log_dir=args.log_dir,
metrics_export_port=args.metrics_export_port,
node_manager_port=args.node_manager_port,
listen_port=args.listen_port,
object_store_name=args.object_store_name,
raylet_name=args.raylet_name,
disable_metrics_collection=args.disable_metrics_collection,
is_head=args.head,
session_name=args.session_name,
)
ray._raylet.setproctitle(ray_constants.AGENT_PROCESS_TYPE_DASHBOARD_AGENT)
def sigterm_handler():
logger.warning("Exiting with SIGTERM immediately...")
# Exit code 0 will be considered as an expected shutdown
os._exit(signal.SIGTERM)
if sys.platform != "win32":
# TODO(rickyyx): we currently do not have any logic for actual
# graceful termination in the agent. Most of the underlying
# async tasks run by the agent head doesn't handle CancelledError.
# So a truly graceful shutdown is not trivial w/o much refactoring.
# Re-open the issue: https://github.com/ray-project/ray/issues/25518
# if a truly graceful shutdown is required.
loop.add_signal_handler(signal.SIGTERM, sigterm_handler)
loop.run_until_complete(agent.run())
except Exception:
logger.exception("Agent is working abnormally. It will exit immediately.")
exit(1)
@@ -0,0 +1 @@
PUBLIC_URL="."
+22
View File
@@ -0,0 +1,22 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.js
# testing
/coverage
# production
/build
# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*
+70
View File
@@ -0,0 +1,70 @@
This project was bootstrapped with `Create React App
<https://github.com/facebook/create-react-app>`__.
Available Scripts
-----------------
In the project directory, you can run:
``npm ci``
~~~~~~~~~~
Once you run this command, all the dependencies listed in your package.json are installed based on the versions in package-lock.json file.
``npm start``
~~~~~~~~~~~~~
Runs the app in the development mode. Open `http://localhost:3000
<http://localhost:3000>`__ to view it in the browser.
The page will reload if you make edits. You will also see any lint errors in the
console.
``npm test``
~~~~~~~~~~~~
Launches the test runner in the interactive watch mode. See the section about
`running tests
<https://facebook.github.io/create-react-app/docs/running-tests>`__ for more
information.
``npm run build``
~~~~~~~~~~~~~~~~~
Builds the app for production to the ``build`` folder. It correctly bundles
React in production mode and optimizes the build for the best performance.
The build is minified and the filenames include the hashes. Your app is ready to
be deployed!
See the section about `deployment
<https://facebook.github.io/create-react-app/docs/deployment>`__ for more
information.
``npm run eject``
~~~~~~~~~~~~~~~~~
Note: this is a one-way operation. Once you ``eject``, you cant go back!
If you arent satisfied with the build tool and configuration choices, you can
``eject`` at any time. This command will remove the single build dependency from
your project.
Instead, it will copy all the configuration files and the transitive
dependencies (Webpack, Babel, ESLint, etc) right into your project so you have
full control over them. All of the commands except ``eject`` will still work,
but they will point to the copied scripts so you can tweak them. At this point
youre on your own.
You dont have to ever use ``eject``. The curated feature set is suitable for
small and middle deployments, and you shouldnt feel obligated to use this
feature. However we understand that this tool wouldnt be useful if you couldnt
customize it when you are ready for it.
Learn More
----------
You can learn more in the `Create React App documentation
<https://facebook.github.io/create-react-app/docs/getting-started>`__.
To learn React, check out the `React documentation <https://reactjs.org/>`__.
File diff suppressed because it is too large Load Diff
+157
View File
@@ -0,0 +1,157 @@
{
"name": "ray-dashboard-client",
"version": "1.0.0",
"private": true,
"dependencies": {
"@emotion/react": "^11.11.3",
"@emotion/styled": "^11.11.0",
"@mui/icons-material": "^5.15.5",
"@mui/material": "^5.15.5",
"@reduxjs/toolkit": "^1.3.1",
"@types/jest": "^27.5.2",
"@types/lodash": "^4.14.161",
"@types/node": "13.9.5",
"@types/react-redux": "^7.1.7",
"@types/react-window": "^1.8.2",
"axios": "^0.21.1",
"copy-to-clipboard": "^3.3.2",
"dayjs": "^1.9.4",
"js-yaml": "^4.1.0",
"lodash": "^4.17.20",
"lowlight": "^2.9.0",
"react": "^18.3.0",
"react-dom": "^18.3.0",
"react-icons": "^4.7.1",
"react-router-dom": "^6.4.3",
"react-scripts": "^5.0.1",
"react-window": "^1.8.5",
"swr": "^2.1.0",
"typeface-roboto": "0.0.75",
"typescript": "^4.8.4",
"usehooks-ts": "^2.9.4"
},
"devDependencies": {
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^14.3.0",
"@testing-library/user-event": "^14.4.3",
"@types/js-yaml": "^4.0.5",
"@types/react": "^18.3.0",
"@types/react-dom": "^18.3.0",
"@typescript-eslint/eslint-plugin": "^5.41.0",
"@typescript-eslint/parser": "^5.41.0",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-prefer-arrow": "^1.2.3",
"mockdate": "^3.0.5",
"npm": "^8.19.2",
"prettier": "2.3.0"
},
"resolutions": {
"@types/react": "16.9.26"
},
"jest": {
"transformIgnorePatterns": [
"/node_modules/(?!lowlight)/"
]
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
"lint": "npm run eslint && npm run prettier",
"lint-fix": "npm run prettier -- --write && npm run eslint -- --fix",
"prettier": "./node_modules/.bin/prettier -c src/",
"eslint": "./node_modules/.bin/eslint \"src/**\""
},
"eslintConfig": {
"ignorePatterns": [
"*.svg",
"*.css"
],
"parser": "@typescript-eslint/parser",
"extends": [
"plugin:import/warnings",
"plugin:@typescript-eslint/recommended",
"react-app"
],
"plugins": [
"prefer-arrow",
"@typescript-eslint"
],
"rules": {
"@typescript-eslint/consistent-type-definitions": [
"error",
"type"
],
"@typescript-eslint/no-explicit-any": 0,
"@typescript-eslint/ban-types": [
"error",
{
"types": {
"{}": false
},
"extendDefaults": true
}
],
"@typescript-eslint/explicit-module-boundary-types": 0,
"comma-dangle": [
"warn",
"always-multiline"
],
"curly": [
"warn",
"all"
],
"eqeqeq": [
"error",
"always"
],
"import/order": [
"warn",
{
"alphabetize": {
"order": "asc",
"caseInsensitive": true
}
}
],
"no-var": "error",
"prefer-arrow/prefer-arrow-functions": [
"warn",
{
"disallowPrototype": true,
"singleReturnOnly": false,
"classPropertiesAllowed": false
}
],
"prefer-const": "error",
"react/jsx-fragments": [
"warn",
"element"
],
"sort-imports": [
"warn",
{
"ignoreCase": true,
"ignoreDeclarationSort": true
}
]
}
},
"prettier": {
"trailingComma": "all"
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
},
"proxy": "http://localhost:8265"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

@@ -0,0 +1,32 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!--
Notice the use of %PUBLIC_URL% in the tags above.
It will be replaced with the URL of the `public` folder during the build.
Only files inside the `public` folder can be referenced from the HTML.
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>Ray Dashboard</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
<!--
This HTML file is a template.
If you open it directly in the browser, you will see an empty page.
You can add webfonts, meta tags, or analytics to this file.
The build step will place the bundled scripts into the <body> tag.
To begin the development, run `npm start`.
To create a production bundle, use `npm run build`.
-->
</body>
</html>
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2018 Jamie Wong
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@@ -0,0 +1,2 @@
This is a self-contained release of https://github.com/jlfwong/speedscope.
To use it, open index.html in Chrome or Firefox.
File diff suppressed because one or more lines are too long
Binary file not shown.

After

Width:  |  Height:  |  Size: 679 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1,324 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"FileFormat.Profile": {
"anyOf": [
{
"$ref": "#/definitions/FileFormat.EventedProfile"
},
{
"$ref": "#/definitions/FileFormat.SampledProfile"
}
]
},
"FileFormat.File": {
"title": "FileFormat.File",
"type": "object",
"properties": {
"$schema": {
"type": "string",
"enum": [
"https://www.speedscope.app/file-format-schema.json"
],
"title": "$schema"
},
"shared": {
"type": "object",
"properties": {
"frames": {
"type": "array",
"items": {
"$ref": "#/definitions/FileFormat.Frame"
},
"title": "frames"
}
},
"required": [
"frames"
],
"title": "shared"
},
"profiles": {
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/FileFormat.EventedProfile"
},
{
"$ref": "#/definitions/FileFormat.SampledProfile"
}
]
},
"title": "profiles"
},
"name": {
"type": "string",
"title": "name"
},
"activeProfileIndex": {
"type": "number",
"title": "activeProfileIndex"
},
"exporter": {
"type": "string",
"title": "exporter"
}
},
"required": [
"$schema",
"profiles",
"shared"
]
},
"FileFormat.Frame": {
"title": "FileFormat.Frame",
"type": "object",
"properties": {
"name": {
"type": "string",
"title": "name"
},
"file": {
"type": "string",
"title": "file"
},
"line": {
"type": "number",
"title": "line"
},
"col": {
"type": "number",
"title": "col"
}
},
"required": [
"name"
]
},
"FileFormat.ProfileType": {
"title": "FileFormat.ProfileType",
"enum": [
"evented",
"sampled"
],
"type": "string"
},
"FileFormat.IProfile": {
"title": "FileFormat.IProfile",
"type": "object",
"properties": {
"type": {
"$ref": "#/definitions/FileFormat.ProfileType",
"title": "type"
}
},
"required": [
"type"
]
},
"FileFormat.EventedProfile": {
"title": "FileFormat.EventedProfile",
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"evented"
],
"title": "type"
},
"name": {
"type": "string",
"title": "name"
},
"unit": {
"$ref": "#/definitions/FileFormat.ValueUnit",
"title": "unit"
},
"startValue": {
"type": "number",
"title": "startValue"
},
"endValue": {
"type": "number",
"title": "endValue"
},
"events": {
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/definitions/OpenFrameEvent"
},
{
"$ref": "#/definitions/CloseFrameEvent"
}
]
},
"title": "events"
}
},
"required": [
"endValue",
"events",
"name",
"startValue",
"type",
"unit"
]
},
"SampledStack": {
"type": "array",
"items": {
"type": "number"
}
},
"FileFormat.SampledProfile": {
"title": "FileFormat.SampledProfile",
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"sampled"
],
"title": "type"
},
"name": {
"type": "string",
"title": "name"
},
"unit": {
"$ref": "#/definitions/FileFormat.ValueUnit",
"title": "unit"
},
"startValue": {
"type": "number",
"title": "startValue"
},
"endValue": {
"type": "number",
"title": "endValue"
},
"samples": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": "number"
}
},
"title": "samples"
},
"weights": {
"type": "array",
"items": {
"type": "number"
},
"title": "weights"
}
},
"required": [
"endValue",
"name",
"samples",
"startValue",
"type",
"unit",
"weights"
]
},
"FileFormat.ValueUnit": {
"title": "FileFormat.ValueUnit",
"enum": [
"bytes",
"microseconds",
"milliseconds",
"nanoseconds",
"none",
"seconds"
],
"type": "string"
},
"FileFormat.EventType": {
"title": "FileFormat.EventType",
"enum": [
"C",
"O"
],
"type": "string"
},
"IEvent": {
"title": "IEvent",
"type": "object",
"properties": {
"type": {
"$ref": "#/definitions/FileFormat.EventType",
"title": "type"
},
"at": {
"type": "number",
"title": "at"
}
},
"required": [
"at",
"type"
]
},
"OpenFrameEvent": {
"title": "OpenFrameEvent",
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"O"
],
"title": "type"
},
"frame": {
"type": "number",
"title": "frame"
},
"at": {
"type": "number",
"title": "at"
}
},
"required": [
"at",
"frame",
"type"
]
},
"CloseFrameEvent": {
"title": "CloseFrameEvent",
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"C"
],
"title": "type"
},
"frame": {
"type": "number",
"title": "frame"
},
"at": {
"type": "number",
"title": "at"
}
},
"required": [
"at",
"frame",
"type"
]
}
},
"$ref": "#/definitions/FileFormat.File"
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>speedscope</title> <link href="https://fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet"> <script></script> <link rel="stylesheet" href="reset.7ae984ff.css"> <link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.1165a94e.png"> <link rel="icon" type="image/png" sizes="16x16" href="favicon-16x16.361d2b26.png"> </head> <body> <script src="speedscope.75eb7d8e.js"></script> </body> </html>
@@ -0,0 +1,199 @@
java;read;check_events_[k];hypercall_page_[k] 1
java;start_thread;java_start;GCTaskThread::run;ScavengeRootsTask::do_it;ClassLoaderDataGraph::oops_do;ClassLoaderData::oops_do;PSScavengeKlassClosure::do_klass 1
java;start_thread;java_start;GCTaskThread::run;StealTask::do_it;PSPromotionManager::drain_stacks_depth;oopDesc* PSPromotionManager::copy_to_survivor_space<false>;InstanceKlass::oop_push_contents 1
java;start_thread;java_start;GCTaskThread::run;StealTask::do_it;ParallelTaskTerminator::offer_termination 5
java;start_thread;java_start;GCTaskThread::run;StealTask::do_it;SpinPause 7
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/buffer/AbstractByteBufAllocator:.directBuffer_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j] 2
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/AbstractReferenceCountedByteBuf:.release_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];io/netty/buffer/PooledByteBuf:.internalNioBuffer_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/NativeThread:.current_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j]; 3
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];Java_sun_nio_ch_FileDispatcherImpl_write0 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;sys_write_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];fget_light_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];__srcu_read_lock_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];__tcp_push_pending_frames_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k] 2
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];ktime_get_real_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];skb_clone_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_set_skb_tso_segs_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k] 2
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_hard_start_xmit_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_pick_tx_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];dev_hard_start_xmit_[k];dev_queue_xmit_nit_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k];netif_rx_[k];netif_rx.part.82_[k];xen_restore_fl_direct_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];dev_hard_start_xmit_[k];loopback_xmit_[k];netif_rx_[k];netif_rx.part.82_[k];xen_restore_fl_direct_end_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];dma_issue_pending_all_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];__inet_lookup_established_[k] 3
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_event_data_recv_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];sock_def_readable_[k];__wake_up_sync_key_[k];check_events_[k];hypercall_page_[k] 19
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k] 3
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];bictcp_acked_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];ktime_get_real_[k];getnstimeofday_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];ktime_get_real_[k];getnstimeofday_[k];xen_clocksource_get_cycles_[k];xen_clocksource_read_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];tcp_rtt_estimator_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_[k];ip_local_deliver_finish_[k];tcp_v4_rcv_[k];tcp_v4_do_rcv_[k];tcp_rcv_established_[k];tcp_ack_[k];tcp_clean_rtx_queue_[k];tcp_valid_rtt_meas_[k];tcp_rtt_estimator_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];__do_softirq_[k];net_rx_action_[k];process_backlog_[k];__netif_receive_skb_[k];ip_rcv_[k];ip_rcv_finish_[k];ip_local_deliver_finish_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];local_bh_enable_[k];do_softirq_[k];call_softirq_[k];rcu_bh_qs_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_local_out_[k];ip_output_[k];ip_finish_output_[k];dev_queue_xmit_[k];netif_skb_features_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ip_queue_xmit_[k];ip_output_[k] 2
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ktime_get_real_[k];getnstimeofday_[k];xen_clocksource_get_cycles_[k];pvclock_clocksource_read_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ktime_get_real_[k];getnstimeofday_[k];xen_clocksource_get_cycles_[k];xen_clocksource_read_[k];pvclock_clocksource_read_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];ktime_get_real_[k];xen_clocksource_get_cycles_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];__tcp_push_pending_frames_[k];tcp_write_xmit_[k];tcp_transmit_skb_[k];skb_dst_set_noref_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];lock_sock_nested_[k];_raw_spin_lock_bh_[k];local_bh_disable_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];__kmalloc_node_track_caller_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];__kmalloc_node_track_caller_[k];arch_local_irq_save_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];__phys_addr_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];get_slab_[k] 2
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];__alloc_skb_[k];kmem_cache_alloc_node_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];sk_stream_alloc_skb_[k];ksize_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_send_mss_[k];tcp_current_mss_[k];ipv4_mtu_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_send_mss_[k];tcp_current_mss_[k];tcp_established_options_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_send_mss_[k];tcp_xmit_size_goal_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];do_sync_write_[k];sock_aio_write_[k];do_sock_write.isra.10_[k];inet_sendmsg_[k];tcp_sendmsg_[k];tcp_xmit_size_goal_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];fsnotify_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];fsnotify_[k];__srcu_read_lock_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];rw_verify_area_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];rw_verify_area_[k];apparmor_file_permission_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];rw_verify_area_[k];security_file_permission_[k];apparmor_file_permission_[k];common_file_perm_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/FileDispatcherImpl:.write0_[j];write;system_call_fastpath_[k];sys_write_[k];vfs_write_[k];sock_aio_write_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.write_[j];sun/nio/ch/SocketChannelImpl:.writerCleanup_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/buffer/PooledUnsafeDirectByteBuf:.readBytes_[j];sun/nio/ch/SocketChannelImpl:.writerCleanup_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/ChannelOutboundHandlerAdapter:.flush_[j];io/netty/channel/AbstractChannelHandlerContext:.flush_[j];io/netty/channel/DefaultChannelPipeline$HeadContext:.flush_[j];io/netty/channel/AbstractChannel$AbstractUnsafe:.flush0_[j];io/netty/channel/nio/AbstractNioByteChannel:.doWrite_[j];io/netty/util/Recycler:.recycle_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j];io/netty/channel/ChannelDuplexHandler:.flush_[j] 2
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelReadComplete_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j];org/vertx/java/core/net/impl/VertxHandler:.channelReadComplete_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/buffer/AbstractReferenceCountedByteBuf:.release_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];java/util/concurrent/ConcurrentHashMap:.get_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/mozilla/javascript/Context:.getWrapFactory_[j] 2
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j] 3
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/ScriptableObject:.getParentScope_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/WrapFactory:.wrapAsJavaObject_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/WrapFactory:.wrapAsJavaObject_[j];java/util/HashMap:.get_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/WrapFactory:.wrap_[j];java/util/HashMap:.get_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getObjectProp_[j] 2
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getObjectProp_[j];org/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getObjectProp_[j];vtable chunks_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.nameOrFunction_[j];org/mozilla/javascript/ScriptableObject$Slot:.getValue_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.name_[j];org/mozilla/javascript/IdScriptableObject:.get_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThis_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.has_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.has_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 2
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.setAttributes_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/MemberBox:.invoke_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/WrapFactory:.wrap_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.findFunction_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaObject:.get_[j] 2
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.get_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 2
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.setAttributes_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getObjectProp_[j];org/mozilla/javascript/ScriptableObject$Slot:.getValue_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getPropFunctionAndThis_[j];org/mozilla/javascript/NativeJavaObject:.get_[j];java/util/HashMap:.get_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];jint_disjoint_arraycopy_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.get_[j] 2
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/IdScriptableObject:.has_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 2
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.setAttributes_[j] 2
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.getObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.get_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.nameOrFunction_[j];org/mozilla/javascript/IdScriptableObject:.get_[j];org/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.findInstanceIdInfo_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 3
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];vtable chunks_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/NativeFunction:.initScriptFunction_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.get_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.has_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 6
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.newObject_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptableObject:.getParentScope_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.has_[j] 4
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.has_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 5
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 6
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptableObject:.getPrototype_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptableObject:.getParentScope_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/TopLevel:.getBuiltinPrototype_[j] 2
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/ScriptRuntime:.name_[j];org/mozilla/javascript/ScriptRuntime:.nameOrFunction_[j];vtable chunks_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.has_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/IdScriptableObject:.setAttributes_[j] 2
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.createFunctionActivation_[j];org/mozilla/javascript/TopLevel:.getBuiltinPrototype_[j] 2
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/optimizer/OptRuntime:.call2_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.setObjectProp_[j];org/mozilla/javascript/IdScriptableObject:.put_[j];org/mozilla/javascript/ScriptableObject:.getSlot_[j];org/mozilla/javascript/ScriptableObject:.createSlot_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/ScriptRuntime:.indexFromString_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/ScriptRuntime:.setObjectElem_[j];org/mozilla/javascript/ScriptRuntime:.indexFromString_[j] 2
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j] 2
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];io/netty/handler/codec/http/DefaultHttpHeaders:.set_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j] 3
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/buffer/AbstractByteBuf:.writeBytes_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/handler/codec/http/HttpObjectEncoder:.encode_[j];io/netty/buffer/AbstractByteBuf:.writeBytes_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/handler/codec/http/HttpObjectEncoder:.encode_[j];io/netty/buffer/AbstractByteBufAllocator:.directBuffer_[j] 2
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/handler/codec/http/HttpObjectEncoder:.encode_[j];io/netty/buffer/AbstractByteBufAllocator:.directBuffer_[j];io/netty/util/concurrent/FastThreadLocal:.get_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/handler/codec/http/HttpObjectEncoder:.encode_[j];java/util/ArrayList:.add_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];io/netty/util/internal/RecyclableArrayList:.newInstance_[j];io/netty/util/concurrent/FastThreadLocal:.get_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];java/util/ArrayList:.ensureExplicitCapacity_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];io/netty/handler/codec/MessageToMessageEncoder:.write_[j];vtable chunks_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/channel/AbstractChannelHandlerContext:.write_[j];org/vertx/java/core/http/impl/VertxHttpHandler:.write_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/handler/codec/http/DefaultHttpHeaders:.add0_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];io/netty/handler/codec/http/DefaultHttpHeaders:.set_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/NativeJavaMethod:.call_[j];org/mozilla/javascript/MemberBox:.invoke_[j];sun/reflect/DelegatingMethodAccessorImpl:.invoke_[j];sun/nio/cs/UTF_8$Encoder:.<init>_[j];jbyte_disjoint_arraycopy_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];org/vertx/java/core/net/impl/VertxHandler:.channelRead_[j];org/vertx/java/core/http/impl/DefaultHttpServer$ServerHandler:.doMessageReceived_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vhello_js_1:.call_[j];org/mozilla/javascript/gen/file__home_bgregg_testtest_vert_x_2_1_4_sys_mods_io_vertx_lang_js_1_1_0_[j];org/mozilla/javascript/ScriptRuntime:.name_[j];org/mozilla/javascript/ScriptRuntime:.nameOrFunction_[j];org/mozilla/javascript/IdScriptableObject:.get_[j];org/mozilla/javascript/ScriptableObject$RelinkedSlot:.getValue_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/buffer/AbstractByteBuf:.forEachByteAsc0_[j];io/netty/util/internal/AppendableCharSequence:.append_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpHeaders:.isTransferEncodingChunked_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.findWhitespace_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders_[j];io/netty/buffer/AbstractByteBuf:.forEachByteAsc0_[j] 2
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders_[j];io/netty/handler/codec/http/HttpHeaders:.hash_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders_[j];io/netty/handler/codec/http/HttpObjectDecoder:.splitHeader_[j] 5
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/AbstractChannelHandlerContext:.fireChannelRead_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelRead_[j];io/netty/handler/codec/http/HttpObjectDecoder:.decode_[j];io/netty/handler/codec/http/HttpObjectDecoder:.readHeaders_[j];java/util/Arrays:.fill_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];java/nio/channels/spi/AbstractInterruptibleChannel:.end_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read 2
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;sys_read_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];do_sync_read_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];__kfree_skb_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_rcv_space_adjust_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];__kfree_skb_[k];skb_release_data_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];__kfree_skb_[k];skb_release_head_state_[k];dst_release_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];_raw_spin_lock_bh_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];skb_copy_datagram_iovec_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];skb_copy_datagram_iovec_[k];copy_user_enhanced_fast_string_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_cleanup_rbuf_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];do_sync_read_[k];sock_aio_read_[k];sock_aio_read.part.13_[k];do_sock_read.isra.12_[k];inet_recvmsg_[k];tcp_recvmsg_[k];tcp_cleanup_rbuf_[k];__tcp_select_window_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j];sun/nio/ch/SocketChannelImpl:.read_[j];sun/nio/ch/FileDispatcherImpl:.read0_[j];read;system_call_fastpath_[k];sys_read_[k];vfs_read_[k];rw_verify_area_[k] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe:.read_[j];io/netty/handler/codec/ByteToMessageDecoder:.channelReadComplete_[j] 1
java;start_thread;java_start;JavaThread::run;JavaThread::thread_main_inner;thread_entry;JavaCalls::call_virtual;JavaCalls::call_virtual;JavaCalls::call_helper;call_stub_[j];Interpreter_[j];Interpreter_[j];io/netty/channel/nio/NioEventLoop:.run_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeys_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKeysOptimized_[j];io/netty/channel/nio/NioEventLoop:.processSelectedKey_[j];io/netty/channel/socket/nio/NioSocketChannel:.doReadBytes_[j] 1
java;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;PSIsAliveClosure::do_object_b 1
java;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;StringTable::unlink_or_oops_do 2
java;start_thread;java_start;VMThread::run;VMThread::loop;VMThread::evaluate_operation;VM_Operation::evaluate;VM_ParallelGCFailedAllocation::doit;ParallelScavengeHeap::failed_mem_allocate;PSScavenge::invoke;PSScavenge::invoke_no_policy;pthread_cond_signal@@GLIBC_2.3.2;system_call_fastpath_[k];sys_futex_[k];do_futex_[k];futex_wake_op_[k] 1
java;write;check_events_[k];hypercall_page_[k] 3
@@ -0,0 +1,3 @@
speedscope@1.5.3
Thu Jan 16 00:10:56 PST 2020
707462e9cffec2bda49587c39d621ba89d1b51cb
@@ -0,0 +1 @@
a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}table{border-collapse:collapse;border-spacing:0}html{overflow:hidden}body,html{height:100%}body{overflow:auto}
File diff suppressed because one or more lines are too long
+567
View File
@@ -0,0 +1,567 @@
import { CssBaseline } from "@mui/material";
import { StyledEngineProvider, ThemeProvider } from "@mui/material/styles";
import dayjs from "dayjs";
import duration from "dayjs/plugin/duration";
import React, { Suspense, useEffect, useState } from "react";
import { HashRouter, Navigate, Route, Routes } from "react-router-dom";
import {
authenticateWithToken,
getAuthenticationMode,
} from "./authentication/authentication";
import { AUTHENTICATION_ERROR_EVENT } from "./authentication/constants";
import TokenAuthenticationDialog from "./authentication/TokenAuthenticationDialog";
import ActorDetailPage, { ActorDetailLayout } from "./pages/actor/ActorDetail";
import { ActorLayout } from "./pages/actor/ActorLayout";
import PlatformEventsPage from "./pages/events/PlatformEventsPage";
import Loading from "./pages/exception/Loading";
import JobList, { JobsLayout } from "./pages/job";
import { JobDetailChartsPage } from "./pages/job/JobDetail";
import {
JobDetailActorDetailWrapper,
JobDetailActorsPage,
} from "./pages/job/JobDetailActorPage";
import { JobDetailInfoPage } from "./pages/job/JobDetailInfoPage";
import { JobDetailLayout, JobPage } from "./pages/job/JobDetailLayout";
import { MainNavLayout } from "./pages/layout/MainNavLayout";
import { SideTabPage } from "./pages/layout/SideTabLayout";
import {
LogsLayout,
StateApiLogsListPage,
StateApiLogViewerPage,
} from "./pages/log/Logs";
import { Metrics } from "./pages/metrics";
import {
DashboardUids,
getMetricsInfo,
getTimeZoneInfo,
TimezoneInfo,
} from "./pages/metrics/utils";
import Nodes, { ClusterMainPageLayout } from "./pages/node";
import { ClusterDetailInfoPage } from "./pages/node/ClusterDetailInfoPage";
import { ClusterLayout } from "./pages/node/ClusterLayout";
import NodeDetailPage from "./pages/node/NodeDetail";
import { OverviewPage } from "./pages/overview/OverviewPage";
import {
ServeApplicationDetailLayout,
ServeApplicationDetailPage,
} from "./pages/serve/ServeApplicationDetailPage";
import {
ServeDeploymentDetailLayout,
ServeDeploymentDetailPage,
} from "./pages/serve/ServeDeploymentDetailPage";
import { ServeDeploymentsListPage } from "./pages/serve/ServeDeploymentsListPage";
import { ServeLayout, ServeSideTabLayout } from "./pages/serve/ServeLayout";
import { ServeReplicaDetailLayout } from "./pages/serve/ServeReplicaDetailLayout";
import { ServeReplicaDetailPage } from "./pages/serve/ServeReplicaDetailPage";
import {
ServeControllerDetailPage,
ServeProxyDetailPage,
} from "./pages/serve/ServeSystemActorDetailPage";
import {
ServeSystemDetailLayout,
ServeSystemDetailPage,
} from "./pages/serve/ServeSystemDetailPage";
import { TaskPage } from "./pages/task/TaskPage";
import { getNodeList } from "./service/node";
import { getPlatformEventsEnabled } from "./service/platform";
import { darkTheme, lightTheme } from "./theme";
dayjs.extend(duration);
// lazy loading fro prevent loading too much code at once
const Actors = React.lazy(() => import("./pages/actor"));
const CMDResult = React.lazy(() => import("./pages/cmd/CMDResult"));
// a global map for relations
export type GlobalContextType = {
nodeMap: { [key: string]: string };
nodeMapByIp: { [key: string]: string };
namespaceMap: { [key: string]: string[] };
/**
* Whether the initial metrics context has been fetched or not.
* This can be used to determine the difference between Grafana
* not being set up vs the status not being fetched yet.
*/
metricsContextLoaded: boolean;
/**
* The host that is serving grafana. Only set if grafana is
* running as detected by the grafana healthcheck endpoint.
*/
grafanaHost: string | undefined;
/**
* The param 'orgId' used in grafana. Default is 1.
*/
grafanaOrgId: string;
/**
* The filter for the Cluster variable in grafana dashboards.
*/
grafanaClusterFilter: string | undefined;
/**
* The uids of the dashboards that ray exports that powers the various metrics UIs.
*/
dashboardUids: DashboardUids | undefined;
/**
* Whether prometheus is runing or not
*/
prometheusHealth: boolean | undefined;
/**
* Whether platform events are enabled
*/
platformEventsEnabled?: boolean;
/**
* The name of the currently running ray session.
*/
sessionName: string | undefined;
/**
* The name of the current selected datasource.
*/
dashboardDatasource: string | undefined;
/**
* The timezone set on the ray cluster.
*/
serverTimeZone: TimezoneInfo | null | undefined;
/**
* The globally selected current time zone.
*/
currentTimeZone: string | undefined;
/**
* The current theme mode (light or dark)
*/
themeMode: "light" | "dark";
/**
* Function to toggle between light and dark mode
*/
toggleTheme: () => void;
};
export const GlobalContext = React.createContext<GlobalContextType>({
nodeMap: {},
nodeMapByIp: {},
namespaceMap: {},
metricsContextLoaded: false,
grafanaHost: undefined,
grafanaOrgId: "1",
grafanaClusterFilter: undefined,
dashboardUids: undefined,
prometheusHealth: undefined,
platformEventsEnabled: false,
sessionName: undefined,
dashboardDatasource: undefined,
serverTimeZone: undefined,
currentTimeZone: undefined,
themeMode: "light",
// eslint-disable-next-line @typescript-eslint/no-empty-function
toggleTheme: () => {},
});
const App = () => {
const [currentTimeZone, setCurrentTimeZone] = useState<string>();
const [themeMode, setThemeMode] = useState<"light" | "dark">(() => {
// Check URL query param first (for embedded views)
const urlParams = new URLSearchParams(window.location.search);
const urlTheme = urlParams.get("theme");
if (urlTheme === "dark" || urlTheme === "light") {
return urlTheme;
}
// Then check localStorage
const stored = localStorage.getItem("themeMode");
if (stored === "dark" || stored === "light") {
return stored;
}
// Fall back to system preference
if (
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches
) {
return "dark";
}
return "light";
});
const [context, setContext] = useState<
Omit<GlobalContextType, "currentTimeZone" | "themeMode" | "toggleTheme">
>({
nodeMap: {},
nodeMapByIp: {},
namespaceMap: {},
metricsContextLoaded: false,
grafanaHost: undefined,
grafanaOrgId: "1",
grafanaClusterFilter: undefined,
dashboardUids: undefined,
prometheusHealth: undefined,
platformEventsEnabled: false,
sessionName: undefined,
dashboardDatasource: undefined,
serverTimeZone: undefined,
});
const toggleTheme = () => {
setThemeMode((prevMode) => {
const newMode = prevMode === "light" ? "dark" : "light";
localStorage.setItem("themeMode", newMode);
return newMode;
});
};
// Listen for system theme changes
useEffect(() => {
const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
const handleChange = (e: MediaQueryListEvent) => {
// Only update if user hasn't explicitly set a preference via localStorage or URL
const stored = localStorage.getItem("themeMode");
const urlParams = new URLSearchParams(window.location.search);
const urlTheme = urlParams.get("theme");
if (!stored && !urlTheme) {
setThemeMode(e.matches ? "dark" : "light");
}
};
mediaQuery.addEventListener("change", handleChange);
return () => mediaQuery.removeEventListener("change", handleChange);
}, []);
// Authentication state
const [authenticationDialogOpen, setAuthenticationDialogOpen] =
useState(false);
const [hasAttemptedAuthentication, setHasAttemptedAuthentication] =
useState(false);
const [authenticationError, setAuthenticationError] =
useState<string | undefined>();
useEffect(() => {
getNodeList().then((res) => {
if (res?.data?.data?.summary) {
const nodeMap = {} as { [key: string]: string };
const nodeMapByIp = {} as { [key: string]: string };
res.data.data.summary.forEach(({ hostname, raylet, ip }) => {
nodeMap[hostname] = raylet.nodeId;
nodeMapByIp[ip] = raylet.nodeId;
});
setContext((existingContext) => ({
...existingContext,
nodeMap,
nodeMapByIp,
namespaceMap: {},
}));
}
});
}, []);
// Detect if grafana is running
useEffect(() => {
const doEffect = async () => {
const {
grafanaHost,
grafanaOrgId,
grafanaClusterFilter,
sessionName,
prometheusHealth,
dashboardUids,
dashboardDatasource,
} = await getMetricsInfo();
setContext((existingContext) => ({
...existingContext,
metricsContextLoaded: true,
grafanaHost,
grafanaOrgId,
grafanaClusterFilter,
dashboardUids,
sessionName,
prometheusHealth,
dashboardDatasource,
}));
};
doEffect();
}, []);
// Detect if platform events are enabled
useEffect(() => {
getPlatformEventsEnabled().then((platformEventsEnabled) => {
setContext((existingContext) => ({
...existingContext,
platformEventsEnabled,
}));
});
}, []);
useEffect(() => {
const updateTimezone = async () => {
// Sets the initial timezone to localStorage value if it exists
const storedTimeZone = localStorage.getItem("timezone");
if (storedTimeZone) {
setCurrentTimeZone(storedTimeZone);
}
// Fetch the server time zone.
const tzInfo = await getTimeZoneInfo();
const timeZone =
storedTimeZone ||
tzInfo?.value ||
Intl.DateTimeFormat().resolvedOptions().timeZone;
setCurrentTimeZone(timeZone);
setContext((existingContext) => ({
...existingContext,
serverTimeZone: tzInfo,
}));
};
updateTimezone();
}, []);
// Check authentication mode on mount and cache in sessionStorage
useEffect(() => {
const checkAuthentication = async () => {
try {
const { authentication_mode } = await getAuthenticationMode();
sessionStorage.setItem("ray-authentication-mode", authentication_mode);
} catch (error) {
console.error("Failed to check authentication mode:", error);
}
};
checkAuthentication();
}, []);
// Listen for authentication errors from axios interceptor
useEffect(() => {
const handleAuthenticationError = async (event: Event) => {
const customEvent = event as CustomEvent<{ hadToken: boolean }>;
const hadToken = customEvent.detail?.hadToken ?? false;
// Check cached auth mode first, fall back to API if not cached
let authMode = sessionStorage.getItem("ray-authentication-mode");
if (!authMode) {
try {
const { authentication_mode } = await getAuthenticationMode();
authMode = authentication_mode;
sessionStorage.setItem(
"ray-authentication-mode",
authentication_mode,
);
} catch (error) {
console.error("Failed to check authentication mode:", error);
return;
}
}
if (authMode === "token" || authMode === "k8s") {
setHasAttemptedAuthentication(hadToken);
setAuthenticationDialogOpen(true);
}
};
window.addEventListener(
AUTHENTICATION_ERROR_EVENT,
handleAuthenticationError,
);
return () => {
window.removeEventListener(
AUTHENTICATION_ERROR_EVENT,
handleAuthenticationError,
);
};
}, []);
// Handle token submission from dialog
const handleTokenSubmit = async (token: string) => {
try {
// Authenticate with the server - this will validate the token
// and set an HttpOnly cookie if valid
const isValid = await authenticateWithToken(token);
if (isValid) {
// Token is valid and server has set HttpOnly cookie
setHasAttemptedAuthentication(true);
setAuthenticationDialogOpen(false);
setAuthenticationError(undefined);
// Reload the page to refetch all data with the new token
window.location.reload();
} else {
// Token is invalid
setHasAttemptedAuthentication(true);
setAuthenticationError(
"Invalid authentication token. Please check and try again.",
);
}
} catch (error) {
console.error("Failed to authenticate:", error);
setAuthenticationError(
"Failed to authenticate. Please check your connection and try again.",
);
}
};
const currentTheme = themeMode === "dark" ? darkTheme : lightTheme;
return (
<StyledEngineProvider injectFirst>
<ThemeProvider theme={currentTheme}>
<Suspense fallback={Loading}>
<GlobalContext.Provider
value={{
...context,
currentTimeZone,
themeMode,
toggleTheme,
}}
>
<CssBaseline />
<TokenAuthenticationDialog
open={authenticationDialogOpen}
hasExistingToken={hasAttemptedAuthentication}
onSubmit={handleTokenSubmit}
error={authenticationError}
/>
<HashRouter>
<Routes>
{/* Redirect people hitting the /new path to root. TODO(aguo): Delete this redirect in ray 2.5 */}
<Route element={<Navigate replace to="/" />} path="/new" />
<Route element={<MainNavLayout />} path="/">
<Route element={<Navigate replace to="overview" />} path="" />
<Route element={<OverviewPage />} path="overview" />
<Route
element={<PlatformEventsPage />}
path="platform-events"
/>
<Route element={<ClusterMainPageLayout />} path="cluster">
<Route element={<ClusterLayout />} path="">
<Route
element={
<SideTabPage tabId="info">
<ClusterDetailInfoPage />
</SideTabPage>
}
path="info"
/>
<Route
element={
<SideTabPage tabId="table">
<Nodes />
</SideTabPage>
}
path=""
/>
</Route>
<Route element={<NodeDetailPage />} path="nodes/:id" />
</Route>
<Route element={<JobsLayout />} path="jobs">
<Route element={<JobList />} path="" />
<Route element={<JobPage />} path=":id">
<Route element={<JobDetailLayout />} path="">
<Route
element={
<SideTabPage tabId="info">
<JobDetailInfoPage />
</SideTabPage>
}
path="info"
/>
<Route
element={
<SideTabPage tabId="charts">
<JobDetailChartsPage />
</SideTabPage>
}
path=""
/>
<Route
element={
<SideTabPage tabId="actors">
<JobDetailActorsPage />
</SideTabPage>
}
path="actors"
/>
</Route>
<Route
element={
<JobDetailActorDetailWrapper>
<ActorDetailLayout />
</JobDetailActorDetailWrapper>
}
path="actors/:actorId"
>
<Route element={<ActorDetailPage />} path="" />
<Route element={<TaskPage />} path="tasks/:taskId" />
</Route>
<Route element={<TaskPage />} path="tasks/:taskId" />
</Route>
</Route>
<Route element={<ActorLayout />} path="actors">
<Route element={<Actors />} path="" />
<Route element={<ActorDetailLayout />} path=":actorId">
<Route element={<ActorDetailPage />} path="" />
<Route element={<TaskPage />} path="tasks/:taskId" />
</Route>
</Route>
<Route element={<Metrics />} path="metrics" />
<Route element={<ServeLayout />} path="serve">
<Route element={<ServeSideTabLayout />} path="">
<Route
element={
<SideTabPage tabId="system">
<ServeSystemDetailPage />
</SideTabPage>
}
path="system"
/>
<Route
element={
<SideTabPage tabId="deployments">
<ServeDeploymentsListPage />
</SideTabPage>
}
path=""
/>
</Route>
<Route element={<ServeSystemDetailLayout />} path="system">
<Route
element={<ServeControllerDetailPage />}
path="controller"
/>
<Route
element={<ServeProxyDetailPage />}
path="proxies/:proxyId"
/>
</Route>
<Route
element={<ServeApplicationDetailLayout />}
path="applications/:applicationName"
>
<Route element={<ServeApplicationDetailPage />} path="" />
<Route
element={<ServeDeploymentDetailLayout />}
path=":deploymentName"
>
<Route
element={<ServeDeploymentDetailPage />}
path=""
/>
<Route
element={<ServeReplicaDetailLayout />}
path=":replicaId"
>
<Route element={<ServeReplicaDetailPage />} path="" />
<Route path="tasks/:taskId" element={<TaskPage />} />
</Route>
</Route>
</Route>
</Route>
<Route element={<LogsLayout />} path="logs">
<Route element={<StateApiLogsListPage />} path="" />
<Route element={<StateApiLogViewerPage />} path="viewer" />
</Route>
</Route>
<Route element={<CMDResult />} path="/cmd/:cmd/:ip/:pid" />
</Routes>
</HashRouter>
</GlobalContext.Provider>
</Suspense>
</ThemeProvider>
</StyledEngineProvider>
);
};
export default App;
@@ -0,0 +1,206 @@
import { render, screen, waitFor } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import React from "react";
import "@testing-library/jest-dom";
import TokenAuthenticationDialog from "./TokenAuthenticationDialog";
describe("TokenAuthenticationDialog", () => {
const mockOnSubmit = jest.fn();
beforeEach(() => {
mockOnSubmit.mockClear();
});
it("renders with initial message when no existing token", () => {
render(
<TokenAuthenticationDialog
open={true}
hasExistingToken={false}
onSubmit={mockOnSubmit}
/>,
);
expect(
screen.getByText("Authentication Token Required"),
).toBeInTheDocument();
expect(
screen.getByText(/Token authentication is enabled/),
).toBeInTheDocument();
});
it("renders with re-authentication message when has existing token", () => {
render(
<TokenAuthenticationDialog
open={true}
hasExistingToken={true}
onSubmit={mockOnSubmit}
/>,
);
expect(
screen.getByText("Authentication Token Required"),
).toBeInTheDocument();
expect(
screen.getByText(/The existing authentication token is invalid/),
).toBeInTheDocument();
});
it("displays error message when provided", () => {
const errorMessage = "Invalid token provided";
render(
<TokenAuthenticationDialog
open={true}
hasExistingToken={false}
onSubmit={mockOnSubmit}
error={errorMessage}
/>,
);
expect(screen.getByText(errorMessage)).toBeInTheDocument();
});
it("calls onSubmit with entered token when submit is clicked", async () => {
const user = userEvent.setup();
mockOnSubmit.mockResolvedValue(undefined);
render(
<TokenAuthenticationDialog
open={true}
hasExistingToken={false}
onSubmit={mockOnSubmit}
/>,
);
const input = screen.getByLabelText("Authentication Token");
await user.type(input, "test-token-123");
const submitButton = screen.getByRole("button", { name: /submit/i });
await user.click(submitButton);
await waitFor(() => {
expect(mockOnSubmit).toHaveBeenCalledWith("test-token-123");
});
});
it("calls onSubmit when Enter key is pressed", async () => {
const user = userEvent.setup();
mockOnSubmit.mockResolvedValue(undefined);
render(
<TokenAuthenticationDialog
open={true}
hasExistingToken={false}
onSubmit={mockOnSubmit}
/>,
);
const input = screen.getByLabelText("Authentication Token");
await user.type(input, "test-token-123{Enter}");
await waitFor(() => {
expect(mockOnSubmit).toHaveBeenCalledWith("test-token-123");
});
});
it("disables submit button when token is empty", () => {
render(
<TokenAuthenticationDialog
open={true}
hasExistingToken={false}
onSubmit={mockOnSubmit}
/>,
);
const submitButton = screen.getByRole("button", { name: /submit/i });
expect(submitButton).toBeDisabled();
});
it("enables submit button when token is entered", async () => {
const user = userEvent.setup();
render(
<TokenAuthenticationDialog
open={true}
hasExistingToken={false}
onSubmit={mockOnSubmit}
/>,
);
const submitButton = screen.getByRole("button", { name: /submit/i });
expect(submitButton).toBeDisabled();
const input = screen.getByLabelText("Authentication Token");
await user.type(input, "test-token");
expect(submitButton).not.toBeDisabled();
});
it("toggles token visibility when visibility icon is clicked", async () => {
const user = userEvent.setup();
render(
<TokenAuthenticationDialog
open={true}
hasExistingToken={false}
onSubmit={mockOnSubmit}
/>,
);
const input = screen.getByLabelText("Authentication Token");
await user.type(input, "secret-token");
// Initially should be password type (hidden)
expect(input).toHaveAttribute("type", "password");
// Click visibility toggle
const toggleButton = screen.getByLabelText(/toggle token visibility/i);
await user.click(toggleButton);
// Should now be text type (visible)
expect(input).toHaveAttribute("type", "text");
// Click again to hide
await user.click(toggleButton);
expect(input).toHaveAttribute("type", "password");
});
it("shows loading state during submission", async () => {
const user = userEvent.setup();
// Mock a slow submission
mockOnSubmit.mockImplementation(
() => new Promise((resolve) => setTimeout(resolve, 100)),
);
render(
<TokenAuthenticationDialog
open={true}
hasExistingToken={false}
onSubmit={mockOnSubmit}
/>,
);
const input = screen.getByLabelText("Authentication Token");
await user.type(input, "test-token");
const submitButton = screen.getByRole("button", { name: /submit/i });
await user.click(submitButton);
// Should show validating state
await waitFor(() => {
expect(screen.getByText(/validating.../i)).toBeInTheDocument();
});
});
it("does not render when open is false", () => {
render(
<TokenAuthenticationDialog
open={false}
hasExistingToken={false}
onSubmit={mockOnSubmit}
/>,
);
// Dialog should not be visible
expect(
screen.queryByText("Authentication Token Required"),
).not.toBeInTheDocument();
});
});
@@ -0,0 +1,156 @@
/**
* Dialog component for Ray dashboard token authentication.
* Prompts users to enter their authentication token when token auth is enabled.
*/
import { Visibility, VisibilityOff } from "@mui/icons-material";
import {
Alert,
Button,
CircularProgress,
Dialog,
DialogActions,
DialogContent,
DialogContentText,
DialogTitle,
IconButton,
InputAdornment,
TextField,
} from "@mui/material";
import React, { useState } from "react";
export type TokenAuthenticationDialogProps = {
/** Whether the dialog is open */
open: boolean;
/** Whether the user has previously entered a token (affects messaging) */
hasExistingToken: boolean;
/** Callback when user submits a token */
onSubmit: (token: string) => Promise<void>;
/** Optional error message to display */
error?: string;
};
/**
* Token Authentication Dialog Component.
*
* Shows different messages based on whether this is the first time
* (hasExistingToken=false) or if a previously stored token was rejected
* (hasExistingToken=true).
*/
export const TokenAuthenticationDialog: React.FC<TokenAuthenticationDialogProps> =
({ open, hasExistingToken, onSubmit, error }) => {
const [token, setToken] = useState("");
const [showToken, setShowToken] = useState(false);
const [isSubmitting, setIsSubmitting] = useState(false);
const handleSubmit = async () => {
if (!token.trim()) {
return;
}
setIsSubmitting(true);
try {
await onSubmit(token.trim());
// If successful, the parent component will close the dialog
// and likely reload the page
} finally {
setIsSubmitting(false);
}
};
const handleKeyDown = (event: React.KeyboardEvent) => {
if (event.key === "Enter" && !isSubmitting) {
handleSubmit();
}
};
const toggleShowToken = () => {
setShowToken(!showToken);
};
// Different messages based on whether this is initial auth or re-auth.
const title = "Authentication Token Required";
const message =
(hasExistingToken
? "The existing authentication token is invalid."
: "Token authentication is enabled.") +
" Provide the matching authentication token for this cluster.\n- Local clusters: use `ray get-auth-token` to retrieve it.\n- Remote clusters: you must retrieve the token that was used when creating the cluster.\n\nSee: https://docs.ray.io/en/latest/ray-security/token-auth.html";
return (
<Dialog
open={open}
// Make dialog non-dismissible - user must provide valid token
disableEscapeKeyDown
aria-labelledby="token-auth-dialog-title"
aria-describedby="token-auth-dialog-description"
maxWidth="sm"
fullWidth
>
<DialogTitle id="token-auth-dialog-title">{title}</DialogTitle>
<DialogContent>
<DialogContentText
id="token-auth-dialog-description"
sx={{ marginBottom: 2, whiteSpace: "pre-line" }}
>
{message}
</DialogContentText>
{error && (
<Alert severity="error" sx={{ marginBottom: 2 }}>
{error}
</Alert>
)}
<TextField
autoFocus
fullWidth
label="Authentication Token"
type={showToken ? "text" : "password"}
value={token}
onChange={(e) => setToken(e.target.value)}
onKeyDown={handleKeyDown}
disabled={isSubmitting}
placeholder="Enter your authentication token"
InputProps={{
endAdornment: (
<InputAdornment position="end">
<IconButton
aria-label="toggle token visibility"
onClick={toggleShowToken}
edge="end"
disabled={isSubmitting}
>
{showToken ? (
<VisibilityOff
sx={(theme) => ({
color: theme.palette.text.secondary,
})}
/>
) : (
<Visibility
sx={(theme) => ({
color: theme.palette.text.secondary,
})}
/>
)}
</IconButton>
</InputAdornment>
),
}}
/>
</DialogContent>
<DialogActions>
<Button
onClick={handleSubmit}
variant="contained"
disabled={!token.trim() || isSubmitting}
startIcon={isSubmitting ? <CircularProgress size={20} /> : null}
>
{isSubmitting ? "Validating..." : "Submit"}
</Button>
</DialogActions>
</Dialog>
);
};
export default TokenAuthenticationDialog;
@@ -0,0 +1,58 @@
/**
* Authentication service for Ray dashboard.
* Provides functions to check authentication mode and authenticate with tokens.
*/
import axios from "axios";
import { formatUrl, get } from "../service/requestHandlers";
/**
* Response type for authentication mode endpoint.
*/
export type AuthenticationModeResponse = {
authentication_mode: "disabled" | "token";
};
/**
* Get the current authentication mode from the server.
* This endpoint is public and does not require authentication.
*
* @returns Promise resolving to the authentication mode
*/
export const getAuthenticationMode =
async (): Promise<AuthenticationModeResponse> => {
const response = await get<AuthenticationModeResponse>(
"/api/authentication_mode",
);
return response.data;
};
/**
* Authenticate with the server using a token.
* If the token is valid, the server will set an HttpOnly cookie that will be
* automatically included in all subsequent requests.
*
* @param token - The authentication token to validate and use
* @returns Promise resolving to true if authentication succeeded, false otherwise
*/
export const authenticateWithToken = async (
token: string,
): Promise<boolean> => {
try {
await axios.post(
formatUrl("/api/authenticate"),
{},
{
headers: { Authorization: `Bearer ${token}` },
},
);
return true;
} catch (error: any) {
// 401 (Unauthorized) or 403 (Forbidden) means invalid token
if (error.response?.status === 401 || error.response?.status === 403) {
return false;
}
// For other errors (network, server errors, etc.), re-throw
throw error;
}
};
@@ -0,0 +1,9 @@
/**
* Authentication-related constants for the Ray dashboard.
*/
/**
* Event name dispatched when an authentication error occurs (401 or 403).
* Listened to by App.tsx to show the authentication dialog.
*/
export const AUTHENTICATION_ERROR_EVENT = "ray-authentication-error";
@@ -0,0 +1,52 @@
import {
Button,
Dialog,
DialogActions,
DialogContent,
DialogContentText,
DialogTitle,
} from "@mui/material";
import React, { PropsWithChildren } from "react";
import { ClassNameProps } from "./props";
type AlertDialogProps = PropsWithChildren<
{
open: boolean;
handleClose: any;
onAgree: any;
title: string;
contents: string;
} & ClassNameProps
>;
export const AlertDialog = ({
open,
handleClose,
onAgree,
title,
contents,
}: AlertDialogProps) => {
return (
<div>
<Dialog
open={open}
onClose={handleClose}
aria-labelledby="alert-dialog-title"
aria-describedby="alert-dialog-description"
>
<DialogTitle id="alert-dialog-title">{title}</DialogTitle>
<DialogContent>
<DialogContentText id="alert-dialog-description">
{contents}
</DialogContentText>
</DialogContent>
<DialogActions>
<Button onClick={handleClose}>Disagree</Button>
<Button onClick={onAgree} autoFocus>
Agree
</Button>
</DialogActions>
</Dialog>
</div>
);
};
@@ -0,0 +1,81 @@
import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import React from "react";
import { TEST_APP_WRAPPER } from "../../util/test-utils";
import {
CodeDialogButton,
CodeDialogButtonWithPreview,
} from "./CodeDialogButton";
describe("CodeDialogButton", () => {
it("renders with code as JSON", async () => {
expect.assertions(4);
render(
<CodeDialogButton title="Test title" code={{ foo: 1, bar: "bar" }} />,
{ wrapper: TEST_APP_WRAPPER },
);
const user = userEvent.setup();
await screen.findByText("View");
expect(screen.getByText("View")).toBeVisible();
await user.click(screen.getByText("View"));
await screen.findByText("Test title");
expect(screen.getByText("Test title")).toBeVisible();
expect(screen.getByText(/foo: 1/)).toBeVisible();
expect(screen.getByText(/bar: bar/)).toBeVisible();
});
it("renders with custom button text and code as a string", async () => {
expect.assertions(4);
render(
<CodeDialogButton
title="Test title"
buttonText="CustomButton"
code="import ray\nray.init()"
/>,
{ wrapper: TEST_APP_WRAPPER },
);
const user = userEvent.setup();
await screen.findByText("CustomButton");
expect(screen.getByText("CustomButton")).toBeVisible();
await user.click(screen.getByText("CustomButton"));
await screen.findByText("Test title");
expect(screen.getByText("Test title")).toBeVisible();
expect(screen.getByText(/import ray/)).toBeVisible();
expect(screen.getByText(/ray.init\(\)/)).toBeVisible();
});
});
describe("CodeDialogButtonWithPreview", () => {
it("renders", async () => {
expect.assertions(5);
render(
<CodeDialogButtonWithPreview
title="Test title"
code={{ foo: 1, bar: "bar" }}
/>,
{ wrapper: TEST_APP_WRAPPER },
);
const user = userEvent.setup();
await screen.findByText("Expand");
// Preview of the code should be visible
expect(screen.getByText(/foo: 1/)).toBeVisible();
expect(screen.getByText("Expand")).toBeVisible();
await user.click(screen.getByText("Expand"));
await screen.findByText("Test title");
expect(screen.getByText("Test title")).toBeVisible();
expect(screen.getAllByText(/foo: 1/)[1]).toBeVisible();
expect(screen.getAllByText(/bar: bar/)[1]).toBeVisible();
});
});
@@ -0,0 +1,126 @@
import { Box, Card, Link, SxProps, Theme, Typography } from "@mui/material";
import yaml from "js-yaml";
import React, { useState } from "react";
import DialogWithTitle from "../DialogWithTitle";
import { ClassNameProps } from "../props";
export type CodeDialogButtonProps = {
/**
* Title of the dialog box
*/
title: string;
/**
* Text for the button. By default it's "View"
*/
buttonText?: string;
/**
* Code to show in the dialog. If an object is passed in, that object will be stringified to yaml.
*/
code: string | object;
sx?: SxProps<Theme>;
};
/**
* A button that when clicked, will pop up a dialog with the full code text with proper formatting.
*/
export const CodeDialogButton = ({
title,
buttonText = "View",
code,
}: CodeDialogButtonProps) => {
const [showConfigDialog, setShowConfigDialog] = useState(false);
const handleConfigClick = () => {
setShowConfigDialog(true);
};
return (
<React.Fragment>
<Link
sx={{
whiteSpace: "nowrap",
}}
component="button"
onClick={handleConfigClick}
>
{buttonText}
</Link>
{showConfigDialog && (
<DialogWithTitle
title={title}
handleClose={() => {
setShowConfigDialog(false);
}}
>
<Card variant="outlined">
<Typography
sx={{
whiteSpace: "pre",
fontFamily:
"SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace",
padding: 2,
overflow: "scroll",
maxHeight: 600,
textWrap: "wrap",
}}
>
{typeof code === "string" ? code : yaml.dump(code, { indent: 2 })}
</Typography>
</Card>
</DialogWithTitle>
)}
</React.Fragment>
);
};
type CodeDialogButtonWithPreviewProps = CodeDialogButtonProps & ClassNameProps;
/**
* Similar to CodeDialogButton but also shows a snippet of the expanded text next to the button.
*/
export const CodeDialogButtonWithPreview = ({
code,
buttonText,
className,
sx,
...props
}: CodeDialogButtonWithPreviewProps) => {
const codeText =
typeof code === "string"
? code
: yaml.dump(code, { indent: 2, sortKeys: true });
const buttonTextToPass = buttonText ?? "Expand";
return (
<Box
className={className}
sx={[
{
display: "flex",
flexWrap: "nowrap",
flexDirection: "row",
gap: 1,
},
...(Array.isArray(sx) ? sx : [sx]),
]}
>
<Box
component="span"
sx={{
display: "block",
whiteSpace: "nowrap",
overflow: "hidden",
textOverflow: "ellipsis",
flex: 1,
}}
>
{codeText}
</Box>
<CodeDialogButton
code={codeText}
buttonText={buttonTextToPass}
{...props}
/>
</Box>
);
};
@@ -0,0 +1 @@
export * from "./CodeDialogButton";
@@ -0,0 +1,152 @@
import { Box, SxProps, Theme, Typography } from "@mui/material";
import React, {
forwardRef,
PropsWithChildren,
useEffect,
useState,
} from "react";
import { RiArrowDownSLine, RiArrowRightSLine } from "react-icons/ri";
import { ClassNameProps } from "./props";
type CollapsibleSectionProps = PropsWithChildren<
{
/**
* Allows the parent component to control if this section is expanded.
* If undefined, the child wil own the expansion state
*/
expanded?: boolean;
onExpandButtonClick?: () => void;
title: string;
startExpanded?: boolean;
/**
* Icon to show to the right of the title.
*/
icon?: React.ReactNode;
/**
* An optimization to not avoid re-rendering the contents of the collapsible section.
* When enabled, we will keep the content around when collapsing but hide it via css.
*/
keepRendered?: boolean;
sx?: SxProps<Theme>;
} & ClassNameProps
>;
export const CollapsibleSection = forwardRef<
HTMLDivElement,
CollapsibleSectionProps
>(
(
{
title,
expanded,
onExpandButtonClick,
startExpanded = false,
className,
children,
keepRendered,
icon,
sx,
},
ref,
) => {
const [internalExpanded, setInternalExpanded] = useState(startExpanded);
const finalExpanded = expanded !== undefined ? expanded : internalExpanded;
const handleExpandClick = () => {
onExpandButtonClick?.();
setInternalExpanded(!finalExpanded);
};
return (
<Box ref={ref} className={className} sx={sx}>
<Box display="flex" flexDirection="row" alignItems="center">
<Typography
sx={{
display: "flex",
flexDirection: "row",
flexWrap: "nowrap",
alignItems: "center",
fontWeight: 500,
cursor: "pointer",
marginRight: 1,
}}
variant="h4"
onClick={handleExpandClick}
>
{finalExpanded ? (
<Box
component={RiArrowDownSLine}
sx={{
marginRight: 1,
width: 24,
height: 24,
}}
/>
) : (
<Box
component={RiArrowRightSLine}
sx={{
marginRight: 1,
width: 24,
height: 24,
}}
/>
)}
{title}
</Typography>
{icon}
</Box>
<HideableBlock visible={finalExpanded} keepRendered={keepRendered}>
{children}
</HideableBlock>
</Box>
);
},
);
type HideableBlockProps = PropsWithChildren<
{
visible: boolean;
/**
* An optimization to not avoid re-rendering the contents of the collapsible section.
* When enabled, we will keep the content around when collapsing but hide it via css.
*/
keepRendered?: boolean;
} & ClassNameProps
>;
/**
* Component that can be hidden depending on a passed in prop. Supports an optimization
* to keep the component rendered (but not visible) when hidden to avoid re-rendering
* when component is shown again.
*/
export const HideableBlock = ({
visible,
keepRendered,
children,
}: HideableBlockProps) => {
// visible represents whether the component is viewable in the browser.
// Rendered represents whether the DOM elements exist in the DOM tree.
// If !visible && rendered, then the elements are in the DOM but are
// not drawn via CSS visibility rules.
const [rendered, setRendered] = useState(visible);
useEffect(() => {
if (visible) {
setRendered(true);
}
}, [visible]);
// Optimization to keep the component rendered (but not visible) when hidden
// to avoid re-rendering when component is shown again.
return visible || (keepRendered && rendered) ? (
<Box
sx={{
marginTop: 1,
display: !visible ? "none" : "block",
}}
>
{children}
</Box>
) : null;
};
@@ -0,0 +1,5 @@
import { styled, Typography } from "@mui/material";
export const RightPaddedTypography = styled(Typography)(({ theme }) => ({
paddingRight: theme.spacing(1),
}));
@@ -0,0 +1,55 @@
import CloseIcon from "@mui/icons-material/Close";
import { Dialog, IconButton, Theme, Typography } from "@mui/material";
import React, { PropsWithChildren } from "react";
type Props = {
handleClose: () => void;
title: string;
};
class DialogWithTitle extends React.Component<PropsWithChildren<Props>> {
render() {
const { handleClose, title } = this.props;
return (
<Dialog
fullWidth
maxWidth="md"
onClose={handleClose}
open
scroll="body"
PaperProps={{ sx: { padding: 3 } }}
>
<IconButton
sx={(theme: Theme) => ({
position: "absolute",
right: theme.spacing(1.5),
top: theme.spacing(1.5),
zIndex: 1,
})}
onClick={handleClose}
size="large"
>
<CloseIcon
sx={(theme) => ({ color: theme.palette.text.secondary })}
/>
</IconButton>
<Typography
sx={(theme) => ({
borderBottomColor: theme.palette.divider,
borderBottomStyle: "solid",
borderBottomWidth: 1,
fontSize: "1.5rem",
lineHeight: 1,
marginBottom: 3,
paddingBottom: 3,
})}
>
{title}
</Typography>
{this.props.children}
</Dialog>
);
}
}
export default DialogWithTitle;
@@ -0,0 +1,111 @@
import { render, screen } from "@testing-library/react";
import MockDate from "mockdate";
import React from "react";
import { act } from "react-dom/test-utils";
import { DurationText } from "./DurationText";
describe("DurationText", () => {
it("renders", async () => {
const { rerender } = render(
<DurationText startTime={new Date(100000)} endTime={new Date(100500)} />,
);
expect(await screen.findByText("500ms")).toBeInTheDocument();
rerender(
<DurationText startTime={new Date(100000)} endTime={new Date(105000)} />,
);
expect(await screen.findByText("5s 0ms")).toBeInTheDocument();
rerender(
<DurationText startTime={new Date(100000)} endTime={new Date(110000)} />,
);
expect(await screen.findByText("10s 0ms")).toBeInTheDocument();
rerender(
<DurationText startTime={new Date(100000)} endTime={new Date(200000)} />,
);
expect(await screen.findByText("1m 40s")).toBeInTheDocument();
rerender(
<DurationText startTime={new Date(100000)} endTime={new Date(5000000)} />,
);
expect(await screen.findByText("1h 21m")).toBeInTheDocument();
// > 1 day
rerender(
<DurationText
startTime={new Date(100000)}
endTime={new Date(100000 + 1000 * 60 * 60 * 24 + 1000 * 60 * 60 * 13)}
/>,
);
expect(await screen.findByText("1d 13h")).toBeInTheDocument();
// > 1 month
rerender(
<DurationText
startTime={new Date(100000)}
endTime={
new Date(100000 + 1000 * 60 * 60 * 24 * 30 + 1000 * 60 * 60 * 24 * 4)
}
/>,
);
expect(await screen.findByText("1M 4d")).toBeInTheDocument();
// > 1 year
rerender(
<DurationText
startTime={new Date(100000)}
endTime={new Date(100000 + 1000 * 60 * 60 * 24 * 405)}
/>,
);
expect(await screen.findByText("1y 1M 10d")).toBeInTheDocument();
});
it("automatically re-renders when endTime is null", async () => {
jest.useFakeTimers();
const startTime = new Date(100000);
const mockDate1 = new Date(105000);
const mockDate2 = new Date(106000);
const mockDate3 = new Date(200000);
const mockDate4 = new Date(5000000);
const mockDate5 = new Date(5060000);
const endTime = new Date(5120000);
MockDate.set(mockDate1);
const { rerender } = render(<DurationText startTime={startTime} />);
expect(await screen.findByText("5s 0ms")).toBeInTheDocument();
MockDate.set(mockDate2);
act(() => {
jest.advanceTimersByTime(1000);
});
expect(await screen.findByText("6s 0ms")).toBeInTheDocument();
MockDate.set(mockDate3);
act(() => {
jest.advanceTimersByTime(1000);
});
expect(await screen.findByText("1m 40s")).toBeInTheDocument();
MockDate.set(mockDate4);
act(() => {
jest.advanceTimersByTime(1000);
});
expect(await screen.findByText("1h 21m")).toBeInTheDocument();
MockDate.set(mockDate5);
// After 1 hr, don't expect dates to re-render every second
act(() => {
jest.advanceTimersByTime(1000);
});
// date should not have changed
expect(await screen.findByText("1h 21m")).toBeInTheDocument();
act(() => {
jest.advanceTimersByTime(60000);
});
expect(await screen.findByText("1h 22m")).toBeInTheDocument();
rerender(<DurationText startTime={startTime} endTime={endTime} />);
expect(await screen.findByText("1h 23m")).toBeInTheDocument();
MockDate.reset();
jest.runOnlyPendingTimers();
jest.useRealTimers();
});
});
@@ -0,0 +1,68 @@
import { Typography } from "@mui/material";
import dayjs from "dayjs";
import React, { useEffect, useState } from "react";
type DurationTextProps = {
startTime: Date | number;
endTime?: Date | number | null;
};
export const getDurationVal = ({ startTime, endTime }: DurationTextProps) => {
// Helper to get duration value for DurationText component
// Assume current time, if end time is nullish
const endTimeToRender = endTime ? endTime : new Date();
const durationTime = dayjs(endTimeToRender).diff(dayjs(startTime));
return durationTime;
};
/**
* Component that shows an incrementing duration text.
* This component will smartly rerender more often depending on the size of the duration.
*/
export const DurationText = ({ startTime, endTime }: DurationTextProps) => {
// Increments to force a re-render.
const [, setRerenderCounter] = useState(0);
const duration = dayjs.duration(getDurationVal({ startTime, endTime }));
let durationText: string;
let refreshInterval = 1000;
if (duration.asSeconds() < 1) {
durationText = duration.milliseconds() + "ms";
} else if (duration.asMinutes() < 1) {
durationText =
duration.format("s[s]") + " " + duration.milliseconds() + "ms";
} else if (duration.asHours() < 1) {
durationText = duration.format("m[m] s[s]");
} else if (duration.asDays() < 1) {
// Only refresh once per minute
durationText = duration.format("H[h] m[m]");
refreshInterval = 1000 * 60;
} else if (duration.asMonths() < 1) {
// Only refresh once per minute
durationText = duration.format("D[d] H[h]");
refreshInterval = 1000 * 60;
} else if (duration.asYears() < 1) {
// Only refresh once per hour
durationText = duration.format("M[M] D[d]");
refreshInterval = 1000 * 60 * 60;
} else {
// Only refresh once per hour
durationText = duration.format("Y[y] M[M] D[d]");
refreshInterval = 1000 * 60 * 60;
}
useEffect(() => {
if (!endTime) {
// Only refresh if this is running job
const timeout = setInterval(() => {
setRerenderCounter((counter) => counter + 1);
}, refreshInterval);
return () => {
clearInterval(timeout);
};
}
}, [endTime, refreshInterval]);
return <Typography>{durationText}</Typography>;
};
@@ -0,0 +1 @@
export * from "./DurationText";
@@ -0,0 +1,25 @@
import ExpandLessIcon from "@mui/icons-material/ExpandLess";
import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
import React from "react";
type MinimizerProps = {
onClick: React.MouseEventHandler;
};
type ExpanderProps = {
onClick: React.MouseEventHandler;
};
export const Minimizer: React.FC<MinimizerProps> = ({ onClick }) => (
<ExpandLessIcon
onClick={onClick}
sx={(theme) => ({ color: theme.palette.text.secondary })}
/>
);
export const Expander: React.FC<ExpanderProps> = ({ onClick }) => (
<ExpandMoreIcon
onClick={onClick}
sx={(theme) => ({ color: theme.palette.text.secondary })}
/>
);
@@ -0,0 +1,129 @@
import { Box, keyframes, SxProps, Theme } from "@mui/material";
import React from "react";
import {
RiCheckboxCircleFill,
RiCloseCircleFill,
RiLoader4Line,
RiStopCircleFill,
} from "react-icons/ri";
import { StatusChip } from "../components/StatusChip";
import { JobStatus, UnifiedJob } from "../type/job";
import { ClassNameProps } from "./props";
const spinner = keyframes`
from {
transform: rotate(0deg)
},
to {
transform: rotate(360deg)
}`;
type JobRunningIconProps = {
title?: string;
small?: boolean;
sx?: SxProps<Theme>;
} & ClassNameProps;
export const JobRunningIcon = ({
className,
title,
small = false,
sx = [],
...props
}: JobRunningIconProps) => {
return (
<Box
component={RiLoader4Line}
sx={[
{
width: small ? 16 : 20,
height: small ? 16 : 20,
color: (theme) => theme.palette.primary.main,
animation: `${spinner} 1s linear infinite`,
},
...(Array.isArray(sx) ? sx : [sx]),
]}
title={title}
{...props}
/>
);
};
type JobStatusIconProps = {
job: UnifiedJob;
small?: boolean;
sx?: SxProps<Theme>;
} & ClassNameProps;
export const JobStatusIcon = ({
job,
small = false,
className,
sx,
}: JobStatusIconProps) => {
switch (job.status) {
case JobStatus.SUCCEEDED:
return (
<Box
component={RiCheckboxCircleFill}
className={className}
sx={[
{
width: small ? 16 : 20,
height: small ? 16 : 20,
color: (theme) => theme.palette.success.main,
},
...(Array.isArray(sx) ? sx : [sx]),
]}
/>
);
case JobStatus.FAILED:
return (
<Box
component={RiCloseCircleFill}
className={className}
sx={[
{
width: small ? 16 : 20,
height: small ? 16 : 20,
color: (theme) => theme.palette.error.main,
},
...(Array.isArray(sx) ? sx : [sx]),
]}
/>
);
case JobStatus.STOPPED:
return (
<Box
component={RiStopCircleFill}
className={className}
sx={[
{
width: small ? 16 : 20,
height: small ? 16 : 20,
color: (theme) => theme.palette.text.secondary,
},
...(Array.isArray(sx) ? sx : [sx]),
]}
/>
);
default:
return <JobRunningIcon className={className} sx={sx} small={small} />;
}
};
type JobStatusWithIconProps = {
job: UnifiedJob;
};
export const JobStatusWithIcon = ({ job }: JobStatusWithIconProps) => {
return (
<Box display="inline-flex" alignItems="center">
<StatusChip
type="job"
status={job.status}
icon={job.status === JobStatus.RUNNING && <JobRunningIcon />}
/>
</Box>
);
};
@@ -0,0 +1,42 @@
import { Box, Grid, Tooltip } from "@mui/material";
import React, { ReactChild } from "react";
type LabeledDatumProps = {
label: ReactChild;
datum: any;
tooltip?: string;
};
const LabeledDatum: React.FC<LabeledDatumProps> = ({
label,
datum,
tooltip,
}) => {
const innerHtml = (
<Grid container item xs={12}>
<Grid item xs={6}>
<Box
sx={(theme) =>
tooltip
? {
textDecorationLine: "underline",
textDecorationColor: theme.palette.primary.light,
textDecorationThickness: "1px",
textDecorationStyle: "dotted",
cursor: "help",
}
: {}
}
>
{label}
</Box>
</Grid>
<Grid item xs={6}>
<span>{datum}</span>
</Grid>
</Grid>
);
return tooltip ? <Tooltip title={tooltip}>{innerHtml}</Tooltip> : innerHtml;
};
export default LabeledDatum;
@@ -0,0 +1,258 @@
import { Box, IconButton, Tab, Tabs, Typography } from "@mui/material";
import React, { useEffect, useState } from "react";
import { RiExternalLinkLine, RiSortAsc, RiSortDesc } from "react-icons/ri";
import { Link } from "react-router-dom";
import { useLocalStorage } from "usehooks-ts";
import { useStateApiLogs } from "../pages/log/hooks";
import { LogViewer } from "../pages/log/LogViewer";
import { HideableBlock } from "./CollapsibleSection";
import { ClassNameProps } from "./props";
export type MultiTabLogViewerTabDetails = {
title: string;
} & LogViewerData;
export type MultiTabLogViewerProps = {
tabs: MultiTabLogViewerTabDetails[];
otherLogsLink?: string;
/**
* If set, this multi-tab log viewer will remember the last selected tab and start on that tab
* the next time this component is rendered.
*
* Different string values to provide different contexts for this memory. For example, if you
* want all multi-tab log viewers in the actor detail page to share one memory, they should have
* the same string value here.
*/
contextKey?: string;
} & ClassNameProps;
export const MultiTabLogViewer = ({
tabs,
otherLogsLink,
contextKey,
className,
}: MultiTabLogViewerProps) => {
// DO NOT use `cachedTab` or `setCachedTab` when `contextKey` is undefined!
const [cachedTab, setCachedTab] = useLocalStorage(
`MultiTabLogViewer-tabMemory-${contextKey}`,
null,
);
const [value, setValue] = useState(
contextKey && cachedTab ? cachedTab : tabs[0]?.title,
);
const [expanded, setExpanded] = useState(false);
useEffect(() => {
// If current tab value is not valid, reset to first tab.
if (!tabs.some((tab) => tab.title === value)) {
setValue(tabs[0]?.title);
}
}, [tabs, value]);
const currentTab = tabs.find((tab) => tab.title === value);
if (tabs.length === 0) {
return <Typography>No logs to display.</Typography>;
}
return (
<div className={className}>
<Box
display="flex"
flexDirection="row"
alignItems="flex-start"
justifyContent="space-between"
>
<Box
display="flex"
flexDirection="column"
alignItems="stretch"
flexGrow={1}
>
{(tabs.length > 1 || otherLogsLink) && (
<Tabs
sx={{
borderBottom: (theme) => `1px solid ${theme.palette.divider}`,
}}
value={value}
onChange={(_, newValue) => {
if (contextKey) {
setCachedTab(newValue);
}
setValue(newValue);
}}
indicatorColor="primary"
>
{tabs.map(({ title }) => (
<Tab key={title} label={title} value={title} />
))}
{otherLogsLink && (
<Tab
label={
<Box display="flex" alignItems="center">
Other logs &nbsp; <RiExternalLinkLine size={20} />
</Box>
}
onClick={(event) => {
// Prevent the tab from changing by setting value to the current value
setValue(value);
}}
component={Link}
to={otherLogsLink}
target="_blank"
rel="noopener noreferrer"
/>
)}
</Tabs>
)}
{!currentTab ? (
<Typography color="error">Please select a tab.</Typography>
) : (
tabs.map((tab) => {
const { title, ...data } = tab;
return (
<HideableBlock
key={title}
visible={title === currentTab?.title}
keepRendered
>
<StateApiLogViewer
data={data}
height={expanded ? 800 : 300}
/>
</HideableBlock>
);
})
)}
</Box>
<IconButton
onClick={() => {
setExpanded(!expanded);
}}
size="large"
sx={(theme) => ({ "& svg": { color: theme.palette.text.secondary } })}
>
{expanded ? <RiSortAsc /> : <RiSortDesc />}
</IconButton>
</Box>
</div>
);
};
type TextData = {
contents: string;
};
type FileData = {
nodeId: string | null;
filename?: string;
};
type ActorData = {
actorId: string | null;
suffix: "out" | "err";
};
type TaskData = {
taskId: string | null;
suffix: "out" | "err";
};
type LogViewerData = TextData | FileData | ActorData | TaskData;
const isLogViewerDataText = (data: LogViewerData): data is TextData =>
"contents" in data;
const isLogViewerDataActor = (data: LogViewerData): data is ActorData =>
"actorId" in data;
const isLogViewerDataTask = (data: LogViewerData): data is TaskData =>
"taskId" in data;
export type StateApiLogViewerProps = {
height?: number;
data: LogViewerData;
};
export const StateApiLogViewer = ({
height = 300,
data,
}: StateApiLogViewerProps) => {
if (isLogViewerDataText(data)) {
return <TextLogViewer height={height} contents={data.contents} />;
} else if (isLogViewerDataActor(data)) {
return <ActorLogViewer height={height} {...data} />;
} else if (isLogViewerDataTask(data)) {
return <TaskLogViewer height={height} {...data} />;
} else {
return <FileLogViewer height={height} {...data} />;
}
};
const TextLogViewer = ({
height = 300,
contents,
}: {
height: number;
contents: string;
}) => {
return <LogViewer log={contents} height={height} />;
};
const FileLogViewer = ({
height = 300,
nodeId,
filename,
}: {
height: number;
} & FileData) => {
const apiData = useStateApiLogs({ nodeId, filename }, filename);
return <ApiLogViewer apiData={apiData} height={height} />;
};
const ActorLogViewer = ({
height = 300,
actorId,
suffix,
}: {
height: number;
} & ActorData) => {
const apiData = useStateApiLogs(
{ actorId, suffix },
`actor-log-${actorId}.${suffix}`,
);
return <ApiLogViewer apiData={apiData} height={height} />;
};
const TaskLogViewer = ({
height = 300,
taskId,
suffix,
}: {
height: number;
} & TaskData) => {
const apiData = useStateApiLogs(
{ taskId, suffix },
`task-log-${taskId}.${suffix}`,
);
return <ApiLogViewer apiData={apiData} height={height} />;
};
const ApiLogViewer = ({
apiData: { downloadUrl, log, path, refresh },
height = 300,
}: {
apiData: ReturnType<typeof useStateApiLogs>;
height: number;
}) => {
return typeof log === "string" ? (
<LogViewer
log={log}
path={path}
downloadUrl={downloadUrl !== null ? downloadUrl : undefined}
height={height}
onRefreshClick={refresh}
/>
) : (
<Typography color="error">Failed to load</Typography>
);
};
@@ -0,0 +1,48 @@
import { styled, Table, TableBody, TableCell, TableRow } from "@mui/material";
import React from "react";
const StyledTableCell = styled(TableCell)(() => ({
borderWidth: 0,
fontFamily: "SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace",
padding: 0,
"&:last-child": {
paddingRight: 0,
},
}));
type NumberedLinesProps = {
lines: string[];
};
const NumberedLines = ({ lines }: NumberedLinesProps) => {
return (
<Table>
<TableBody>
{lines.map((line, index) => (
<TableRow key={index}>
<StyledTableCell
sx={(theme) => ({
color: theme.palette.text.secondary,
paddingRight: 2,
textAlign: "right",
verticalAlign: "top",
width: "1%",
// Use a ::before pseudo-element for the line number so that it won't
// interact with user selections or searching.
"&::before": {
content: "attr(data-line-number)",
},
})}
data-line-number={index + 1}
/>
<StyledTableCell sx={{ textAlign: "left", whiteSpace: "pre-wrap" }}>
{line}
</StyledTableCell>
</TableRow>
))}
</TableBody>
</Table>
);
};
export default NumberedLines;
@@ -0,0 +1,71 @@
import { render, screen, waitFor } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import React from "react";
import "@testing-library/jest-dom";
import { TEST_APP_WRAPPER } from "../util/test-utils";
import { ProfilerButton } from "./ProfilingLink";
describe("ProfilerButton", () => {
const mockProps = {
profilerUrl: "http://localhost:3000/worker/memory_profile",
};
it("renders button correctly", () => {
render(<ProfilerButton {...mockProps} />, { wrapper: TEST_APP_WRAPPER });
const button = screen.getByLabelText(/Memory Profiling/);
expect(button).toBeInTheDocument();
});
it("opens the dialog when the button is clicked", async () => {
const user = userEvent.setup();
render(<ProfilerButton {...mockProps} />, { wrapper: TEST_APP_WRAPPER });
const button = screen.getByLabelText(/Memory Profiling/);
user.click(button);
// check all components exist in dialog
await waitFor(() => {
const dialogTitle = screen.getByText("Memory Profiling Config");
expect(dialogTitle).toBeInTheDocument();
const reportButton = screen.getByText(/Generate report/);
expect(reportButton).toBeInTheDocument();
const durationInput = screen.getByLabelText(/Duration/);
expect(durationInput).toBeInTheDocument();
const leaksCheckbox = screen.getByText(/Leaks/);
expect(leaksCheckbox).toBeInTheDocument();
const nativeCheckbox = screen.getByText(/Native/);
expect(nativeCheckbox).toBeInTheDocument();
const allocatorCheckbox = screen.getByText(/Python Allocator Tracing/);
expect(allocatorCheckbox).toBeInTheDocument();
});
});
it("closes the dialog when the cancel button is clicked", async () => {
const user = userEvent.setup();
render(<ProfilerButton {...mockProps} />, { wrapper: TEST_APP_WRAPPER });
const button = screen.getByLabelText(/Memory Profiling/);
await user.click(button);
const cancelButton = screen.getByRole("button", { name: /Cancel/ });
await user.click(cancelButton);
await waitFor(() => {
const dialogTitle = screen.queryByText(/Memory Profiling Config/);
expect(dialogTitle).not.toBeInTheDocument();
});
});
it('selects "flamegraph" as the default format', async () => {
const user = userEvent.setup();
render(<ProfilerButton {...mockProps} />, { wrapper: TEST_APP_WRAPPER });
const button = screen.getByLabelText(/Memory Profiling/);
await user.click(button);
const formatSelect = screen.getByLabelText(/flamegraph/);
expect(formatSelect).toBeInTheDocument();
expect(screen.getByText(/Generate report/)).toHaveAttribute(
"href",
`${mockProps.profilerUrl}&format=flamegraph&duration=5&leaks=1&native=0&trace_python_allocators=0`,
);
});
});
@@ -0,0 +1,405 @@
import {
Box,
Button,
Checkbox,
Dialog,
DialogContent,
DialogTitle,
FormControlLabel,
InputLabel,
Link,
MenuItem,
Select,
TextField,
Tooltip,
Typography,
} from "@mui/material";
import React, { PropsWithChildren, useEffect, useState } from "react";
import { HelpInfo } from "../components/Tooltip";
import { ClassNameProps } from "./props";
let cachedProfilingEnabled: boolean | null = null;
let fetchPromise: Promise<void> | null = null;
const fetchProfilingEnabled = (): Promise<void> => {
if (cachedProfilingEnabled !== null) {
return Promise.resolve();
}
if (!fetchPromise) {
fetchPromise = fetch("/api/profiling_enabled")
.then((res) => res.json())
.then((data) => {
cachedProfilingEnabled = data.data.profilingEnabled;
})
.catch(() => {
cachedProfilingEnabled = false;
});
}
return fetchPromise;
};
const useProfilingEnabled = () => {
const [enabled, setEnabled] = useState(cachedProfilingEnabled ?? false);
useEffect(() => {
fetchProfilingEnabled().then(() =>
setEnabled(cachedProfilingEnabled ?? false),
);
}, []);
return enabled;
};
const PROFILING_DISABLED_TOOLTIP =
"Profiling is disabled by default for security. " +
"Set RAY_DASHBOARD_ENABLE_PROFILING=1 environment variable on the Ray head node to enable. " +
"See https://docs.ray.io/en/latest/ray-observability/user-guides/profiling.html#enabling-dashboard-profiling";
const DisabledProfilingLabel = ({
children,
}: {
children: React.ReactNode;
}) => (
<Tooltip title={PROFILING_DISABLED_TOOLTIP}>
<Typography component="span" color="text.disabled">
{children}
</Typography>
</Tooltip>
);
type CpuProfilingLinkProps = PropsWithChildren<
{
pid: string | number | null | undefined;
nodeId: string | null | undefined;
type: string | null;
} & ClassNameProps
>;
type TaskProfilingStackTraceProps = {
taskId: string | null | undefined;
attemptNumber: number;
nodeId: string;
};
type MemoryProfilingProps = PropsWithChildren<
{
pid: string | number | null | undefined;
nodeId: string | null | undefined;
type?: string | null;
} & ClassNameProps
>;
type TaskMemoryProfilingProps = {
taskId: string | null | undefined;
attemptNumber: number;
nodeId: string;
};
type MemoryProfilingButtonProps = {
profilerUrl: string;
type?: string | null;
};
export const TaskCpuProfilingLink = ({
taskId,
attemptNumber,
nodeId,
}: TaskProfilingStackTraceProps) => {
const profilingEnabled = useProfilingEnabled();
if (!taskId) {
return null;
}
if (!profilingEnabled) {
return (
<DisabledProfilingLabel>CPU&nbsp;Flame&nbsp;Graph</DisabledProfilingLabel>
);
}
return (
<Link
href={`task/cpu_profile?task_id=${taskId}&attempt_number=${attemptNumber}&node_id=${nodeId}`}
target="_blank"
title="Profile the Python worker for 5 seconds (default) and display a CPU flame graph."
rel="noreferrer"
>
CPU&nbsp;Flame&nbsp;Graph
</Link>
);
};
export const TaskCpuStackTraceLink = ({
taskId,
attemptNumber,
nodeId,
}: TaskProfilingStackTraceProps) => {
const profilingEnabled = useProfilingEnabled();
if (!taskId) {
return null;
}
if (!profilingEnabled) {
return <DisabledProfilingLabel>Stack&nbsp;Trace</DisabledProfilingLabel>;
}
return (
<Link
href={`task/traceback?task_id=${taskId}&attempt_number=${attemptNumber}&node_id=${nodeId}`}
target="_blank"
title="Sample the current Python stack trace for this worker."
rel="noreferrer"
>
Stack&nbsp;Trace
</Link>
);
};
export const CpuStackTraceLink = ({
pid,
nodeId,
type = "",
}: CpuProfilingLinkProps) => {
const profilingEnabled = useProfilingEnabled();
if (
!pid ||
!nodeId ||
typeof pid === "undefined" ||
typeof nodeId === "undefined"
) {
return <div></div>;
}
if (!profilingEnabled) {
return (
<DisabledProfilingLabel>
Stack&nbsp;Trace{type ? ` (${type})` : ""}
</DisabledProfilingLabel>
);
}
return (
<Link
href={`worker/traceback?pid=${pid}&node_id=${nodeId}&native=0`}
target="_blank"
title="Sample the current Python stack trace for this worker."
rel="noreferrer"
>
Stack&nbsp;Trace{type ? ` (${type})` : ""}
</Link>
);
};
export const CpuProfilingLink = ({
pid,
nodeId,
type = "",
}: CpuProfilingLinkProps) => {
const profilingEnabled = useProfilingEnabled();
if (!pid || !nodeId) {
return <div></div>;
}
if (!profilingEnabled) {
return (
<DisabledProfilingLabel>
CPU&nbsp;Flame&nbsp;Graph{type ? ` (${type})` : ""}
</DisabledProfilingLabel>
);
}
return (
<Link
href={`worker/cpu_profile?pid=${pid}&node_id=${nodeId}&duration=5&native=0`}
target="_blank"
title="Profile the Python worker for 5 seconds (default) and display a CPU flame graph."
rel="noreferrer"
>
CPU&nbsp;Flame&nbsp;Graph{type ? ` (${type})` : ""}
</Link>
);
};
export const ProfilerButton = ({
profilerUrl,
type,
}: MemoryProfilingButtonProps) => {
const [duration, setDuration] = useState(5);
const [leaks, setLeaks] = useState(true);
const [native, setNative] = useState(false);
const [allocator, setAllocator] = useState(false);
const [open, setOpen] = useState(false);
const [format, setFormat] = useState("flamegraph");
const handleOpen = () => {
setOpen(true);
};
const handleClose = () => {
setOpen(false);
};
return (
<div>
<Link
onClick={handleOpen}
aria-label="Memory Profiling"
sx={{ cursor: "pointer" }}
>
Memory&nbsp;Profiling{type ? ` (${type})` : ""}
</Link>
<Dialog open={open} onClose={handleClose}>
<DialogTitle>Memory Profiling Config</DialogTitle>
<DialogContent>
<InputLabel id="format-label">Format</InputLabel>
<Select
labelId="format-label"
id="format"
value={format}
aria-label={format}
onChange={(e) => setFormat(e.target.value as string)}
fullWidth
style={{ marginBottom: "12px" }}
>
<MenuItem value="flamegraph">Flamegraph</MenuItem>
<MenuItem value="table">Table</MenuItem>
</Select>
<TextField
label="Duration (seconds)"
type="number"
value={duration !== null ? duration : ""}
onChange={(e) => setDuration(parseInt(e.target.value, 10))}
required
/>
<br />
<FormControlLabel
control={
<Checkbox
checked={leaks}
onChange={(e) => setLeaks(e.target.checked)}
/>
}
label={
<div style={{ display: "flex", alignItems: "center" }}>
<span style={{ marginRight: "4px" }}>Leaks</span>
<HelpInfo>
<Typography>
Enable memory leaks, instead of peak memory usage. Refer to
Memray documentation for more details.
</Typography>
</HelpInfo>
</div>
}
/>
<br />
<FormControlLabel
control={
<Checkbox
checked={native}
onChange={(e) => setNative(e.target.checked)}
/>
}
label={
<div style={{ display: "flex", alignItems: "center" }}>
<span style={{ marginRight: "4px" }}>Native</span>
<HelpInfo>
<Typography>
Track native (C/C++) stack frames. Refer to Memray
documentation for more details.
</Typography>
</HelpInfo>
</div>
}
/>
<br />
<FormControlLabel
control={
<Checkbox
checked={allocator}
onChange={(e) => setAllocator(e.target.checked)}
/>
}
label={
<div style={{ display: "flex", alignItems: "center" }}>
<span style={{ marginRight: "4px" }}>
Python Allocator Tracing
</span>
<HelpInfo>
<Typography>
Record allocations made by the pymalloc allocator. Refer to
Memray documentation for more details.
</Typography>
</HelpInfo>
</div>
}
/>
</DialogContent>
<Box
sx={{ padding: "12px", display: "flex", justifyContent: "flex-end" }}
>
<Button
onClick={handleClose}
variant="text"
sx={(theme) => ({
textTransform: "capitalize",
color: theme.palette.text.secondary,
})}
>
Cancel
</Button>
<Button
color="primary"
variant="text"
onClick={handleClose}
style={{ textTransform: "capitalize" }}
>
<Link
href={
`${profilerUrl}&format=${format}&duration=${duration}` +
`&leaks=${leaks ? "1" : "0"}` +
`&native=${native ? "1" : "0"}` +
`&trace_python_allocators=${allocator ? "1" : "0"}`
}
rel="noreferrer"
target="_blank"
>
Generate&nbsp;report
</Link>
</Button>
</Box>
</Dialog>
</div>
);
};
export const MemoryProfilingButton = ({
pid,
nodeId,
type = "",
}: MemoryProfilingProps) => {
const profilingEnabled = useProfilingEnabled();
if (!pid || !nodeId) {
return <div></div>;
}
if (!profilingEnabled) {
return (
<DisabledProfilingLabel>
Memory&nbsp;Profiling{type ? ` (${type})` : ""}
</DisabledProfilingLabel>
);
}
const profilerUrl = `memory_profile?pid=${pid}&node_id=${nodeId}`;
return <ProfilerButton profilerUrl={profilerUrl} type={type} />;
};
export const TaskMemoryProfilingButton = ({
taskId,
attemptNumber,
nodeId,
}: TaskMemoryProfilingProps) => {
const profilingEnabled = useProfilingEnabled();
if (!taskId) {
return null;
}
if (!profilingEnabled) {
return (
<DisabledProfilingLabel>Memory&nbsp;Profiling</DisabledProfilingLabel>
);
}
const profilerUrl = `memory_profile?task_id=${taskId}&attempt_number=${attemptNumber}&node_id=${nodeId}`;
return <ProfilerButton profilerUrl={profilerUrl} />;
};
@@ -0,0 +1,9 @@
const rowStyles = {
idCol: {
display: "block",
width: "100%",
whiteSpace: "nowrap",
},
};
export default rowStyles;
@@ -0,0 +1,37 @@
import { Box, BoxProps, Paper, Typography } from "@mui/material";
import React, { PropsWithChildren } from "react";
import { ClassNameProps } from "./props";
type SectionProps = {
title?: string;
noTopPadding?: boolean;
} & ClassNameProps &
BoxProps;
export const Section = ({
title,
children,
className,
noTopPadding = false,
...props
}: PropsWithChildren<SectionProps>) => {
return (
<Box className={className} {...props}>
{title && (
<Box paddingBottom={2}>
<Typography variant="h4">{title}</Typography>
</Box>
)}
<Paper
variant="outlined"
sx={{
padding: 2,
height: "100%",
paddingTop: noTopPadding ? 0 : undefined,
}}
>
{children}
</Paper>
</Box>
);
};
@@ -0,0 +1,47 @@
import { render, screen } from "@testing-library/react";
import React from "react";
import { ServeDeployment, ServeDeploymentStatus } from "../type/serve";
import { TEST_APP_WRAPPER } from "../util/test-utils";
import { ServeStatusIcon } from "./ServeStatus";
const DEPLOYMENT: ServeDeployment = {
name: "MyServeDeployment",
deployment_config: {} as any,
message: "Running",
replicas: [],
status: ServeDeploymentStatus.HEALTHY,
};
describe("ServeStatusIcon", () => {
it("renders HEALTHY status", async () => {
render(<ServeStatusIcon deployment={DEPLOYMENT} small={false} />, {
wrapper: TEST_APP_WRAPPER,
});
await screen.findByTitle("Healthy");
});
it("renders UNHEALTHY status", async () => {
render(
<ServeStatusIcon
deployment={{ ...DEPLOYMENT, status: ServeDeploymentStatus.UNHEALTHY }}
small={false}
/>,
{ wrapper: TEST_APP_WRAPPER },
);
await screen.findByTitle("Unhealthy");
});
it("renders UPDATING status", async () => {
render(
<ServeStatusIcon
deployment={{ ...DEPLOYMENT, status: ServeDeploymentStatus.UPDATING }}
small={false}
/>,
{ wrapper: TEST_APP_WRAPPER },
);
await screen.findByTitle("Updating");
});
});
@@ -0,0 +1,64 @@
import { Box, SxProps, Theme } from "@mui/material";
import React from "react";
import { RiCloseCircleFill, RiRecordCircleFill } from "react-icons/ri";
import { ServeDeployment } from "../type/serve";
import { JobRunningIcon } from "./JobStatus";
import { ClassNameProps } from "./props";
type ServeStatusIconProps = {
deployment: ServeDeployment;
small: boolean;
sx?: SxProps<Theme>;
} & ClassNameProps;
export const ServeStatusIcon = ({
deployment,
small,
className,
sx,
}: ServeStatusIconProps) => {
switch (deployment.status) {
case "HEALTHY":
return (
<Box
component={RiRecordCircleFill}
sx={[
{
width: 20,
height: 20,
marginRight: 1,
color: (theme) => theme.palette.success.main,
},
...(Array.isArray(sx) ? sx : [sx]),
]}
title="Healthy"
/>
);
case "UNHEALTHY":
return (
<Box
component={RiCloseCircleFill}
sx={[
{
width: 20,
height: 20,
marginRight: 1,
color: (theme) => theme.palette.error.main,
},
...(Array.isArray(sx) ? sx : [sx]),
]}
title="Unhealthy"
/>
);
default:
// UPDATING
return (
<JobRunningIcon
className={className}
sx={sx}
small={small}
title="Updating"
/>
);
}
};
@@ -0,0 +1,88 @@
import { Box, TableHead, TableRow, TableSortLabel } from "@mui/material";
import React from "react";
import { StyledTableCell } from "./TableCell";
import { Order } from "./tableUtils";
export type HeaderInfo<T> = {
sortable: boolean;
id: T;
label: string;
numeric: boolean;
};
type SortableTableHeadProps<T> = {
onRequestSort: (event: React.MouseEvent<unknown>, id: T) => void;
order: Order;
orderBy: T | null;
headerInfo: HeaderInfo<T>[];
firstColumnEmpty: boolean;
};
const SortableTableHead = <T,>(props: SortableTableHeadProps<T>) => {
const { order, orderBy, onRequestSort, headerInfo, firstColumnEmpty } = props;
const createSortHandler = (id: T) => (event: React.MouseEvent<unknown>) => {
onRequestSort(event, id);
};
return (
<TableHead>
<TableRow>
{firstColumnEmpty && <StyledTableCell />}
{headerInfo.map((headerInfo) => {
if (headerInfo.sortable) {
return (
<StyledTableCell
key={headerInfo.label}
align={headerInfo.numeric ? "right" : "left"}
sortDirection={orderBy === headerInfo.id ? order : false}
>
<TableSortLabel
active={orderBy === headerInfo.id}
direction={orderBy === headerInfo.id ? order : "asc"}
onClick={createSortHandler(headerInfo.id)}
sx={(theme) => ({
"& .MuiSvgIcon-root": {
color: theme.palette.text.secondary,
},
})}
>
{headerInfo.label}
{orderBy === headerInfo.id ? (
<Box
component="span"
sx={{
border: 0,
clip: "rect(0 0 0 0)",
height: 1,
margin: -1,
overflow: "hidden",
padding: 0,
position: "absolute",
top: 20,
width: 1,
}}
>
{order === "desc"
? "sorted descending"
: "sorted ascending"}
</Box>
) : null}
</TableSortLabel>
</StyledTableCell>
);
} else {
return (
<StyledTableCell
key={headerInfo.label}
align={headerInfo.numeric ? "right" : "left"}
>
{headerInfo.label}
</StyledTableCell>
);
}
})}
</TableRow>
</TableHead>
);
};
export default SortableTableHead;
@@ -0,0 +1,11 @@
import { styled } from "@mui/material";
export const SpanButton = styled("span")(({ theme }) => ({
button: {
color: theme.palette.primary.main,
"&:hover": {
cursor: "pointer",
textDecoration: "underline",
},
},
}));
@@ -0,0 +1,13 @@
import { TableCell } from "@mui/material";
import { styled } from "@mui/material/styles";
export const StyledTableCell = styled(TableCell)(({ theme }) => ({
padding: theme.spacing(1),
textAlign: "center",
}));
export const ExpandableStyledTableCell = styled(TableCell)(({ theme }) => ({
padding: theme.spacing(1),
textAlign: "center",
cursor: "pointer",
}));
@@ -0,0 +1,65 @@
import { Box, Typography } from "@mui/material";
import React from "react";
const blend = (
[r1, g1, b1]: number[],
[r2, g2, b2]: number[],
ratio: number,
) => [
r1 * (1 - ratio) + r2 * ratio,
g1 * (1 - ratio) + g2 * ratio,
b1 * (1 - ratio) + b2 * ratio,
];
type UsageBarProps = {
percent: number;
text: string;
};
const UsageBar: React.FC<UsageBarProps> = ({ percent, text }) => {
const safePercent = Math.max(Math.min(percent, 100), 0);
const minColor = [0, 255, 0];
const maxColor = [255, 0, 0];
const leftColor = minColor;
const rightColor = blend(minColor, maxColor, safePercent / 100);
const alpha = 0.2;
const gradient = `
linear-gradient(
to right,
rgba(${leftColor.join(",")}, ${alpha}) 0%,
rgba(${rightColor.join(",")}, ${alpha}) ${safePercent}%,
transparent ${safePercent}%
)
`;
// Use a nested `span` here because the right border is affected by the
// gradient background otherwise.
return (
<Box
component="span"
sx={{
borderColor: (theme) => theme.palette.divider,
borderStyle: "solid",
borderWidth: 1,
display: "flex",
flexGrow: 1,
}}
>
<Box
component="span"
sx={{
paddingLeft: 1,
paddingRight: 1,
background: gradient,
flexGrow: 1,
}}
>
<Typography align="center">{text}</Typography>
</Box>
</Box>
);
};
export default UsageBar;
@@ -0,0 +1,37 @@
import { Alert, Link } from "@mui/material";
import React, { useEffect, useState } from "react";
import { getUsageStatsEnabled } from "../service/global";
export const UsageStatsAlert = () => {
const [usageStatsPromptEnabled, setUsageStatsPromptEnabled] = useState(false);
const [usageStatsEnabled, setUsageStatsEnabled] = useState(false);
useEffect(() => {
getUsageStatsEnabled().then(({ data }) => {
setUsageStatsPromptEnabled(data.usageStatsPromptEnabled);
setUsageStatsEnabled(data.usageStatsEnabled);
});
}, []);
return usageStatsPromptEnabled ? (
<Alert style={{ marginTop: 30 }} severity="info">
{usageStatsEnabled ? (
<span>
Usage stats collection is enabled. To disable this, add
`--disable-usage-stats` to the command that starts the cluster, or run
the following command: `ray disable-usage-stats` before starting the
cluster. See{" "}
<Link
href="https://docs.ray.io/en/master/cluster/usage-stats.html"
target="_blank"
rel="noreferrer"
>
https://docs.ray.io/en/master/cluster/usage-stats.html
</Link>{" "}
for more details.
</span>
) : (
<span>Usage stats collection is disabled.</span>
)}
</Alert>
) : null;
};
@@ -0,0 +1,4 @@
export const API_REFRESH_INTERVAL_MS = 4000;
// Per job page refresh interval.
export const PER_JOB_PAGE_REFRESH_INTERVAL_MS = 10000;
export const DASHBOARD_DATA_LOADED_EVENT = "ray-dashboard-data-loaded";
@@ -0,0 +1,74 @@
import dayjs from "dayjs";
import timezone from "dayjs/plugin/timezone";
import utc from "dayjs/plugin/utc";
dayjs.extend(utc);
dayjs.extend(timezone);
export const formatByteAmount = (
amount: number,
unit: "mebibyte" | "gibibyte",
) =>
`${(
amount / (unit === "mebibyte" ? Math.pow(1024, 2) : Math.pow(1024, 3))
).toFixed(1)} ${unit === "mebibyte" ? "MiB" : "GiB"}`;
export const formatUsage = (
used_b: number,
total_b: number,
unit: "mebibyte" | "gibibyte",
includePercentage: boolean,
) => {
const usedFormatted = formatByteAmount(used_b, unit);
const totalFormatted = formatByteAmount(total_b, unit);
const percent = (100 * used_b) / total_b;
const ratioStr = `${usedFormatted} / ${totalFormatted}`;
if (includePercentage) {
return `${ratioStr} (${percent.toFixed(0)}%)`;
}
return ratioStr;
};
// Formats, e.g. 400 and 6000 as "400 MiB / 6000 MiB (6.7%)"
export const MiBRatio = (used: number, total: number) =>
`${used} MiB / ${total} MiB (${(100 * (used / total)).toFixed(1)}%)`;
export const MiBRatioNoPercent = (used: number, total: number) =>
`${used} MiB / ${total} MiB`;
export const formatDuration = (durationInSeconds: number) => {
const durationSeconds = Math.floor(durationInSeconds) % 60;
const durationMinutes = Math.floor(durationInSeconds / 60) % 60;
const durationHours = Math.floor(durationInSeconds / 60 / 60) % 24;
const durationDays = Math.floor(durationInSeconds / 60 / 60 / 24);
const pad = (value: number) => value.toString().padStart(2, "0");
return [
durationDays ? `${durationDays}d` : "",
`${pad(durationHours)}h`,
`${pad(durationMinutes)}m`,
`${pad(durationSeconds)}s`,
].join(" ");
};
export const formatValue = (rawFloat: number) => {
try {
const decimals = rawFloat.toString().split(".")[1].length || 0;
if (decimals <= 3) {
return rawFloat.toString();
} // Few decimals
if (Math.abs(rawFloat.valueOf()) >= 1.0) {
return rawFloat.toPrecision(5);
} // Values >= 1
return rawFloat.toExponential(); // Values in (-1; 1)
} catch (e) {
return rawFloat.toString();
}
};
export const formatTimeZone = (UTC: string) => {
dayjs.tz.setDefault(UTC);
};
export const formatDateFromTimeMs = (time: number) => {
return dayjs.utc(time).tz().format("YYYY/MM/DD HH:mm:ss");
};
@@ -0,0 +1,74 @@
import { Link, SxProps, Theme } from "@mui/material";
import React, { PropsWithChildren } from "react";
import { Link as RouterLink } from "react-router-dom";
import { ClassNameProps } from "./props";
type ActorLinkProps = PropsWithChildren<
{
actorId: string;
/**
* This can be provided to override where we link to.
*/
to?: string;
sx?: SxProps<Theme>;
} & ClassNameProps
>;
export const generateActorLink = (actorId: string) => `/actors/${actorId}`;
/**
* A link to the top-level actors detail page.
*/
export const ActorLink = ({
actorId,
to,
children,
className,
sx,
}: ActorLinkProps) => {
return (
<Link
className={className}
sx={sx}
component={RouterLink}
to={to ?? generateActorLink(actorId)}
>
{children ?? actorId}
</Link>
);
};
type NodeLinkProps = PropsWithChildren<
{
nodeId: string;
/**
* This can be provided to override where we link to.
*/
to?: string;
sx?: SxProps<Theme>;
} & ClassNameProps
>;
export const generateNodeLink = (nodeId: string) => `/cluster/nodes/${nodeId}`;
/**
* A link to the top-level Cluster node detail page.
*/
export const NodeLink = ({
nodeId,
to,
children,
className,
sx,
}: NodeLinkProps) => {
return (
<Link
className={className}
sx={sx}
component={RouterLink}
to={to ?? generateNodeLink(nodeId)}
>
{children ?? nodeId}
</Link>
);
};
+7
View File
@@ -0,0 +1,7 @@
export type ClassNameProps = {
className?: string;
};
export type DataTestIdProps = {
"data-testid"?: string;
};
@@ -0,0 +1,61 @@
export const descendingComparator = <T>(a: T, b: T, orderBy: keyof T) => {
if (b[orderBy] < a[orderBy]) {
return -1;
}
if (b[orderBy] > a[orderBy]) {
return 1;
}
return 0;
};
const descendingComparatorFnAccessor = <T>(
a: T,
b: T,
orderByFn: Accessor<T>,
) => {
const aVal = orderByFn(a);
const bVal = orderByFn(b);
if (bVal < aVal) {
return -1;
}
if (bVal > aVal) {
return 1;
}
return 0;
};
export type Order = "asc" | "desc";
export type Comparator<T> = (a: T, b: T) => number;
export type Accessor<T> = (a: T) => number | string;
export const getComparator = <Key extends keyof any>(
order: Order,
orderBy: Key,
): ((
a: { [key in Key]: number | string },
b: { [key in Key]: number | string },
) => number) => {
return order === "desc"
? (a, b) => descendingComparator(a, b, orderBy)
: (a, b) => -descendingComparator(a, b, orderBy);
};
export const getFnComparator =
<T>(order: Order, orderByFn: Accessor<T>) =>
(a: T, b: T): number => {
return order === "desc"
? descendingComparatorFnAccessor(a, b, orderByFn)
: -descendingComparatorFnAccessor(a, b, orderByFn);
};
export const stableSort = <T>(array: T[], comparator: Comparator<T>) => {
const stabilizedThis = array.map((el, index) => [el, index] as [T, number]);
stabilizedThis.sort((a, b) => {
const order = comparator(a[0], b[0]);
if (order !== 0) {
return order;
}
return a[1] - b[1];
});
return stabilizedThis.map((el) => el[0]);
};
@@ -0,0 +1,681 @@
let warnedUTCOffsetError = false;
const getCurrentUTCOffset = (timeZone: string) => {
try {
const date = new Date();
const formatter = new Intl.DateTimeFormat("en-US", {
timeZone,
timeZoneName: "shortOffset",
});
// Extract the GMT offset part from the formatted string
const formatted = formatter.format(date);
const match = formatted.match(/GMT([+-]\d{1,2}(?::\d{2})?)?/);
return match ? match[0] : "";
} catch (e) {
if (!warnedUTCOffsetError) {
warnedUTCOffsetError = true;
console.warn(`Error getting UTC offset for ${timeZone}:`, e);
}
return "";
}
};
// Base timezone definitions
const baseTimezones = [
{
value: "Etc/GMT+12",
group: "Pacific",
country: "International Date Line West",
},
{
value: "Pacific/Pago_Pago",
group: "Pacific",
country: "American Samoa",
},
{
value: "Pacific/Midway",
group: "Pacific",
country: "Midway Island",
},
{
value: "Pacific/Honolulu",
group: "Pacific",
country: "Hawaii",
},
{
value: "America/Anchorage",
group: "America",
country: "Alaska",
},
{
value: "America/Los_Angeles",
group: "America",
country: "Pacific Time (US & Canada)",
},
{
value: "America/Tijuana",
group: "America",
country: "Tijuana",
},
{
value: "America/Phoenix",
group: "America",
country: "Arizona",
},
{
value: "America/Mazatlan",
group: "America",
country: "Mazatlan",
},
{
value: "America/Denver",
group: "America",
country: "Mountain Time (US & Canada)",
},
{
value: "America/Guatemala",
group: "America",
country: "Central America",
},
{
value: "America/Chicago",
group: "America",
country: "Central Time (US & Canada)",
},
{
value: "America/Chihuahua",
group: "America",
country: "Chihuahua",
},
{
value: "America/Mexico_City",
group: "America",
country: "Mexico City",
},
{
value: "America/Monterrey",
group: "America",
country: "Monterrey",
},
{
value: "America/Regina",
group: "America",
country: "Saskatchewan",
},
{
value: "America/Bogota",
group: "America",
country: "Bogota",
},
{
value: "America/New_York",
group: "America",
country: "Eastern Time (US & Canada)",
},
{
value: "America/Indiana/Indianapolis",
group: "America",
country: "Indiana (East)",
},
{
value: "America/Lima",
group: "America",
country: "Lima",
},
{
value: "America/Guayaquil",
group: "America",
country: "Quito",
},
{
value: "America/Halifax",
group: "America",
country: "Atlantic Time (Canada)",
},
{
value: "America/Caracas",
group: "America",
country: "Caracas",
},
{
value: "America/Guyana",
group: "America",
country: "Georgetown",
},
{
value: "America/La_Paz",
group: "America",
country: "La Paz",
},
{
value: "America/Puerto_Rico",
group: "America",
country: "Puerto Rico",
},
{
value: "America/Santiago",
group: "America",
country: "Santiago",
},
{
value: "America/St_Johns",
group: "America",
country: "Newfoundland",
},
{
value: "America/Sao_Paulo",
group: "America",
country: "Brasilia",
},
{
value: "America/Argentina/Buenos_Aires",
group: "America",
country: "Buenos Aires",
},
{
value: "America/Montevideo",
group: "America",
country: "Montevideo",
},
{
value: "America/Godthab",
group: "America",
country: "Greenland",
},
{
value: "Etc/GMT+2",
group: "Atlantic",
country: "Mid-Atlantic",
},
{
value: "Atlantic/Azores",
group: "Atlantic",
country: "Azores",
},
{
value: "Atlantic/Cape_Verde",
group: "Atlantic",
country: "Cape Verde Is.",
},
{
value: "Europe/London",
group: "Europe",
country: "Edinburgh",
},
{
value: "Europe/Lisbon",
group: "Europe",
country: "Lisbon",
},
{
value: "Europe/London",
group: "Europe",
country: "London",
},
{
value: "Africa/Monrovia",
group: "Africa",
country: "Monrovia",
},
{
value: "Europe/Amsterdam",
group: "Europe",
country: "Amsterdam",
},
{
value: "Europe/Belgrade",
group: "Europe",
country: "Belgrade",
},
{
value: "Europe/Berlin",
group: "Europe",
country: "Berlin",
},
{
value: "Europe/Brussels",
group: "Europe",
country: "Brussels",
},
{
value: "Europe/Budapest",
group: "Europe",
country: "Budapest",
},
{
value: "Europe/Copenhagen",
group: "Europe",
country: "Copenhagen",
},
{
value: "Europe/Madrid",
group: "Europe",
country: "Madrid",
},
{
value: "Europe/Paris",
group: "Europe",
country: "Paris",
},
{
value: "Europe/Prague",
group: "Europe",
country: "Prague",
},
{
value: "Europe/Rome",
group: "Europe",
country: "Rome",
},
{
value: "Europe/Sarajevo",
group: "Europe",
country: "Sarajevo",
},
{
value: "Europe/Stockholm",
group: "Europe",
country: "Stockholm",
},
{
value: "Europe/Vienna",
group: "Europe",
country: "Vienna",
},
{
value: "Europe/Warsaw",
group: "Europe",
country: "Warsaw",
},
{
value: "Africa/Lagos",
group: "Africa",
country: "West Central Africa",
},
{
value: "Asia/Amman",
group: "Asia",
country: "Amman",
},
{
value: "Europe/Athens",
group: "Europe",
country: "Athens",
},
{
value: "Asia/Beirut",
group: "Asia",
country: "Beirut",
},
{
value: "Europe/Bucharest",
group: "Europe",
country: "Bucharest",
},
{
value: "Africa/Cairo",
group: "Africa",
country: "Cairo",
},
{
value: "Africa/Harare",
group: "Africa",
country: "Harare",
},
{
value: "Europe/Helsinki",
group: "Europe",
country: "Helsinki",
},
{
value: "Europe/Istanbul",
group: "Europe",
country: "Istanbul",
},
{
value: "Asia/Jerusalem",
group: "Asia",
country: "Jerusalem",
},
{
value: "Europe/Kiev",
group: "Europe",
country: "Kyiv",
},
{
value: "Europe/Minsk",
group: "Europe",
country: "Minsk",
},
{
value: "Europe/Riga",
group: "Europe",
country: "Riga",
},
{
value: "Europe/Sofia",
group: "Europe",
country: "Sofia",
},
{
value: "Europe/Tallinn",
group: "Europe",
country: "Tallinn",
},
{
value: "Europe/Vilnius",
group: "Europe",
country: "Vilnius",
},
{
value: "Asia/Baghdad",
group: "Asia",
country: "Baghdad",
},
{
value: "Asia/Kuwait",
group: "Asia",
country: "Kuwait",
},
{
value: "Europe/Moscow",
group: "Europe",
country: "Moscow",
},
{
value: "Africa/Nairobi",
group: "Africa",
country: "Nairobi",
},
{
value: "Asia/Riyadh",
group: "Asia",
country: "Riyadh",
},
{
value: "Asia/Tehran",
group: "Asia",
country: "Tehran",
},
{
value: "Asia/Dubai",
group: "Asia",
country: "Abu Dhabi",
},
{
value: "Asia/Baku",
group: "Asia",
country: "Baku",
},
{
value: "Asia/Muscat",
group: "Asia",
country: "Muscat",
},
{
value: "Asia/Tbilisi",
group: "Asia",
country: "Tbilisi",
},
{
value: "Asia/Yerevan",
group: "Asia",
country: "Yerevan",
},
{
value: "Asia/Kabul",
group: "Asia",
country: "Kabul",
},
{
value: "Asia/Karachi",
group: "Asia",
country: "Islamabad",
},
{
value: "Asia/Tashkent",
group: "Asia",
country: "Tashkent",
},
{
value: "Asia/Kolkata",
group: "Asia",
country: "Chennai",
},
{
value: "Asia/Kolkata",
group: "Asia",
country: "Kolkata",
},
{
value: "Asia/Kolkata",
group: "Asia",
country: "Mumbai",
},
{
value: "Asia/Kolkata",
group: "Asia",
country: "New Delhi",
},
{
value: "Asia/Kathmandu",
group: "Asia",
country: "Kathmandu",
},
{
value: "Asia/Almaty",
group: "Asia",
country: "Almaty",
},
{
value: "Asia/Dhaka",
group: "Asia",
country: "Dhaka",
},
{
value: "Asia/Yekaterinburg",
group: "Asia",
country: "Yekaterinburg",
},
{
value: "Asia/Yangon",
group: "Asia",
country: "Yangon (Rangoon)",
},
{
value: "Asia/Bangkok",
group: "Asia",
country: "Bangkok",
},
{
value: "Asia/Jakarta",
group: "Asia",
country: "Jakarta",
},
{
value: "Asia/Novosibirsk",
group: "Asia",
country: "Novosibirsk",
},
{
value: "Asia/Shanghai",
group: "Asia",
country: "Beijing",
},
{
value: "Asia/Chongqing",
group: "Asia",
country: "Chongqing",
},
{
value: "Asia/Hong_Kong",
group: "Asia",
country: "Hong Kong",
},
{
value: "Asia/Krasnoyarsk",
group: "Asia",
country: "Krasnoyarsk",
},
{
value: "Asia/Kuala_Lumpur",
group: "Asia",
country: "Kuala Lumpur",
},
{
value: "Australia/Perth",
group: "Australia",
country: "Perth",
},
{
value: "Asia/Singapore",
group: "Asia",
country: "Singapore",
},
{
value: "Asia/Taipei",
group: "Asia",
country: "Taipei",
},
{
value: "Asia/Ulaanbaatar",
group: "Asia",
country: "Ulaan Bataar",
},
{
value: "Asia/Urumqi",
group: "Asia",
country: "Urumqi",
},
{
value: "Asia/Irkutsk",
group: "Asia",
country: "Irkutsk",
},
{
value: "Asia/Tokyo",
group: "Asia",
country: "Osaka",
},
{
value: "Asia/Tokyo",
group: "Asia",
country: "Sapporo",
},
{
value: "Asia/Seoul",
group: "Asia",
country: "Seoul",
},
{
value: "Asia/Tokyo",
group: "Asia",
country: "Tokyo",
},
{
value: "Australia/Adelaide",
group: "Australia",
country: "Adelaide",
},
{
value: "Australia/Darwin",
group: "Australia",
country: "Darwin",
},
{
value: "Australia/Brisbane",
group: "Australia",
country: "Brisbane",
},
{
value: "Australia/Sydney",
group: "Australia",
country: "Canberra",
},
{
value: "Pacific/Guam",
group: "Pacific",
country: "Guam",
},
{
value: "Australia/Hobart",
group: "Australia",
country: "Hobart",
},
{
value: "Australia/Melbourne",
group: "Australia",
country: "Melbourne",
},
{
value: "Pacific/Port_Moresby",
group: "Pacific",
country: "Port Moresby",
},
{
value: "Australia/Sydney",
group: "Australia",
country: "Sydney",
},
{
value: "Asia/Magadan",
group: "Asia",
country: "Magadan",
},
{
value: "Pacific/Noumea",
group: "Pacific",
country: "New Caledonia",
},
{
value: "Pacific/Guadalcanal",
group: "Pacific",
country: "Solomon Is.",
},
{
value: "Pacific/Auckland",
group: "Pacific",
country: "Auckland",
},
{
value: "Pacific/Fiji",
group: "Pacific",
country: "Fiji",
},
{
value: "Asia/Kamchatka",
group: "Asia",
country: "Kamchatka",
},
{
value: "Pacific/Majuro",
group: "Pacific",
country: "Marshall Is.",
},
{
value: "Pacific/Auckland",
group: "Pacific",
country: "Wellington",
},
{
value: "Pacific/Tongatapu",
group: "Pacific",
country: "Nuku'alofa",
},
{
value: "Pacific/Apia",
group: "Pacific",
country: "Samoa",
},
{
value: "Pacific/Fakaofo",
group: "Pacific",
country: "Tokelau Is.",
},
];
// Generate the timezone list with current UTC offsets
export const timezones = baseTimezones.map((tz) => ({
...tz,
utc: getCurrentUTCOffset(tz.value),
}));
@@ -0,0 +1,56 @@
import _ from "lodash";
export const getWeightedAverage = (
input: {
weight: number;
value: number;
}[],
) => {
if (input.length === 0) {
return 0;
}
let totalWeightTimesValue = 0;
let totalWeight = 0;
for (const { weight, value } of input) {
totalWeightTimesValue += weight * value;
totalWeight += weight;
}
return totalWeightTimesValue / totalWeight;
};
export const sum = (vals: number[]) => vals.reduce((acc, val) => acc + val, 0);
export const filterObj = (obj: Record<string, unknown>, filterFn: any) =>
Object.fromEntries(Object.entries(obj).filter(filterFn));
export const mapObj = (obj: Record<string, unknown>, filterFn: any) =>
Object.fromEntries(Object.entries(obj).map(filterFn) as any[]);
export const filterRuntimeEnvSystemVariables = (
runtime_env: Record<string, any>,
): Record<string, any> => {
const out = _.pickBy(runtime_env, (_, key) => {
if (key.startsWith("_")) {
return false;
}
return true;
});
return out;
};
export const sliceToPage = <T>(
items: T[],
pageNo: number,
pageSize = 10,
): { items: T[]; constrainedPage: number; maxPage: number } => {
const maxPage = Math.ceil(items.length / pageSize);
const constrainedPage = Math.min(maxPage, Math.max(1, pageNo));
const start = (constrainedPage - 1) * pageSize;
const end = constrainedPage * pageSize;
return {
items: items.slice(start, end),
constrainedPage,
maxPage,
};
};
@@ -0,0 +1,34 @@
import { filterRuntimeEnvSystemVariables } from "./util";
describe("filterRuntimeEnvSystemVariables", () => {
it("filters out system variables", () => {
expect(
filterRuntimeEnvSystemVariables({
pip: {
pip_check: true,
packages: ["chess", "foo", "bar"],
pip_version: "1.2.3",
},
env_vars: {
FOO: "foo",
BAR: "5",
},
working_dir: ".",
_ray_release: "2.3.1",
_ray_commit: "12345abc",
_inject_current_ray: false,
}),
).toEqual({
pip: {
pip_check: true,
packages: ["chess", "foo", "bar"],
pip_version: "1.2.3",
},
env_vars: {
FOO: "foo",
BAR: "5",
},
working_dir: ".",
});
});
});
@@ -0,0 +1,391 @@
import { render, screen, within } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import React from "react";
import { ActorDetail } from "../type/actor";
import { TEST_APP_WRAPPER } from "../util/test-utils";
import ActorTable from "./ActorTable";
const MOCK_ACTORS: { [actorId: string]: ActorDetail } = {
ACTOR_1: {
actorId: "ACTOR_1",
jobId: "01000000",
address: {
nodeId: "426854e68e4225b3941deaf03c8dcfcb1daacc69a92711d370dbb0e1",
ipAddress: "172.31.11.178",
port: 10003,
workerId: "b8b276a03612644098ed7a929c3b0e50f5bde894eb0d8cab288fbb6d",
},
state: "ALIVE",
numRestarts: "0",
name: "",
pid: 25321,
startTime: 1679010689148,
endTime: 0,
actorClass: "Counter",
exitDetail: "-",
requiredResources: {},
placementGroupId: "123",
reprName: ",",
workerId: "b8b276a03612644098ed7a929c3b0e50f5bde894eb0d8cab288fbb6d",
numPendingTasks: 0,
taskQueueLength: 0,
numExecutedTasks: 0,
numInPlasma: 0,
numLocalObjects: 0,
numObjectRefsInScope: 0,
gpus: [],
processStats: {
cmdline: [],
cpuPercent: 0,
cpuTimes: {
user: 0,
system: 0,
childrenUser: 0,
childrenUystem: 0,
iowait: 0,
},
createTime: 0,
memoryInfo: {
rss: 0,
vms: 0,
pfaults: 0,
pageins: 0,
},
pid: 25321,
},
labelSelector: {
"test-label-key": "test-label-value",
},
},
ACTOR_2: {
actorId: "ACTOR_2",
jobId: "01000000",
address: {
nodeId: "426854e68e4225b3941deaf03c8dcfcb1daacc69a92711d370dbb0e1",
ipAddress: "172.31.11.178",
port: 10003,
workerId: "b8b276a03612644098ed7a929c3b0e50f5bde894eb0d8cab288fbb6d",
},
state: "DEAD",
numRestarts: "0",
name: "",
pid: 25322,
startTime: 1679010689150,
endTime: 0,
actorClass: "Counter",
exitDetail: "-",
requiredResources: {},
placementGroupId: "123",
reprName: ",",
workerId: "b8b276a03612644098ed7a929c3b0e50f5bde894eb0d8cab288fbb6d",
numPendingTasks: 0,
taskQueueLength: 0,
numExecutedTasks: 0,
numInPlasma: 0,
numLocalObjects: 0,
numObjectRefsInScope: 0,
gpus: [],
processStats: {
cmdline: [],
cpuPercent: 0,
cpuTimes: {
user: 0,
system: 0,
childrenUser: 0,
childrenUystem: 0,
iowait: 0,
},
createTime: 0,
memoryInfo: {
rss: 0,
vms: 0,
pfaults: 0,
pageins: 0,
},
pid: 25322,
},
labelSelector: {},
},
};
// These tests are slow because they involve a lot of interactivity.
// Clicking various buttons and waiting for the table to update.
// So we increase the timeout to 40 seconds.
jest.setTimeout(40000);
describe("ActorTable", () => {
it("renders a table of actors filtered by node ID", async () => {
const RUNNING_ACTORS = {
...MOCK_ACTORS,
ACTOR_2: {
...MOCK_ACTORS.ACTOR_2,
address: {
nodeId: "426854e68e4225b3941deaf03c8dcfcb1daacc69a92711d370dbb0e2",
ipAddress: "172.31.11.178",
port: 10003,
workerId: "b8b276a03612644098ed7a929c3b0e50f5bde894eb0d8cab288fbb6e",
},
},
};
const user = userEvent.setup();
render(<ActorTable actors={RUNNING_ACTORS} />, {
wrapper: TEST_APP_WRAPPER,
});
const nodeIdFilter = screen.getByTestId("nodeIdFilter");
const input = within(nodeIdFilter).getByRole("combobox");
// Filter by node ID of ACTOR_2
await user.type(
input,
"426854e68e4225b3941deaf03c8dcfcb1daacc69a92711d370dbb0e2",
);
await screen.findAllByText("Actor ID");
expect(screen.queryByText("ACTOR_1")).not.toBeInTheDocument();
expect(screen.queryByText("ACTOR_2")).toBeInTheDocument();
});
it("renders a table of actors sorted by state", () => {
const { getByRole } = render(<ActorTable actors={MOCK_ACTORS} />, {
wrapper: TEST_APP_WRAPPER,
});
const actor1Row = getByRole("row", {
name: /ACTOR_1/,
});
const actor2Row = getByRole("row", {
name: /ACTOR_2/,
});
expect(within(actor1Row).getByText("ACTOR_1")).toBeInTheDocument();
expect(within(actor2Row).getByText("ACTOR_2")).toBeInTheDocument();
expect(actor1Row.compareDocumentPosition(actor2Row)).toBe(
Node.DOCUMENT_POSITION_FOLLOWING,
); // actor2Row appear after actor1Row
});
it("renders a table of actors sorted by startTime desc when states are the same", () => {
const RUNNING_ACTORS = {
...MOCK_ACTORS,
ACTOR_2: {
...MOCK_ACTORS.ACTOR_2,
state: "ALIVE",
},
};
const { getByRole } = render(<ActorTable actors={RUNNING_ACTORS} />, {
wrapper: TEST_APP_WRAPPER,
});
const actor1Row = getByRole("row", {
name: /ACTOR_1/,
});
const actor2Row = getByRole("row", {
name: /ACTOR_2/,
});
expect(within(actor1Row).getByText("ACTOR_1")).toBeInTheDocument();
expect(within(actor2Row).getByText("ACTOR_2")).toBeInTheDocument();
expect(
screen.queryByText('{ "test-label-key": "test-label-value" }'),
).toBeInTheDocument();
expect(actor2Row.compareDocumentPosition(actor1Row)).toBe(
Node.DOCUMENT_POSITION_FOLLOWING,
); // actor1Row appear after actor2Row
});
it("renders a table of actors sorted by startTime desc when states are the same, actor1 appears first", () => {
const RUNNING_ACTORS = {
...MOCK_ACTORS,
ACTOR_2: {
...MOCK_ACTORS.ACTOR_2,
state: "ALIVE",
startTime: 1679010689146,
},
};
const { getByRole } = render(<ActorTable actors={RUNNING_ACTORS} />, {
wrapper: TEST_APP_WRAPPER,
});
const actor1Row = getByRole("row", {
name: /ACTOR_1/,
});
const actor2Row = getByRole("row", {
name: /ACTOR_2/,
});
expect(within(actor1Row).getByText("ACTOR_1")).toBeInTheDocument();
expect(within(actor2Row).getByText("ACTOR_2")).toBeInTheDocument();
expect(actor1Row.compareDocumentPosition(actor2Row)).toBe(
Node.DOCUMENT_POSITION_FOLLOWING,
); // actor1Row appear before actor2Row
});
it("renders a table of actors with same state sorted by resource utilization", async () => {
/*
When sorted by
- CPU: Actor 2 CPU > Actor 1 CPU --> Actor 2 row before Actor 1 row
- Used memory: Actor 1 memory > Actor 2 memory --> Actor 1 row before Actor 2 row
- Uptime: Actor 2 uptime < Actor 1 uptime --> Actor 2 row before Actor 1 row
- GPU Utilization: Actor 1 GPU > Actor 2 GPU --> Actor 1 row before Actor 2 row
- GRAM Utilization: Actor 2 GRAM > Actor 1 GRAM --> Actor 2 row before Actor 1 row
*/
const RUNNING_ACTORS = {
...MOCK_ACTORS,
ACTOR_1: {
...MOCK_ACTORS.ACTOR_1,
state: "ALIVE",
startTime: 0,
processStats: {
cmdline: [],
cpuPercent: 0,
cpuTimes: {
user: 0,
system: 0,
childrenUser: 0,
childrenUystem: 0,
iowait: 0,
},
createTime: 0,
memoryInfo: {
rss: 10,
vms: 0,
pfaults: 0,
pageins: 0,
},
pid: 25321,
},
gpus: [
{
uuid: "mock_gpu_uuid1",
index: 0,
name: "mock_gpu_name1",
utilizationGpu: 50,
memoryUsed: 0,
memoryTotal: 20,
processesPids: [{ pid: 25321, gpuMemoryUsage: 0 }],
},
],
},
ACTOR_2: {
...MOCK_ACTORS.ACTOR_2,
state: "ALIVE",
startTime: 1,
processStats: {
cmdline: [],
cpuPercent: 20,
cpuTimes: {
user: 0,
system: 0,
childrenUser: 0,
childrenUystem: 0,
iowait: 0,
},
createTime: 0,
memoryInfo: {
rss: 0,
vms: 0,
pfaults: 0,
pageins: 0,
},
pid: 25322,
},
gpus: [
{
uuid: "mock_gpu_uuid2",
index: 0,
name: "mock_gpu_name2",
utilizationGpu: 0,
memoryUsed: 10,
memoryTotal: 20,
processesPids: [{ pid: 25322, gpuMemoryUsage: 10 }],
},
],
},
};
const user = userEvent.setup();
render(<ActorTable actors={RUNNING_ACTORS} />, {
wrapper: TEST_APP_WRAPPER,
});
// Sort by CPU utilization
await user.click(screen.getByRole("combobox", { name: /Sort By/ }));
await user.click(screen.getByRole("option", { name: /CPU/ }));
const actor1CPURow = screen.getByRole("row", {
name: /ACTOR_1/,
});
const actor2CPURow = screen.getByRole("row", {
name: /ACTOR_2/,
});
expect(within(actor1CPURow).getByText("ACTOR_1")).toBeInTheDocument();
expect(within(actor2CPURow).getByText("ACTOR_2")).toBeInTheDocument();
expect(actor2CPURow.compareDocumentPosition(actor1CPURow)).toBe(
Node.DOCUMENT_POSITION_FOLLOWING,
); // actor2Row appear before actor1Row
// Sort by used memory
await user.click(screen.getByRole("combobox", { name: /Sort By/ }));
await user.click(screen.getByRole("option", { name: /Used Memory/ }));
const actor1MemRow = screen.getByRole("row", {
name: /ACTOR_1/,
});
const actor2MemRow = screen.getByRole("row", {
name: /ACTOR_2/,
});
expect(within(actor1MemRow).getByText("ACTOR_1")).toBeInTheDocument();
expect(within(actor2MemRow).getByText("ACTOR_2")).toBeInTheDocument();
expect(actor1MemRow.compareDocumentPosition(actor2MemRow)).toBe(
Node.DOCUMENT_POSITION_FOLLOWING,
); // actor1Row appear before actor2Row
// Sort by uptime
await user.click(screen.getByRole("combobox", { name: /Sort By/ }));
await user.click(screen.getByRole("option", { name: /Uptime/ }));
const actor1UptimeRow = screen.getByRole("row", {
name: /ACTOR_1/,
});
const actor2UptimeRow = screen.getByRole("row", {
name: /ACTOR_2/,
});
expect(within(actor1UptimeRow).getByText("ACTOR_1")).toBeInTheDocument();
expect(within(actor2UptimeRow).getByText("ACTOR_2")).toBeInTheDocument();
expect(actor2UptimeRow.compareDocumentPosition(actor1UptimeRow)).toBe(
Node.DOCUMENT_POSITION_FOLLOWING,
); // actor2Row appear before actor1Row
// Sort by GPU utilization
await user.click(screen.getByRole("combobox", { name: /Sort By/ }));
await user.click(screen.getByRole("option", { name: /GPU Utilization/ }));
const actor1GPURow = screen.getByRole("row", {
name: /ACTOR_1/,
});
const actor2GPURow = screen.getByRole("row", {
name: /ACTOR_2/,
});
expect(within(actor1GPURow).getByText("ACTOR_1")).toBeInTheDocument();
expect(within(actor2GPURow).getByText("ACTOR_2")).toBeInTheDocument();
expect(actor1GPURow.compareDocumentPosition(actor2GPURow)).toBe(
Node.DOCUMENT_POSITION_FOLLOWING,
); // actor1Row appear before actor2Row
// Sort by GRAM usage
await user.click(screen.getByRole("combobox", { name: /Sort By/ }));
await user.click(screen.getByRole("option", { name: /GRAM Usage/ }));
const actor1GRAMRow = screen.getByRole("row", {
name: /ACTOR_1/,
});
const actor2GRAMRow = screen.getByRole("row", {
name: /ACTOR_2/,
});
expect(within(actor1GRAMRow).getByText("ACTOR_1")).toBeInTheDocument();
expect(within(actor2GRAMRow).getByText("ACTOR_2")).toBeInTheDocument();
expect(actor2GRAMRow.compareDocumentPosition(actor1GRAMRow)).toBe(
Node.DOCUMENT_POSITION_FOLLOWING,
); // actor2Row appear before actor1Row
});
});
@@ -0,0 +1,829 @@
import { SearchOutlined } from "@mui/icons-material";
import {
Box,
InputAdornment,
Link,
Switch,
Table,
TableBody,
TableCell,
TableHead,
TableRow,
TextField,
TextFieldProps,
Tooltip,
Typography,
} from "@mui/material";
import Autocomplete from "@mui/material/Autocomplete";
import { orange } from "@mui/material/colors";
import Pagination from "@mui/material/Pagination";
import _ from "lodash";
import React, { useMemo, useState } from "react";
import { Link as RouterLink } from "react-router-dom";
import { CodeDialogButtonWithPreview } from "../common/CodeDialogButton";
import { DurationText, getDurationVal } from "../common/DurationText";
import { ActorLink, generateNodeLink } from "../common/links";
import {
CpuProfilingLink,
CpuStackTraceLink,
MemoryProfilingButton,
} from "../common/ProfilingLink";
import rowStyles from "../common/RowStyles";
import { sliceToPage } from "../common/util";
import {
getSumAcceleratorUtilization,
WorkerAcceleratorRow,
} from "../pages/node/AcceleratorColumn";
import {
getSumAcceleratorMemoryUsage,
WorkerAcceleratorMemory,
} from "../pages/node/AcceleratorMemoryColumn";
import { ActorDetail, ActorEnum } from "../type/actor";
import { Worker } from "../type/worker";
import { memoryConverter } from "../util/converter";
import { useFilter, useSorter } from "../util/hook";
import OverflowCollapsibleCell from "./OverflowCollapsibleCell";
import PercentageBar from "./PercentageBar";
import { SearchSelect } from "./SearchComponent";
import StateCounter from "./StatesCounter";
import { StatusChip } from "./StatusChip";
import { HelpInfo } from "./Tooltip";
import RayletWorkerTable, { ExpandableTableRow } from "./WorkerTable";
export type ActorTableProps = {
actors: { [actorId: string]: ActorDetail };
workers?: Worker[];
jobId?: string | null;
filterToActorId?: string;
onFilterChange?: () => void;
detailPathPrefix?: string;
};
const SEQUENCE = {
FIRST: 1,
MIDDLE: 2,
LAST: 3,
};
type StateOrder = {
[key in ActorEnum]: number;
};
const stateOrder: StateOrder = {
[ActorEnum.ALIVE]: SEQUENCE.FIRST,
[ActorEnum.DEPENDENCIES_UNREADY]: SEQUENCE.MIDDLE,
[ActorEnum.PENDING_CREATION]: SEQUENCE.MIDDLE,
[ActorEnum.RESTARTING]: SEQUENCE.MIDDLE,
[ActorEnum.DEAD]: SEQUENCE.LAST,
};
//type predicate for ActorEnum
const isActorEnum = (state: unknown): state is ActorEnum => {
return Object.values(ActorEnum).includes(state as ActorEnum);
};
const ActorTable = ({
actors = {},
workers = [],
jobId = null,
filterToActorId,
onFilterChange,
detailPathPrefix = "",
}: ActorTableProps) => {
const [pageNo, setPageNo] = useState(1);
const { changeFilter, filterFunc } = useFilter<string>({
overrideFilters:
filterToActorId !== undefined
? [{ key: "actorId", val: filterToActorId }]
: undefined,
onFilterChange,
});
const [actorIdFilterValue, setActorIdFilterValue] = useState(filterToActorId);
const [pageSize, setPageSize] = useState<number | undefined>(10);
const uptimeSorterKey = "fake_uptime_attr";
const gpuUtilizationSorterKey = "fake_gpu_attr";
const gramUsageSorterKey = "fake_gram_attr";
const defaultSorterKey = uptimeSorterKey;
const { sorterFunc, setOrderDesc, setSortKey, sorterKey, descVal } =
useSorter(defaultSorterKey);
//We get a filtered and sorted actor list to render from prop actors
const sortedActors = useMemo(() => {
const aggregateUserSortKeys = [
uptimeSorterKey,
gpuUtilizationSorterKey,
gramUsageSorterKey,
];
const actorList = Object.values(actors || {}).filter(filterFunc);
let actorsSortedUserKey = actorList;
if (aggregateUserSortKeys.includes(sorterKey)) {
// Uptime, GPU utilization, and GRAM usage are user specified sort keys but require an aggregate function
// over the actor attribute, so sorting with sortBy
actorsSortedUserKey = _.sortBy(actorList, (actor) => {
const descMultiplier = descVal ? 1 : -1;
switch (sorterKey) {
case uptimeSorterKey:
// Note: Sort by uptime only is re-sorted on re-render (not as uptime value changes)
const startTime = actor.startTime;
const endTime = actor.endTime;
// If actor doesn't have startTime, set uptime to infinity for sort so it appears at the bottom of
// the table by default
const uptime =
startTime && startTime > 0
? getDurationVal({ startTime, endTime })
: Number.POSITIVE_INFINITY;
// Default sort for uptime should be ascending (default for all others is descending)
// so multiply by -1
return uptime * -1 * descMultiplier;
case gpuUtilizationSorterKey:
const sumGpuUtilization = getSumAcceleratorUtilization(
actor.pid,
actor.gpus,
actor.tpus,
);
return sumGpuUtilization * descMultiplier;
case gramUsageSorterKey:
const sumGRAMUsage = getSumAcceleratorMemoryUsage(
actor.pid,
actor.gpus,
actor.tpus,
);
return sumGRAMUsage * descMultiplier;
default:
return 0;
}
});
} else {
actorsSortedUserKey = actorList.sort(sorterFunc);
}
return _.sortBy(actorsSortedUserKey, (actor) => {
// Always show ALIVE actors at top
const actorOrder = isActorEnum(actor.state) ? stateOrder[actor.state] : 0;
return actorOrder;
});
}, [actors, sorterKey, sorterFunc, filterFunc, descVal]);
const {
items: list,
constrainedPage,
maxPage,
} = sliceToPage(sortedActors, pageNo, pageSize ?? 10);
const columns = [
{ label: "" },
{ label: "ID" },
{
label: "Worker ID",
helpInfo: (
<Typography>
The ID of the worker process that hosts this actor.
</Typography>
),
},
{
label: "Class",
helpInfo: (
<Typography>
The class name of the actor. For example, the below actor has a class
name "Actor".
<br />
<br />
@ray.remote
<br />
class Actor:
<br />
&emsp;pass
<br />
</Typography>
),
},
{
label: "Name",
helpInfo: (
<Typography>
The name of the actor given by the "name" argument. For example, this
actor's name is "unique_name".
<br />
<br />
Actor.options(name="unique_name").remote()
</Typography>
),
},
{
label: "Repr",
helpInfo: (
<Typography>
The repr name of the actor instance defined by __repr__. For example,
this actor will have repr "Actor1"
<br />
<br />
@ray.remote
<br />
class Actor:
<br />
&emsp;def __repr__(self):
<br />
&emsp;&emsp;return "Actor1"
<br />
</Typography>
),
},
{
label: "State",
helpInfo: (
<Typography>
The state of the actor. States are documented as a "ActorState" in the
"gcs.proto" file.
</Typography>
),
},
{
label: "Actions",
helpInfo: (
<Typography>
A list of actions performable on this actor.
<br />
- Log: view log messages of this actor. Only available if a node is
alive.
<br />
- Stack Trace: Get a stacktrace of the alive actor.
<br />- CPU Flame Graph: Get a flamegraph for the next 5 seconds of an
alive actor.
</Typography>
),
},
{ label: "Uptime" },
{ label: "Job ID" },
{ label: "PID" },
{ label: "IP" },
{ label: "Node ID" },
{
label: "CPU",
helpInfo: (
<Typography>
Hardware CPU usage of this Actor (from Worker Process).
<br />
<br />
Node's CPU usage is calculated against all CPU cores. Worker Process's
CPU usage is calculated against 1 CPU core. As a result, the sum of
CPU usage from all Worker Processes is not equal to the Node's CPU
usage.
</Typography>
),
},
{
label: "Memory",
helpInfo: (
<Typography>
Actor's RAM usage (from Worker Process). <br />
</Typography>
),
},
{
label: "GPU",
helpInfo: (
<Typography>
Usage of each GPU device. If no GPU usage is detected, here are the
potential root causes:
<br />
1. non-GPU Ray image is used on this node. Switch to a GPU Ray image
and try again. <br />
2. Non Nvidia or AMD GPUs are being used.
<br />
3. pynvml or pyamdsmi module raises an exception.
</Typography>
),
},
{
label: "GRAM",
helpInfo: (
<Typography>
Actor's GRAM usage (from Worker Process). <br />
</Typography>
),
},
{
label: "Restarted",
helpInfo: (
<Typography>
The total number of the count this actor has been restarted.
</Typography>
),
},
{
label: "Placement group ID",
helpInfo: (
<Typography>
The ID of the placement group this actor is scheduled to.
<br />
</Typography>
),
},
{
label: "Required resources",
helpInfo: (
<Typography>
The required Ray resources to start an actor.
<br />
For example, this actor has GPU:1 required resources.
<br />
<br />
@ray.remote(num_gpus=1)
<br />
class Actor:
<br />
&emsp;pass
<br />
</Typography>
),
},
{
label: "Label selector",
helpInfo: <Typography>The label selector of the actor.</Typography>,
},
{
label: "Exit detail",
helpInfo: (
<Typography>
The detail of an actor exit. Only available when an actor is dead.
</Typography>
),
},
];
return (
<React.Fragment>
<Box sx={{ display: "flex", flex: 1, alignItems: "center" }}>
<Autocomplete
style={{ margin: 8, width: 120 }}
sx={(theme) => ({
"& .MuiSvgIcon-root": { color: theme.palette.text.secondary },
})}
options={Array.from(
new Set(Object.values(actors).map((e) => e.state)),
)}
onInputChange={(_: any, value: string) => {
changeFilter("state", value.trim());
}}
renderInput={(params: TextFieldProps) => (
<TextField {...params} label="State" />
)}
/>
<Autocomplete
style={{ margin: 8, width: 150 }}
sx={(theme) => ({
"& .MuiSvgIcon-root": { color: theme.palette.text.secondary },
})}
defaultValue={filterToActorId === undefined ? jobId : undefined}
options={Array.from(
new Set(Object.values(actors).map((e) => e.jobId)),
)}
onInputChange={(_: any, value: string) => {
changeFilter("jobId", value.trim());
}}
renderInput={(params: TextFieldProps) => (
<TextField {...params} label="Job Id" />
)}
/>
<Autocomplete
style={{ margin: 8, width: 150 }}
sx={(theme) => ({
"& .MuiSvgIcon-root": { color: theme.palette.text.secondary },
})}
options={Array.from(
new Set(Object.values(actors).map((e) => e.address?.ipAddress)),
)}
onInputChange={(_: any, value: string) => {
changeFilter("address.ipAddress", value.trim());
}}
renderInput={(params: TextFieldProps) => (
<TextField {...params} label="IP" />
)}
/>
<Autocomplete
data-testid="nodeIdFilter"
style={{ margin: 8, width: 150 }}
sx={(theme) => ({
"& .MuiSvgIcon-root": { color: theme.palette.text.secondary },
})}
options={Array.from(
new Set(Object.values(actors).map((e) => e.address?.nodeId)),
)}
onInputChange={(_: any, value: string) => {
changeFilter("address.nodeId", value.trim());
}}
renderInput={(params: TextFieldProps) => (
<TextField {...params} label="Node ID" />
)}
/>
<TextField
style={{ margin: 8, width: 120 }}
label="PID"
size="small"
InputProps={{
onChange: ({ target: { value } }) => {
changeFilter("pid", value.trim());
},
endAdornment: (
<InputAdornment position="end">
<SearchOutlined
sx={(theme) => ({ color: theme.palette.text.secondary })}
/>
</InputAdornment>
),
}}
/>
</Box>
<Box sx={{ display: "flex", flex: 1, alignItems: "center" }}>
<TextField
style={{ margin: 8, width: 120 }}
label="Name"
size="small"
InputProps={{
onChange: ({ target: { value } }) => {
changeFilter("name", value.trim());
},
endAdornment: (
<InputAdornment position="end">
<SearchOutlined
sx={(theme) => ({ color: theme.palette.text.secondary })}
/>
</InputAdornment>
),
}}
/>
<TextField
style={{ margin: 8, width: 120 }}
label="Worker ID"
size="small"
InputProps={{
onChange: ({ target: { value } }) => {
changeFilter("workerId", value.trim());
},
endAdornment: (
<InputAdornment position="end">
<SearchOutlined
sx={(theme) => ({ color: theme.palette.text.secondary })}
/>
</InputAdornment>
),
}}
/>
<TextField
style={{ margin: 8, width: 120 }}
label="Class"
size="small"
InputProps={{
onChange: ({ target: { value } }) => {
changeFilter("actorClass", value.trim());
},
endAdornment: (
<InputAdornment position="end">
<SearchOutlined
sx={(theme) => ({ color: theme.palette.text.secondary })}
/>
</InputAdornment>
),
}}
/>
<TextField
style={{ margin: 8, width: 120 }}
label="repr"
size="small"
InputProps={{
onChange: ({ target: { value } }) => {
changeFilter("reprName", value.trim());
},
endAdornment: (
<InputAdornment position="end">
<SearchOutlined
sx={(theme) => ({ color: theme.palette.text.secondary })}
/>
</InputAdornment>
),
}}
/>
<TextField
value={filterToActorId ?? actorIdFilterValue}
style={{ margin: 8, width: 120 }}
label="Actor ID"
size="small"
InputProps={{
onChange: ({ target: { value } }) => {
changeFilter("actorId", value.trim());
setActorIdFilterValue(value);
},
endAdornment: (
<InputAdornment position="end">
<SearchOutlined
sx={(theme) => ({ color: theme.palette.text.secondary })}
/>
</InputAdornment>
),
}}
/>
<TextField
style={{ margin: 8, width: 120 }}
label="Page Size"
size="small"
value={pageSize}
InputProps={{
onChange: ({ target: { value } }) => {
setPageSize(Math.min(Number(value), 500) || undefined);
},
endAdornment: (
<InputAdornment position="end">Per Page</InputAdornment>
),
}}
/>
<div data-testid="sortByFilter" style={{ margin: 8 }}>
<SearchSelect
label="Sort By"
options={[
[uptimeSorterKey, "Uptime"],
["processStats.memoryInfo.rss", "Used Memory"],
["mem[0]", "Total Memory"],
["processStats.cpuPercent", "CPU"],
// Fake attribute key used when sorting by GPU utilization and
// GRAM usage because aggregate function required on actor key before sorting.
[gpuUtilizationSorterKey, "GPU Utilization"],
[gramUsageSorterKey, "GRAM Usage"],
]}
onChange={(val) => setSortKey(val)}
showAllOption={false}
defaultValue={defaultSorterKey}
/>
</div>
<Box sx={{ marginLeft: 1 }}>
Reverse:
<Switch onChange={(_, checked) => setOrderDesc(checked)} />
</Box>
</Box>
<div style={{ display: "flex", alignItems: "center" }}>
<div>
<Pagination
page={constrainedPage}
onChange={(e, num) => setPageNo(num)}
count={maxPage}
/>
</div>
<div>
<StateCounter type="actor" list={sortedActors} />
</div>
</div>
<Box sx={{ overflowX: "scroll" }}>
<Table>
<TableHead>
<TableRow>
{columns.map(({ label, helpInfo }) => (
<TableCell align="center" key={label}>
<Box
display="flex"
justifyContent="center"
alignItems="center"
>
{label}
{helpInfo && (
<HelpInfo sx={{ marginLeft: 1 }}>{helpInfo}</HelpInfo>
)}
</Box>
</TableCell>
))}
</TableRow>
</TableHead>
<TableBody>
{list.map(
({
actorId,
actorClass,
reprName,
jobId,
placementGroupId,
pid,
address,
state,
name,
numRestarts,
startTime,
endTime,
exitDetail,
requiredResources,
gpus,
tpus,
processStats,
mem,
labelSelector,
}) => (
<ExpandableTableRow
length={
workers.filter(
(e) =>
e.pid === pid &&
address.ipAddress === e.coreWorkerStats[0].ipAddress,
).length
}
expandComponent={
<RayletWorkerTable
actorMap={{}}
workers={workers.filter(
(e) =>
e.pid === pid &&
address.ipAddress === e.coreWorkerStats[0].ipAddress,
)}
mini
/>
}
key={actorId}
>
<TableCell align="center">
<Tooltip title={actorId} arrow>
<Box sx={rowStyles.idCol}>
<ActorLink
actorId={actorId}
to={
detailPathPrefix
? `${detailPathPrefix}/${actorId}`
: actorId
}
/>
</Box>
</Tooltip>
</TableCell>
<TableCell align="center">
{actors[actorId]?.workerId ? (
<Tooltip title={actors[actorId].workerId} arrow>
<Box
sx={{
maxWidth: "120px",
overflow: "hidden",
textOverflow: "ellipsis",
whiteSpace: "nowrap",
}}
>
{actors[actorId].workerId}
</Box>
</Tooltip>
) : (
"-"
)}
</TableCell>
<TableCell align="center">{actorClass}</TableCell>
<TableCell align="center">{name ? name : "-"}</TableCell>
<TableCell align="center">
{reprName ? reprName : "-"}
</TableCell>
<TableCell align="center">
<StatusChip type="actor" status={state} />
</TableCell>
<TableCell align="center">
<React.Fragment>
<ActorLink
actorId={actorId}
to={
detailPathPrefix
? `${detailPathPrefix}/${actorId}`
: actorId
}
>
Log
</ActorLink>
<br />
<CpuProfilingLink
pid={pid}
nodeId={address?.nodeId}
type=""
/>
<br />
<CpuStackTraceLink
pid={pid}
nodeId={address?.nodeId}
type=""
/>
<br />
<MemoryProfilingButton
pid={pid}
nodeId={address?.nodeId}
/>
</React.Fragment>
</TableCell>
<TableCell align="center">
{startTime && startTime > 0 ? (
<DurationText startTime={startTime} endTime={endTime} />
) : (
"-"
)}
</TableCell>
<TableCell align="center">{jobId}</TableCell>
<TableCell align="center">{pid ? pid : "-"}</TableCell>
<TableCell align="center">
{address?.ipAddress ? address?.ipAddress : "-"}
</TableCell>
<TableCell align="center">
{address?.nodeId ? (
<Tooltip title={address?.nodeId} arrow>
<Box sx={rowStyles.idCol}>
<Link
component={RouterLink}
to={generateNodeLink(address.nodeId)}
>
{address?.nodeId}
</Link>
</Box>
</Tooltip>
) : (
"-"
)}
</TableCell>
<TableCell>
<PercentageBar
num={Number(processStats?.cpuPercent)}
total={100}
>
{processStats?.cpuPercent}
</PercentageBar>
</TableCell>
<TableCell>
{mem && (
<PercentageBar
num={processStats?.memoryInfo.rss}
total={mem[0]}
>
{memoryConverter(processStats?.memoryInfo.rss)}/
{memoryConverter(mem[0])}(
{(
(processStats?.memoryInfo.rss / mem[0]) *
100
).toFixed(1)}
%)
</PercentageBar>
)}
</TableCell>
<TableCell>
<WorkerAcceleratorRow
workerPID={pid}
gpus={gpus}
tpus={tpus}
/>
</TableCell>
<TableCell>
<WorkerAcceleratorMemory
workerPID={pid}
gpus={gpus}
tpus={tpus}
/>
</TableCell>
<TableCell
align="center"
style={{
color: Number(numRestarts) > 0 ? orange[500] : "inherit",
}}
>
{numRestarts}
</TableCell>
<TableCell align="center">
<Tooltip
title={placementGroupId ? placementGroupId : "-"}
arrow
>
<Box sx={rowStyles.idCol}>
{placementGroupId ? placementGroupId : "-"}
</Box>
</Tooltip>
</TableCell>
<TableCell align="center">
{Object.entries(requiredResources || {}).length > 0 ? (
<CodeDialogButtonWithPreview
sx={{ maxWidth: 200 }}
title="Required resources"
code={JSON.stringify(requiredResources, undefined, 2)}
/>
) : (
"{}"
)}
</TableCell>
<TableCell align="center">
{Object.entries(labelSelector || {}).length > 0 ? (
<CodeDialogButtonWithPreview
sx={{ maxWidth: 200 }}
title="Label selector"
code={JSON.stringify(labelSelector, undefined, 2)}
/>
) : (
"{}"
)}
</TableCell>
<TableCell align="center">
<OverflowCollapsibleCell text={exitDetail} />
</TableCell>
</ExpandableTableRow>
),
)}
</TableBody>
</Table>
</Box>
</React.Fragment>
);
};
export default ActorTable;
@@ -0,0 +1,101 @@
import { Box, Typography } from "@mui/material";
import React from "react";
import { RayStatusResp } from "../service/status";
const formatNodeStatus = (clusterStatus?: string) => {
// ==== auto scaling status
// Node status
// ....
// Resources
// ....
if (!clusterStatus) {
return "No cluster status.";
}
try {
// Try to parse the node status.
const sections = clusterStatus.split("Resources");
return formatClusterStatus(
"Node Status",
sections[0].split("Node status")[1],
);
} catch (e) {
return "No cluster status.";
}
};
const formatResourcesStatus = (clusterStatus?: string) => {
// ==== auto scaling status
// Node status
// ....
// Resources
// ....
if (!clusterStatus) {
return "No cluster status.";
}
try {
const sections = clusterStatus.split("Resources");
return formatClusterStatus("Resource Status", sections[1]);
} catch (e) {
return "No cluster status.";
}
};
const formatClusterStatus = (title: string, clusterStatus: string) => {
const clusterStatusRows = clusterStatus.split("\n");
return (
<div>
<Box marginBottom={2}>
<Typography variant="h3">{title}</Typography>
</Box>
{clusterStatusRows.map((i, key) => {
// Format the output.
// See format_info_string in util.py
if (i.startsWith("-----") || i.startsWith("=====") || i === "") {
// Ignore separators
return null;
} else if (i.endsWith(":")) {
return (
<div key={key}>
<b>{i}</b>
</div>
);
} else {
return <div key={key}>{i}</div>;
}
})}
</div>
);
};
type StatusCardProps = {
clusterStatus: RayStatusResp | undefined;
};
export const NodeStatusCard = ({ clusterStatus }: StatusCardProps) => {
return (
<Box
style={{
overflow: "hidden",
overflowY: "auto",
height: "100%",
}}
>
{formatNodeStatus(clusterStatus?.data.clusterStatus)}
</Box>
);
};
export const ResourceStatusCard = ({ clusterStatus }: StatusCardProps) => {
return (
<Box
style={{
overflow: "hidden",
overflowY: "auto",
height: "100%",
}}
>
{formatResourcesStatus(clusterStatus?.data.clusterStatus)}
</Box>
);
};
@@ -0,0 +1,279 @@
import {
Box,
Table,
TableBody,
TableCell,
TableContainer,
TableHead,
TableRow,
TextField,
TextFieldProps,
Typography,
} from "@mui/material";
import Autocomplete from "@mui/material/Autocomplete";
import Pagination from "@mui/material/Pagination";
import React, { useState } from "react";
import { RiArrowDownSLine, RiArrowRightSLine } from "react-icons/ri";
import { formatDateFromTimeMs } from "../common/formatUtils";
import { sliceToPage } from "../common/util";
import { TaskProgressBar } from "../pages/job/TaskProgressBar";
import { DatasetMetrics, OperatorMetrics } from "../type/data";
import { memoryConverter } from "../util/converter";
import { useFilter } from "../util/hook";
import StateCounter from "./StatesCounter";
import { StatusChip } from "./StatusChip";
import { HelpInfo } from "./Tooltip";
const columns = [
{ label: "" }, // Empty column for dropdown icons
{ label: "Dataset / Operator Name", align: "start" },
{
label: "Blocks Outputted",
helpInfo: <Typography>Blocks outputted by output operator.</Typography>,
},
{ label: "State", align: "center" },
{ label: "Rows Outputted" },
{
label: "Queued Blocks",
helpInfo: (
<Typography>
Number of blocks waiting in an input queue to be processed.
</Typography>
),
},
{
label: "Memory Usage (current / max)",
helpInfo: (
<Typography>
Amount of object store memory used by a dataset. Includes spilled
objects.
</Typography>
),
},
{
label: "Bytes Spilled",
helpInfo: (
<Typography>
Set
"ray.data.context.DataContext.get_current().enable_get_object_locations_for_metrics
= True" to collect spill stats.
</Typography>
),
},
{
label: "Logical CPU Cores (current / max)",
align: "center",
},
{
label: "Logical GPU Cores (current / max)",
align: "center",
},
{ label: "Start Time", align: "center" },
{ label: "End Time", align: "center" },
];
const DataOverviewTable = ({
datasets = [],
}: {
datasets: DatasetMetrics[];
}) => {
const [pageNo, setPageNo] = useState(1);
const { changeFilter, filterFunc } = useFilter();
const pageSize = 10;
const datasetList = datasets.filter(filterFunc);
const [expandedDatasets, setExpandedDatasets] = useState<
Record<string, boolean>
>({});
const {
items: list,
constrainedPage,
maxPage,
} = sliceToPage(datasetList, pageNo, pageSize);
return (
<div>
<div style={{ flex: 1, display: "flex", alignItems: "center" }}>
<Autocomplete
style={{ margin: 8, width: 120 }}
options={Array.from(new Set(datasets.map((e) => e.dataset)))}
onInputChange={(_: any, value: string) => {
changeFilter("dataset", value.trim());
}}
renderInput={(params: TextFieldProps) => (
<TextField {...params} label="Dataset Name" />
)}
/>
</div>
<div style={{ display: "flex", alignItems: "center" }}>
<div>
<Pagination
page={constrainedPage}
onChange={(e, num) => setPageNo(num)}
count={maxPage}
/>
</div>
<div>
<StateCounter type="task" list={datasetList} />
</div>
</div>
<TableContainer>
<Table>
<TableHead>
<TableRow>
{columns.map(({ label, helpInfo, align }) => (
<TableCell align="center" key={label}>
<Box
display="flex"
justifyContent={align ? align : "end"}
alignItems="center"
>
{label}
{helpInfo && (
<HelpInfo sx={{ marginLeft: 1 }}>{helpInfo}</HelpInfo>
)}
</Box>
</TableCell>
))}
</TableRow>
</TableHead>
<TableBody>
{list.map((dataset) => (
<DatasetTable
datasetMetrics={dataset}
isExpanded={expandedDatasets[dataset.dataset]}
setIsExpanded={(isExpanded: boolean) => {
const copy = {
...expandedDatasets,
[dataset.dataset]: isExpanded,
};
setExpandedDatasets(copy);
}}
key={dataset.dataset}
/>
))}
</TableBody>
</Table>
</TableContainer>
</div>
);
};
const DataRow = ({
datasetMetrics,
operatorMetrics,
isExpanded,
setIsExpanded,
}: {
datasetMetrics?: DatasetMetrics;
operatorMetrics?: OperatorMetrics;
isExpanded?: boolean;
setIsExpanded?: CallableFunction;
}) => {
const isDatasetRow = datasetMetrics !== undefined;
const isOperatorRow = operatorMetrics !== undefined;
const data = datasetMetrics || operatorMetrics;
if ((isDatasetRow && isOperatorRow) || data === undefined) {
throw new Error(
"Exactly one of datasetMetrics or operatorMetrics musts be given.",
);
}
return (
<TableRow>
<TableCell align="center">
{isDatasetRow &&
setIsExpanded !== undefined &&
(isExpanded ? (
<Box
component={RiArrowDownSLine}
title={"Collapse Dataset " + datasetMetrics.dataset}
sx={{ width: 16, height: 16 }}
onClick={() => setIsExpanded(false)}
/>
) : (
<Box
component={RiArrowRightSLine}
title={"Expand Dataset " + datasetMetrics.dataset}
sx={{ width: 16, height: 16 }}
onClick={() => setIsExpanded(true)}
/>
))}
</TableCell>
<TableCell align="left">
{isDatasetRow && datasetMetrics.dataset}
{isOperatorRow && operatorMetrics.name}
</TableCell>
<TableCell align="right" style={{ width: 200 }}>
<TaskProgressBar
showLegend={false}
numFinished={data.progress}
numRunning={
data.state === "RUNNING" ? data.total - data.progress : undefined
}
numCancelled={
data.state === "FAILED" ? data.total - data.progress : undefined
}
total={data.total}
/>
</TableCell>
<TableCell align="center">
<StatusChip type="task" status={data.state} />
</TableCell>
<TableCell align="right">{data.ray_data_output_rows.max}</TableCell>
<TableCell align="right">
{isOperatorRow ? operatorMetrics.queued_blocks : ""}
</TableCell>
<TableCell align="right">
{memoryConverter(Number(data.ray_data_current_bytes.value))}/
{memoryConverter(Number(data.ray_data_current_bytes.max))}
</TableCell>
<TableCell align="right">
{memoryConverter(Number(data.ray_data_spilled_bytes.max))}
</TableCell>
<TableCell align="center" style={{ width: 200 }}>
{data.ray_data_cpu_usage_cores.value}/
{data.ray_data_cpu_usage_cores.max}
</TableCell>
<TableCell align="center" style={{ width: 200 }}>
{data.ray_data_gpu_usage_cores.value}/
{data.ray_data_gpu_usage_cores.max}
</TableCell>
<TableCell align="center">
{isDatasetRow && formatDateFromTimeMs(datasetMetrics.start_time * 1000)}
</TableCell>
<TableCell align="center">
{isDatasetRow &&
datasetMetrics.end_time &&
formatDateFromTimeMs(datasetMetrics.end_time * 1000)}
</TableCell>
</TableRow>
);
};
const DatasetTable = ({
datasetMetrics,
isExpanded,
setIsExpanded,
}: {
datasetMetrics: DatasetMetrics;
isExpanded: boolean;
setIsExpanded: CallableFunction;
}) => {
const operatorRows =
isExpanded &&
datasetMetrics.operators.map((operator) => (
<DataRow operatorMetrics={operator} key={operator.operator} />
));
return (
<React.Fragment>
<DataRow
datasetMetrics={datasetMetrics}
isExpanded={isExpanded}
setIsExpanded={setIsExpanded}
/>
{operatorRows}
</React.Fragment>
);
};
export default DataOverviewTable;
@@ -0,0 +1,370 @@
import { SearchOutlined } from "@mui/icons-material";
import {
Box,
Button,
Chip,
Grid,
InputAdornment,
LinearProgress,
TextField,
TextFieldProps,
Tooltip,
} from "@mui/material";
import Autocomplete from "@mui/material/Autocomplete";
import Pagination from "@mui/material/Pagination";
import dayjs from "dayjs";
import React, { useContext, useEffect, useState } from "react";
import { Link } from "react-router-dom";
import { GlobalContext } from "../App";
import { sliceToPage } from "../common/util";
import { getEvents, getGlobalEvents } from "../service/event";
import { Event } from "../type/event";
import { useFilter } from "../util/hook";
import { StatusChip } from "./StatusChip";
type EventTableProps = {
job_id?: string;
};
const useEventTable = (props: EventTableProps) => {
const { job_id } = props;
const { nodeMap } = useContext(GlobalContext);
const [loading, setLoading] = useState(true);
const { changeFilter: _changeFilter, filterFunc } = useFilter();
const [events, setEvents] = useState<Event[]>([]);
const [pagination, setPagination] = useState({
pageNo: 1,
pageSize: 10,
total: 0,
});
const changePage = (key: string, value: number) => {
setPagination({ ...pagination, [key]: value });
};
const realLen = events.filter(filterFunc).length;
const { pageSize } = pagination;
const changeFilter: typeof _changeFilter = (...params) => {
_changeFilter(...params);
setPagination({
...pagination,
pageNo: 1,
});
};
useEffect(() => {
const getEvent = async () => {
try {
if (job_id) {
const rsp = await getEvents(job_id);
if (rsp?.data?.data?.events) {
setEvents(
rsp.data.data.events.sort(
(a, b) => Number(b.timestamp) - Number(a.timestamp),
),
);
}
} else {
const rsp = await getGlobalEvents();
if (rsp?.data?.data?.events) {
setEvents(
Object.values(rsp.data.data.events)
.reduce((a, b) => a.concat(b))
.sort((a, b) => Number(b.timestamp) - Number(a.timestamp)),
);
}
}
} catch (e) {
} finally {
setLoading(false);
}
};
getEvent();
}, [job_id]);
useEffect(() => {
setPagination((p) => ({
...p,
total: Math.ceil(realLen / p.pageSize),
pageNo: 1,
}));
}, [realLen, pageSize]);
return {
events: sliceToPage(
events.filter(filterFunc),
pagination.pageNo,
pagination.pageSize,
).items,
changeFilter,
pagination,
changePage,
labelOptions: Array.from(new Set(events.map((e) => e.label))),
hostOptions: Array.from(
new Set(events.map((e) => e.sourceHostname || e.hostName)),
),
sourceOptions: Array.from(new Set(events.map((e) => e.sourceType))),
severityOptions: Array.from(new Set(events.map((e) => e.severity))),
loading,
reverseEvents: () => {
setEvents([...events.reverse()]);
},
nodeMap,
};
};
const EventTable = (props: EventTableProps) => {
const {
events,
changeFilter,
pagination,
changePage,
labelOptions,
hostOptions,
sourceOptions,
severityOptions,
loading,
reverseEvents,
nodeMap,
} = useEventTable(props);
if (loading) {
return <LinearProgress />;
}
return (
<div style={{ position: "relative" }}>
<Box
sx={{
display: "flex",
alignItems: "center",
}}
>
<Autocomplete
sx={{
margin: 1,
display: "inline-block",
fontSize: 12,
"& .MuiSvgIcon-root": { color: "text.secondary" },
}}
style={{ width: 200 }}
options={labelOptions}
onInputChange={(_: any, value: string) => {
changeFilter("label", value.trim());
}}
renderInput={(params: TextFieldProps) => (
<TextField {...params} label="Label" />
)}
/>
<Autocomplete
sx={{
margin: 1,
display: "inline-block",
fontSize: 12,
"& .MuiSvgIcon-root": { color: "text.secondary" },
}}
style={{ width: 200 }}
options={hostOptions}
onInputChange={(_: any, value: string) => {
changeFilter("sourceHostname", value.trim());
}}
renderInput={(params: TextFieldProps) => (
<TextField {...params} label="Host" />
)}
/>
<Autocomplete
sx={{
margin: 1,
display: "inline-block",
fontSize: 12,
"& .MuiSvgIcon-root": { color: "text.secondary" },
}}
style={{ width: 100 }}
options={sourceOptions}
onInputChange={(_: any, value: string) => {
changeFilter("sourceType", value.trim());
}}
renderInput={(params: TextFieldProps) => (
<TextField {...params} label="Source" />
)}
/>
<Autocomplete
sx={{
margin: 1,
display: "inline-block",
fontSize: 12,
"& .MuiSvgIcon-root": { color: "text.secondary" },
}}
style={{ width: 140 }}
options={severityOptions}
onInputChange={(_: any, value: string) => {
changeFilter("severity", value.trim());
}}
renderInput={(params: TextFieldProps) => (
<TextField {...params} label="Severity" />
)}
/>
<TextField
sx={{ margin: 1, display: "inline-block", fontSize: 12 }}
label="Msg"
InputProps={{
onChange: ({ target: { value } }) => {
changeFilter("message", value.trim());
},
endAdornment: (
<InputAdornment position="end">
<SearchOutlined
sx={(theme) => ({ color: theme.palette.text.secondary })}
/>
</InputAdornment>
),
}}
/>
<TextField
label="Page Size"
sx={{ margin: 1, width: 120 }}
size="small"
defaultValue={10}
InputProps={{
onChange: ({ target: { value } }) => {
changePage("pageSize", Math.min(Number(value), 500) || 10);
},
endAdornment: (
<InputAdornment position="end">Per Page</InputAdornment>
),
}}
/>
<Button
sx={{ margin: 1, display: "inline-block", fontSize: 12 }}
size="small"
variant="contained"
onClick={() => reverseEvents()}
>
Reverse
</Button>
</Box>
<div>
<Pagination
count={pagination.total}
page={pagination.pageNo}
onChange={(event: React.ChangeEvent<unknown>, value: number) => {
changePage("pageNo", value);
}}
/>
</div>
<Box sx={{ padding: 2, marginTop: 2 }}>
{!events.length
? "No Events Yet."
: events.map(
({
label,
message,
timestamp,
timeStamp,
sourceType,
sourceHostname,
hostName,
sourcePid,
pid,
eventId,
jobId,
jobName,
nodeId,
severity,
customFields,
}) => {
const realTimestamp =
timeStamp ||
dayjs(Math.floor(timestamp * 1000)).format(
"YYYY-MM-DD HH:mm:ss",
);
const hostname = sourceHostname || hostName;
const realPid = pid || sourcePid;
return (
<Box
component="article"
sx={(theme) => ({
color: theme.palette.text.secondary,
fontSize: 12,
})}
key={eventId}
>
<Grid container spacing={4}>
<Grid item>
<StatusChip status={severity} type={severity} />
</Grid>
<Grid item>{realTimestamp}</Grid>
{customFields && (
<Grid item>
<Tooltip
title={
<pre style={{ whiteSpace: "pre-wrap" }}>
{JSON.stringify(customFields, null, 2)}
</pre>
}
>
<Chip size="small" label="CustomFields" />
</Tooltip>
</Grid>
)}
</Grid>
<Grid container>
<Grid item sx={{ margin: 1 }}>
severity: {severity}
</Grid>
<Grid item sx={{ margin: 1 }}>
source: {sourceType}
</Grid>
<Grid item sx={{ margin: 1 }}>
hostname:{" "}
{nodeMap[hostname] ? (
<Link to={`/node/${nodeMap[hostname]}`}>
{hostname}
</Link>
) : (
hostname
)}
</Grid>
<Grid item sx={{ margin: 1 }}>
pid: {realPid}
</Grid>
{jobId && (
<Grid item sx={{ margin: 1 }}>
jobId: <Link to={`/job/${jobId}`}>{jobId}</Link>
</Grid>
)}
{jobName && (
<Grid item sx={{ margin: 1 }}>
jobId: {jobName}
</Grid>
)}
{eventId && (
<Grid item sx={{ margin: 1 }}>
eventId: {eventId}
</Grid>
)}
{nodeId && (
<Grid item sx={{ margin: 1 }}>
nodeId: {nodeId}
</Grid>
)}
</Grid>
<pre style={{ whiteSpace: "pre-wrap" }}>{message}</pre>
</Box>
);
},
)}
</Box>
<div>
<Pagination
count={pagination.total}
page={pagination.pageNo}
onChange={(event: React.ChangeEvent<unknown>, value: number) => {
changePage("pageNo", value);
}}
/>
</div>
</div>
);
};
export default EventTable;
@@ -0,0 +1,136 @@
import { Box, Link, SxProps, Theme, Typography } from "@mui/material";
import React, { ReactNode } from "react";
import { Link as RouterLink } from "react-router-dom";
import { ClassNameProps } from "../common/props";
import {
LinkWithArrow,
OverviewCard,
} from "../pages/overview/cards/OverviewCard";
type ListItemCardProps = {
headerTitle: string;
items: ListItemProps[];
emptyListText: string;
footerText: string;
footerLink: string;
sx?: SxProps<Theme>;
} & ClassNameProps;
type ListItemProps = {
title: string | undefined;
subtitle: string;
link: string | undefined;
icon: ReactNode;
sx?: SxProps<Theme>;
} & ClassNameProps;
export const ListItemCard = ({
className,
headerTitle,
items,
emptyListText: itemEmptyTip,
footerText,
footerLink,
sx,
}: ListItemCardProps) => {
return (
<OverviewCard
className={className}
sx={[
{
display: "flex",
flexDirection: "column",
paddingX: 3,
paddingY: 2,
},
...(Array.isArray(sx) ? sx : [sx]),
]}
>
<Typography variant="h3">{headerTitle}</Typography>
<Box
sx={{
marginTop: 2,
flex: 1,
overflow: "hidden",
}}
>
{items.map((item: ListItemProps) => (
<ListItem
{...item}
sx={{
"&:not(:first-child)": {
marginTop: 1,
},
}}
key={item.title}
/>
))}
{items.length === 0 && (
<Typography variant="h4">{itemEmptyTip}</Typography>
)}
</Box>
<LinkWithArrow text={footerText} to={footerLink} />
</OverviewCard>
);
};
const listItemStyles = {
root: {
display: "flex",
flexDirection: "row",
flexWrap: "nowrap",
alignItems: "center",
textDecoration: "none",
},
};
const ListItem = ({
icon,
title,
subtitle,
className,
link,
sx,
}: ListItemProps) => {
const cardContent = (
<React.Fragment>
{icon}
<Box
sx={(theme) => ({
flex: "1 1 auto",
width: `calc(100% - calc(${theme.spacing(1)} + 20px))`,
})}
>
<Typography
sx={(theme) => ({ color: theme.palette.primary.main })}
variant="body2"
>
{title}
</Typography>
<Typography
sx={(theme) => ({
overflow: "hidden",
textOverflow: "ellipsis",
whiteSpace: "nowrap",
color: theme.palette.text.secondary,
})}
title={subtitle}
variant="caption"
>
{subtitle}
</Typography>
</Box>
</React.Fragment>
);
return (
<Box className={className} sx={sx}>
{link !== undefined ? (
<Link component={RouterLink} sx={listItemStyles.root} to={link}>
{cardContent}
</Link>
) : (
<Box sx={listItemStyles.root}>{cardContent}</Box>
)}
</Box>
);
};
@@ -0,0 +1,7 @@
import { CircularProgress } from "@mui/material";
import React from "react";
const Loading = ({ loading }: { loading: boolean }) =>
loading ? <CircularProgress color="primary" /> : null;
export default Loading;
@@ -0,0 +1,430 @@
import { Box, Typography } from "@mui/material";
import dayjs from "dayjs";
import prolog from "highlight.js/lib/languages/prolog";
import { lowlight } from "lowlight";
import React, {
MutableRefObject,
useCallback,
useEffect,
useRef,
useState,
} from "react";
import { FixedSizeList as List } from "react-window";
import DialogWithTitle from "../../common/DialogWithTitle";
import "./darcula.css";
import "./github.css";
import "./index.css";
import { MAX_LINES_FOR_LOGS } from "../../service/log";
lowlight.registerLanguage("prolog", prolog);
const uniqueKeySelector = () => Math.random().toString(16).slice(-8);
const timeReg =
/(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)\s+([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]/;
const value2react = (
{ type, tagName, properties, children, value = "" }: any,
key: string,
keywords = "",
) => {
switch (type) {
case "element":
return React.createElement(
tagName,
{
className: properties.className[0],
key: `${key}line${uniqueKeySelector()}`,
},
children.map((e: any, i: number) =>
value2react(e, `${key}-${i}`, keywords),
),
);
case "text":
if (keywords && value.includes(keywords)) {
const afterChildren = [];
const vals = value.split(keywords);
let tmp = vals.shift();
if (!tmp) {
return React.createElement(
"span",
{ className: "find-kws" },
keywords,
);
}
while (typeof tmp === "string") {
if (tmp !== "") {
afterChildren.push(tmp);
} else {
afterChildren.push(
React.createElement("span", { className: "find-kws" }, keywords),
);
}
tmp = vals.shift();
if (tmp) {
afterChildren.push(
React.createElement("span", { className: "find-kws" }, keywords),
);
}
}
return afterChildren;
}
return value;
default:
return [];
}
};
export type LogVirtualViewProps = {
content: string;
width?: number;
height?: number;
fontSize?: number;
theme?: "light" | "dark";
language?: string;
focusLine?: number;
keywords?: string;
style?: { [key: string]: string | number };
listRef?: MutableRefObject<HTMLDivElement | null>;
onScrollBottom?: (event: Event) => void;
revert?: boolean;
startTime?: string;
endTime?: string;
};
type LogLineDetailDialogProps = {
formattedLogLine: string | null;
message: string;
onClose: () => void;
};
const LogLineDetailDialog = ({
formattedLogLine,
message,
onClose,
}: LogLineDetailDialogProps) => {
return (
<DialogWithTitle title="Log line details" handleClose={onClose}>
<Box
sx={{
display: "flex",
flexDirection: "row",
gap: 4,
alignItems: "stretch",
}}
>
<Box
sx={{
width: "100%",
}}
>
{formattedLogLine !== null && (
<React.Fragment>
<Typography
variant="h5"
sx={{
marginBottom: 2,
}}
>
Raw log line
</Typography>
<Box
sx={(theme) => ({
padding: 1,
bgcolor:
theme.palette.mode === "dark"
? theme.palette.grey[900]
: theme.palette.grey[200],
borderRadius: 1,
border: `1px solid ${theme.palette.divider}`,
marginBottom: 2,
})}
>
<Typography
component="pre"
variant="body2"
sx={{
whiteSpace: "pre",
overflow: "auto",
height: "300px",
}}
data-testid="raw-log-line"
>
{formattedLogLine}
</Typography>
</Box>
</React.Fragment>
)}
<Typography
variant="h5"
sx={{
marginBottom: 2,
}}
>
Formatted message
</Typography>
<Box
sx={(theme) => ({
padding: 1,
bgcolor:
theme.palette.mode === "dark"
? theme.palette.grey[900]
: theme.palette.grey[200],
borderRadius: 1,
border: `1px solid ${theme.palette.divider}`,
})}
>
<Typography
component="pre"
variant="body2"
sx={{
whiteSpace: "pre",
overflow: "auto",
height: "300px",
}}
data-testid="raw-log-line"
>
{message}
</Typography>
</Box>
</Box>
</Box>
</DialogWithTitle>
);
};
const LogVirtualView: React.FC<LogVirtualViewProps> = ({
content,
width = "100%",
height,
fontSize = 12,
theme = "light",
keywords = "",
language = "dos",
focusLine = 1,
style = {},
listRef,
onScrollBottom,
revert = false,
startTime,
endTime,
}) => {
const [logs, setLogs] = useState<{ i: number; origin: string }[]>([]);
const total = logs.length;
const timmer = useRef<ReturnType<typeof setTimeout>>();
const el = useRef<List>(null);
const outter = useRef<HTMLDivElement>(null);
if (listRef) {
listRef.current = outter.current;
}
const [selectedLogLine, setSelectedLogLine] =
useState<[string | null, string]>();
const handleLogLineClick = useCallback(
(logLine: string | null, message: string) => {
setSelectedLogLine([logLine, message]);
},
[],
);
const itemRenderer = ({ index, style }: { index: number; style: any }) => {
const { i, origin } = logs[revert ? logs.length - 1 - index : index];
let message = origin;
let formattedLogLine: string | null = null;
try {
const parsedOrigin = JSON.parse(origin);
// Iff the parsed origin has a message field, use it as the message.
if (parsedOrigin.message) {
message = parsedOrigin.message;
// If levelname exist on the structured logs, put it in front of the message.
if (parsedOrigin.levelname) {
message = `${parsedOrigin.levelname} ${message}`;
}
// If asctime exist on the structured logs, use it as the prefix of the message.
if (parsedOrigin.asctime) {
message = `${parsedOrigin.asctime}\t${message}`;
}
}
formattedLogLine = JSON.stringify(parsedOrigin, null, 2);
} catch (e) {
// Keep the `origin` as message, if json parsing failed.
// If formattedLogLine is null, then the log line is not JSON and we will
// not show the raw json dialog pop up.
}
return (
<Box
key={`${index}list`}
style={style}
sx={(theme) => ({
// Explicitly create a stacking context so that the ::after pseudo-element
// with z-index: -1 stays behind the text but in front of the list background.
zIndex: 0,
overflowX: "visible",
whiteSpace: "nowrap",
// Reveal the hidden button on row hover using a CSS-only selector.
// This avoids React state changes on every mouse move, keeping
// scroll and render performance smooth for large log files.
"&:hover .log-line-details-btn": {
opacity: 1,
pointerEvents: "auto",
},
// Expand the row hover area to cover blank viewport space when
// the log panel is horizontally scrolled.
"&::after": {
content: '""',
position: "absolute",
top: 0,
right: "calc(-1 * var(--log-view-scroll-left, 0px))",
width: "var(--log-view-scroll-left, 0px)",
height: "100%",
zIndex: -1,
},
"&::before": {
content: `"${i + 1}"`,
marginRight: 0.5,
width: `${logs.length}`.length * 6 + 4,
color: theme.palette.text.disabled,
display: "inline-block",
},
})}
>
{lowlight
.highlight(language, message)
.children.map((v) => value2react(v, index.toString(), keywords))}
{/* Only render the button for structured (JSON) log lines.
Plain text lines have no additional data to show in the dialog. */}
{formattedLogLine !== null && (
<button
className="log-line-details-btn"
onClick={(e) => {
e.stopPropagation();
if ((window.getSelection()?.toString().length ?? 0) === 0) {
handleLogLineClick(formattedLogLine, message);
}
}}
>
Show details
</button>
)}
<br />
</Box>
);
};
useEffect(() => {
const originContent = content.split("\n");
if (timmer.current) {
clearTimeout(timmer.current);
}
timmer.current = setTimeout(() => {
setLogs(
originContent
.map((e, i) => ({
i,
origin: e,
time: (e?.match(timeReg) || [""])[0],
}))
.filter((e) => {
let bool = e.origin.includes(keywords);
if (
e.time &&
startTime &&
!dayjs(e.time).isAfter(dayjs(startTime))
) {
bool = false;
}
if (e.time && endTime && !dayjs(e.time).isBefore(dayjs(endTime))) {
bool = false;
}
return bool;
})
.map((e) => ({
...e,
})),
);
}, 500);
}, [content, keywords, language, startTime, endTime]);
useEffect(() => {
if (el.current) {
el.current?.scrollTo((focusLine - 1) * (fontSize + 6));
}
}, [focusLine, fontSize]);
useEffect(() => {
let outterCurrentValue: any = null;
if (outter.current) {
outter.current.style.setProperty("--log-view-scroll-left", "0px");
const scrollFunc = (event: any) => {
const { target } = event;
if (target) {
const scrollLeft = `${target.scrollLeft ?? 0}px`;
if (
target.style.getPropertyValue("--log-view-scroll-left") !==
scrollLeft
) {
target.style.setProperty("--log-view-scroll-left", scrollLeft);
}
}
if (
target &&
target.scrollTop + target.clientHeight === target.scrollHeight
) {
if (onScrollBottom) {
onScrollBottom(event);
}
}
outterCurrentValue = outter.current;
};
outter.current.addEventListener("scroll", scrollFunc);
return () => {
if (outterCurrentValue) {
outterCurrentValue.removeEventListener("scroll", scrollFunc);
}
};
}
}, [onScrollBottom]);
return (
<div>
{logs && logs.length > MAX_LINES_FOR_LOGS && (
<Box component="p" sx={{ color: (theme) => theme.palette.error.main }}>
[Truncation warning] This log has been truncated and only the latest{" "}
{MAX_LINES_FOR_LOGS} lines are displayed. Click "Download" button
above to see the full log
</Box>
)}
<List
height={height || 600}
width={width}
ref={el}
outerRef={outter}
className={`hljs-${theme}`}
style={{
fontSize,
fontFamily: "menlo, monospace",
...style,
}}
itemSize={fontSize + 6}
itemCount={total}
>
{itemRenderer}
</List>
{selectedLogLine && (
<LogLineDetailDialog
formattedLogLine={selectedLogLine[0]}
message={selectedLogLine[1]}
onClose={() => {
setSelectedLogLine(undefined);
}}
/>
)}
</div>
);
};
export default LogVirtualView;
@@ -0,0 +1,59 @@
/*
Dracula Theme v1.2.0
https://github.com/zenorocha/dracula-theme
Copyright 2015, All rights reserved
Code licensed under the MIT license
http://zenorocha.mit-license.org
@author Éverton Ribeiro <nuxlli@gmail.com>
@author Zeno Rocha <hi@zenorocha.com>
*/
.hljs-dark {
display: block;
overflow-x: auto;
padding: 0.5em;
color: #f8f8f2;
}
.hljs-dark .hljs-number,
.hljs-dark .hljs-keyword,
.hljs-dark .hljs-selector-tag,
.hljs-dark .hljs-literal,
.hljs-dark .hljs-section,
.hljs-dark .hljs-link {
color: #8be9fd;
}
.hljs-dark .hljs-function .hljs-keyword {
color: #ff79c6;
}
.hljs-dark .hljs-string,
.hljs-dark .hljs-title,
.hljs-dark .hljs-name,
.hljs-dark .hljs-type,
.hljs-dark .hljs-attribute,
.hljs-dark .hljs-symbol,
.hljs-dark .hljs-bullet,
.hljs-dark .hljs-addition,
.hljs-dark .hljs-variable,
.hljs-dark .hljs-template-tag,
.hljs-dark .hljs-template-variable {
color: #f1fa8c;
}
.hljs-dark .hljs-comment,
.hljs-dark .hljs-quote,
.hljs-dark .hljs-deletion,
.hljs-dark .hljs-meta {
color: #6272a4;
}
.hljs-dark .hljs-keyword,
.hljs-dark .hljs-selector-tag,
.hljs-dark .hljs-literal,
.hljs-dark .hljs-title,
.hljs-dark .hljs-section,
.hljs-dark .hljs-doctag,
.hljs-dark .hljs-type,
.hljs-dark .hljs-name,
.hljs-dark .hljs-strong {
font-weight: bold;
}
.hljs-dark .hljs-emphasis {
font-style: italic;
}
@@ -0,0 +1,96 @@
/*
github.com style (c) Vasily Polovnyov <vast@whiteants.net>
*/
.hljs-light {
display: block;
overflow-x: auto;
padding: 0.5em;
color: #333;
}
.hljs-light .hljs-comment,
.hljs-light .hljs-quote {
color: #998;
font-style: italic;
}
.hljs-light .hljs-keyword,
.hljs-light .hljs-selector-tag,
.hljs-light .hljs-subst {
color: #333;
font-weight: bold;
}
.hljs-light .hljs-number,
.hljs-light .hljs-literal,
.hljs-light .hljs-variable,
.hljs-light .hljs-template-variable,
.hljs-light .hljs-tag .hljs-attr {
color: #008080;
}
.hljs-light .hljs-string,
.hljs-light .hljs-doctag {
color: #d14;
}
.hljs-light .hljs-title,
.hljs-light .hljs-section,
.hljs-light .hljs-selector-id {
color: #900;
font-weight: bold;
}
.hljs-light .hljs-subst {
font-weight: normal;
}
.hljs-light .hljs-type,
.hljs-light .hljs-class .hljs-title {
color: #458;
font-weight: bold;
}
.hljs-light .hljs-tag,
.hljs-light .hljs-name,
.hljs-light .hljs-attribute {
color: #000080;
font-weight: normal;
}
.hljs-light .hljs-regexp,
.hljs-light .hljs-link {
color: #009926;
}
.hljs-light .hljs-symbol,
.hljs-light .hljs-bullet {
color: #990073;
}
.hljs-light .hljs-built_in,
.hljs-light .hljs-builtin-name {
color: #0086b3;
}
.hljs-light .hljs-meta {
color: #999;
font-weight: bold;
}
.hljs-light .hljs-deletion {
background: #fdd;
}
.hljs-light .hljs-addition {
background: #dfd;
}
.hljs-light .hljs-emphasis {
font-style: italic;
}
.hljs-light .hljs-strong {
font-weight: bold;
}
@@ -0,0 +1,32 @@
/* Light mode - default yellow highlight */
.hljs-light span.find-kws {
background-color: #ffd800;
}
/* Dark mode - darker yellow with white text for better contrast */
.hljs-dark span.find-kws {
background-color: #b89700;
color: #ffffff;
}
/* "Show details" button rendered inside each log line row.
Hidden by default; revealed on row hover via the sx "&:hover" selector
in LogVirtualView.tsx to avoid React state updates on mouse move. */
.log-line-details-btn {
opacity: 0;
pointer-events: none;
position: absolute;
right: 8px;
top: 50%;
transform: translate(calc(var(--log-view-scroll-left, 0px)), -50%);
padding: 1px 6px;
font-size: 11px;
line-height: 1.4;
cursor: pointer;
background-color: #1976d2;
color: white;
border: none;
border-radius: 3px;
z-index: 1;
transition: opacity 120ms ease-in-out;
}
@@ -0,0 +1,103 @@
import { render, screen } from "@testing-library/react";
import React from "react";
import { TEST_APP_WRAPPER } from "../../util/test-utils";
import { MetadataContentField } from "./MetadataSection";
const CONTENT_VALUE = "test_string";
const LINK_VALUE = "https://docs.ray.com/";
const COPYABLE_VALUE = "Copyable value";
const COPY_BUTTON_LABEL = "copy";
describe("MetadataContentField", () => {
it("renders the content string", () => {
expect.assertions(4);
render(
<MetadataContentField
content={{ value: CONTENT_VALUE }}
label="test-label"
/>,
{ wrapper: TEST_APP_WRAPPER },
);
expect(screen.getByText(CONTENT_VALUE)).toBeInTheDocument();
expect(screen.getByText(CONTENT_VALUE)).not.toHaveAttribute("href");
expect(screen.queryByLabelText(COPY_BUTTON_LABEL)).not.toBeInTheDocument();
expect(
screen.getByTestId("metadata-content-for-test-label"),
).toBeInTheDocument();
});
it("renders the content string if link is undefined", () => {
expect.assertions(4);
render(
<MetadataContentField
content={{ value: CONTENT_VALUE, link: undefined }}
label="test-label"
/>,
{ wrapper: TEST_APP_WRAPPER },
);
expect(screen.getByText(CONTENT_VALUE)).toBeInTheDocument();
expect(screen.getByText(CONTENT_VALUE)).not.toHaveAttribute("href");
expect(screen.queryByLabelText(COPY_BUTTON_LABEL)).not.toBeInTheDocument();
expect(
screen.getByTestId("metadata-content-for-test-label"),
).toBeInTheDocument();
});
it("renders the content string with label", () => {
expect.assertions(4);
render(
<MetadataContentField
content={{ value: CONTENT_VALUE, link: LINK_VALUE }}
label="test-label"
/>,
{ wrapper: TEST_APP_WRAPPER },
);
expect(screen.getByText(CONTENT_VALUE)).toBeInTheDocument();
expect(screen.getByText(CONTENT_VALUE)).toHaveAttribute("href", LINK_VALUE);
expect(screen.queryByLabelText(COPY_BUTTON_LABEL)).not.toBeInTheDocument();
expect(
screen.getByTestId("metadata-content-for-test-label"),
).toBeInTheDocument();
});
it("renders the content string with copyable value", () => {
expect.assertions(4);
render(
<MetadataContentField
content={{ value: CONTENT_VALUE, copyableValue: COPYABLE_VALUE }}
label="test-label"
/>,
{ wrapper: TEST_APP_WRAPPER },
);
expect(screen.getByText(CONTENT_VALUE)).toBeInTheDocument();
expect(screen.getByText(CONTENT_VALUE)).not.toHaveAttribute("href");
expect(screen.getByLabelText(COPY_BUTTON_LABEL)).toBeInTheDocument();
expect(
screen.getByTestId("metadata-content-for-test-label"),
).toBeInTheDocument();
});
it("renders the content string with a JSX element", () => {
expect.assertions(3);
const CUSTOM_TEST_ID = "custom-test-id";
const customElement = <p data-testid={CUSTOM_TEST_ID}>Test</p>;
render(
<MetadataContentField content={customElement} label="test-label" />,
{ wrapper: TEST_APP_WRAPPER },
);
expect(screen.queryByLabelText(COPY_BUTTON_LABEL)).not.toBeInTheDocument();
expect(screen.getByTestId(CUSTOM_TEST_ID)).toBeInTheDocument();
expect(
screen.getByTestId("metadata-content-for-test-label"),
).toBeInTheDocument();
});
});
@@ -0,0 +1,196 @@
import { Box, IconButton, Link, Tooltip, Typography } from "@mui/material";
import copy from "copy-to-clipboard";
import React, { useState } from "react";
import { RiFileCopyLine } from "react-icons/ri";
import { Link as RouterLink } from "react-router-dom";
import { Section } from "../../common/Section";
import { HelpInfo } from "../Tooltip";
export type StringOnlyMetadataContent = {
readonly value: string;
};
type LinkableMetadataContent = StringOnlyMetadataContent & {
readonly link: string;
};
type CopyableMetadataContent = StringOnlyMetadataContent & {
/**
* The "copyable value" may be different from "value"
* in case we want to render a more readable text.
*/
readonly copyableValue: string;
};
type CopyAndLinkableMetadataContent = LinkableMetadataContent &
CopyableMetadataContent;
export type Metadata = {
readonly label: string;
readonly labelTooltip?: string | JSX.Element;
// If content is undefined, we display "-" as the placeholder.
readonly content?:
| StringOnlyMetadataContent
| LinkableMetadataContent
| CopyableMetadataContent
| CopyAndLinkableMetadataContent
| JSX.Element;
/**
* This flag will determine this metadata field will show in the UI.
* Defaults to true.
*/
readonly isAvailable?: boolean;
};
const styles = {
contentContainer: {
display: "flex",
alignItems: "center",
},
content: {
display: "block",
textOverflow: "ellipsis",
overflow: "hidden",
whiteSpace: "nowrap",
},
};
/**
* We style the metadata content based on the type supplied.
*
* A default style will be applied if content is MetadataContent type.
* If content is undefined, we display "-" as the placeholder.
*/
export const MetadataContentField: React.FC<{
content: Metadata["content"];
label: string;
}> = ({ content, label }) => {
const [copyIconClicked, setCopyIconClicked] = useState<boolean>(false);
const copyElement = content && "copyableValue" in content && (
<Tooltip
placement="top"
title={copyIconClicked ? "Copied" : "Click to copy"}
>
<IconButton
aria-label="copy"
onClick={() => {
setCopyIconClicked(true);
copy(content.copyableValue);
}}
// Set up mouse events to avoid text changing while tooltip is visible
onMouseEnter={() => setCopyIconClicked(false)}
onMouseLeave={() => setTimeout(() => setCopyIconClicked(false), 333)}
size="small"
sx={(theme) => ({
color: theme.palette.text.secondary,
marginLeft: 0.5,
})}
>
<RiFileCopyLine />
</IconButton>
</Tooltip>
);
if (content === undefined || "value" in content) {
return content === undefined ||
!("link" in content) ||
content.link === undefined ? (
<Box sx={styles.contentContainer}>
<Typography
sx={styles.content}
variant="body2"
title={content?.value}
data-testid={`metadata-content-for-${label}`}
>
{content?.value ?? "-"}
</Typography>
{copyElement}
</Box>
) : content.link.startsWith("http") ? (
<Box sx={styles.contentContainer}>
<Link
sx={styles.content}
href={content.link}
data-testid={`metadata-content-for-${label}`}
>
{content.value}
</Link>
{copyElement}
</Box>
) : (
<Box sx={styles.contentContainer}>
<Link
sx={styles.content}
component={RouterLink}
to={content.link}
data-testid={`metadata-content-for-${label}`}
>
{content.value}
</Link>
{copyElement}
</Box>
);
}
return <div data-testid={`metadata-content-for-${label}`}>{content}</div>;
};
/**
* Renders the metadata list in a column format.
*/
const MetadataList: React.FC<{
metadataList: Metadata[];
}> = ({ metadataList }) => {
const filteredMetadataList = metadataList.filter(
({ isAvailable }) => isAvailable ?? true,
);
return (
<Box
sx={{
display: "grid",
gridTemplateColumns: "repeat(3, minmax(0, 1fr))",
rowGap: 1,
columnGap: 4,
}}
>
{filteredMetadataList.map(({ label, labelTooltip, content }, idx) => (
<Box key={idx} flex={1} paddingTop={0.5} paddingBottom={0.5}>
<Box display="flex" alignItems="center" marginBottom={0.5}>
<Typography
sx={{ color: (theme) => theme.palette.text.secondary }}
variant="body2"
>
{label}
</Typography>
{labelTooltip && (
<HelpInfo sx={{ marginLeft: 0.5 }}>{labelTooltip}</HelpInfo>
)}
</Box>
<MetadataContentField content={content} label={label} />
</Box>
))}
</Box>
);
};
/**
* Renders the Metadata UI with the header and metadata in a 3-column format.
*/
export const MetadataSection = ({
header,
metadataList,
footer,
}: {
header?: string;
metadataList: Metadata[];
footer?: JSX.Element;
}) => {
return (
<Section title={header} marginTop={1} marginBottom={4}>
<MetadataList metadataList={metadataList} />
<Box marginTop={1}>{footer}</Box>
</Section>
);
};
@@ -0,0 +1 @@
export * from "./MetadataSection";
@@ -0,0 +1,72 @@
import KeyboardArrowDownIcon from "@mui/icons-material/KeyboardArrowDown";
import KeyboardArrowRightIcon from "@mui/icons-material/KeyboardArrowRight";
import Box from "@mui/material/Box";
import IconButton from "@mui/material/IconButton";
import Tooltip from "@mui/material/Tooltip";
import React, { useEffect, useRef, useState } from "react";
export type OverflowCollapsibleCellProps = {
text: string;
maxWidth?: number;
wordBreak?: "break-all" | "break-word";
};
const OverflowCollapsibleCell = ({
text,
maxWidth = 100,
wordBreak = "break-word",
}: OverflowCollapsibleCellProps) => {
const [open, setOpen] = useState(false);
const [isOverflow, setIsOverflow] = useState(false);
const textRef = useRef<HTMLDivElement>(null);
useEffect(() => {
if (textRef.current) {
setIsOverflow(textRef.current.scrollWidth > textRef.current.clientWidth);
}
}, [text]);
return (
<Tooltip title={text} arrow>
<Box
sx={{
display: "flex",
flexDirection: "row",
alignItems: "center",
justifyContent: "center",
}}
>
<Box
ref={textRef}
sx={{
overflow: open ? "auto" : "hidden",
width: `${maxWidth}px`,
textOverflow: open ? "clip" : "ellipsis",
whiteSpace: open ? "normal" : "nowrap",
wordBreak,
}}
>
{text}
</Box>
<IconButton
aria-label="expand row"
size="small"
onClick={() => setOpen(!open)}
sx={{ display: isOverflow ? "block" : "none" }}
>
{open ? (
<KeyboardArrowDownIcon
sx={(theme) => ({ color: theme.palette.text.secondary })}
/>
) : (
<KeyboardArrowRightIcon
sx={(theme) => ({ color: theme.palette.text.secondary })}
/>
)}
</IconButton>
</Box>
</Tooltip>
);
};
export default OverflowCollapsibleCell;
@@ -0,0 +1,62 @@
import { Box, useTheme } from "@mui/material";
import React, { PropsWithChildren } from "react";
const PercentageBar = (
props: PropsWithChildren<{ num: number; total: number }>,
) => {
const { num, total } = props;
const per = Math.round((num / total) * 100);
const theme = useTheme();
return (
<Box
sx={{
background:
theme.palette.mode === "dark"
? "linear-gradient(45deg, #0D47A1ee 30%, #01579Bee 90%)"
: "linear-gradient(45deg, #21CBF3ee 30%, #2196F3ee 90%)",
border: `1px solid ${
theme.palette.mode === "dark" ? theme.palette.divider : "#ffffffbb"
}`,
padding: "0 12px",
height: 18,
lineHeight: "18px",
position: "relative",
boxSizing: "content-box",
borderRadius: "4px",
flexGrow: 1,
}}
>
<Box
sx={(theme) => ({
background: theme.palette.background.paper,
position: "absolute",
right: 0,
height: 18,
transition: "0.5s width",
borderRadius: "2px",
borderTopLeftRadius: 0,
borderBottomLeftRadius: 0,
border: "2px solid transparent",
boxSizing: "border-box",
width: `${Math.min(Math.max(0, 100 - per), 100)}%`,
})}
/>
<Box
sx={(theme) => ({
fontSize: 12,
zIndex: 2,
position: "relative",
color: theme.palette.text.primary,
width: "100%",
textAlign: "center",
whiteSpace: "nowrap",
})}
>
{props.children}
</Box>
</Box>
);
};
export default PercentageBar;
@@ -0,0 +1,398 @@
import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import React from "react";
import { PlacementGroup, PlacementGroupState } from "../type/placementGroup";
import { TEST_APP_WRAPPER } from "../util/test-utils";
import PlacementGroupTable from "./PlacementGroupTable";
const MOCK_PLACEMENT_GROUPS: PlacementGroup[] = [
{
placement_group_id: "pg-123456789",
name: "MyPlacementGroup1",
creator_job_id: "job-987654321",
state: PlacementGroupState.CREATED,
stats: {
scheduling_state: "SUCCESS",
},
bundles: [
{
bundle_id: "bundle-1",
node_id: "node-1",
unit_resources: {
cpu: 4,
memory: 8192,
},
label_selector: {
"test-label-key": "test-label-value",
},
},
{
bundle_id: "bundle-2",
node_id: null,
unit_resources: {
cpu: 2,
memory: 4096,
},
label_selector: null,
},
],
},
{
placement_group_id: "pg-987654321",
name: "MyPlacementGroup2",
creator_job_id: "job-123456789",
state: PlacementGroupState.PENDING,
stats: {
scheduling_state: "PENDING",
},
bundles: [
{
bundle_id: "bundle-3",
node_id: "node-2",
unit_resources: {
cpu: 8,
memory: 16384,
gpu: 1,
},
label_selector: {
"gpu-required": "true",
},
},
],
},
{
placement_group_id: "pg-555666777",
name: "MyPlacementGroup3",
creator_job_id: "job-987654321",
state: PlacementGroupState.REMOVED,
stats: null,
bundles: [
{
bundle_id: "bundle-4",
node_id: null,
unit_resources: {},
label_selector: {},
},
],
},
];
// These tests are slow because they involve a lot of interactivity.
// Clicking various buttons and waiting for the table to update.
// So we increase the timeout to 40 seconds.
jest.setTimeout(40000);
describe("PlacementGroupTable", () => {
it("renders a table of placement groups with all columns", () => {
render(<PlacementGroupTable placementGroups={MOCK_PLACEMENT_GROUPS} />, {
wrapper: TEST_APP_WRAPPER,
});
// Check that all column headers are present
const idHeaders = screen.getAllByText("ID");
expect(idHeaders.length).toBeGreaterThan(0);
const nameHeaders = screen.getAllByText("Name");
expect(nameHeaders.length).toBeGreaterThan(0);
const jobIdHeaders = screen.getAllByText("Job Id");
expect(jobIdHeaders.length).toBeGreaterThan(0);
const stateHeaders = screen.getAllByText("State");
expect(stateHeaders.length).toBeGreaterThan(0);
const reservedResourcesHeaders = screen.getAllByText("Reserved Resources");
expect(reservedResourcesHeaders.length).toBeGreaterThan(0);
const labelSelectorHeaders = screen.getAllByText("Label Selector");
expect(labelSelectorHeaders.length).toBeGreaterThan(0);
const topologyHeaders = screen.getAllByText("Topology");
expect(topologyHeaders.length).toBeGreaterThan(0);
const schedulingDetailHeaders = screen.getAllByText("Scheduling Detail");
expect(schedulingDetailHeaders.length).toBeGreaterThan(0);
// Check that placement group data is displayed
expect(screen.getByText("pg-123456789")).toBeInTheDocument();
expect(screen.getByText("MyPlacementGroup1")).toBeInTheDocument();
const jobIdElements = screen.getAllByText("job-987654321");
expect(jobIdElements.length).toBeGreaterThan(0);
expect(screen.getByText("SUCCESS")).toBeInTheDocument();
});
it("renders placement groups filtered by placement group ID", async () => {
const user = userEvent.setup();
render(<PlacementGroupTable placementGroups={MOCK_PLACEMENT_GROUPS} />, {
wrapper: TEST_APP_WRAPPER,
});
// Get the input directly by its label
const input = screen.getByLabelText("Placement group ID");
// Filter by placement group ID
await user.type(input, "pg-123456789");
// Wait for the filter to be applied
await new Promise((resolve) => setTimeout(resolve, 100));
// Check that only the filtered placement group is shown
const pg123Elements = screen.getAllByText("pg-123456789");
expect(pg123Elements.length).toBeGreaterThan(0);
// Check that other placement groups are not shown
expect(screen.queryByText("pg-987654321")).not.toBeInTheDocument();
expect(screen.queryByText("pg-555666777")).not.toBeInTheDocument();
});
it("renders placement groups filtered by state", async () => {
const user = userEvent.setup();
render(<PlacementGroupTable placementGroups={MOCK_PLACEMENT_GROUPS} />, {
wrapper: TEST_APP_WRAPPER,
});
// Get the input directly by its label
const input = screen.getByLabelText("State");
// Filter by state
await user.type(input, "CREATED");
// Wait for the filter to be applied
await new Promise((resolve) => setTimeout(resolve, 100));
// Check that only the filtered placement group is shown
expect(screen.queryByText("pg-123456789")).toBeInTheDocument();
expect(screen.queryByText("pg-987654321")).not.toBeInTheDocument();
expect(screen.queryByText("pg-555666777")).not.toBeInTheDocument();
});
it("renders placement groups filtered by job ID", async () => {
const user = userEvent.setup();
render(<PlacementGroupTable placementGroups={MOCK_PLACEMENT_GROUPS} />, {
wrapper: TEST_APP_WRAPPER,
});
// Get the input directly by its label
const input = screen.getByLabelText("Job Id");
// Filter by job ID
await user.type(input, "job-987654321");
// Wait for the filter to be applied
await new Promise((resolve) => setTimeout(resolve, 100));
// Check that only the filtered placement groups are shown
expect(screen.queryByText("pg-123456789")).toBeInTheDocument();
expect(screen.queryByText("pg-987654321")).not.toBeInTheDocument();
expect(screen.queryByText("pg-555666777")).toBeInTheDocument();
});
it("renders placement groups filtered by name", async () => {
const user = userEvent.setup();
render(<PlacementGroupTable placementGroups={MOCK_PLACEMENT_GROUPS} />, {
wrapper: TEST_APP_WRAPPER,
});
// Get the input directly by its label
const input = screen.getByLabelText("Name");
// Filter by name
await user.type(input, "MyPlacementGroup1");
// Wait for the filter to be applied
await new Promise((resolve) => setTimeout(resolve, 100));
// Check that only the filtered placement group is shown
const nameElements = screen.getAllByText("MyPlacementGroup1");
expect(nameElements.length).toBeGreaterThan(0);
// Check that other placement groups are not shown
expect(screen.queryByText("MyPlacementGroup2")).not.toBeInTheDocument();
expect(screen.queryByText("MyPlacementGroup3")).not.toBeInTheDocument();
});
it("renders placement groups with pagination", async () => {
const user = userEvent.setup();
render(<PlacementGroupTable placementGroups={MOCK_PLACEMENT_GROUPS} />, {
wrapper: TEST_APP_WRAPPER,
});
// Check that pagination controls are present
expect(screen.getByRole("navigation")).toBeInTheDocument();
// Change page size
const pageSizeInput = screen.getByLabelText("Page Size");
await user.clear(pageSizeInput);
await user.type(pageSizeInput, "2");
// Verify pagination works
expect(screen.getByText("pg-123456789")).toBeInTheDocument();
expect(screen.getByText("pg-987654321")).toBeInTheDocument();
expect(screen.queryByText("pg-555666777")).not.toBeInTheDocument();
});
it("renders placement groups with job ID prop", () => {
render(
<PlacementGroupTable
placementGroups={MOCK_PLACEMENT_GROUPS}
jobId="job-987654321"
/>,
{
wrapper: TEST_APP_WRAPPER,
},
);
// Check that the job ID filter is pre-populated
const jobIdFilter = screen.getByLabelText("Job Id");
expect(jobIdFilter).toHaveValue("job-987654321");
});
it("renders placement groups with empty bundles", () => {
const placementGroupsWithEmptyBundles = [
{
...MOCK_PLACEMENT_GROUPS[0],
bundles: [],
},
];
render(
<PlacementGroupTable placementGroups={placementGroupsWithEmptyBundles} />,
{
wrapper: TEST_APP_WRAPPER,
},
);
// Check that empty bundles are handled gracefully
expect(screen.getByText("pg-123456789")).toBeInTheDocument();
// Check that empty resources are handled - might be rendered as "[]" or not at all
const emptyResourceElements = screen.getAllByText("[]");
expect(emptyResourceElements.length).toBeGreaterThan(0);
});
it("renders placement groups with null stats", () => {
const placementGroupsWithNullStats = [
{
...MOCK_PLACEMENT_GROUPS[0],
stats: null,
},
];
render(
<PlacementGroupTable placementGroups={placementGroupsWithNullStats} />,
{
wrapper: TEST_APP_WRAPPER,
},
);
// Check that null stats are handled gracefully
expect(screen.getByText("pg-123456789")).toBeInTheDocument();
const dashes = screen.getAllByText("-");
expect(dashes.length).toBeGreaterThan(0); // Null scheduling detail and empty topology
});
it("renders placement groups with empty name", () => {
const placementGroupsWithEmptyName = [
{
...MOCK_PLACEMENT_GROUPS[0],
name: "",
},
];
render(
<PlacementGroupTable placementGroups={placementGroupsWithEmptyName} />,
{
wrapper: TEST_APP_WRAPPER,
},
);
// Check that empty names are handled gracefully
expect(screen.getByText("pg-123456789")).toBeInTheDocument();
const dashes = screen.getAllByText("-");
expect(dashes.length).toBeGreaterThan(0); // Empty name and empty topology
});
it("renders state counter for placement groups", () => {
render(<PlacementGroupTable placementGroups={MOCK_PLACEMENT_GROUPS} />, {
wrapper: TEST_APP_WRAPPER,
});
// Check that state counter is present by looking for the total count
expect(screen.getByText(/x 3/)).toBeInTheDocument(); // Total count of 3 placement groups
});
it("renders resource requirements as JSON dialog", () => {
render(<PlacementGroupTable placementGroups={MOCK_PLACEMENT_GROUPS} />, {
wrapper: TEST_APP_WRAPPER,
});
// Check that resource requirements are rendered as dialog buttons
// Look for the button text or check that the table cell contains resource data
const resourceCells = screen.getAllByText(/cpu|memory|gpu/i);
expect(resourceCells.length).toBeGreaterThan(0);
});
it("renders label selector as JSON dialog", () => {
render(<PlacementGroupTable placementGroups={MOCK_PLACEMENT_GROUPS} />, {
wrapper: TEST_APP_WRAPPER,
});
// Check that label selector is rendered as dialog buttons
// Look for the button text or check that the table cell contains label data
const labelCells = screen.getAllByText(/test-label-key|gpu-required/i);
expect(labelCells.length).toBeGreaterThan(0);
});
it("handles placement groups with different states", () => {
render(<PlacementGroupTable placementGroups={MOCK_PLACEMENT_GROUPS} />, {
wrapper: TEST_APP_WRAPPER,
});
// Check that different states are displayed by looking for the placement group rows
expect(screen.getByText("pg-123456789")).toBeInTheDocument();
expect(screen.getByText("pg-987654321")).toBeInTheDocument();
expect(screen.getByText("pg-555666777")).toBeInTheDocument();
// Check that the table contains the expected states (using getAllByText to handle multiple instances)
const createdElements = screen.getAllByText("CREATED");
const pendingElements = screen.getAllByText("PENDING");
const removedElements = screen.getAllByText("REMOVED");
expect(createdElements.length).toBeGreaterThan(0);
expect(pendingElements.length).toBeGreaterThan(0);
expect(removedElements.length).toBeGreaterThan(0);
});
it("renders empty table when no placement groups provided", () => {
render(<PlacementGroupTable placementGroups={[]} />, {
wrapper: TEST_APP_WRAPPER,
});
// Check that column headers are still present by looking for table headers specifically
const tableHeaders = screen.getAllByText("ID");
expect(tableHeaders.length).toBeGreaterThan(0);
const nameHeaders = screen.getAllByText("Name");
expect(nameHeaders.length).toBeGreaterThan(0);
const jobIdHeaders = screen.getAllByText("Job Id");
expect(jobIdHeaders.length).toBeGreaterThan(0);
const stateHeaders = screen.getAllByText("State");
expect(stateHeaders.length).toBeGreaterThan(0);
const reservedResourcesHeaders = screen.getAllByText("Reserved Resources");
expect(reservedResourcesHeaders.length).toBeGreaterThan(0);
const labelSelectorHeaders = screen.getAllByText("Label Selector");
expect(labelSelectorHeaders.length).toBeGreaterThan(0);
const topologyHeaders = screen.getAllByText("Topology");
expect(topologyHeaders.length).toBeGreaterThan(0);
const schedulingDetailHeaders = screen.getAllByText("Scheduling Detail");
expect(schedulingDetailHeaders.length).toBeGreaterThan(0);
// Check that no data rows are present
expect(screen.queryByText("pg-123456789")).not.toBeInTheDocument();
});
});
@@ -0,0 +1,247 @@
import {
Box,
InputAdornment,
SxProps,
Table,
TableBody,
TableCell,
TableHead,
TableRow,
TextField,
TextFieldProps,
Theme,
Tooltip,
} from "@mui/material";
import Autocomplete from "@mui/material/Autocomplete";
import Pagination from "@mui/material/Pagination";
import React, { useState } from "react";
import { CodeDialogButtonWithPreview } from "../common/CodeDialogButton";
import rowStyles from "../common/RowStyles";
import { sliceToPage } from "../common/util";
import { Bundle, PlacementGroup } from "../type/placementGroup";
import { useFilter } from "../util/hook";
import StateCounter from "./StatesCounter";
import { StatusChip } from "./StatusChip";
const BundleResourceRequirements = ({
bundles,
}: {
bundles: Bundle[];
sx?: SxProps<Theme>;
}) => {
const resources = bundles.map(({ unit_resources }) => unit_resources);
return (
<React.Fragment>
{Object.entries(resources).length > 0 ? (
<CodeDialogButtonWithPreview
title="Required resources"
code={JSON.stringify(resources, undefined, 2)}
/>
) : (
"[]"
)}
</React.Fragment>
);
};
const LabelSelector = ({
bundles,
}: {
bundles: Bundle[];
sx?: SxProps<Theme>;
}) => {
const labelSelector = bundles.map(({ label_selector }) => label_selector);
return (
<React.Fragment>
{Object.entries(labelSelector).length > 0 ? (
<CodeDialogButtonWithPreview
title="Label selector"
code={JSON.stringify(labelSelector, undefined, 2)}
/>
) : (
"[]"
)}
</React.Fragment>
);
};
const PlacementGroupTable = ({
placementGroups = [],
jobId = null,
}: {
placementGroups: PlacementGroup[];
jobId?: string | null;
}) => {
const [pageNo, setPageNo] = useState(1);
const { changeFilter, filterFunc } = useFilter();
const [pageSize, setPageSize] = useState(10);
const placementGroupList = placementGroups.filter(filterFunc);
const {
items: list,
constrainedPage,
maxPage,
} = sliceToPage(placementGroupList, pageNo, pageSize);
const columns = [
{ label: "ID" },
{ label: "Name" },
{ label: "Job Id" },
{ label: "State" },
{ label: "Reserved Resources" },
{ label: "Label Selector" },
{ label: "Topology" },
{ label: "Scheduling Detail" },
];
return (
<div>
<div style={{ flex: 1, display: "flex", alignItems: "center" }}>
<Autocomplete
style={{ margin: 8, width: 120 }}
options={Array.from(
new Set(placementGroups.map((e) => e.placement_group_id)),
)}
onInputChange={(_: any, value: string) => {
changeFilter("placement_group_id", value.trim());
}}
renderInput={(params: TextFieldProps) => (
<TextField {...params} label="Placement group ID" />
)}
/>
<Autocomplete
style={{ margin: 8, width: 120 }}
options={Array.from(new Set(placementGroups.map((e) => e.state)))}
onInputChange={(_: any, value: string) => {
changeFilter("state", value.trim());
}}
renderInput={(params: TextFieldProps) => (
<TextField {...params} label="State" />
)}
/>
<Autocomplete
style={{ margin: 8, width: 150 }}
defaultValue={jobId}
options={Array.from(
new Set(placementGroups.map((e) => e.creator_job_id)),
)}
onInputChange={(_: any, value: string) => {
changeFilter("creator_job_id", value.trim());
}}
renderInput={(params: TextFieldProps) => (
<TextField {...params} label="Job Id" />
)}
/>
<Autocomplete
style={{ margin: 8, width: 150 }}
options={Array.from(new Set(placementGroups.map((e) => e.name)))}
onInputChange={(_: any, value: string) => {
changeFilter("name", value.trim());
}}
renderInput={(params: TextFieldProps) => (
<TextField {...params} label="Name" />
)}
/>
<TextField
label="Page Size"
sx={{ margin: 1, width: 120 }}
size="small"
defaultValue={10}
InputProps={{
onChange: ({ target: { value } }) => {
setPageSize(Math.min(Number(value), 500) || 10);
},
endAdornment: (
<InputAdornment position="end">Per Page</InputAdornment>
),
}}
/>
</div>
<div style={{ display: "flex", alignItems: "center" }}>
<div>
<Pagination
page={constrainedPage}
onChange={(e, num) => setPageNo(num)}
count={maxPage}
/>
</div>
<div>
<StateCounter type="placementGroup" list={placementGroupList} />
</div>
</div>
<Box sx={{ overflowX: "scroll" }}>
<Table>
<TableHead>
<TableRow>
{columns.map(({ label }) => (
<TableCell align="center" key={label}>
<Box
display="flex"
justifyContent="center"
alignItems="center"
>
{label}
</Box>
</TableCell>
))}
</TableRow>
</TableHead>
<TableBody>
{list.map(
({
placement_group_id,
name,
creator_job_id,
state,
stats,
bundles,
topology_strategy,
topology_assignments,
}) => (
<TableRow key={placement_group_id}>
<TableCell align="center">
<Tooltip title={placement_group_id} arrow>
<Box sx={rowStyles.idCol}>{placement_group_id}</Box>
</Tooltip>
</TableCell>
<TableCell align="center">{name ? name : "-"}</TableCell>
<TableCell align="center">{creator_job_id}</TableCell>
<TableCell align="center">
<StatusChip type="placementGroup" status={state} />
</TableCell>
<TableCell align="center">
<BundleResourceRequirements bundles={bundles} />
</TableCell>
<TableCell align="center">
<LabelSelector bundles={bundles} />
</TableCell>
<TableCell align="center">
{topology_strategy ? (
<Box sx={{ textAlign: "left" }}>
<div>
<b>strategy:</b> {JSON.stringify(topology_strategy)}
</div>
<div>
<b>assignment:</b>{" "}
{topology_assignments
? JSON.stringify(topology_assignments)
: "-"}
</div>
</Box>
) : (
"-"
)}
</TableCell>
<TableCell align="center">
{stats ? stats.scheduling_state : "-"}
</TableCell>
</TableRow>
),
)}
</TableBody>
</Table>
</Box>
</div>
);
};
export default PlacementGroupTable;
@@ -0,0 +1,38 @@
import { render, screen } from "@testing-library/react";
import React from "react";
import { TEST_APP_WRAPPER } from "../../util/test-utils";
import { ProgressBar } from "./ProgressBar";
describe("ProgressBar", () => {
it("renders", async () => {
render(
<ProgressBar
progress={[
{
color: "blue",
label: "in progress",
value: 2,
},
{
color: "red",
label: "error",
value: 5,
},
{
color: "green",
label: "success",
value: 3,
},
]}
/>,
{ wrapper: TEST_APP_WRAPPER },
);
await screen.findByText(/error/);
expect(screen.getByText(/in progress/)).toBeInTheDocument();
expect(screen.getByText(/success/)).toBeInTheDocument();
const segments = screen.getAllByTestId("progress-bar-segment");
expect(segments).toHaveLength(3);
});
});
@@ -0,0 +1,337 @@
import { Box, TooltipProps, Typography, useTheme } from "@mui/material";
import React from "react";
import { RiArrowDownSLine, RiArrowRightSLine } from "react-icons/ri";
import { HelpInfo, StyledTooltip } from "../Tooltip";
export type ProgressBarSegment = {
/**
* Number of items in this segment
*/
value: number;
/**
* Name of this segment
*/
label: string;
/**
* Text to show to explain the segment better.
*/
hint?: string;
/**
* A CSS color used to represent the segment.
*/
color: string;
};
export type ProgressBarProps = {
/**
* The different segments to the progress bar.
* The order determines the order of which we show the segments on the page.
* Ex: [Succeeded: 5, Running: 2, Pending: 10]
*/
progress: ProgressBarSegment[];
/**
* The expected total number of items. If not provided, we calculate the total
* from the sum of the segments.
*
* If the sum of the values from each segment is less than total, then we create
* an additional segment for unaccounted items. This additional segment is placed
* at the end.
*/
total?: number;
/**
* Label for unaccounted for items i.e. items that are not part of a `progress` segment.
*/
unaccountedLabel?: string;
/**
* Whether a legend is shown. Default to true.
*/
showLegend?: boolean;
/**
* Whether to show the a legend as a tooltip.
*/
showTooltip?: boolean;
/**
* Whether to show the total progress to the right of the progress bar.
* Example: 5 / 20
* This should be set to the number that should be shown in the left side of the fraction.
* If this is undefined, don't show it.
*/
showTotalProgress?: number;
/**
* If true, we show an expanded icon to the left of the progress bar.
* If false, we show an unexpanded icon to the left of the progress bar.
* If undefined, we don't show any icon.
*/
expanded?: boolean;
onClick?: () => void;
/**
* Controls that can be put to the right of the legend.
*/
controls?: JSX.Element;
};
export const ProgressBar = ({
progress,
total,
unaccountedLabel,
showLegend = true,
showTooltip = false,
showTotalProgress,
expanded,
onClick,
controls,
}: ProgressBarProps) => {
const theme = useTheme();
const segmentTotal = progress.reduce((acc, { value }) => acc + value, 0);
const finalTotal = total ?? segmentTotal;
// TODO(aguo): Handle total being > segmentTotal
const segments =
segmentTotal < finalTotal
? [
...progress,
{
value: finalTotal - segmentTotal,
label: unaccountedLabel ?? "Unaccounted",
hint: "Unaccounted tasks can happen when there are too many tasks. Ray drops older tasks to conserve memory.",
color:
theme.palette.mode === "dark"
? theme.palette.grey[700]
: theme.palette.grey[300],
},
]
: progress;
const filteredSegments = segments.filter(({ value }) => value);
return (
<Box sx={{ display: "flex", flexDirection: "column" }}>
{(showLegend || controls) && (
<Box
display="flex"
justifyContent="space-between"
alignItems="center"
marginBottom={1}
>
{showLegend && (
<Box sx={{ display: "flex", flexDirection: "row" }}>
<Box
sx={{
display: "flex",
flexDirection: "row",
flexWrap: "nowrap",
alignItems: "center",
"&:not(:first-child)": {
marginLeft: 1.5,
},
"&:not(:last-child)": {
marginRight: 1.5,
},
}}
>
<Box
sx={{
width: 16,
height: 16,
borderRadius: "4px",
marginRight: 1,
backgroundColor: "text.primary",
}}
/>
<Typography>Total: {finalTotal}</Typography>
</Box>
{filteredSegments.map(({ value, label, hint, color }) => (
<Box
key={label}
sx={{
display: "flex",
flexDirection: "row",
flexWrap: "nowrap",
alignItems: "center",
"&:not(:first-child)": {
marginLeft: 1.5,
},
"&:not(:last-child)": {
marginRight: 1.5,
},
}}
>
<Box
sx={{
width: 16,
height: 16,
borderRadius: "4px",
marginRight: 1,
backgroundColor: color,
}}
/>
<Typography>
{label}: {value}
</Typography>
{hint && <HelpInfo sx={{ marginLeft: 0.5 }}>{hint}</HelpInfo>}
</Box>
))}
</Box>
)}
{controls && controls}
</Box>
)}
<Box
sx={{ display: "flex", flexDirection: "row", alignItems: "center" }}
onClick={onClick}
>
{expanded !== undefined &&
(expanded ? (
<Box
component={RiArrowDownSLine}
sx={(theme) => ({
width: 16,
height: 16,
marginRight: 1,
color: theme.palette.text.secondary,
})}
/>
) : (
<Box
component={RiArrowRightSLine}
sx={(theme) => ({
width: 16,
height: 16,
marginRight: 1,
color: theme.palette.text.secondary,
})}
/>
))}
<LegendTooltip
showTooltip={showTooltip}
total={finalTotal}
segments={filteredSegments}
>
<Box
sx={{
display: "flex",
flexDirection: "row",
flexWrap: "nowrap",
width: "100%",
height: 8,
borderRadius: "6px",
overflow: "hidden",
backgroundColor:
segmentTotal === 0
? theme.palette.grey[400]
: theme.palette.mode === "dark"
? theme.palette.grey[800]
: theme.palette.grey[100],
}}
>
{filteredSegments.map(({ color, label, value }) => (
<Box
component="span"
key={label}
sx={{
"&:not(:last-child)": {
marginRight: "1px",
},
flex: value,
backgroundColor: color,
}}
data-testid="progress-bar-segment"
/>
))}
</Box>
</LegendTooltip>
{showTotalProgress !== undefined && (
<Box
sx={{
flex: "1 0 40px",
marginLeft: 1,
textAlign: "end",
whiteSpace: "nowrap",
}}
>
{showTotalProgress} / {finalTotal}
</Box>
)}
</Box>
</Box>
);
};
type LegendTooltipProps = {
showTooltip: boolean;
segments: ProgressBarSegment[];
total: number;
children: TooltipProps["children"];
};
const LegendTooltip = ({
showTooltip,
segments,
total,
children,
}: LegendTooltipProps) => {
if (showTooltip) {
return (
<StyledTooltip
placement="right"
title={
<Box>
<Box
sx={{
display: "flex",
flexDirection: "row",
flexWrap: "nowrap",
alignItems: "center",
"&:not(:first-child)": {
marginTop: 1,
},
}}
>
<Box
sx={{
width: 16,
height: 16,
borderRadius: "4px",
marginRight: 1,
backgroundColor: "text.primary",
}}
/>
<Typography>Total: {total}</Typography>
</Box>
{segments.map(({ value, label, color }) => (
<Box
key={label}
sx={{
display: "flex",
flexDirection: "row",
flexWrap: "nowrap",
alignItems: "center",
"&:not(:first-child)": {
marginTop: 1,
},
}}
>
<Box
sx={{
width: 16,
height: 16,
borderRadius: "4px",
marginRight: 1,
backgroundColor: color,
}}
/>
<Typography>
{label}: {value}
</Typography>
</Box>
))}
</Box>
}
>
{children}
</StyledTooltip>
);
}
return children;
};
@@ -0,0 +1 @@
export * from "./ProgressBar";
@@ -0,0 +1,251 @@
import { SearchOutlined } from "@mui/icons-material";
import {
Autocomplete,
Box,
Divider,
InputAdornment,
MenuItem,
TextField,
Typography,
} from "@mui/material";
import React, { useEffect, useState } from "react";
import { formatTimeZone } from "../common/formatUtils";
import { timezones } from "../common/timezone";
import { TimezoneInfo } from "../pages/metrics/utils";
export const SearchInput = ({
label,
onChange,
defaultValue,
}: {
label: string;
defaultValue?: string;
onChange?: (value: string) => void;
}) => {
return (
<TextField
size="small"
label={label}
InputProps={{
onChange: ({ target: { value } }) => {
if (onChange) {
onChange(value);
}
},
defaultValue,
endAdornment: (
<InputAdornment position="end">
<SearchOutlined
sx={(theme) => ({ color: theme.palette.text.secondary })}
/>
</InputAdornment>
),
}}
/>
);
};
export const SearchSelect = ({
label,
onChange,
options,
showAllOption,
defaultValue,
}: {
label: string;
onChange?: (value: string) => void;
options: (string | [string, string])[];
showAllOption: boolean;
defaultValue?: string;
}) => {
return (
<TextField
size="small"
label={label}
select
SelectProps={{
onChange: ({ target: { value } }) => {
if (onChange) {
onChange(value as string);
}
},
style: {
width: 100,
},
}}
sx={(theme) => ({
"& .MuiSvgIcon-root": { color: theme.palette.text.secondary },
})}
defaultValue={defaultValue || ""}
>
{showAllOption ? <MenuItem value="">All</MenuItem> : null}
{options.map((e) =>
typeof e === "string" ? (
<MenuItem key={e} value={e}>
{e}
</MenuItem>
) : (
<MenuItem key={e[0]} value={e[0]}>
{e[1]}
</MenuItem>
),
)}
</TextField>
);
};
export const SearchTimezone = ({
serverTimeZone,
currentTimeZone,
}: {
serverTimeZone?: TimezoneInfo | null;
currentTimeZone?: string;
}) => {
const [timezone, setTimezone] = useState<string>("");
useEffect(() => {
if (currentTimeZone !== undefined) {
formatTimeZone(currentTimeZone);
setTimezone(currentTimeZone);
}
}, [currentTimeZone]);
const handleTimezoneChange = (value: string) => {
localStorage.setItem("timezone", value);
window.location.reload();
};
const options = timezones
.map((x) => x) // Create a copy
.sort((a, b) => a.group.localeCompare(b.group));
options.unshift({
value: "Etc/UTC",
utc: "GMT+00:00",
group: "System",
country: "Coordinated Universal Time",
});
const browserTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
const browserUtc = timezones.find((t) => t.value === browserTimezone)?.utc;
if (browserUtc) {
options.unshift({
value: browserTimezone,
utc: browserUtc,
group: "System",
country: "Browser Time",
});
}
const serverUtc =
serverTimeZone?.value &&
timezones.find((t) => t.value === serverTimeZone.value)?.utc;
if (serverUtc) {
options.unshift({
value: serverTimeZone.value,
utc: serverUtc,
group: "System",
country: "Dashboard Server Timezone",
});
}
const curUtc = timezones.find((t) => t.value === timezone)?.utc;
return (
<Autocomplete
size="small"
onChange={(event, newValue) => {
if (newValue) {
handleTimezoneChange(newValue.value);
}
}}
options={options}
getOptionLabel={(option) => option.value}
groupBy={(option) => option.group}
filterOptions={(options, { inputValue }) =>
options.filter(
(item) =>
item.value.includes(inputValue) ||
item.utc.includes(inputValue) ||
item.country.toLowerCase().includes(inputValue.toLowerCase()) ||
item.group.toLowerCase().includes(inputValue.toLowerCase()),
)
}
renderOption={(props, option) => (
<Box
component="li"
{...props}
sx={{
display: "flex",
justifyContent: "space-between",
}}
>
<Typography component="span" sx={{ marginRight: 1 }}>
{option.country}
</Typography>
<Typography
sx={(theme) => ({ color: theme.palette.text.secondary })}
component="span"
>
{option.value}
</Typography>
<Box sx={{ flexGrow: 1 }} />
<Typography component="span" sx={{ marginLeft: 1 }}>
{option.utc}
</Typography>
</Box>
)}
renderInput={(params) => (
<TextField
{...params}
sx={(theme) => ({
width: 120,
"& .MuiOutlinedInput-notchedOutline": {
borderColor: theme.palette.divider,
},
})}
placeholder={curUtc}
/>
)}
renderGroup={(params) => (
<li>
<Typography
sx={(theme) => ({
color: theme.palette.text.secondary,
paddingX: 2,
paddingY: "6px",
})}
>
{params.group}
</Typography>
<Box
component="ul"
sx={{
padding: 0,
}}
>
{params.children}
</Box>
<Divider
sx={{
marginX: 2,
marginY: 1,
}}
/>
</li>
)}
slotProps={{
paper: {
style: {
width: "400px",
},
},
popper: {
placement: "bottom-end",
style: {
width: "fit-content",
},
},
}}
/>
);
};
@@ -0,0 +1,31 @@
import { Grid } from "@mui/material";
import React from "react";
import { StatusChip } from "./StatusChip";
const StateCounter = ({
type,
list,
}: {
type: string;
list: { state: string }[];
}) => {
const stateMap = {} as { [state: string]: number };
list.forEach(({ state }) => {
stateMap[state] = stateMap[state] + 1 || 1;
});
return (
<Grid container spacing={2} alignItems="center">
<Grid item>
<StatusChip status="TOTAL" type={type} suffix={` x ${list.length}`} />
</Grid>
{Object.entries(stateMap).map(([s, num]) => (
<Grid key={s} item>
<StatusChip status={s} type={type} suffix={` x ${num}`} />
</Grid>
))}
</Grid>
);
};
export default StateCounter;
@@ -0,0 +1,168 @@
import { Box, Color, useTheme } from "@mui/material";
import { blue, blueGrey, cyan, green, red } from "@mui/material/colors";
import React, { CSSProperties, ReactNode } from "react";
import { TaskStatus } from "../pages/job/hook/useJobProgress";
import { ActorEnum } from "../type/actor";
import { JobStatus } from "../type/job";
import { PlacementGroupState } from "../type/placementGroup";
import {
ServeApplicationStatus,
ServeDeploymentStatus,
ServeReplicaState,
ServeSystemActorStatus,
} from "../type/serve";
// Use theme-aware colors for better accessibility
const getStatusColors = (themeMode: "light" | "dark") => ({
orange: themeMode === "dark" ? "#FF8C1A" : "#DB6D00",
grey: themeMode === "dark" ? "#8A8F94" : "#5F6469",
});
const getColorMap = (orange: string, grey: string) =>
({
node: {
ALIVE: green,
DEAD: grey,
},
worker: {
ALIVE: green,
DEAD: grey,
},
actor: {
[ActorEnum.ALIVE]: green,
[ActorEnum.DEAD]: grey,
[ActorEnum.DEPENDENCIES_UNREADY]: orange,
[ActorEnum.PENDING_CREATION]: orange,
[ActorEnum.RESTARTING]: orange,
},
task: {
[TaskStatus.FAILED]: red,
[TaskStatus.FINISHED]: green,
[TaskStatus.RUNNING]: blue,
[TaskStatus.SUBMITTED_TO_WORKER]: orange,
[TaskStatus.PENDING_NODE_ASSIGNMENT]: orange,
[TaskStatus.PENDING_ARGS_AVAIL]: orange,
[TaskStatus.UNKNOWN]: grey,
},
job: {
[JobStatus.PENDING]: orange,
[JobStatus.RUNNING]: blue,
[JobStatus.STOPPED]: grey,
[JobStatus.SUCCEEDED]: green,
[JobStatus.FAILED]: red,
},
placementGroup: {
[PlacementGroupState.PENDING]: orange,
[PlacementGroupState.CREATED]: green,
[PlacementGroupState.REMOVED]: grey,
[PlacementGroupState.RESCHEDULING]: orange,
},
serveApplication: {
[ServeApplicationStatus.NOT_STARTED]: grey,
[ServeApplicationStatus.DEPLOYING]: orange,
[ServeApplicationStatus.RUNNING]: green,
[ServeApplicationStatus.DEPLOY_FAILED]: red,
[ServeApplicationStatus.DELETING]: orange,
[ServeApplicationStatus.UNHEALTHY]: red,
},
serveDeployment: {
[ServeDeploymentStatus.UPDATING]: orange,
[ServeDeploymentStatus.HEALTHY]: green,
[ServeDeploymentStatus.UNHEALTHY]: red,
},
serveReplica: {
[ServeReplicaState.STARTING]: orange,
[ServeReplicaState.UPDATING]: orange,
[ServeReplicaState.RECOVERING]: orange,
[ServeReplicaState.RUNNING]: green,
[ServeReplicaState.STOPPING]: red,
[ServeReplicaState.STOPPED]: grey,
},
serveProxy: {
[ServeSystemActorStatus.HEALTHY]: green,
[ServeSystemActorStatus.UNHEALTHY]: red,
[ServeSystemActorStatus.STARTING]: orange,
[ServeSystemActorStatus.DRAINING]: blueGrey,
},
serveController: {
[ServeSystemActorStatus.HEALTHY]: green,
[ServeSystemActorStatus.UNHEALTHY]: red,
[ServeSystemActorStatus.STARTING]: orange,
},
severity: {
INFO: cyan,
WARNING: orange,
ERROR: red,
FATAL: red,
},
} as {
[key: string]: {
[key: string]: Color | string;
};
});
const typeMap = {
deps: blue,
INFO: cyan,
ERROR: red,
} as {
[key: string]: Color;
};
export type StatusChipProps = {
type: keyof ReturnType<typeof getColorMap>;
status: string | ActorEnum | ReactNode;
suffix?: ReactNode;
icon?: ReactNode;
};
export const StatusChip = ({ type, status, suffix, icon }: StatusChipProps) => {
const theme = useTheme();
const { orange, grey } = getStatusColors(theme.palette.mode);
const colorMap = getColorMap(orange, grey);
let color: Color | string = blueGrey;
if (typeMap[type]) {
color = typeMap[type];
} else if (
typeof status === "string" &&
colorMap[type] &&
colorMap[type][status]
) {
color = colorMap[type][status];
}
const colorValue = typeof color === "string" ? color : color[500];
const style: CSSProperties = {};
style.color = colorValue;
style.borderColor = colorValue;
if (color !== blueGrey) {
style.backgroundColor = `${colorValue}20`;
}
return (
<Box
component="span"
sx={{
padding: "2px 8px",
border: "solid 1px",
borderRadius: "4px",
fontSize: 12,
display: "inline-flex",
alignItems: "center",
}}
style={style}
>
{icon}
<Box
component="span"
sx={icon !== undefined ? { marginLeft: "4px" } : {}}
>
{status}
</Box>
<Box sx={{ marginLeft: 0.5 }}>{suffix}</Box>
</Box>
);
};
@@ -0,0 +1,389 @@
import {
Box,
InputAdornment,
Link,
Table,
TableBody,
TableCell,
TableHead,
TableRow,
TextField,
TextFieldProps,
Tooltip,
Typography,
} from "@mui/material";
import Autocomplete from "@mui/material/Autocomplete";
import Pagination from "@mui/material/Pagination";
import React, { useState } from "react";
import { Link as RouterLink } from "react-router-dom";
import { CodeDialogButton } from "../common/CodeDialogButton";
import { DurationText } from "../common/DurationText";
import { ActorLink, NodeLink } from "../common/links";
import {
TaskCpuProfilingLink,
TaskCpuStackTraceLink,
TaskMemoryProfilingButton,
} from "../common/ProfilingLink";
import rowStyles from "../common/RowStyles";
import { sliceToPage } from "../common/util";
import { Task } from "../type/task";
import { useFilter } from "../util/hook";
import StateCounter from "./StatesCounter";
import { StatusChip } from "./StatusChip";
import { HelpInfo } from "./Tooltip";
export type TaskTableProps = {
tasks: Task[];
jobId?: string;
filterToTaskId?: string;
onFilterChange?: () => void;
actorId?: string;
};
const TaskTable = ({
tasks = [],
jobId,
filterToTaskId,
onFilterChange,
actorId,
}: TaskTableProps) => {
const [pageNo, setPageNo] = useState(1);
const { changeFilter, filterFunc } = useFilter<keyof Task>({
overrideFilters:
filterToTaskId !== undefined
? [{ key: "task_id", val: filterToTaskId }]
: undefined,
onFilterChange,
});
const [taskIdFilterValue, setTaskIdFilterValue] = useState(filterToTaskId);
const [pageSize, setPageSize] = useState(10);
const taskList = tasks.filter(filterFunc);
const {
items: list,
constrainedPage,
maxPage,
} = sliceToPage(taskList, pageNo, pageSize);
const columns = [
{ label: "ID" },
{ label: "Name" },
{ label: "Job ID" },
{ label: "State" },
{
label: "Actions",
helpInfo: (
<Typography>
A list of actions performable on this task.
<br />
- Log: view log messages of the worker that ran this task. You can
only view all the logs of the worker and a worker can run multiple
tasks.
<br />- Error: For tasks that have failed, show a stack trace for the
faiure.
<br /> Stack Trace: Get a stacktrace of the worker process where the
task is running.
<br />- CPU Flame Graph: Get a flame graph of the next 5 seconds of
the worker process where the task is running.
</Typography>
),
},
{ label: "Duration" },
{ label: "Function or class name" },
{ label: "Node ID" },
{ label: "Actor ID" },
{ label: "Worker ID" },
{ label: "Type" },
{ label: "Placement group ID" },
{ label: "Required resources" },
{ label: "Label selector" },
];
return (
<div>
<div style={{ flex: 1, display: "flex", alignItems: "center" }}>
<Autocomplete
value={filterToTaskId ?? taskIdFilterValue}
inputValue={filterToTaskId ?? taskIdFilterValue}
style={{ margin: 8, width: 120 }}
options={Array.from(new Set(tasks.map((e) => e.task_id)))}
onInputChange={(_: any, value: string) => {
changeFilter("task_id", value.trim());
setTaskIdFilterValue(value);
}}
renderInput={(params: TextFieldProps) => (
<TextField {...params} label="Task ID" />
)}
/>
<Autocomplete
style={{ margin: 8, width: 120 }}
options={Array.from(new Set(tasks.map((e) => e.state)))}
onInputChange={(_: any, value: string) => {
changeFilter("state", value.trim());
}}
renderInput={(params: TextFieldProps) => (
<TextField {...params} label="State" />
)}
/>
<Autocomplete
style={{ margin: 8, width: 150 }}
defaultValue={filterToTaskId === undefined ? jobId : undefined}
options={Array.from(new Set(tasks.map((e) => e.job_id)))}
onInputChange={(_: any, value: string) => {
changeFilter("job_id", value.trim());
}}
renderInput={(params: TextFieldProps) => (
<TextField {...params} label="Job Id" />
)}
/>
<Autocomplete
style={{ margin: 8, width: 150 }}
defaultValue={filterToTaskId === undefined ? actorId : undefined}
options={Array.from(
new Set(tasks.map((e) => (e.actor_id ? e.actor_id : ""))),
)}
onInputChange={(_: any, value: string) => {
changeFilter("actor_id", value.trim());
}}
renderInput={(params: TextFieldProps) => (
<TextField {...params} label="Actor Id" />
)}
/>
<Autocomplete
style={{ margin: 8, width: 150 }}
options={Array.from(new Set(tasks.map((e) => e.name)))}
onInputChange={(_: any, value: string) => {
changeFilter("name", value.trim());
}}
renderInput={(params: TextFieldProps) => (
<TextField {...params} label="Name" />
)}
/>
<Autocomplete
style={{ margin: 8, width: 150 }}
options={Array.from(new Set(tasks.map((e) => e.func_or_class_name)))}
onInputChange={(_: any, value: string) => {
changeFilter("func_or_class_name", value.trim());
}}
renderInput={(params: TextFieldProps) => (
<TextField {...params} label="Function or Class Name" />
)}
/>
<TextField
label="Page Size"
sx={{ margin: 1, width: 120 }}
size="small"
defaultValue={10}
InputProps={{
onChange: ({ target: { value } }) => {
setPageSize(Math.min(Number(value), 500) || 10);
},
endAdornment: (
<InputAdornment position="end">Per Page</InputAdornment>
),
}}
/>
</div>
<div style={{ display: "flex", alignItems: "center" }}>
<div>
<Pagination
page={constrainedPage}
onChange={(e, num) => setPageNo(num)}
count={maxPage}
/>
</div>
<div>
<StateCounter type="task" list={taskList} />
</div>
</div>
<Box sx={{ overflowX: "scroll" }}>
<Table>
<TableHead>
<TableRow>
{columns.map(({ label, helpInfo }) => (
<TableCell align="center" key={label}>
<Box
display="flex"
justifyContent="center"
alignItems="center"
>
{label}
{helpInfo && (
<HelpInfo sx={{ marginLeft: 1 }}>{helpInfo}</HelpInfo>
)}
</Box>
</TableCell>
))}
</TableRow>
</TableHead>
<TableBody>
{list.map((task) => {
const {
task_id,
name,
job_id,
state,
func_or_class_name,
node_id,
actor_id,
placement_group_id,
type,
required_resources,
start_time_ms,
end_time_ms,
worker_id,
label_selector,
} = task;
return (
<TableRow key={task_id}>
<TableCell align="center">
<Tooltip title={task_id} arrow>
<Link
sx={rowStyles.idCol}
component={RouterLink}
to={`tasks/${task_id}`}
>
{task_id}
</Link>
</Tooltip>
</TableCell>
<TableCell align="center">{name ? name : "-"}</TableCell>
<TableCell align="center">{job_id}</TableCell>
<TableCell align="center">
<StatusChip type="task" status={state} />
</TableCell>
<TableCell align="center">
<TaskTableActions task={task} />
</TableCell>
<TableCell align="center">
{start_time_ms && start_time_ms > 0 ? (
<DurationText
startTime={start_time_ms}
endTime={end_time_ms}
/>
) : (
"-"
)}
</TableCell>
<TableCell align="center">{func_or_class_name}</TableCell>
<TableCell align="center">
<Tooltip title={node_id ? node_id : "-"} arrow>
{node_id ? (
<NodeLink sx={rowStyles.idCol} nodeId={node_id} />
) : (
<Box sx={rowStyles.idCol}>-</Box>
)}
</Tooltip>
</TableCell>
<TableCell align="center">
<Tooltip
sx={rowStyles.idCol}
title={actor_id ? actor_id : "-"}
arrow
>
{actor_id ? (
<ActorLink sx={rowStyles.idCol} actorId={actor_id} />
) : (
<Box sx={rowStyles.idCol}>-</Box>
)}
</Tooltip>
</TableCell>
<TableCell align="center">
<Tooltip title={worker_id ? worker_id : "-"} arrow>
<Box sx={rowStyles.idCol}>
{worker_id ? worker_id : "-"}
</Box>
</Tooltip>
</TableCell>
<TableCell align="center">{type}</TableCell>
<TableCell align="center">
<Tooltip
title={placement_group_id ? placement_group_id : "-"}
arrow
>
<Box sx={rowStyles.idCol}>
{placement_group_id ? placement_group_id : "-"}
</Box>
</Tooltip>
</TableCell>
<TableCell align="center">
{Object.entries(required_resources || {}).length > 0 ? (
<CodeDialogButton
title="Required resources"
code={JSON.stringify(required_resources, undefined, 2)}
/>
) : (
"{}"
)}
</TableCell>
<TableCell align="center">
{Object.entries(label_selector || {}).length > 0 ? (
<CodeDialogButton
title="Label selector"
code={JSON.stringify(label_selector, undefined, 2)}
/>
) : (
"{}"
)}
</TableCell>
</TableRow>
);
})}
</TableBody>
</Table>
</Box>
</div>
);
};
export default TaskTable;
type TaskTableActionsProps = {
task: Task;
};
const TaskTableActions = ({ task }: TaskTableActionsProps) => {
const errorDetails =
task.error_type !== null && task.error_message !== null
? `Error Type: ${task.error_type}\n\n${task.error_message}`
: undefined;
const isTaskActive = task.state === "RUNNING" && task.worker_id;
return (
<React.Fragment>
<Link component={RouterLink} to={`tasks/${task.task_id}`}>
Log
</Link>
{isTaskActive && (
<React.Fragment>
<br />
<TaskCpuProfilingLink
taskId={task.task_id}
attemptNumber={task.attempt_number}
nodeId={task.node_id}
/>
<br />
<TaskCpuStackTraceLink
taskId={task.task_id}
attemptNumber={task.attempt_number}
nodeId={task.node_id}
/>
<br />
<TaskMemoryProfilingButton
taskId={task.task_id}
attemptNumber={task.attempt_number}
nodeId={task.node_id}
/>
</React.Fragment>
)}
<br />
{errorDetails && (
<CodeDialogButton
title="Error details"
code={errorDetails}
buttonText="Error"
/>
)}
</React.Fragment>
);
};
@@ -0,0 +1,35 @@
import { Box, Paper } from "@mui/material";
import React, { PropsWithChildren, ReactNode } from "react";
const TitleCard = ({
title,
children,
}: PropsWithChildren<{ title?: ReactNode | string }>) => {
return (
<Paper
sx={{
padding: 2,
paddingTop: 1.5,
marginX: 1,
marginY: 2,
}}
elevation={0}
>
{title && (
<Box
sx={(theme) => ({
fontSize: theme.typography.fontSize + 2,
fontWeight: 500,
color: theme.palette.text.secondary,
marginBottom: 1,
})}
>
{title}
</Box>
)}
<Box>{children}</Box>
</Paper>
);
};
export default TitleCard;
@@ -0,0 +1,41 @@
import HelpOutlineIcon from "@mui/icons-material/HelpOutline";
import { SxProps, Theme, Tooltip, TooltipProps } from "@mui/material";
import React, { ReactNode } from "react";
export const StyledTooltip = (props: TooltipProps) => {
return (
<Tooltip
componentsProps={{
tooltip: {
sx: (theme) => ({
backgroundColor: theme.palette.background.paper,
border: `1px solid ${theme.palette.divider}`,
color: theme.palette.text.primary,
padding: 1,
}),
},
}}
{...props}
/>
);
};
type HelpInfoProps = {
children: NonNullable<ReactNode>;
className?: string;
sx?: SxProps<Theme>;
};
export const HelpInfo = ({ children, className, sx }: HelpInfoProps) => {
return (
<StyledTooltip className={className} title={children}>
<HelpOutlineIcon
fontSize="small"
sx={[
{ color: (theme) => theme.palette.text.secondary },
...(Array.isArray(sx) ? sx : [sx]),
]}
/>
</StyledTooltip>
);
};
@@ -0,0 +1,372 @@
import { KeyboardArrowDown, KeyboardArrowRight } from "@mui/icons-material";
import {
Box,
Button,
Grid,
IconButton,
Table,
TableBody,
TableCell,
TableContainer,
TableHead,
TableRow,
Tooltip,
} from "@mui/material";
import React, {
PropsWithChildren,
ReactNode,
useContext,
useEffect,
useState,
} from "react";
import { Link } from "react-router-dom";
import { GlobalContext } from "../App";
import { formatDateFromTimeMs } from "../common/formatUtils";
import { ActorDetail } from "../type/actor";
import { CoreWorkerStats, Worker } from "../type/worker";
import { memoryConverter } from "../util/converter";
import { longTextCut } from "../util/func";
import { useFilter } from "../util/hook";
import ActorTable from "./ActorTable";
import PercentageBar from "./PercentageBar";
import { SearchInput } from "./SearchComponent";
export const ExpandableTableRow = ({
children,
expandComponent,
length,
stateKey = "",
...otherProps
}: PropsWithChildren<{
expandComponent: ReactNode;
length: number;
stateKey?: string;
}>) => {
const [isExpanded, setIsExpanded] = React.useState(false);
useEffect(() => {
if (stateKey.startsWith("ON")) {
setIsExpanded(true);
} else if (stateKey.startsWith("OFF")) {
setIsExpanded(false);
}
}, [stateKey]);
if (length < 1) {
return (
<TableRow {...otherProps}>
<TableCell padding="checkbox" />
{children}
</TableRow>
);
}
return (
<React.Fragment>
<TableRow {...otherProps}>
<TableCell padding="checkbox">
<IconButton
style={{ color: "inherit" }}
onClick={() => setIsExpanded(!isExpanded)}
size="large"
>
{length}
{isExpanded ? (
<KeyboardArrowDown
sx={(theme) => ({ color: theme.palette.text.secondary })}
/>
) : (
<KeyboardArrowRight
sx={(theme) => ({ color: theme.palette.text.secondary })}
/>
)}
</IconButton>
</TableCell>
{children}
</TableRow>
{isExpanded && (
<TableRow>
<TableCell colSpan={24}>{expandComponent}</TableCell>
</TableRow>
)}
</React.Fragment>
);
};
const WorkerDetailTable = ({
actorMap,
coreWorkerStats,
}: {
actorMap: { [actorId: string]: ActorDetail };
coreWorkerStats: CoreWorkerStats[];
}) => {
const actors = {} as { [actorId: string]: ActorDetail };
(coreWorkerStats || [])
.filter((e) => actorMap[e.actorId])
.forEach((e) => {
if (actorMap[e.actorId]) {
actors[e.actorId] = {
...actorMap[e.actorId],
workerId: e.workerId || "N/A",
};
}
});
if (!Object.values(actors).length) {
return <p>The Worker Haven't Had Related Actor Yet.</p>;
}
return (
<TableContainer>
<ActorTable actors={actors} detailPathPrefix="/actors" />
</TableContainer>
);
};
const RayletWorkerTable = ({
workers = [],
actorMap,
mini,
}: {
workers: Worker[];
actorMap: { [actorId: string]: ActorDetail };
mini?: boolean;
}) => {
const { changeFilter, filterFunc } = useFilter();
const [key, setKey] = useState("");
const { nodeMapByIp } = useContext(GlobalContext);
const open = () => setKey(`ON${Math.random()}`);
const close = () => setKey(`OFF${Math.random()}`);
return (
<React.Fragment>
{!mini && (
<div style={{ display: "flex", alignItems: "center" }}>
<SearchInput
label="Pid"
onChange={(value) => changeFilter("pid", value)}
/>
<SearchInput
label="Worker ID"
onChange={(value) =>
changeFilter("coreWorkerStats.0.workerId", value)
}
/>
<Button onClick={open}>Expand All</Button>
<Button onClick={close}>Collapse All</Button>
</div>
)}{" "}
<Table>
<TableHead>
<TableRow>
{[
"",
"Pid",
"Worker ID",
"CPU",
"CPU Times",
"Memory",
"CMD Line",
"Create Time",
"Log",
"Ops",
"IP",
"Tasks",
"Objects",
].map((col) => (
<TableCell align="center" key={col}>
{col}
</TableCell>
))}
</TableRow>
</TableHead>
<TableBody>
{workers
.filter(filterFunc)
.sort((aWorker, bWorker) => {
const a =
(aWorker.coreWorkerStats || []).filter(
(e) => actorMap[e.actorId],
).length || 0;
const b =
(bWorker.coreWorkerStats || []).filter(
(e) => actorMap[e.actorId],
).length || 0;
return b - a;
})
.map(
({
pid,
cpuPercent,
cpuTimes,
memoryInfo,
cmdline,
createTime,
coreWorkerStats = [],
language,
}) => (
<ExpandableTableRow
expandComponent={
<WorkerDetailTable
actorMap={actorMap}
coreWorkerStats={coreWorkerStats}
/>
}
length={
(coreWorkerStats || []).filter((e) => actorMap[e.actorId])
.length
}
key={pid}
stateKey={key}
>
<TableCell align="center">{pid}</TableCell>
<TableCell align="center">
{coreWorkerStats[0]?.workerId ? (
<Tooltip title={coreWorkerStats[0].workerId} arrow>
<Box
sx={{
maxWidth: "120px",
overflow: "hidden",
textOverflow: "ellipsis",
whiteSpace: "nowrap",
}}
>
{coreWorkerStats[0].workerId}
</Box>
</Tooltip>
) : (
"N/A"
)}
</TableCell>
<TableCell align="center">
<PercentageBar num={Number(cpuPercent)} total={100}>
{cpuPercent}%
</PercentageBar>
</TableCell>
<TableCell align="center">
<div style={{ maxHeight: 55, overflow: "auto" }}>
{Object.entries(cpuTimes || {}).map(([key, val]) => (
<div style={{ margin: 4 }}>
{key}:{val}%
</div>
))}
</div>
</TableCell>
<TableCell align="center">
<div style={{ maxHeight: 55, overflow: "auto" }}>
{Object.entries(memoryInfo || {}).map(([key, val]) => (
<div style={{ margin: 4 }}>
{key}:{memoryConverter(val)}
</div>
))}
</div>
</TableCell>
<TableCell align="center" style={{ lineBreak: "anywhere" }}>
{cmdline && longTextCut(cmdline.filter((e) => e).join(" "))}
</TableCell>
<TableCell align="center">
{formatDateFromTimeMs(createTime * 1000)}
</TableCell>
<TableCell align="center">
<Grid container spacing={2}>
{coreWorkerStats[0] && (
<Grid item>
<Link
target="_blank"
to={`/logs/?nodeId=${encodeURIComponent(
nodeMapByIp[coreWorkerStats[0].ipAddress],
)}&fileName=${
coreWorkerStats[0].jobId || ""
}-${pid}`}
>
Log
</Link>
</Grid>
)}
</Grid>
</TableCell>
<TableCell align="center">
{language === "JAVA" ? (
<div>
<Button
onClick={() => {
window.open(
`#/cmd/jstack/${coreWorkerStats[0]?.ipAddress}/${pid}`,
);
}}
>
jstack
</Button>{" "}
<Button
onClick={() => {
window.open(
`#/cmd/jmap/${coreWorkerStats[0]?.ipAddress}/${pid}`,
);
}}
>
jmap
</Button>
<Button
onClick={() => {
window.open(
`#/cmd/jstat/${coreWorkerStats[0]?.ipAddress}/${pid}`,
);
}}
>
jstat
</Button>
</div>
) : (
"N/A"
)}
</TableCell>
<TableCell align="center">
{nodeMapByIp[coreWorkerStats[0]?.ipAddress] ? (
<Link
target="_blank"
to={`/cluster/nodes/${
nodeMapByIp[coreWorkerStats[0]?.ipAddress]
}`}
>
{coreWorkerStats[0]?.ipAddress}
</Link>
) : (
coreWorkerStats[0]?.ipAddress
)}
</TableCell>
<TableCell align="center">
<div>
Pending tasks: {coreWorkerStats[0]?.numPendingTasks}
</div>
<div>
Executed tasks: {coreWorkerStats[0]?.numExecutedTasks}
</div>
</TableCell>
<TableCell align="center">
<div>
ObjectRefs in scope:{" "}
{coreWorkerStats[0]?.numObjectRefsInScope}
</div>
<div>
Objects in local memory store:{" "}
{coreWorkerStats[0]?.numLocalObjects}
</div>
<div>
Objects in plasma store: {coreWorkerStats[0]?.numInPlasma}
</div>
<div>
Object store Memory used (MiB):{" "}
{coreWorkerStats[0]?.usedObjectStoreMemory}
</div>
</TableCell>
</ExpandableTableRow>
),
)}
</TableBody>
</Table>
</React.Fragment>
);
};
export default RayletWorkerTable;
+12
View File
@@ -0,0 +1,12 @@
import React from "react";
import { createRoot } from "react-dom/client";
import "typeface-roboto";
import App from "./App";
const rootElement = document.getElementById("root");
if (rootElement !== null) {
const root = createRoot(rootElement);
root.render(<App />);
} else {
console.error("Could not find root element.");
}
+34
View File
@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.6, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="ray" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 144.5 144.6" style="enable-background:new 0 0 144.5 144.6;" xml:space="preserve">
<style type="text/css">
.st0{fill:url(#SVGID_1_);}
</style>
<title>Ray Logo</title>
<g>
<g id="layer-1">
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="31.9659" y1="112.5396" x2="112.4544" y2="32.0512">
<stop offset="0.3" style="stop-color:#1976D2"/>
<stop offset="0.9" style="stop-color:#0091EA"/>
</linearGradient>
<path class="st0" d="M97.3,77.2c-3.8-1.1-6.2,0.9-8.3,5.1c-3.5,6.8-9.9,9.9-17.4,9.6S58,88.1,54.8,81.2c-1.4-3-3-4-6.3-4.1
c-5.6-0.1-9.9,0.1-13.1,6.4c-3.8,7.6-13.6,10.2-21.8,7.6C5.2,88.4-0.4,80.5,0,71.7c0.1-8.4,5.7-15.8,13.8-18.2
c8.4-2.6,17.5,0.7,22.3,8c1.3,1.9,1.3,5.2,3.6,5.6c3.9,0.6,8,0.2,12,0.2c1.8,0,1.9-1.6,2.4-2.8c3.5-7.8,9.7-11.8,18-11.9
c8.2-0.1,14.4,3.9,17.8,11.4c1.3,2.8,2.9,3.6,5.7,3.3c1-0.1,2,0.1,3,0c2.8-0.5,6.4,1.7,8.1-2.7s-2.3-5.5-4.1-7.5
c-5.1-5.7-10.9-10.8-16.1-16.3C84,38,81.9,37.1,78,38.3C66.7,42,56.2,35.7,53,24.1C50.3,14,57.3,2.8,67.7,0.5
C78.4-2,89,4.7,91.5,15.3c0.1,0.3,0.1,0.5,0.2,0.8c0.7,3.4,0.7,6.9-0.8,9.8c-1.7,3.2-0.8,5,1.5,7.2c6.7,6.5,13.3,13,19.8,19.7
c1.8,1.8,3,2.1,5.5,1.2c9.1-3.4,17.9-0.6,23.4,7c4.8,6.9,4.6,16.1-0.4,22.9c-5.4,7.2-14.2,9.9-23.1,6.5c-2.3-0.9-3.5-0.6-5.1,1.1
c-6.7,6.9-13.6,13.7-20.5,20.4c-1.8,1.8-2.5,3.2-1.4,5.9c3.5,8.7,0.3,18.6-7.7,23.6c-7.9,5-18.2,3.8-24.8-2.9
c-6.4-6.4-7.4-16.2-2.5-24.3c4.9-7.8,14.5-11,23.1-7.8c3,1.1,4.7,0.5,6.9-1.7C91.7,98.4,98,92.3,104.2,86c1.6-1.6,4.1-2.7,2.6-6.2
c-1.4-3.3-3.8-2.5-6.2-2.6C99.8,77.2,98.9,77.2,97.3,77.2z M72.1,29.7c5.5,0.1,9.9-4.3,10-9.8c0-0.1,0-0.2,0-0.3
C81.8,14,77,9.8,71.5,10.2c-5,0.3-9,4.2-9.3,9.2c-0.2,5.5,4,10.1,9.5,10.3C71.8,29.7,72,29.7,72.1,29.7z M72.3,62.3
c-5.4-0.1-9.9,4.2-10.1,9.7c0,0.2,0,0.3,0,0.5c0.2,5.4,4.5,9.7,9.9,10c5.1,0.1,9.9-4.7,10.1-9.8c0.2-5.5-4-10-9.5-10.3
C72.6,62.3,72.4,62.3,72.3,62.3z M115,72.5c0.1,5.4,4.5,9.7,9.8,9.9c5.6-0.2,10-4.8,10-10.4c-0.2-5.4-4.6-9.7-10-9.7
c-5.3-0.1-9.8,4.2-9.9,9.5C115,72.1,115,72.3,115,72.5z M19.5,62.3c-5.4,0.1-9.8,4.4-10,9.8c-0.1,5.1,5.2,10.4,10.2,10.3
c5.6-0.2,10-4.9,9.8-10.5c-0.1-5.4-4.5-9.7-9.9-9.6C19.6,62.3,19.5,62.3,19.5,62.3z M71.8,134.6c5.9,0.2,10.3-3.9,10.4-9.6
c0.5-5.5-3.6-10.4-9.1-10.8c-5.5-0.5-10.4,3.6-10.8,9.1c0,0.5,0,0.9,0,1.4c-0.2,5.3,4,9.8,9.3,10
C71.6,134.6,71.7,134.6,71.8,134.6z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

@@ -0,0 +1,293 @@
import { Box } from "@mui/material";
import React from "react";
import { Outlet } from "react-router-dom";
import {
CodeDialogButton,
CodeDialogButtonWithPreview,
} from "../../common/CodeDialogButton";
import { CollapsibleSection } from "../../common/CollapsibleSection";
import { DurationText } from "../../common/DurationText";
import { formatDateFromTimeMs } from "../../common/formatUtils";
import { generateNodeLink } from "../../common/links";
import {
CpuProfilingLink,
CpuStackTraceLink,
MemoryProfilingButton,
} from "../../common/ProfilingLink";
import { Section } from "../../common/Section";
import Loading from "../../components/Loading";
import { MetadataSection } from "../../components/MetadataSection";
import { StatusChip } from "../../components/StatusChip";
import TitleCard from "../../components/TitleCard";
import { MainNavPageInfo } from "../layout/mainNavContext";
import TaskList from "../state/task";
import { ActorLogs } from "./ActorLogs";
import { useActorDetail } from "./hook/useActorDetail";
export const ActorDetailLayout = () => {
const { params, actorDetail } = useActorDetail();
return (
<div>
<MainNavPageInfo
pageInfo={
actorDetail
? {
title: `${params.actorId}`,
pageTitle: `${params.actorId} | Actor`,
id: "actor-detail",
path: `${params.actorId}`,
}
: {
id: "actor-detail",
title: "Actor",
path: `${params.actorId}`,
}
}
/>
<Outlet />
</div>
);
};
const ActorDetailPage = () => {
const { params, actorDetail, msg, isLoading } = useActorDetail();
if (isLoading || actorDetail === undefined) {
return (
<Box
sx={(theme) => ({
padding: 2,
backgroundColor: theme.palette.background.paper,
})}
>
<Loading loading={isLoading} />
<TitleCard title={`ACTOR - ${params.actorId}`}>
<StatusChip type="actor" status="LOADING" />
<br />
Request Status: {msg} <br />
</TitleCard>
</Box>
);
}
return (
<Box
sx={(theme) => ({
padding: 2,
backgroundColor: theme.palette.background.paper,
})}
>
<MetadataSection
metadataList={[
{
label: "State",
content: <StatusChip type="actor" status={actorDetail.state} />,
},
{
label: "ID",
content: actorDetail.actorId
? {
value: actorDetail.actorId,
copyableValue: actorDetail.actorId,
}
: { value: "-" },
},
{
label: "Name",
content: actorDetail.name
? {
value: actorDetail.name,
}
: { value: "-" },
},
{
label: "Class Name",
content: actorDetail.actorClass
? {
value: actorDetail.actorClass,
}
: { value: "-" },
},
{
label: "Repr",
content: actorDetail.reprName
? {
value: actorDetail.reprName,
}
: { value: "-" },
},
{
label: "Job ID",
content: actorDetail.jobId
? {
value: actorDetail.jobId,
copyableValue: actorDetail.jobId,
}
: { value: "-" },
},
{
label: "Node ID",
content: actorDetail.address?.nodeId
? {
value: actorDetail.address?.nodeId,
copyableValue: actorDetail.address?.nodeId,
link: actorDetail.address.nodeId
? generateNodeLink(actorDetail.address.nodeId)
: undefined,
}
: { value: "-" },
},
{
label: "Worker ID",
content: actorDetail.address?.workerId
? {
value: actorDetail.address?.workerId,
copyableValue: actorDetail.address?.workerId,
}
: { value: "-" },
},
{
label: "PID",
content: actorDetail.pid
? {
value: `${actorDetail.pid}`,
copyableValue: `${actorDetail.pid}`,
}
: { value: "-" },
},
{
label: "Started at",
content: {
value: actorDetail.startTime
? formatDateFromTimeMs(actorDetail.startTime)
: "-",
},
},
{
label: "Ended at",
content: {
value: actorDetail.endTime
? formatDateFromTimeMs(actorDetail.endTime)
: "-",
},
},
{
label: "Uptime",
content: actorDetail.startTime ? (
<DurationText
startTime={actorDetail.startTime}
endTime={actorDetail.endTime}
/>
) : (
<React.Fragment>-</React.Fragment>
),
},
{
label: "Restarted",
content: { value: actorDetail.numRestarts },
},
{
label: "Exit Detail",
content: actorDetail.exitDetail
? {
value: actorDetail.exitDetail,
}
: { value: "-" },
},
{
label: "Actions",
content: (
<div>
<CpuStackTraceLink
pid={actorDetail.pid}
nodeId={actorDetail.address?.nodeId}
type=""
/>
<br />
<CpuProfilingLink
pid={actorDetail.pid}
nodeId={actorDetail.address?.nodeId}
type=""
/>
<br />
<MemoryProfilingButton
pid={actorDetail.pid}
nodeId={actorDetail.address?.nodeId}
type=""
/>
</div>
),
},
{
label: "Call site",
content: (
<Box display="inline-block">
<CodeDialogButton
title="Call site"
code={
actorDetail.callSite ||
'Call site not recorded. To enable, set environment variable "RAY_record_task_actor_creation_sites" to "true".'
}
/>
</Box>
),
},
{
label: "Required Resources",
content: (
<Box display="inline-block">
{Object.entries(actorDetail.requiredResources || {}).length >
0 ? (
<CodeDialogButtonWithPreview
sx={{ maxWidth: 200 }}
title="Required resources"
code={JSON.stringify(
actorDetail.requiredResources,
undefined,
2,
)}
/>
) : (
"{}"
)}
</Box>
),
},
{
label: "Label Selector",
content: (
<Box display="inline-block">
{Object.entries(actorDetail.labelSelector || {}).length > 0 ? (
<CodeDialogButtonWithPreview
sx={{ maxWidth: 200 }}
title="Label selector"
code={JSON.stringify(
actorDetail.labelSelector,
undefined,
2,
)}
/>
) : (
"{}"
)}
</Box>
),
},
]}
/>
<CollapsibleSection title="Logs" startExpanded>
<Section noTopPadding>
<ActorLogs actor={actorDetail} />
</Section>
</CollapsibleSection>
<CollapsibleSection title="Tasks History" sx={{ marginTop: 4 }}>
<Section>
<TaskList jobId={actorDetail.jobId} actorId={params.actorId} />
</Section>
</CollapsibleSection>
</Box>
);
};
export default ActorDetailPage;
@@ -0,0 +1,18 @@
import React from "react";
import { Outlet } from "react-router-dom";
import { MainNavPageInfo } from "../layout/mainNavContext";
export const ActorLayout = () => {
return (
<div>
<MainNavPageInfo
pageInfo={{
id: "actors",
title: "Actors",
path: "/actors",
}}
/>
<Outlet />
</div>
);
};
@@ -0,0 +1,32 @@
import React from "react";
import ActorTable, { ActorTableProps } from "../../components/ActorTable";
import { ActorDetail } from "../../type/actor";
import { useActorList } from "./hook/useActorList";
/**
* Represent the embedable actors page.
*/
const ActorList = ({
jobId = null,
detailPathPrefix = "",
...actorTableProps
}: {
jobId?: string | null;
detailPathPrefix?: string;
} & Pick<ActorTableProps, "filterToActorId" | "onFilterChange">) => {
const data: { [actorId: string]: ActorDetail } | undefined = useActorList();
const actors: { [actorId: string]: ActorDetail } = data ? data : {};
return (
<div>
<ActorTable
actors={actors}
jobId={jobId}
detailPathPrefix={detailPathPrefix}
{...actorTableProps}
/>
</div>
);
};
export default ActorList;
@@ -0,0 +1,38 @@
import React from "react";
import {
MultiTabLogViewer,
MultiTabLogViewerTabDetails,
} from "../../common/MultiTabLogViewer";
import { ActorDetail } from "../../type/actor";
export type ActorLogsProps = {
actor: Pick<ActorDetail, "actorId" | "address" | "pid">;
};
export const ActorLogs = ({
actor: {
actorId,
pid,
address: { workerId, nodeId },
},
}: ActorLogsProps) => {
const tabs: MultiTabLogViewerTabDetails[] = [
{
title: "stderr",
actorId,
suffix: "err",
},
{
title: "stdout",
actorId,
suffix: "out",
},
{
title: "system",
nodeId: nodeId,
// TODO(aguo): Have API return the log file name.
filename: `python-core-worker-${workerId}_${pid}.log`,
},
];
return <MultiTabLogViewer tabs={tabs} contextKey="actors-page" />;
};
@@ -0,0 +1,123 @@
import { Actor } from "../../../type/actor";
const MOCK_ACTORS: { [actorId: string]: Actor } = {
ACTOR_1: {
actorId: "ACTOR_1",
jobId: "01000000",
address: {
nodeId: "426854e68e4225b3941deaf03c8dcfcb1daacc69a92711d370dbb0e1",
ipAddress: "172.31.11.178",
port: 10003,
workerId: "b8b276a03612644098ed7a929c3b0e50f5bde894eb0d8cab288fbb6d",
},
state: "ALIVE",
numRestarts: "0",
name: "",
pid: 25321,
startTime: 1679010689148,
endTime: 0,
actorClass: "Counter",
exitDetail: "-",
requiredResources: {},
placementGroupId: "123",
reprName: ",",
callSite: "",
labelSelector: {},
},
ACTOR_2: {
actorId: "ACTOR_2",
jobId: "01000000",
address: {
nodeId: "426854e68e4225b3941deaf03c8dcfcb1daacc69a92711d370dbb0e1",
ipAddress: "172.31.11.178",
port: 10003,
workerId: "b8b276a03612644098ed7a929c3b0e50f5bde894eb0d8cab288fbb6d",
},
state: "DEAD",
numRestarts: "0",
name: "",
pid: 25322,
startTime: 1679010689150,
endTime: 0,
actorClass: "Counter",
exitDetail: "-",
requiredResources: {},
placementGroupId: "123",
reprName: ",",
callSite: "",
labelSelector: {},
},
ACTOR_3: {
actorId: "ACTOR_3",
jobId: "01000000",
address: {
nodeId: "426854e68e4225b3941deaf03c8dcfcb1daacc69a92711d370dbb0e1",
ipAddress: "172.31.11.178",
port: 10003,
workerId: "b8b276a03612644098ed7a929c3b0e50f5bde894eb0d8cab288fbb6d",
},
state: "DEPENDENCIES_UNREADY",
numRestarts: "0",
name: "",
pid: 25323,
startTime: 1679010689152,
endTime: 0,
actorClass: "Counter",
exitDetail: "-",
requiredResources: {},
placementGroupId: "123",
reprName: ",",
callSite: "",
labelSelector: {},
},
ACTOR_4: {
actorId: "ACTOR_4",
jobId: "01000000",
address: {
nodeId: "426854e68e4225b3941deaf03c8dcfcb1daacc69a92711d370dbb0e1",
ipAddress: "172.31.11.178",
port: 10003,
workerId: "b8b276a03612644098ed7a929c3b0e50f5bde894eb0d8cab288fbb6d",
},
state: "PENDING_CREATION",
numRestarts: "0",
name: "",
pid: 25324,
startTime: 1679010689154,
endTime: 0,
actorClass: "Counter",
exitDetail: "-",
requiredResources: {},
placementGroupId: "123",
reprName: ",",
callSite: "",
labelSelector: {},
},
ACTOR_5: {
actorId: "ACTOR_5",
jobId: "01000000",
address: {
nodeId: "426854e68e4225b3941deaf03c8dcfcb1daacc69a92711d370dbb0e1",
ipAddress: "172.31.11.178",
port: 10003,
workerId: "b8b276a03612644098ed7a929c3b0e50f5bde894eb0d8cab288fbb6d",
},
state: "RESTARTING",
numRestarts: "1",
name: "",
pid: 25325,
startTime: 1679010689156,
endTime: 0,
actorClass: "Counter",
exitDetail: "-",
requiredResources: {},
placementGroupId: "123",
reprName: ",",
callSite: "",
labelSelector: {},
},
};
export const useActorList = (): { [actorId: string]: Actor } => {
return MOCK_ACTORS;
};
@@ -0,0 +1,56 @@
import { useContext, useState } from "react";
import { useParams } from "react-router-dom";
import useSWR from "swr";
import { GlobalContext } from "../../../App";
import { API_REFRESH_INTERVAL_MS } from "../../../common/constants";
import { ActorResp, getActor } from "../../../service/actor";
export const useFetchActor = (actorId: string | null) => {
return useSWR(
actorId ? ["useActorDetail", actorId] : null,
async ([_, actorId]) => {
const actor_resp = await getActor(actorId);
const data: ActorResp = actor_resp?.data;
const { data: rspData } = data;
if (rspData.detail) {
return rspData.detail;
}
},
);
};
export const useActorDetail = () => {
const params = useParams() as { actorId: string };
const [msg, setMsg] = useState("Loading the actor infos...");
const { namespaceMap } = useContext(GlobalContext);
const { data: actorDetail, isLoading } = useSWR(
["useActorDetail", params.actorId],
async ([_, actorId]) => {
const actor_resp = await getActor(actorId);
const data: ActorResp = actor_resp?.data;
const { data: rspData, msg, result } = data;
if (msg) {
setMsg(msg);
}
if (result === false) {
setMsg("Actor Query Error Please Check Actor Id");
}
if (rspData.detail) {
return rspData.detail;
}
},
{ refreshInterval: API_REFRESH_INTERVAL_MS },
);
return {
params,
actorDetail,
msg,
isLoading,
namespaceMap,
};
};
@@ -0,0 +1,21 @@
import useSWR from "swr";
import { PER_JOB_PAGE_REFRESH_INTERVAL_MS } from "../../../common/constants";
import { getActors } from "../../../service/actor";
export const useActorList = () => {
const { data } = useSWR(
"useActorList",
async () => {
const rsp = await getActors();
if (rsp?.data?.data?.actors) {
return rsp.data.data.actors;
} else {
return {};
}
},
{ refreshInterval: PER_JOB_PAGE_REFRESH_INTERVAL_MS },
);
return data;
};
@@ -0,0 +1,22 @@
import { Box } from "@mui/material";
import React from "react";
import ActorList from "./ActorList";
/**
* Represent the standalone actors page.
*/
const Actors = () => {
return (
<Box
sx={(theme) => ({
padding: 2,
width: "100%",
backgroundColor: theme.palette.background.paper,
})}
>
<ActorList />
</Box>
);
};
export default Actors;
@@ -0,0 +1,114 @@
import { Box, Button, Grid, MenuItem, Select } from "@mui/material";
import React, { useCallback, useContext, useEffect, useState } from "react";
import { useParams } from "react-router-dom";
import { GlobalContext } from "../../App";
import LogVirtualView from "../../components/LogView/LogVirtualView";
import TitleCard from "../../components/TitleCard";
import { getJmap, getJstack, getJstat } from "../../service/util";
const CMDResult = () => {
const { cmd, ip, pid } = useParams() as {
cmd: string;
ip: string;
pid: string;
};
const [result, setResult] = useState<string>();
const [option, setOption] = useState("gcutil");
const { themeMode } = useContext(GlobalContext);
const executeJstat = useCallback(
() =>
getJstat(ip, pid, option)
.then((rsp) => {
if (rsp.data.result) {
setResult(rsp.data.data.output);
} else {
setResult(rsp.data.msg);
}
})
.catch((err) => setResult(err.toString())),
[ip, pid, option],
);
useEffect(() => {
switch (cmd) {
case "jstack":
getJstack(ip, pid)
.then((rsp) => {
if (rsp.data.result) {
setResult(rsp.data.data.output);
} else {
setResult(rsp.data.msg);
}
})
.catch((err) => setResult(err.toString()));
break;
case "jmap":
getJmap(ip, pid)
.then((rsp) => {
if (rsp.data.result) {
setResult(rsp.data.data.output);
} else {
setResult(rsp.data.msg);
}
})
.catch((err) => setResult(err.toString()));
break;
case "jstat":
executeJstat();
break;
default:
setResult(`Command ${cmd} is not supported.`);
break;
}
}, [cmd, executeJstat, ip, pid]);
return (
<Box sx={{ padding: 4, width: "100%" }}>
<TitleCard title={cmd}>
{cmd === "jstat" && (
<Box sx={{ padding: 2, marginTop: 2 }}>
<Grid container spacing={1}>
<Grid item>
<Select
value={option}
onChange={(e) => setOption(e.target.value as string)}
sx={{ "& .MuiSvgIcon-root": { color: "text.secondary" } }}
>
{[
"class",
"compiler",
"gc",
"gccapacity",
"gcmetacapacity",
"gcnew",
"gcnewcapacity",
"gcold",
"gcoldcapacity",
"gcutil",
"gccause",
"printcompilation",
].map((e) => (
<MenuItem value={e}>{e}</MenuItem>
))}
</Select>
</Grid>
<Grid item>
<Button onClick={executeJstat}>Execute</Button>
</Grid>
</Grid>
</Box>
)}
</TitleCard>
<TitleCard title={`IP: ${ip} / Pid: ${pid}`}>
<LogVirtualView
content={result || "loading"}
language="prolog"
height={800}
theme={themeMode}
/>
</TitleCard>
</Box>
);
};
export default CMDResult;

Some files were not shown because too many files have changed in this diff Show More