Description
The query for allocating external IPs from an IP Pool range currently generates the sequence of all IPs in that range. That's inefficient, but works at this point. However, there's a latent bug here. That generates the sequence of IP addresses by computing offsets, using generate_series(0, last_address - first_address)
, and adding those offsets to the first address. That subtraction will not fit in an i64
if the address range is huge. For example:
[email protected]:26257/movr> select 'fd00::'::INET - 'fc00::'::INET;
ERROR: result out of range
SQLSTATE: 22003
[email protected]:26257/movr>
That's not super likely, but it should be detected and handled correctly, by taking the maximum allowed offset from the first address. Something like:
[email protected]:26257/movr> select if('fc00::'::INET + 9223372036854775807 > 'fd00::'::INET, 'fd00::'::INET, 'fc00::'::INET + 9223372036854775807) - 'fc00::'::INET;
?column?
-----------------------
9223372036854775807
(1 row)
Time: 0ms total (execution 0ms / network 0ms)
[email protected]:26257/movr>
That constant is i64::MAX
, and can be supplied on the Rust side or in the database. The IF
is needed because there's no maximum function for INET types.