Fix port conversion issue in add_data_node

This change fixes an issue with port conversion in the `add_data_node`
command that results in an error when a port is not explicitly given
and PostgreSQL is configured to use a high port number. Note that this
issue does _not_ occur when the port number is given as an explicit
argument to `add_data_node`.

The underlying issue is that, without an explicit port number, the
remote port is assumed to be the same as the port configured for the
local server instance. The conversion of that port number was done
using a _signed_ two-byte integer, while the valid port range fits
within an _unsigned_ two-byte integer.

To test higher port ranges without an explicit argument to
`add_data_node`, the default port for test instances has been updated
to a high port number to test integer range overflow for small signed
integers.
This commit is contained in:
Erik Nordström 2020-01-28 13:33:00 +01:00 committed by Erik Nordström
parent 0f2d7251cf
commit 26c6e156d7
24 changed files with 144 additions and 117 deletions

View File

@ -301,7 +301,7 @@ process_create_foreign_server_start(ProcessUtilityArgs *args)
if (strcmp(EXTENSION_FDW_NAME, stmt->fdwname) == 0)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("operation not supported on a TimescaleDB data node"),
errmsg("operation not supported for a TimescaleDB data node"),
errhint("Use add_data_node() to add data nodes to a "
"TimescaleDB distributed database.")));
}

View File

