Test two previous commits which did not include tests

https://github.com/citusdata/citus/pull/3400
https://github.com/citusdata/citus/pull/3382
pull/3415/head
Philip Dubé 2020-01-22 18:00:22 +00:00
parent 4118560b75
commit dafec9a070
7 changed files with 213 additions and 24 deletions

View File

@ -0,0 +1,138 @@
/*-------------------------------------------------------------------------
*
* system_utils.c
* Methods for managing databases during regression tests.
*
* Copyright (c) Citus Data, Inc.
*
* $Id$
*
*-------------------------------------------------------------------------
*/
#include "postgres.h"
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include "libpq-fe.h"
#include "pgstat.h"
#include "port.h"
#include "storage/fd.h"
#include "distributed/master_metadata_utility.h"
#include "distributed/version_compat.h"
PG_FUNCTION_INFO_V1(citus_stop_test_worker);
PG_FUNCTION_INFO_V1(citus_start_test_worker);
/*
* Invokes pg_ctl stop for the worker using the given port.
*/
Datum
citus_stop_test_worker(PG_FUNCTION_ARGS)
{
EnsureSuperUser();
int port = PG_GETARG_INT32(0);
StringInfoData commandString;
initStringInfo(&commandString);
appendStringInfo(&commandString, "pg_ctl stop -D ../../worker.%d/data", port);
PG_RETURN_INT32(system(commandString.data));
}
/*
* Starts worker using the given port.
*/
Datum
citus_start_test_worker(PG_FUNCTION_ARGS)
{
EnsureSuperUser();
int port = PG_GETARG_INT32(0);
const int fileFlags = O_RDONLY;
const int fileMode = S_IRUSR;
StringInfoData optionsPath;
initStringInfo(&optionsPath);
appendStringInfo(&optionsPath, "../../worker.%d/data/postmaster.opts", port);
File file =
PathNameOpenFilePerm(optionsPath.data, fileFlags, fileMode);
FileCompat fileCompat = FileCompatFromFileStart(file);
StringInfoData optionsString;
initStringInfo(&optionsString);
while (true)
{
char chunk[1025];
int amount = FileReadCompat(&fileCompat, chunk, 1024, PG_WAIT_IO);
if (amount <= 0)
{
break;
}
chunk[amount] = 0;
appendStringInfoString(&optionsString, chunk);
}
FileClose(file);
char *tmpCheckPtr = strstr(optionsString.data, " \"tmp_check/");
if (tmpCheckPtr == NULL)
{
/* If we've already been through this logic previously, the fix will've persisted. */
char *tmpCheckAlreadyCorrectPtr = strstr(optionsString.data,
" \"../../../tmp_check");
if (tmpCheckAlreadyCorrectPtr == NULL)
{
elog(ERROR, "Could not find directory in command string: %s",
optionsString.data);
}
}
else
{
/* replace " with NUL */
tmpCheckPtr[1] = 0;
}
StringInfoData commandString;
initStringInfo(&commandString);
appendStringInfoString(&commandString, optionsString.data);
if (tmpCheckPtr != NULL)
{
appendStringInfoString(&commandString, "\"../../../");
appendStringInfoString(&commandString, tmpCheckPtr + 2);
}
Assert(commandString.data[commandString.len - 1] == '\n');
commandString.data[commandString.len - 1] = '&';
int result = system(commandString.data);
if (result != 0)
{
elog(ERROR, "Failed to start worker, exit code: %d command: %s", result,
commandString.data);
}
StringInfoData connectionString;
initStringInfo(&connectionString);
appendStringInfo(&connectionString, "host=localhost port=%d dbname=regression", port);
/* poll for at least 10 seconds */
int i = 10000;
while (PQping(connectionString.data) != PQPING_OK)
{
pg_usleep(100);
if (!i--)
{
elog(ERROR, "could not connect");
}
}
PG_RETURN_VOID();
}

View File

@ -651,6 +651,14 @@ ERROR: permission denied for function worker_cleanup_job_schema_cache
SET ROLE no_access;
SELECT worker_cleanup_job_schema_cache();
ERROR: permission denied for function worker_cleanup_job_schema_cache
-- test other functions only superuser can call
SET ROLE full_access;
SELECT citus_stop_test_worker(:worker_1_port);
ERROR: operation is not allowed
HINT: Run the command with a superuser.
SELECT citus_start_test_worker(:worker_1_port);
ERROR: operation is not allowed
HINT: Run the command with a superuser.
RESET ROLE;
-- to test access to files created during repartition we will create some on worker 1
\c - - - :worker_1_port

View File

