chore: import upstream snapshot with attribution
This commit is contained in:
@@ -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"],
|
||||
)
|
||||
@@ -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="."
|
||||
@@ -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*
|
||||
@@ -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 can’t go back!
|
||||
|
||||
If you aren’t 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
|
||||
you’re on your own.
|
||||
|
||||
You don’t have to ever use ``eject``. The curated feature set is suitable for
|
||||
small and middle deployments, and you shouldn’t feel obligated to use this
|
||||
feature. However we understand that this tool wouldn’t be useful if you couldn’t
|
||||
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/>`__.
|
||||
+18327
File diff suppressed because it is too large
Load Diff
@@ -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>
|
||||
+199
@@ -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
@@ -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;
|
||||
+206
@@ -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>
|
||||
);
|
||||
};
|
||||
+81
@@ -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 <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 Flame 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 Flame Graph
|
||||
</Link>
|
||||
);
|
||||
};
|
||||
|
||||
export const TaskCpuStackTraceLink = ({
|
||||
taskId,
|
||||
attemptNumber,
|
||||
nodeId,
|
||||
}: TaskProfilingStackTraceProps) => {
|
||||
const profilingEnabled = useProfilingEnabled();
|
||||
if (!taskId) {
|
||||
return null;
|
||||
}
|
||||
if (!profilingEnabled) {
|
||||
return <DisabledProfilingLabel>Stack 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 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 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 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 Flame 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 Flame 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 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 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 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 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>
|
||||
);
|
||||
};
|
||||
@@ -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 />
|
||||
 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 />
|
||||
 def __repr__(self):
|
||||
<br />
|
||||
  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 />
|
||||
 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;
|
||||
}
|
||||
+103
@@ -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;
|
||||
@@ -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.");
|
||||
}
|
||||
@@ -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
Reference in New Issue
Block a user