* setErrorDataFromSegvChunk * Fill in the given error data with the chunk that contains the message * sent in a SEGV/BUS/ILL handler. */
| 1053 | * sent in a SEGV/BUS/ILL handler. |
| 1054 | */ |
| 1055 | static void |
| 1056 | fillinErrorDataFromSegvChunk(GpErrorData *errorData, PipeProtoChunk *chunk) |
| 1057 | { |
| 1058 | Assert(chunk != NULL && |
| 1059 | chunk->hdr.is_segv_msg == 't' && |
| 1060 | chunk->hdr.is_last == 't'); |
| 1061 | |
| 1062 | GpSegvErrorData *segvData = (GpSegvErrorData *)chunk->data; |
| 1063 | |
| 1064 | errorData->fix_fields.session_start_time = segvData->session_start_time; |
| 1065 | errorData->fix_fields.omit_location = 'f'; |
| 1066 | |
| 1067 | /* This field is always true now. We should remove this eventually. */ |
| 1068 | errorData->fix_fields.gp_is_primary = 't'; |
| 1069 | errorData->fix_fields.gp_session_id = segvData->gp_session_id; |
| 1070 | errorData->fix_fields.gp_command_count = segvData->gp_command_count; |
| 1071 | errorData->fix_fields.gp_segment_id = segvData->gp_segment_id; |
| 1072 | errorData->fix_fields.slice_id = segvData->slice_id; |
| 1073 | errorData->fix_fields.error_cursor_pos = 0; |
| 1074 | errorData->fix_fields.internal_query_pos = 0; |
| 1075 | errorData->fix_fields.error_fileline = 0; |
| 1076 | errorData->fix_fields.top_trans_id = 0; |
| 1077 | errorData->fix_fields.dist_trans_id = 0; |
| 1078 | errorData->fix_fields.local_trans_id = 0; |
| 1079 | errorData->fix_fields.subtrans_id = 0; |
| 1080 | |
| 1081 | errorData->username = NULL; |
| 1082 | errorData->databasename = NULL; |
| 1083 | errorData->remote_host = NULL; |
| 1084 | errorData->remote_port = NULL; |
| 1085 | errorData->error_severity = "PANIC"; |
| 1086 | errorData->sql_state = "XX000"; |
| 1087 | errorData->error_message = palloc0(ERROR_MESSAGE_MAX_SIZE); |
| 1088 | |
| 1089 | const char *signalName = SegvBusIllName(segvData->signal_num); |
| 1090 | Assert(signalName != NULL); |
| 1091 | snprintf(errorData->error_message, ERROR_MESSAGE_MAX_SIZE, |
| 1092 | "Unexpected internal error: %s received signal %s", |
| 1093 | Gp_role == GP_ROLE_DISPATCH ? "Master process" : "Segment process", |
| 1094 | signalName); |
| 1095 | |
| 1096 | errorData->error_detail = NULL; |
| 1097 | errorData->error_hint = NULL; |
| 1098 | errorData->internal_query = NULL; |
| 1099 | errorData->error_context = NULL; |
| 1100 | errorData->debug_query_string = NULL; |
| 1101 | errorData->error_func_name = NULL; |
| 1102 | errorData->error_filename = NULL; |
| 1103 | errorData->stacktrace = NULL; |
| 1104 | |
| 1105 | if (segvData->frame_depth > 0) |
| 1106 | { |
| 1107 | void *stackAddressArray = (chunk->data + MAXALIGN(sizeof(GpSegvErrorData))); |
| 1108 | void **stackAddresses = stackAddressArray; |
| 1109 | errorData->stacktrace = gp_stacktrace(stackAddresses, segvData->frame_depth); |
| 1110 | } |
| 1111 | } |
| 1112 |
no test coverage detected