@ -403,29 +403,26 @@ SELECT * FROM researchers WHERE lab_id=10;
32 | 10 | Raymond Smullyan
(2 rows)
-- Verify that we don't have a memory leak in subtransactions
-- See https://github.com/citusdata/citus/pull/4000
CREATE FUNCTION text2number(v_value text) RETURNS numeric
LANGUAGE plpgsql VOLATILE
AS $$
BEGIN
RETURN v_value::numeric;
exception
when others then
return null;
END;
$$;
-- if we leak at least an integer in each subxact, then size of TopTransactionSize
-- will be way beyond the 50k limit. If issue #3999 happens, then this will also take
-- a long time, since for each row we will create a memory context that is not destroyed
-- until the end of command.
SELECT max(text2number('1234')), max(public.top_transaction_context_size()) > 50000 AS leaked
FROM generate_series(1, 20000);
max | leaked
-- Test https://github.com/citusdata/citus/issues/2179
CREATE TABLE ref(a int unique, b int);
SELECT create_reference_table('ref');
create_reference_table
---------------------------------------------------------------------
1234 | f
(1 row)
-- Clean-up
SET client_min_messages TO ERROR;
DROP SCHEMA multi_subtransactions CASCADE;
BEGIN;
SAVEPOINT start;
INSERT INTO ref VALUES (1001,2);
SELECT public.citus_stop_test_worker(:worker_2_port);
citus_stop_test_worker
---------------------------------------------------------------------
0
(1 row)
SELECT * FROM ref;
WARNING: connection to the remote node localhost:xxxxx failed
WARNING: connection to the remote node localhost:xxxxx failed
FATAL: terminating connection due to administrator command
SSL connection has been closed unexpectedly
connection to server was lost

View File

@ -53,3 +53,7 @@ CREATE OR REPLACE FUNCTION pg_catalog.partition_task_list_results(resultIdPrefix
CREATE OR REPLACE FUNCTION top_transaction_context_size() RETURNS BIGINT
LANGUAGE C STRICT VOLATILE
AS 'citus', $$top_transaction_context_size$$;
CREATE FUNCTION citus_stop_test_worker(int)
RETURNS int AS 'citus' LANGUAGE C;
CREATE FUNCTION citus_start_test_worker(int)
RETURNS void AS 'citus' LANGUAGE C;

View File

@ -387,6 +387,12 @@ SET ROLE read_access;
SELECT worker_cleanup_job_schema_cache();
SET ROLE no_access;
SELECT worker_cleanup_job_schema_cache();
-- test other functions only superuser can call
SET ROLE full_access;
SELECT citus_stop_test_worker(:worker_1_port);
SELECT citus_start_test_worker(:worker_1_port);
RESET ROLE;
-- to test access to files created during repartition we will create some on worker 1

View File

@ -308,9 +308,39 @@ COMMIT;
SELECT * FROM researchers WHERE lab_id=10;
-- Test https://github.com/citusdata/citus/issues/2179
CREATE TABLE ref(a int unique, b int);
SELECT create_reference_table('ref');
BEGIN;
SAVEPOINT start;
INSERT INTO ref VALUES (1001,2);
SELECT public.citus_stop_test_worker(:worker_2_port);
SELECT * FROM ref;
ROLLBACK TO SAVEPOINT start;
SELECT * FROM ref;
END;
SELECT public.citus_start_test_worker(:worker_2_port);
SELECT shardid FROM pg_dist_shard
JOIN pg_dist_placement USING (shardid)
WHERE shardstate = 3 AND logicalrelid = 'ref'::regclass;
SELECT * FROM ref ORDER BY 1;
-- Test https://github.com/citusdata/citus/issues/3360
BEGIN;
SELECT * FROM artists JOIN ref ON id = a;
SELECT public.citus_stop_test_worker(:worker_2_port);
INSERT INTO ref VALUES (1002,2);
END;
SELECT public.citus_start_test_worker(:worker_2_port);
SELECT * FROM ref ORDER BY 1;
-- Clean-up
DROP TABLE artists;
DROP TABLE researchers;
DROP TABLE ref;
-- Verify that we don't have a memory leak in subtransactions
-- See https://github.com/citusdata/citus/pull/4000
CREATE FUNCTION text2number(v_value text) RETURNS numeric
LANGUAGE plpgsql VOLATILE
AS $$

View File

@ -54,3 +54,9 @@ CREATE OR REPLACE FUNCTION pg_catalog.partition_task_list_results(resultIdPrefix
CREATE OR REPLACE FUNCTION top_transaction_context_size() RETURNS BIGINT
LANGUAGE C STRICT VOLATILE
AS 'citus', $$top_transaction_context_size$$;
CREATE FUNCTION citus_stop_test_worker(int)
RETURNS int AS 'citus' LANGUAGE C;
CREATE FUNCTION citus_start_test_worker(int)
RETURNS void AS 'citus' LANGUAGE C;