From 43c37b8dab039cb31efb8e65d67f1131b15c72b6 Mon Sep 17 00:00:00 2001 From: Nathan Bossart Date: Mon, 4 Dec 2023 16:40:30 -0600 Subject: [PATCH v1 2/2] test dsm registry --- src/test/modules/Makefile | 1 + src/test/modules/meson.build | 1 + src/test/modules/test_dsm_registry/.gitignore | 4 ++ src/test/modules/test_dsm_registry/Makefile | 23 ++++++++ .../modules/test_dsm_registry/meson.build | 33 ++++++++++++ .../t/001_test_dsm_registry.pl | 25 +++++++++ .../test_dsm_registry--1.0.sql | 10 ++++ .../test_dsm_registry/test_dsm_registry.c | 54 +++++++++++++++++++ .../test_dsm_registry.control | 4 ++ 9 files changed, 155 insertions(+) create mode 100644 src/test/modules/test_dsm_registry/.gitignore create mode 100644 src/test/modules/test_dsm_registry/Makefile create mode 100644 src/test/modules/test_dsm_registry/meson.build create mode 100644 src/test/modules/test_dsm_registry/t/001_test_dsm_registry.pl create mode 100644 src/test/modules/test_dsm_registry/test_dsm_registry--1.0.sql create mode 100644 src/test/modules/test_dsm_registry/test_dsm_registry.c create mode 100644 src/test/modules/test_dsm_registry/test_dsm_registry.control diff --git a/src/test/modules/Makefile b/src/test/modules/Makefile index 5d33fa6a9a..f656032589 100644 --- a/src/test/modules/Makefile +++ b/src/test/modules/Makefile @@ -18,6 +18,7 @@ SUBDIRS = \ test_custom_rmgrs \ test_ddl_deparse \ test_dsa \ + test_dsm_registry \ test_extensions \ test_ginpostinglist \ test_integerset \ diff --git a/src/test/modules/meson.build b/src/test/modules/meson.build index b76f588559..bd53d52a3f 100644 --- a/src/test/modules/meson.build +++ b/src/test/modules/meson.build @@ -15,6 +15,7 @@ subdir('test_copy_callbacks') subdir('test_custom_rmgrs') subdir('test_ddl_deparse') subdir('test_dsa') +subdir('test_dsm_registry') subdir('test_extensions') subdir('test_ginpostinglist') subdir('test_integerset') diff --git a/src/test/modules/test_dsm_registry/.gitignore b/src/test/modules/test_dsm_registry/.gitignore new file mode 100644 index 0000000000..5dcb3ff972 --- /dev/null +++ b/src/test/modules/test_dsm_registry/.gitignore @@ -0,0 +1,4 @@ +# Generated subdirectories +/log/ +/results/ +/tmp_check/ diff --git a/src/test/modules/test_dsm_registry/Makefile b/src/test/modules/test_dsm_registry/Makefile new file mode 100644 index 0000000000..6f2508bc37 --- /dev/null +++ b/src/test/modules/test_dsm_registry/Makefile @@ -0,0 +1,23 @@ +# src/test/modules/test_dsm_registry/Makefile + +MODULE_big = test_dsm_registry +OBJS = \ + $(WIN32RES) \ + test_dsm_registry.o +PGFILEDESC = "test_dsm_registry - test code for the DSM registry" + +EXTENSION = test_dsm_registry +DATA = test_dsm_registry--1.0.sql + +TAP_TESTS = 1 + +ifdef USE_PGXS +PG_CONFIG = pg_config +PGXS := $(shell $(PG_CONFIG) --pgxs) +include $(PGXS) +else +subdir = src/test/modules/test_dsm_registry +top_builddir = ../../../.. +include $(top_builddir)/src/Makefile.global +include $(top_srcdir)/contrib/contrib-global.mk +endif diff --git a/src/test/modules/test_dsm_registry/meson.build b/src/test/modules/test_dsm_registry/meson.build new file mode 100644 index 0000000000..e5d8272d10 --- /dev/null +++ b/src/test/modules/test_dsm_registry/meson.build @@ -0,0 +1,33 @@ +# Copyright (c) 2023, PostgreSQL Global Development Group + +test_dsm_registry_sources = files( + 'test_dsm_registry.c', +) + +if host_system == 'windows' + test_dsm_registry_sources += rc_lib_gen.process(win32ver_rc, extra_args: [ + '--NAME', 'test_dsm_registry', + '--FILEDESC', 'test_dsm_registry - test code for the DSM registry',]) +endif + +test_dsm_registry = shared_module('test_dsm_registry', + test_dsm_registry_sources, + kwargs: pg_test_mod_args, +) +test_install_libs += test_dsm_registry + +test_install_data += files( + 'test_dsm_registry.control', + 'test_dsm_registry--1.0.sql', +) + +tests += { + 'name': 'test_dsm_registry', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tap': { + 'tests': [ + 't/001_test_dsm_registry.pl', + ], + }, +} diff --git a/src/test/modules/test_dsm_registry/t/001_test_dsm_registry.pl b/src/test/modules/test_dsm_registry/t/001_test_dsm_registry.pl new file mode 100644 index 0000000000..4ad6097d1c --- /dev/null +++ b/src/test/modules/test_dsm_registry/t/001_test_dsm_registry.pl @@ -0,0 +1,25 @@ + +# Copyright (c) 2023, PostgreSQL Global Development Group + +use strict; +use warnings; + +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +my $node = PostgreSQL::Test::Cluster->new('main'); +$node->init; +$node->start; + +$node->safe_psql('postgres', "CREATE DATABASE test;"); +$node->safe_psql('postgres', "CREATE EXTENSION test_dsm_registry;"); +$node->safe_psql('postgres', "SELECT set_val_in_shmem(1236);"); + +$node->safe_psql('test', "CREATE EXTENSION test_dsm_registry;"); +my $result = $node->safe_psql('test', "SELECT get_val_in_shmem();"); +is($result, "1236", "check shmem val"); + +$node->stop; + +done_testing(); diff --git a/src/test/modules/test_dsm_registry/test_dsm_registry--1.0.sql b/src/test/modules/test_dsm_registry/test_dsm_registry--1.0.sql new file mode 100644 index 0000000000..8c55b0919b --- /dev/null +++ b/src/test/modules/test_dsm_registry/test_dsm_registry--1.0.sql @@ -0,0 +1,10 @@ +/* src/test/modules/test_dsm_registry/test_dsm_registry--1.0.sql */ + +-- complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "CREATE EXTENSION test_dsm_registry" to load this file. \quit + +CREATE FUNCTION set_val_in_shmem(val INT) RETURNS VOID + AS 'MODULE_PATHNAME' LANGUAGE C; + +CREATE FUNCTION get_val_in_shmem() RETURNS INT + AS 'MODULE_PATHNAME' LANGUAGE C; diff --git a/src/test/modules/test_dsm_registry/test_dsm_registry.c b/src/test/modules/test_dsm_registry/test_dsm_registry.c new file mode 100644 index 0000000000..8f78012e52 --- /dev/null +++ b/src/test/modules/test_dsm_registry/test_dsm_registry.c @@ -0,0 +1,54 @@ +/*-------------------------------------------------------------------------- + * + * test_dsm_registry.c + * Test the DSM registry + * + * Copyright (c) 2023, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/test/modules/test_dsm_registry/test_dsm_registry.c + * + * ------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "fmgr.h" +#include "port/atomics.h" +#include "storage/dsm_registry.h" + +PG_MODULE_MAGIC; + +static pg_atomic_uint32 *val; + +static void +init_val(void *ptr) +{ + pg_atomic_init_u32(ptr, 0); +} + +static void +dsm_registry_attach(void) +{ + dsm_registry_init_or_attach("test_dsm_registry", (void **) &val, + sizeof(pg_atomic_uint32), init_val); +} + +PG_FUNCTION_INFO_V1(set_val_in_shmem); +Datum +set_val_in_shmem(PG_FUNCTION_ARGS) +{ + dsm_registry_attach(); + + (void) pg_atomic_exchange_u32(val, PG_GETARG_UINT32(0)); + + PG_RETURN_VOID(); +} + +PG_FUNCTION_INFO_V1(get_val_in_shmem); +Datum +get_val_in_shmem(PG_FUNCTION_ARGS) +{ + dsm_registry_attach(); + + PG_RETURN_UINT32(pg_atomic_fetch_add_u32(val, 0)); +} diff --git a/src/test/modules/test_dsm_registry/test_dsm_registry.control b/src/test/modules/test_dsm_registry/test_dsm_registry.control new file mode 100644 index 0000000000..813f099889 --- /dev/null +++ b/src/test/modules/test_dsm_registry/test_dsm_registry.control @@ -0,0 +1,4 @@ +comment = 'Test code for the DSM registry' +default_version = '1.0' +module_pathname = '$libdir/test_dsm_registry' +relocatable = true -- 2.25.1