@ -17,7 +17,7 @@ set(TEST_PGPORT_LOCAL 5432 CACHE STRING "The port of a running PostgreSQL instan
set(TEST_PGHOST localhost CACHE STRING "The hostname of a running PostgreSQL instance")
set(TEST_PGUSER ${TEST_ROLE_DEFAULT_PERM_USER} CACHE STRING "The PostgreSQL test user")
set(TEST_DBNAME single CACHE STRING "The database name to use for tests")
set(TEST_PGPORT_TEMP_INSTANCE 15432 CACHE STRING "The port to run a temporary test PostgreSQL instance on")
set(TEST_PGPORT_TEMP_INSTANCE 55432 CACHE STRING "The port to run a temporary test PostgreSQL instance on")
set(TEST_SCHEDULE ${CMAKE_CURRENT_BINARY_DIR}/test_schedule)
set(TEST_SCHEDULE_SHARED ${CMAKE_CURRENT_BINARY_DIR}/shared/test_schedule_shared)
set(ISOLATION_TEST_SCHEDULE ${CMAKE_CURRENT_BINARY_DIR}/isolation_test_schedule)
@ -135,4 +135,3 @@ if (${PG_VERSION_MAJOR} GREATER "9")
else ()
set(TEST_VERSION_SUFFIX ${PG_VERSION_MAJOR}.${PG_VERSION_MINOR})
endif ()

View File

@ -591,7 +591,7 @@ get_server_port()
{
const char *const portstr =
GetConfigOption("port", /* missing_ok= */ false, /* restrict_privileged= */ false);
return pg_atoi(portstr, 2, 0);
return pg_atoi(portstr, sizeof(int32), 0);
}
/* set_distid may need to be false for some otherwise invalid configurations
@ -604,7 +604,7 @@ data_node_add_internal(PG_FUNCTION_ARGS, bool set_distid)
const char *node_name = PG_ARGISNULL(0) ? NULL : PG_GETARG_CSTRING(0);
const char *host = PG_ARGISNULL(1) ? NULL : TextDatumGetCString(PG_GETARG_DATUM(1));
const char *dbname = PG_ARGISNULL(2) ? get_database_name(MyDatabaseId) : PG_GETARG_CSTRING(2);
long port = PG_ARGISNULL(3) ? get_server_port() : PG_GETARG_INT32(3);
int32 port = PG_ARGISNULL(3) ? get_server_port() : PG_GETARG_INT32(3);
bool if_not_exists = PG_ARGISNULL(4) ? false : PG_GETARG_BOOL(4);
bool bootstrap = PG_ARGISNULL(5) ? true : PG_GETARG_BOOL(5);
bool server_created = false;
@ -633,7 +633,7 @@ data_node_add_internal(PG_FUNCTION_ARGS, bool set_distid)
if (port < 1 || port > PG_UINT16_MAX)
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
(errmsg("invalid port"),
(errmsg("invalid port number %d", port),
errhint("The port number must be between 1 and %u", PG_UINT16_MAX))));
result = get_database_info(MyDatabaseId, &database);

View File

@ -210,14 +210,14 @@ SELECT * FROM add_data_node('data_node_1', host => 'localhost',
database => 'data_node_1');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_1 | localhost | 15432 | data_node_1 | t | t | t
data_node_1 | localhost | 55432 | data_node_1 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_2', host => 'localhost',
database => 'data_node_2');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_2 | localhost | 15432 | data_node_2 | t | t | t
data_node_2 | localhost | 55432 | data_node_2 | t | t | t
(1 row)
GRANT USAGE

View File

@ -24,21 +24,21 @@ SELECT * FROM add_data_node('data_node_1', host => 'localhost',
database => 'data_node_1');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_1 | localhost | 15432 | data_node_1 | t | t | t
data_node_1 | localhost | 55432 | data_node_1 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_2', host => 'localhost',
database => 'data_node_2');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_2 | localhost | 15432 | data_node_2 | t | t | t
data_node_2 | localhost | 55432 | data_node_2 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_3', host => 'localhost',
database => 'data_node_3');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_3 | localhost | 15432 | data_node_3 | t | t | t
data_node_3 | localhost | 55432 | data_node_3 | t | t | t
(1 row)
CREATE TABLE disttable(time timestamptz, device int, temp float);

View File

@ -17,14 +17,14 @@ SELECT * FROM add_data_node('data_node_1', host => 'localhost',
database => 'data_node_1');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_1 | localhost | 15432 | data_node_1 | t | t | t
data_node_1 | localhost | 55432 | data_node_1 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_2', 'localhost',
database => 'data_node_2');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_2 | localhost | 15432 | data_node_2 | t | t | t
data_node_2 | localhost | 55432 | data_node_2 | t | t | t
(1 row)
\set ON_ERROR_STOP 0
@ -42,10 +42,24 @@ SELECT * FROM add_data_node(NULL, host => 'localhost');
ERROR: invalid data node name
SELECT * FROM add_data_node(NULL, NULL);
ERROR: a host needs to be specified
-- Test invalid port numbers
SELECT * FROM add_data_node('data_node_3', 'localhost',
port => 65536,
database => 'data_node_3');
ERROR: invalid port number 65536
SELECT * FROM add_data_node('data_node_3', 'localhost',
port => 0,
database => 'data_node_3');
ERROR: invalid port number 0
SELECT * FROM add_data_node('data_node_3', 'localhost',
port => -1,
database => 'data_node_3');
ERROR: invalid port number -1
SELECT inet_server_port() as PGPORT \gset
-- Adding a data node via ADD SERVER is blocked
CREATE SERVER data_node_4 FOREIGN DATA WRAPPER timescaledb_fdw
OPTIONS (host 'localhost', port '15432', dbname 'data_node_4');
ERROR: operation not supported on a TimescaleDB data node
OPTIONS (host 'localhost', port ':PGPORT', dbname 'data_node_4');
ERROR: operation not supported for a TimescaleDB data node
-- Dropping a data node via DROP SERVER is also blocked
DROP SERVER data_node_1, data_node_2;
ERROR: operation not supported on a TimescaleDB data node
@ -56,13 +70,13 @@ SELECT * FROM add_data_node('data_node_2', host => 'localhost', database => 'dat
NOTICE: data node "data_node_2" already exists, skipping
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_2 | localhost | 15432 | data_node_2 | f | f | f
data_node_2 | localhost | 55432 | data_node_2 | f | f | f
(1 row)
SELECT * FROM add_data_node('data_node_3', host => 'localhost', database => 'data_node_3');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_3 | localhost | 15432 | data_node_3 | t | t | t
data_node_3 | localhost | 55432 | data_node_3 | t | t | t
(1 row)
-- Test altering server command is blocked
@ -80,9 +94,9 @@ ERROR: alter owner not supported on a TimescaleDB data node
SELECT node_name, "options" FROM timescaledb_information.data_node ORDER BY node_name;
node_name | options
-------------+------------------------------------------------
data_node_1 | {host=localhost,port=15432,dbname=data_node_1}
data_node_2 | {host=localhost,port=15432,dbname=data_node_2}
data_node_3 | {host=localhost,port=15432,dbname=data_node_3}
data_node_1 | {host=localhost,port=55432,dbname=data_node_1}
data_node_2 | {host=localhost,port=55432,dbname=data_node_2}
data_node_3 | {host=localhost,port=55432,dbname=data_node_3}
(3 rows)
-- Delete a data node
@ -96,8 +110,8 @@ SELECT * FROM delete_data_node('data_node_3');
SELECT node_name, "options" FROM timescaledb_information.data_node ORDER BY node_name;
node_name | options
-------------+------------------------------------------------
data_node_1 | {host=localhost,port=15432,dbname=data_node_1}
data_node_2 | {host=localhost,port=15432,dbname=data_node_2}
data_node_1 | {host=localhost,port=55432,dbname=data_node_1}
data_node_2 | {host=localhost,port=55432,dbname=data_node_2}
(2 rows)
\set ON_ERROR_STOP 0
@ -116,8 +130,8 @@ NOTICE: data node "data_node_3" does not exist, skipping
SELECT node_name, "options" FROM timescaledb_information.data_node ORDER BY node_name;
node_name | options
-------------+------------------------------------------------
data_node_1 | {host=localhost,port=15432,dbname=data_node_1}
data_node_2 | {host=localhost,port=15432,dbname=data_node_2}
data_node_1 | {host=localhost,port=55432,dbname=data_node_1}
data_node_2 | {host=localhost,port=55432,dbname=data_node_2}
(2 rows)
SELECT * FROM delete_data_node('data_node_1');
@ -149,21 +163,21 @@ SELECT * FROM add_data_node('data_node_1', host => 'localhost',
database => 'data_node_1');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_1 | localhost | 15432 | data_node_1 | t | t | t
data_node_1 | localhost | 55432 | data_node_1 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_2', host => 'localhost',
database => 'data_node_2');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_2 | localhost | 15432 | data_node_2 | t | t | t
data_node_2 | localhost | 55432 | data_node_2 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_3', host => 'localhost',
database => 'data_node_3');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_3 | localhost | 15432 | data_node_3 | t | t | t
data_node_3 | localhost | 55432 | data_node_3 | t | t | t
(1 row)
-- Allow ROLE_1 to create distributed tables on these data nodes.
@ -178,9 +192,9 @@ SELECT node_name, "options"
ORDER BY node_name;
node_name | options
-------------+------------------------------------------------
data_node_1 | {host=localhost,port=15432,dbname=data_node_1}
data_node_2 | {host=localhost,port=15432,dbname=data_node_2}
data_node_3 | {host=localhost,port=15432,dbname=data_node_3}
data_node_1 | {host=localhost,port=55432,dbname=data_node_1}
data_node_2 | {host=localhost,port=55432,dbname=data_node_2}
data_node_3 | {host=localhost,port=55432,dbname=data_node_3}
(3 rows)
SELECT object_name, object_type, ARRAY_AGG(privilege_type)
@ -311,9 +325,9 @@ INSERT INTO disttable VALUES ('2019-02-02 10:45', 1, 23.4);
SELECT node_name, "options" FROM timescaledb_information.data_node ORDER BY node_name;
node_name | options
-------------+------------------------------------------------
data_node_1 | {host=localhost,port=15432,dbname=data_node_1}
data_node_2 | {host=localhost,port=15432,dbname=data_node_2}
data_node_3 | {host=localhost,port=15432,dbname=data_node_3}
data_node_1 | {host=localhost,port=55432,dbname=data_node_1}
data_node_2 | {host=localhost,port=55432,dbname=data_node_2}
data_node_3 | {host=localhost,port=55432,dbname=data_node_3}
(3 rows)
DROP TABLE disttable;
@ -663,7 +677,7 @@ SELECT * FROM add_data_node('data_node_4', host => 'localhost', database => 'dat
if_not_exists => true);
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_4 | localhost | 15432 | data_node_4 | t | t | t
data_node_4 | localhost | 55432 | data_node_4 | t | t | t
(1 row)
SELECT * FROM attach_data_node('data_node_4', 'disttable');
@ -752,21 +766,21 @@ SELECT * FROM add_data_node('data_node_1', host => 'localhost',
database => 'data_node_1');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_1 | localhost | 15432 | data_node_1 | t | t | t
data_node_1 | localhost | 55432 | data_node_1 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_2', host => 'localhost',
database => 'data_node_2');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_2 | localhost | 15432 | data_node_2 | t | t | t
data_node_2 | localhost | 55432 | data_node_2 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_3', host => 'localhost',
database => 'data_node_3');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_3 | localhost | 15432 | data_node_3 | t | t | t
data_node_3 | localhost | 55432 | data_node_3 | t | t | t
(1 row)
GRANT USAGE ON FOREIGN SERVER data_node_1, data_node_2, data_node_3 TO PUBLIC;
@ -1126,13 +1140,13 @@ SET ROLE :ROLE_CLUSTER_SUPERUSER;
SELECT * FROM add_data_node('data_node_4', host => 'localhost', database => 'data_node_4');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_4 | localhost | 15432 | data_node_4 | t | t | t
data_node_4 | localhost | 55432 | data_node_4 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_5', host => 'localhost', database => 'data_node_5');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_5 | localhost | 15432 | data_node_5 | t | t | t
data_node_5 | localhost | 55432 | data_node_5 | t | t | t
(1 row)
GRANT ALL ON FOREIGN SERVER data_node_4, data_node_5 TO PUBLIC;

View File

@ -21,7 +21,7 @@ SET client_min_messages TO NOTICE;
SELECT * FROM add_data_node('bootstrap_test', host => 'localhost', database => 'bootstrap_test');
node_name | host | port | database | node_created | database_created | extension_created
----------------+-----------+-------+----------------+--------------+------------------+-------------------
bootstrap_test | localhost | 15432 | bootstrap_test | t | t | t
bootstrap_test | localhost | 55432 | bootstrap_test | t | t | t
(1 row)
-- Ensure database and extensions are installed and have the correct
@ -79,13 +79,13 @@ SELECT * FROM add_data_node('bootstrap_test', host => 'localhost',
database => 'bootstrap_test', bootstrap => true);
node_name | host | port | database | node_created | database_created | extension_created
----------------+-----------+-------+----------------+--------------+------------------+-------------------
bootstrap_test | localhost | 15432 | bootstrap_test | t | t | t
bootstrap_test | localhost | 55432 | bootstrap_test | t | t | t
(1 row)
SELECT * FROM show_data_nodes();
data_node_name | host | port | dbname
----------------+-----------+-------+----------------
bootstrap_test | localhost | 15432 | bootstrap_test
bootstrap_test | localhost | 55432 | bootstrap_test
(1 row)
\c :TEST_DBNAME :ROLE_CLUSTER_SUPERUSER;
@ -112,7 +112,7 @@ SELECT * FROM add_data_node('bootstrap_test', host => 'localhost',
database => 'bootstrap_test', bootstrap => false);
node_name | host | port | database | node_created | database_created | extension_created
----------------+-----------+-------+----------------+--------------+------------------+-------------------
bootstrap_test | localhost | 15432 | bootstrap_test | t | f | f
bootstrap_test | localhost | 55432 | bootstrap_test | t | f | f
(1 row)
SELECT * FROM delete_data_node('bootstrap_test');
@ -137,7 +137,7 @@ SELECT * FROM add_data_node('bootstrap_test', host => 'localhost',
database => 'bootstrap_test', bootstrap => false);
node_name | host | port | database | node_created | database_created | extension_created
----------------+-----------+-------+----------------+--------------+------------------+-------------------
bootstrap_test | localhost | 15432 | bootstrap_test | t | f | f
bootstrap_test | localhost | 55432 | bootstrap_test | t | f | f
(1 row)
SELECT * FROM delete_data_node('bootstrap_test');
@ -165,7 +165,7 @@ NOTICE: database "bootstrap_test" already exists on data node, skipping
NOTICE: extension "timescaledb" already exists on data node, skipping
node_name | host | port | database | node_created | database_created | extension_created
----------------+-----------+-------+----------------+--------------+------------------+-------------------
bootstrap_test | localhost | 15432 | bootstrap_test | t | f | f
bootstrap_test | localhost | 55432 | bootstrap_test | t | f | f
(1 row)
SELECT * FROM delete_data_node('bootstrap_test');
@ -271,13 +271,13 @@ SELECT * FROM add_data_node('bootstrap_test', host => 'localhost',
database => 'bootstrap_test', bootstrap => true);
node_name | host | port | database | node_created | database_created | extension_created
----------------+-----------+-------+----------------+--------------+------------------+-------------------
bootstrap_test | localhost | 15432 | bootstrap_test | t | t | t
bootstrap_test | localhost | 55432 | bootstrap_test | t | t | t
(1 row)
SELECT * FROM show_data_nodes();
data_node_name | host | port | dbname
----------------+-----------+-------+----------------
bootstrap_test | localhost | 15432 | bootstrap_test
bootstrap_test | localhost | 55432 | bootstrap_test
(1 row)
SELECT * FROM delete_data_node('bootstrap_test');
@ -302,7 +302,7 @@ SELECT * FROM add_data_node('bootstrap_test', host => 'localhost',
database => 'bootstrap_test', bootstrap => true);
node_name | host | port | database | node_created | database_created | extension_created
----------------+-----------+-------+----------------+--------------+------------------+-------------------
bootstrap_test | localhost | 15432 | bootstrap_test | t | t | t
bootstrap_test | localhost | 55432 | bootstrap_test | t | t | t
(1 row)
SELECT * FROM delete_data_node('bootstrap_test');
@ -433,7 +433,7 @@ SELECT label FROM pg_shseclabel
SELECT * FROM add_data_node('drop_db_test_dn', host => 'localhost', database => 'drop_db_test_dn');
node_name | host | port | database | node_created | database_created | extension_created
-----------------+-----------+-------+-----------------+--------------+------------------+-------------------
drop_db_test_dn | localhost | 15432 | drop_db_test_dn | t | t | t
drop_db_test_dn | localhost | 55432 | drop_db_test_dn | t | t | t
(1 row)
-- Make sure security label is created

View File

@ -19,19 +19,19 @@ SET client_min_messages TO NOTICE;
SELECT * FROM add_data_node('data_node_1', host => 'localhost', database => 'data_node_1');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_1 | localhost | 15432 | data_node_1 | t | t | t
data_node_1 | localhost | 55432 | data_node_1 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_2', host => 'localhost', database => 'data_node_2');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_2 | localhost | 15432 | data_node_2 | t | t | t
data_node_2 | localhost | 55432 | data_node_2 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_3', host => 'localhost', database => 'data_node_3');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_3 | localhost | 15432 | data_node_3 | t | t | t
data_node_3 | localhost | 55432 | data_node_3 | t | t | t
(1 row)
GRANT USAGE ON FOREIGN SERVER data_node_1, data_node_2, data_node_3 TO PUBLIC;

View File

@ -16,21 +16,21 @@ SELECT * FROM add_data_node('data_node_1', host => 'localhost',
database => 'data_node_1');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_1 | localhost | 15432 | data_node_1 | t | t | t
data_node_1 | localhost | 55432 | data_node_1 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_2', host => 'localhost',
database => 'data_node_2');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_2 | localhost | 15432 | data_node_2 | t | t | t
data_node_2 | localhost | 55432 | data_node_2 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_3', host => 'localhost',
database => 'data_node_3');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_3 | localhost | 15432 | data_node_3 | t | t | t
data_node_3 | localhost | 55432 | data_node_3 | t | t | t
(1 row)
GRANT USAGE ON FOREIGN SERVER data_node_1, data_node_2, data_node_3 TO PUBLIC;
@ -38,11 +38,11 @@ GRANT USAGE ON FOREIGN SERVER data_node_1, data_node_2, data_node_3 TO PUBLIC;
List of foreign servers
Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW options | Description
-------------+--------------------+----------------------+-----------------------------------------+------+---------+--------------------------------------------------------+-------------
data_node_1 | cluster_super_user | timescaledb_fdw | cluster_super_user=U/cluster_super_user+| | | (host 'localhost', port '15432', dbname 'data_node_1') |
data_node_1 | cluster_super_user | timescaledb_fdw | cluster_super_user=U/cluster_super_user+| | | (host 'localhost', port '55432', dbname 'data_node_1') |
| | | =U/cluster_super_user | | | |
data_node_2 | cluster_super_user | timescaledb_fdw | cluster_super_user=U/cluster_super_user+| | | (host 'localhost', port '15432', dbname 'data_node_2') |
data_node_2 | cluster_super_user | timescaledb_fdw | cluster_super_user=U/cluster_super_user+| | | (host 'localhost', port '55432', dbname 'data_node_2') |
| | | =U/cluster_super_user | | | |
data_node_3 | cluster_super_user | timescaledb_fdw | cluster_super_user=U/cluster_super_user+| | | (host 'localhost', port '15432', dbname 'data_node_3') |
data_node_3 | cluster_super_user | timescaledb_fdw | cluster_super_user=U/cluster_super_user+| | | (host 'localhost', port '55432', dbname 'data_node_3') |
| | | =U/cluster_super_user | | | |
(3 rows)

View File

@ -23,21 +23,21 @@ SELECT * FROM add_data_node('data_node_1', host => 'localhost',
database => 'data_node_1');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_1 | localhost | 15432 | data_node_1 | t | t | t
data_node_1 | localhost | 55432 | data_node_1 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_2', host => 'localhost',
database => 'data_node_2');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_2 | localhost | 15432 | data_node_2 | t | t | t
data_node_2 | localhost | 55432 | data_node_2 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_3', host => 'localhost',
database => 'data_node_3');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_3 | localhost | 15432 | data_node_3 | t | t | t
data_node_3 | localhost | 55432 | data_node_3 | t | t | t
(1 row)
GRANT USAGE ON FOREIGN SERVER data_node_1, data_node_2, data_node_3 TO :ROLE_1;

View File

@ -17,21 +17,21 @@ SELECT * FROM add_data_node('data_node_1', host => 'localhost',
database => 'data_node_1');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_1 | localhost | 15432 | data_node_1 | t | t | t
data_node_1 | localhost | 55432 | data_node_1 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_2', host => 'localhost',
database => 'data_node_2');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_2 | localhost | 15432 | data_node_2 | t | t | t
data_node_2 | localhost | 55432 | data_node_2 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_3', host => 'localhost',
database => 'data_node_3');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_3 | localhost | 15432 | data_node_3 | t | t | t
data_node_3 | localhost | 55432 | data_node_3 | t | t | t
(1 row)
GRANT USAGE ON FOREIGN SERVER data_node_1, data_node_2, data_node_3 TO PUBLIC;

View File

@ -10,19 +10,19 @@ NOTICE: table "conditions" does not exist, skipping
SELECT * FROM add_data_node('data1', host => 'localhost', database => 'data1');
node_name | host | port | database | node_created | database_created | extension_created
-----------+-----------+-------+----------+--------------+------------------+-------------------
data1 | localhost | 15432 | data1 | t | t | t
data1 | localhost | 55432 | data1 | t | t | t
(1 row)
SELECT * FROM add_data_node('data2', host => 'localhost', database => 'data2');
node_name | host | port | database | node_created | database_created | extension_created
-----------+-----------+-------+----------+--------------+------------------+-------------------
data2 | localhost | 15432 | data2 | t | t | t
data2 | localhost | 55432 | data2 | t | t | t
(1 row)
SELECT * FROM add_data_node('data3', host => 'localhost', database => 'data3');
node_name | host | port | database | node_created | database_created | extension_created
-----------+-----------+-------+----------+--------------+------------------+-------------------
data3 | localhost | 15432 | data3 | t | t | t
data3 | localhost | 55432 | data3 | t | t | t
(1 row)
CREATE TABLE conditions(time TIMESTAMPTZ NOT NULL, device INTEGER, temperature FLOAT, humidity FLOAT);

View File

@ -18,21 +18,21 @@ SELECT * FROM add_data_node('data_node_1', host => 'localhost',
database => 'data_node_1');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_1 | localhost | 15432 | data_node_1 | t | t | t
data_node_1 | localhost | 55432 | data_node_1 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_2', host => 'localhost',
database => 'data_node_2');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_2 | localhost | 15432 | data_node_2 | t | t | t
data_node_2 | localhost | 55432 | data_node_2 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_3', host => 'localhost',
database => 'data_node_3');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_3 | localhost | 15432 | data_node_3 | t | t | t
data_node_3 | localhost | 55432 | data_node_3 | t | t | t
(1 row)
GRANT USAGE ON FOREIGN SERVER data_node_1, data_node_2, data_node_3 TO PUBLIC;
@ -41,9 +41,9 @@ SET ROLE :ROLE_1;
SELECT node_name, "options" FROM timescaledb_information.data_node ORDER BY node_name;
node_name | options
-------------+------------------------------------------------
data_node_1 | {host=localhost,port=15432,dbname=data_node_1}
data_node_2 | {host=localhost,port=15432,dbname=data_node_2}
data_node_3 | {host=localhost,port=15432,dbname=data_node_3}
data_node_1 | {host=localhost,port=55432,dbname=data_node_1}
data_node_2 | {host=localhost,port=55432,dbname=data_node_2}
data_node_3 | {host=localhost,port=55432,dbname=data_node_3}
(3 rows)
\set ON_ERROR_STOP 0
@ -381,9 +381,9 @@ Sun Jul 01 08:01:00 2018 PDT| 29| 1.5
SELECT node_name, "options" FROM timescaledb_information.data_node ORDER BY node_name;
node_name | options
-------------+------------------------------------------------
data_node_1 | {host=localhost,port=15432,dbname=data_node_1}
data_node_2 | {host=localhost,port=15432,dbname=data_node_2}
data_node_3 | {host=localhost,port=15432,dbname=data_node_3}
data_node_1 | {host=localhost,port=55432,dbname=data_node_1}
data_node_2 | {host=localhost,port=55432,dbname=data_node_2}
data_node_3 | {host=localhost,port=55432,dbname=data_node_3}
(3 rows)
SELECT * FROM hypertable_data_node_relation_size('disttable');

View File

@ -18,21 +18,21 @@ SELECT * FROM add_data_node('data_node_1', host => 'localhost',
database => 'data_node_1');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_1 | localhost | 15432 | data_node_1 | t | t | t
data_node_1 | localhost | 55432 | data_node_1 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_2', host => 'localhost',
database => 'data_node_2');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_2 | localhost | 15432 | data_node_2 | t | t | t
data_node_2 | localhost | 55432 | data_node_2 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_3', host => 'localhost',
database => 'data_node_3');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_3 | localhost | 15432 | data_node_3 | t | t | t
data_node_3 | localhost | 55432 | data_node_3 | t | t | t
(1 row)
GRANT USAGE ON FOREIGN SERVER data_node_1, data_node_2, data_node_3 TO PUBLIC;
@ -41,9 +41,9 @@ SET ROLE :ROLE_1;
SELECT node_name, "options" FROM timescaledb_information.data_node ORDER BY node_name;
node_name | options
-------------+------------------------------------------------
data_node_1 | {host=localhost,port=15432,dbname=data_node_1}
data_node_2 | {host=localhost,port=15432,dbname=data_node_2}
data_node_3 | {host=localhost,port=15432,dbname=data_node_3}
data_node_1 | {host=localhost,port=55432,dbname=data_node_1}
data_node_2 | {host=localhost,port=55432,dbname=data_node_2}
data_node_3 | {host=localhost,port=55432,dbname=data_node_3}
(3 rows)
\set ON_ERROR_STOP 0
@ -381,9 +381,9 @@ Sun Jul 01 08:01:00 2018 PDT| 29| 1.5
SELECT node_name, "options" FROM timescaledb_information.data_node ORDER BY node_name;
node_name | options
-------------+------------------------------------------------
data_node_1 | {host=localhost,port=15432,dbname=data_node_1}
data_node_2 | {host=localhost,port=15432,dbname=data_node_2}
data_node_3 | {host=localhost,port=15432,dbname=data_node_3}
data_node_1 | {host=localhost,port=55432,dbname=data_node_1}
data_node_2 | {host=localhost,port=55432,dbname=data_node_2}
data_node_3 | {host=localhost,port=55432,dbname=data_node_3}
(3 rows)
SELECT * FROM hypertable_data_node_relation_size('disttable');

View File

@ -48,21 +48,21 @@ SELECT * FROM add_data_node('data_node_1', host => 'localhost',
database => 'data_node_1');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_1 | localhost | 15432 | data_node_1 | t | t | t
data_node_1 | localhost | 55432 | data_node_1 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_2', host => 'localhost',
database => 'data_node_2');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_2 | localhost | 15432 | data_node_2 | t | t | t
data_node_2 | localhost | 55432 | data_node_2 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_3', host => 'localhost',
database => 'data_node_3');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_3 | localhost | 15432 | data_node_3 | t | t | t
data_node_3 | localhost | 55432 | data_node_3 | t | t | t
(1 row)
GRANT USAGE ON FOREIGN SERVER data_node_1, data_node_2, data_node_3 TO :ROLE_1;

View File

@ -34,21 +34,21 @@ SELECT * FROM add_data_node('data_node_1', host => 'localhost',
database => 'data_node_1');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_1 | localhost | 15432 | data_node_1 | t | t | t
data_node_1 | localhost | 55432 | data_node_1 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_2', host => 'localhost',
database => 'data_node_2');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_2 | localhost | 15432 | data_node_2 | t | t | t
data_node_2 | localhost | 55432 | data_node_2 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_3', host => 'localhost',
database => 'data_node_3');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_3 | localhost | 15432 | data_node_3 | t | t | t
data_node_3 | localhost | 55432 | data_node_3 | t | t | t
(1 row)
GRANT USAGE ON FOREIGN SERVER data_node_1, data_node_2, data_node_3 TO :ROLE_1;

View File

@ -34,21 +34,21 @@ SELECT * FROM add_data_node('data_node_1', host => 'localhost',
database => 'data_node_1');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_1 | localhost | 15432 | data_node_1 | t | t | t
data_node_1 | localhost | 55432 | data_node_1 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_2', host => 'localhost',
database => 'data_node_2');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_2 | localhost | 15432 | data_node_2 | t | t | t
data_node_2 | localhost | 55432 | data_node_2 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_3', host => 'localhost',
database => 'data_node_3');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_3 | localhost | 15432 | data_node_3 | t | t | t
data_node_3 | localhost | 55432 | data_node_3 | t | t | t
(1 row)
GRANT USAGE ON FOREIGN SERVER data_node_1, data_node_2, data_node_3 TO :ROLE_1;

View File

@ -88,7 +88,7 @@ SELECT key, value FROM _timescaledb_catalog.metadata WHERE key LIKE '%uuid';
SELECT * FROM add_data_node('data_node_1', host => 'localhost', database => 'backend_1_1');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_1 | localhost | 15432 | backend_1_1 | t | t | t
data_node_1 | localhost | 55432 | backend_1_1 | t | t | t
(1 row)
SELECT key, value FROM _timescaledb_catalog.metadata WHERE key LIKE '%uuid';
@ -113,7 +113,7 @@ SELECT key, value FROM _timescaledb_catalog.metadata WHERE key LIKE '%uuid';
SELECT * FROM add_data_node('data_node_1', host => 'localhost', database => 'backend_2_1');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_1 | localhost | 15432 | backend_2_1 | t | t | t
data_node_1 | localhost | 55432 | backend_2_1 | t | t | t
(1 row)
SELECT key, value FROM _timescaledb_catalog.metadata WHERE key LIKE '%uuid';
@ -167,7 +167,7 @@ ERROR: invalid_data_node is not valid as data node
SELECT * FROM add_data_node('data_node_2', host => 'localhost', database => 'backend_x_2', bootstrap => true);
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_2 | localhost | 15432 | backend_x_2 | t | t | t
data_node_2 | localhost | 55432 | backend_x_2 | t | t | t
(1 row)
-- dist_uuid should be added to the metadata on the data node
@ -202,7 +202,7 @@ DELETE FROM _timescaledb_catalog.metadata WHERE key = 'dist_uuid';
SELECT * FROM add_data_node('data_node_2', host => 'localhost', database => 'backend_x_2', bootstrap => false);
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_2 | localhost | 15432 | backend_x_2 | t | f | f
data_node_2 | localhost | 55432 | backend_x_2 | t | f | f
(1 row)
-- dist_uuid should be added to the metadata on the data node
@ -241,11 +241,11 @@ INSERT INTO disttable VALUES
('2018-01-02 08:01', 2, 1.3),
('2019-01-01 09:11', 3, 2.1),
('2017-01-01 06:05', 1, 1.4);
SELECT * FROM timescaledb_information.data_node;
SELECT * FROM timescaledb_information.data_node ORDER BY node_name;
node_name | owner | options | node_up | num_dist_tables | num_dist_chunks | total_dist_size
-------------+--------------------+------------------------------------------------+---------+-----------------+-----------------+-----------------
data_node_1 | cluster_super_user | {host=localhost,port=15432,dbname=backend_2_1} | t | 1 | 2 | 48 kB
data_node_2 | cluster_super_user | {host=localhost,port=15432,dbname=backend_x_2} | t | 1 | 1 | 24 kB
data_node_1 | cluster_super_user | {host=localhost,port=55432,dbname=backend_2_1} | t | 1 | 2 | 48 kB
data_node_2 | cluster_super_user | {host=localhost,port=55432,dbname=backend_x_2} | t | 1 | 1 | 24 kB
(2 rows)
SELECT * FROM timescaledb_information.hypertable;
@ -267,14 +267,14 @@ SELECT * FROM hypertable_relation_size('nondisttable');
24576 | 49152 | | 73728
(1 row)
SELECT * FROM hypertable_data_node_relation_size('disttable');
SELECT * FROM hypertable_data_node_relation_size('disttable') ORDER BY node_name;
node_name | num_chunks | table_size | index_size | toast_size | total_size
-------------+------------+------------+------------+------------+------------
data_node_1 | 2 | 16 kB | 32 kB | | 48 kB
data_node_2 | 1 | 8192 bytes | 16 kB | | 24 kB
(2 rows)
SELECT * FROM hypertable_data_node_relation_size('nondisttable');
SELECT * FROM hypertable_data_node_relation_size('nondisttable') ORDER BY node_name;
NOTICE: calling hypertable_data_node_relation_size on a non-distributed hypertable
node_name | num_chunks | table_size | index_size | toast_size | total_size
-----------+------------+------------+------------+------------+------------

View File

@ -11,21 +11,21 @@ SELECT * FROM add_data_node('data_node_1', host => 'localhost',
database => 'data_node_1');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_1 | localhost | 15432 | data_node_1 | t | t | t
data_node_1 | localhost | 55432 | data_node_1 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_2', host => 'localhost',
database => 'data_node_2');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_2 | localhost | 15432 | data_node_2 | t | t | t
data_node_2 | localhost | 55432 | data_node_2 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_3', host => 'localhost',
database => 'data_node_3');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_3 | localhost | 15432 | data_node_3 | t | t | t
data_node_3 | localhost | 55432 | data_node_3 | t | t | t
(1 row)
GRANT USAGE

View File

@ -13,21 +13,21 @@ SELECT * FROM add_data_node('data_node_1', host => 'localhost',
database => 'data_node_1');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_1 | localhost | 15432 | data_node_1 | t | t | t
data_node_1 | localhost | 55432 | data_node_1 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_2', host => 'localhost',
database => 'data_node_2');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_2 | localhost | 15432 | data_node_2 | t | t | t
data_node_2 | localhost | 55432 | data_node_2 | t | t | t
(1 row)
SELECT * FROM add_data_node('data_node_3', host => 'localhost',
database => 'data_node_3');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_3 | localhost | 15432 | data_node_3 | t | t | t
data_node_3 | localhost | 55432 | data_node_3 | t | t | t
(1 row)
GRANT USAGE ON FOREIGN SERVER data_node_1, data_node_2, data_node_3 TO PUBLIC;

View File

@ -39,13 +39,13 @@ LANGUAGE C;
SELECT * FROM add_loopback_server('loopback', database => :'TEST_DBNAME', bootstrap => false);
server_name | host | port | database | server_created | database_created | extension_created
-------------+-----------+-------+---------------+----------------+------------------+-------------------
loopback | localhost | 15432 | db_remote_txn | t | f | f
loopback | localhost | 55432 | db_remote_txn | t | f | f
(1 row)
SELECT * FROM add_loopback_server('loopback2', database => :'TEST_DBNAME', bootstrap => false);
server_name | host | port | database | server_created | database_created | extension_created
-------------+-----------+-------+---------------+----------------+------------------+-------------------
loopback2 | localhost | 15432 | db_remote_txn | t | f | f
loopback2 | localhost | 55432 | db_remote_txn | t | f | f
(1 row)
-- ===================================================================

View File

@ -17,7 +17,7 @@ SELECT * FROM add_data_node('data_node_1', host => 'localhost',
database => 'data_node_1');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_1 | localhost | 15432 | data_node_1 | t | t | t
data_node_1 | localhost | 55432 | data_node_1 | t | t | t
(1 row)
SELECT json_object_field(get_telemetry_report(always_display_report := true)::json, 'distributed_db');
@ -39,7 +39,7 @@ SELECT * FROM add_data_node('data_node_2', 'localhost',
database => 'data_node_2');
node_name | host | port | database | node_created | database_created | extension_created
-------------+-----------+-------+-------------+--------------+------------------+-------------------
data_node_2 | localhost | 15432 | data_node_2 | t | t | t
data_node_2 | localhost | 55432 | data_node_2 | t | t | t
(1 row)
-- Add hypertables

View File

@ -34,9 +34,23 @@ SELECT * FROM add_data_node(NULL);
-- Add NULL data_node
SELECT * FROM add_data_node(NULL, host => 'localhost');
SELECT * FROM add_data_node(NULL, NULL);
-- Test invalid port numbers
SELECT * FROM add_data_node('data_node_3', 'localhost',
port => 65536,
database => 'data_node_3');
SELECT * FROM add_data_node('data_node_3', 'localhost',
port => 0,
database => 'data_node_3');
SELECT * FROM add_data_node('data_node_3', 'localhost',
port => -1,
database => 'data_node_3');
SELECT inet_server_port() as PGPORT \gset
-- Adding a data node via ADD SERVER is blocked
CREATE SERVER data_node_4 FOREIGN DATA WRAPPER timescaledb_fdw
OPTIONS (host 'localhost', port '15432', dbname 'data_node_4');
OPTIONS (host 'localhost', port ':PGPORT', dbname 'data_node_4');
-- Dropping a data node via DROP SERVER is also blocked
DROP SERVER data_node_1, data_node_2;
\set ON_ERROR_STOP 1

View File

@ -136,9 +136,9 @@ INSERT INTO disttable VALUES
('2019-01-01 09:11', 3, 2.1),
('2017-01-01 06:05', 1, 1.4);
SELECT * FROM timescaledb_information.data_node;
SELECT * FROM timescaledb_information.data_node ORDER BY node_name;
SELECT * FROM timescaledb_information.hypertable;
SELECT * FROM hypertable_relation_size('disttable');
SELECT * FROM hypertable_relation_size('nondisttable');
SELECT * FROM hypertable_data_node_relation_size('disttable');
SELECT * FROM hypertable_data_node_relation_size('nondisttable');
SELECT * FROM hypertable_data_node_relation_size('disttable') ORDER BY node_name;
SELECT * FROM hypertable_data_node_relation_size('nondisttable') ORDER BY node_name;