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:
demo@127.0.0.1:26257/movr> select 'fd00::'::INET - 'fc00::'::INET;
ERROR: result out of range
SQLSTATE: 22003
demo@127.0.0.1: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:
demo@127.0.0.1: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)
demo@127.0.0.1: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.
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 ani64if the address range is huge. For example: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:
That constant is
i64::MAX, and can be supplied on the Rust side or in the database. TheIFis needed because there's no maximum function for INET types.