From 9c0ac251df6baff4fcf752a4d9503dc825747707 Mon Sep 17 00:00:00 2001 From: Stas Kelvich Date: Thu, 20 May 2021 00:17:46 +0300 Subject: [PATCH] Describe BeMessage::ErrorResponse format in comments --- pageserver/src/page_service.rs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/pageserver/src/page_service.rs b/pageserver/src/page_service.rs index bcc546ea14..9b0f0b1597 100644 --- a/pageserver/src/page_service.rs +++ b/pageserver/src/page_service.rs @@ -577,10 +577,17 @@ impl Connection { self.stream.write_all(&data)?; } + // ErrorResponse is a zero-terminated array of zero-terminated fields. + // First byte of each field represents type of this field. Set just enough fields + // to satisfy rust-postgres client: 'S' -- severity, 'C' -- error, 'M' -- error + // message text. BeMessage::ErrorResponse(error_msg) => { + // For all the errors set Severity to Error and error code to + // 'internal error'. let severity = Bytes::from("SERROR\0"); let code = Bytes::from("CXX000\0"); + // 'E' signalizes ErrorResponse messages self.stream.write_u8(b'E')?; self.stream.write_u32::( 4 + severity.len() as u32 @@ -589,15 +596,17 @@ impl Connection { + 1, )?; + // Send severity and code fields self.stream.write_all(&severity)?; - self.stream.write_all(&code)?; - self.stream.write_u8(b'M')?; /* primary human-readable error message */ + // Send error message field + self.stream.write_u8(b'M')?; self.stream.write_all(error_msg.as_bytes())?; - self.stream.write_u8(0)?; /* end of M field */ + self.stream.write_u8(0)?; - self.stream.write_u8(0)?; /* end of all fields */ + // Terminate fields + self.stream.write_u8(0)?; } }