async def get_memory_table(cls, sort_by=memory_utils.SortingType.OBJECT_SIZE, group_by=memory_utils.GroupByType.STACK_TRACE): all_worker_stats = [] for node_stats in DataSource.node_stats.values(): all_worker_stats.extend(node_stats.get("coreWorkersStats", [])) memory_information = memory_utils.construct_memory_table( all_worker_stats, group_by=group_by, sort_by=sort_by) return memory_information
async def list_objects(self, *, option: ListApiOptions) -> dict: """List all object information from the cluster. Returns: {object_id -> object_data_in_dict} object_data_in_dict's schema is in ObjectState """ replies = await asyncio.gather(*[ self._client.get_object_info(node_id, timeout=option.timeout) for node_id in self._client.get_all_registered_raylet_ids() ]) worker_stats = [] for reply in replies: for core_worker_stat in reply.core_workers_stats: # NOTE: Set preserving_proto_field_name=False here because # `construct_memory_table` requires a dictionary that has # modified protobuf name # (e.g., workerId instead of worker_id) as a key. worker_stats.append( self._message_to_dict( message=core_worker_stat, fields_to_decode=["object_id"], preserving_proto_field_name=False, )) result = [] memory_table = memory_utils.construct_memory_table(worker_stats) for entry in memory_table.table: data = entry.as_dict() # `construct_memory_table` returns object_ref field which is indeed # object_id. We do transformation here. # TODO(sang): Refactor `construct_memory_table`. data["object_id"] = data["object_ref"] del data["object_ref"] data = filter_fields(data, ObjectState) result.append(data) # Sort to make the output deterministic. result.sort(key=lambda entry: entry["object_id"]) return {d["object_id"]: d for d in islice(result, option.limit)}
async def list_objects(self, *, option: ListApiOptions) -> ListApiResponse: """List all object information from the cluster. Returns: {object_id -> object_data_in_dict} object_data_in_dict's schema is in ObjectState """ raylet_ids = self._client.get_all_registered_raylet_ids() replies = await asyncio.gather( *[ self._client.get_object_info(node_id, timeout=option.timeout) for node_id in raylet_ids ], return_exceptions=True, ) unresponsive_nodes = 0 worker_stats = [] for reply, _ in zip(replies, raylet_ids): if isinstance(reply, DataSourceUnavailable): unresponsive_nodes += 1 continue elif isinstance(reply, Exception): raise reply for core_worker_stat in reply.core_workers_stats: # NOTE: Set preserving_proto_field_name=False here because # `construct_memory_table` requires a dictionary that has # modified protobuf name # (e.g., workerId instead of worker_id) as a key. worker_stats.append( self._message_to_dict( message=core_worker_stat, fields_to_decode=["object_id"], preserving_proto_field_name=False, ) ) partial_failure_warning = None if len(raylet_ids) > 0 and unresponsive_nodes > 0: warning_msg = NODE_QUERY_FAILURE_WARNING.format( type="raylet", total=len(raylet_ids), network_failures=unresponsive_nodes, log_command="raylet.out", ) if unresponsive_nodes == len(raylet_ids): raise DataSourceUnavailable(warning_msg) partial_failure_warning = ( f"The returned data may contain incomplete result. {warning_msg}" ) result = [] memory_table = memory_utils.construct_memory_table(worker_stats) for entry in memory_table.table: data = entry.as_dict() # `construct_memory_table` returns object_ref field which is indeed # object_id. We do transformation here. # TODO(sang): Refactor `construct_memory_table`. data["object_id"] = data["object_ref"] del data["object_ref"] result.append(data) result = self._filter(result, option.filters, ObjectState) # Sort to make the output deterministic. result.sort(key=lambda entry: entry["object_id"]) return ListApiResponse( result=list(islice(result, option.limit)), partial_failure_warning=partial_failure_warning, )