Skip to content

Commit 5863f5e

Browse files
authored
handle and log query errors in type server (#106)
* bump opentelemetry api dependency * decode and return pg errors for simple queries * log message for failure to load types from database for server * update ssl certs for tests
1 parent ed33449 commit 5863f5e

File tree

7 files changed

+82
-68
lines changed

7 files changed

+82
-68
lines changed

rebar.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
{deps, [{backoff, "~> 1.1.6"},
44
{pg_types, "~> 0.5.0"},
5-
{opentelemetry_api, "~> 1.4.0"}]}.
5+
{opentelemetry_api, "~> 1.5"}]}.
66

77
{profiles, [{test, [{erl_opts, [nowarn_export_all]},
88
{deps, [jsone,

rebar.lock

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
{"1.2.0",
22
[{<<"backoff">>,{pkg,<<"backoff">>,<<"1.1.6">>},0},
3-
{<<"opentelemetry_api">>,{pkg,<<"opentelemetry_api">>,<<"1.4.0">>},0},
3+
{<<"opentelemetry_api">>,{pkg,<<"opentelemetry_api">>,<<"1.5.0">>},0},
44
{<<"pg_types">>,{pkg,<<"pg_types">>,<<"0.5.0">>},0}]}.
55
[
66
{pkg_hash,[
77
{<<"backoff">>, <<"83B72ED2108BA1EE8F7D1C22E0B4A00CFE3593A67DBC792799E8CCE9F42F796B">>},
8-
{<<"opentelemetry_api">>, <<"63CA1742F92F00059298F478048DFB826F4B20D49534493D6919A0DB39B6DB04">>},
8+
{<<"opentelemetry_api">>, <<"1A676F3E3340CAB81C763E939A42E11A70C22863F645AA06AAFEFC689B5550CF">>},
99
{<<"pg_types">>, <<"4FF09A61231EF33A10CF9524CECF8696EA2C971EE89204F95ACEFB1CFE9682DB">>}]},
1010
{pkg_hash_ext,[
1111
{<<"backoff">>, <<"CF0CFFF8995FB20562F822E5CC47D8CCF664C5ECDC26A684CBE85C225F9D7C39">>},
12-
{<<"opentelemetry_api">>, <<"3DFBBFAA2C2ED3121C5C483162836C4F9027DEF469C41578AF5EF32589FCFC58">>},
12+
{<<"opentelemetry_api">>, <<"F53EC8A1337AE4A487D43AC89DA4BD3A3C99DDF576655D071DEED8B56A2D5DDA">>},
1313
{<<"pg_types">>, <<"A3023B464AA960BC1628635081E30CCA4F676F2D4C23CCD6179C1C11C9B4A642">>}]}
1414
].

src/pgo_handler.erl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -634,6 +634,8 @@ simple_query_loop(#conn{socket=Socket}=Conn, Acc) ->
634634
simple_query_loop(Conn, Acc);
635635
{ok, #ready_for_query{}} ->
636636
{ok, Acc};
637+
{ok, #error_response{fields=Fields}} ->
638+
{error, {pgo_error, Fields}};
637639
{error, _} = ReceiveError ->
638640
ReceiveError
639641
end.
@@ -651,7 +653,9 @@ simple_receive_message(Socket, _Conn=#conn{socket_module=SocketModule}, _DecodeO
651653
$C ->
652654
{ok, command_complete};
653655
$Z ->
654-
decode_ready_for_query_message(Rest)
656+
decode_ready_for_query_message(Rest);
657+
$E ->
658+
pgo_protocol:decode_error_response_message(Rest)
655659
end;
656660
{error, _} = ErrorRecvPacket ->
657661
ErrorRecvPacket

src/pgo_protocol.erl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
encode_copy_done/0,
2020
encode_copy_fail/1,
2121
decode_message/4,
22+
decode_error_response_message/1,
2223
decode_row/4,
2324
decode_strings/1,
2425
bind_requires_statement_description/1,

src/pgo_type_server.erl

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
-include("pgo_internal.hrl").
1313
-include_lib("pg_types/include/pg_types.hrl").
14+
-include_lib("kernel/include/logger.hrl").
1415

1516
-record(data, {pool :: atom(),
1617
pool_config :: pgo:pool_config(),
@@ -62,9 +63,13 @@ terminate(_, _, _Data) ->
6263
load(Pool, LastReload, RequestTime, PoolConfig) when LastReload < RequestTime ->
6364
try pgo_handler:open(Pool, PoolConfig) of
6465
{ok, Conn=#conn{parameters=Parameters}} ->
65-
TypeInfos = load_and_update_types(Conn, Pool),
66-
_ = pg_types:update(Pool, TypeInfos, Parameters),
67-
TypeInfos;
66+
case load_and_update_types(Conn, Pool) of
67+
failed ->
68+
failed;
69+
TypeInfos ->
70+
_ = pg_types:update(Pool, TypeInfos, Parameters),
71+
TypeInfos
72+
end;
6873
{error, _} ->
6974
failed
7075
catch
@@ -86,22 +91,27 @@ load(_, _, _, _) ->
8691

8792
load_and_update_types(Conn, Pool) ->
8893
try
89-
{ok, Oids} = pgo_handler:simple_query(Conn, ?BOOTSTRAP_QUERY),
90-
[#type_info{oid=binary_to_integer(Oid),
91-
pool=Pool,
92-
name=binary:copy(Name),
93-
typsend=binary:copy(Send),
94-
typreceive=binary:copy(Receive),
95-
typlen=binary_to_integer(Len),
96-
output=binary:copy(Output),
97-
input=binary:copy(Input),
98-
elem_oid=binary_to_integer(ArrayOid),
99-
base_oid=binary_to_integer(BaseOid),
100-
comp_oids=parse_array_oids(CompOids)}
101-
|| [Oid, Name, Send, Receive, Len, Output, Input, ArrayOid, BaseOid, CompOids] <- Oids]
94+
case pgo_handler:simple_query(Conn, ?BOOTSTRAP_QUERY) of
95+
{ok, Oids} ->
96+
[#type_info{oid=binary_to_integer(Oid),
97+
pool=Pool,
98+
name=binary:copy(Name),
99+
typsend=binary:copy(Send),
100+
typreceive=binary:copy(Receive),
101+
typlen=binary_to_integer(Len),
102+
output=binary:copy(Output),
103+
input=binary:copy(Input),
104+
elem_oid=binary_to_integer(ArrayOid),
105+
base_oid=binary_to_integer(BaseOid),
106+
comp_oids=parse_array_oids(CompOids)}
107+
|| [Oid, Name, Send, Receive, Len, Output, Input, ArrayOid, BaseOid, CompOids] <- Oids];
108+
{error, {pgo_error, PgoError}} ->
109+
?LOG_WARNING("Unable to load type information. query failed with error: ~p", [PgoError]),
110+
failed
111+
end
102112
catch
103-
_:_:_ ->
104-
113+
Class:Reason:Stacktrace ->
114+
?LOG_WARNING("Unable to load type information. pgo will not function properly: ~s", [erl_error:format_exception(Class, Reason, Stacktrace)]),
105115
failed
106116
after
107117
pgo_handler:close(Conn)

test/certs/server.crt

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,20 @@
11
-----BEGIN CERTIFICATE-----
2-
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
2120
-----END CERTIFICATE-----

test/certs/server.key

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
11
-----BEGIN PRIVATE KEY-----
2-
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDoD/84QIb2yNgs
3-
LGUmIhKCqkzU0wYRx2fXCoWAioxOizH+Nd0r+HaI2VaVCNCcCA/1SH6O2ZvGzl0/
4-
WdMKbg2bu7HQHAYydSHLpsbpPmYGP+VBw89yY5QFORN2KmyQybISF856LMORUNft
5-
sUHiZOW7+T+lRRfYARy25wGu5gmrqsAS/x4Gw/ihNQKcFg6NnioyhdxKZbBFkRtm
6-
eFX4IwWLrRHt5cBUa8mgNpWNd0/lz+DdtUKVrSPECwwlDhC9tFVsk0ibjXQCHGAN
7-
mAvBsf48WREnThor2BETPWOsVCX8axxjssNwpXtT/TbhB9v1nEviJAfxSPdKsP2i
8-
4rQhYpd/AgMBAAECggEAMgylMEYmdZo6mUhX5mIJ2PmOyYXbtMDrgeMIiQEYoqX9
9-
ucR3N5EGS5yIQmtcxpIskuu4M+n14WpHjS67x++VasWP44Dvyzkc+VW2Z76n9WgZ
10-
c1Yeax7T4U5+hok+0flWOPW+d/YolbI4Z9DHk2LMc36dvfDJZDJVNZNb9xMw+b9Y
11-
IuC0CJgg1retXdfo2CABHB7QWozx0huhOmZyGbwxwJuG5jBSoOj3P/N36fm0CkPL
12-
6TAVFaEhOfja/8tySICGS1dw/XPmLDBzAMr+OABiji8bNh7/TUooX5cHDE2c44lg
13-
O4weN8FJL8zdKMm7tyiwPUB2uehAppkuxf48BWvzNQKBgQD+b8OLhM59xdCMoqqr
14-
ScW8mUSNUJJ91cRETRZBOxSN8hFifs69UN7kCJjV4aLhzIHfdB6QfuS1im1dZnKZ
15-
YlUk/ix6qk7JUl2k5HtL7bi13nRFp0dcN7jdAHtvi9FWxDRCEdiU0INLzUmbqj7N
16-
0Gh5Ndvgw4j1zSMkw9ffVucUEwKBgQDpfQm7AAN0TaivppJOcepReAokBHEtw1Bs
17-
vyNsbE8k82j2m+vhzUSS6e4TnGfSqipG6EoND29L39WvPWrcrw97tLmfkbnCvw5o
18-
+74Wl5+n5U/kMPlXOlLYk9UhpRFTuOAFN/3P51AAEmoXctPgfyfvN9aFQyiQTdLd
19-
OVQ826ckZQKBgG5w1uFVmUfwuHCDHy/QitstcBsi8SNbyaCYEWPpICfo/fDR+C0m
20-
0EkNDkIwecInQexbe/Tej6nZV1VmZbH8g9bV2Tq5eA9dCDbN0lMH8dhHohKl5Iy7
21-
xytuzSWC/C/8ZG6VTnxx8bvSdPPztuUhZGfQoAt09Js1Gt8Xfzl7gDwvAoGAZl7a
22-
K1EgMpfyA8FmmFo9wCZ/W7dO4B+oXWWYZGtAcBUAyk8mpsPW8wr5xUNoCedtzdT+
23-
0qcXxw6Go+Sru8JNaZGdaSb9aTNXYBQwDbvA1l4mHwiR6fq6ZBa89Zln9WszXVZl
24-
RAhI/R8VwN4po15c5fd3aMo/OLXGZBREqMItkDkCgYEA8295H8YoahfV1aBm6m3x
25-
QZH4uJkSRFSOepGcBkmIoPGdiYJ85+1fmBOeSQPvcQPgynLBTa6iSGbVkp1kCXvM
26-
mPyeNqjcWfh4Gay+fnRjDolc4NZoNVCB0aoyaH+wCZQyPIbGnqspm1piDz0jN7Pp
27-
In+OPiiumI/4hRHC5ZqB5NA=
2+
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCXV1SQY98iD04F
3+
0Xedp7MOiKj07rCtr4NerOaTh3RLR1HiQRM1OWInYt7HiuNJEg0QgadrJvMna5ZO
4+
z3TNiD+UMtW++VTRORoFbMJlOULtSu51xf2ZuYyydpWMn9+1DNLOW8gMxd8+sm2r
5+
A5DmLyLb/p6v+oHCPLOXmAnJ6v5ObvYNCuvqJh1k8IxV4OfIC/gAEojqEYx6eN0w
6+
9nvM1o7chyMFV1lqh2jApzywmJ6zCz3rCi9Y6Lxv0JI2pLAP2WuzlFZ9jQO5HOpa
7+
rHnUQvIeNVAevaknVMSKB5htD4scRCXQqcstgnC3fNeOWEIEQm8oicPin+F4nfbg
8+
qmLZXQ2hAgMBAAECggEAGI1KYsJRCK2C8t6wkRsLqWfyQQoYD5VRsqJKJdTrwOqp
9+
FhOIkjHlAo6/pY+an9gV1n+yMWf4OoTxtYdiY5We+uPkWT8Jy4d/+TFTuCg5+1UU
10+
qnacVbwMX0dtq4qkODMEYAXzxl6zgPBhakUB1NYAyb/c7p+tPV2rpQQ9UkyVRRPr
11+
O4cSVqw8R9UFQHz0qHMpdvfm3uUQJuB/7Ak7tEfnwZmbZpjUYE8EUySRUff7H14E
12+
yr0RFdS0Qvx2kmaLwZ3tOw2eiV8WcMjFdDz0eIiPVTYsS1S/MHHBucBLCErMScB+
13+
24377hndcN85tUJmFtkE27b25MLhHTHFxVa8Yb96IQKBgQDUJPuhlbgOkjwK+/T7
14+
l6DUGJvmqwg4yMd5Un5snEs1/wXPJ41+7CxYmcdEc6AgSyUyhqqIH5Y/r1wGh8xs
15+
P7732pibsmjG6QXG2OUSILVDit7aHiNdZ0SidLCSNUcRkjzsUNEvsvJsdiNGlLzc
16+
Q4mywRZrvOE75fLdS/U6kDyfFwKBgQC2oIo8tSmaw6Yg59V0Pt6rdiqZOMcWJss7
17+
HZ9cfhXwz5pw8q7QcxoJW6IHfalk/rKDYT8zMXpPfftYqhk5aDzEiMhCnoJvq1Fa
18+
q4VROYACOpjhc5NM+UALdi6md/rVHp7OfpLjnXsgsrG6FsmMDi3DatNm49LsdSCH
19+
yM0AZoFsBwKBgCWe4VjIWjmLSUaRY+JyAz1Zl9wSHIUlZepn7K+KD/RlYzxXQUpu
20+
y3Zy3tmOv6i6asBJDVjScSyeBm3KC0BvFYiSpVmHC/mqPTIEKKtMTZjKubZofdEE
21+
jTFaDC4BcLb2/gLSWiZhT4hYcu0DV3KgL30ZrMYyWqbqomUIIVbfWUDFAoGBAK4j
22+
mIzYhepf4pn/1eZ5SGOgUnA11ohFx4X/8gQE6jDsFCzdC1oSVuJTcMXJyetWfauO
23+
3++VnzYLP87Eqza1MTSJ5MK5WFDYv8NAR+gyduApNbvMM8my5aHIOCVdxFzRTMZD
24+
pRbLBCwimBuEPPyCTJrI0vmKBYaZDMLM8sUN+RyjAoGBAKnnL5pkKwNfzd3WgX5d
25+
PNbR/U7SupVYXrYzY36xL+NpPL3VJNNvuRQ55rpakw8S6aQzYcf2cNxH1sM2oRB8
26+
6qI4S+JM2T2QVoue6i/qNRAqNtndWRTDMzIcD+Q9U3PnJ2cH7ZjgGUy9QYVFin3/
27+
OpPHvMX30mRr4GSOVBB9mfI5
2828
-----END PRIVATE KEY-----

0 commit comments

Comments
 (0)