diff --git a/ChangeLog b/ChangeLog index e1e173b..0d9d286 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,10 +1,22 @@ +15/12/2024 Cédric Villemain + * 1.4.0 - Add GHA test for PostgreSQL 17 + - Drop support for PostgreSQL < 12 + - Add function pg_page_size() + - Add function pg_segment_size() + - Add function vm_available_pages() + - Add function vm_page_size() + - Add function vm_physical_pages() + 21/09/2023 Cédric Villemain * 1.3.1 - drop support for upgrading from "unpackaged" + 21/09/2023 Cédric Villemain * 1.3 - added support for PostgreSQL 16 - drop support for PostgreSQL < 9.4 -2019-10-29 Cédric Villemain + +29/10/2019 Cédric Villemain * 1.2.2 - Fix bad errno usage + 22/09/2017 Cédric Villemain * 1.2.1 - Fix check on NULL input for drawer function diff --git a/Makefile b/Makefile index a05cd16..94e8da1 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,11 @@ EXTENSION = pgfincore -EXTVERSION = 1.3.1 +EXTVERSION = 1.4.0 MODULES = $(EXTENSION) MODULEDIR = $(EXTENSION) DOCS = README.md -DATA = $(EXTENSION)--1.2--1.3.1.sql \ - $(EXTENSION)--$(EXTVERSION).sql +DATA = $(EXTENSION)--1.3.1.sql \ + $(EXTENSION)--1.3.1--1.4.0.sql REGRESS = $(EXTENSION) diff --git a/README.md b/README.md index 6c6c675..ff385bb 100644 --- a/README.md +++ b/README.md @@ -35,12 +35,16 @@ You can grab the latest code with git: git clone git://git.postgresql.org/git/pgfincore.git or + git://github.com/pgfincore/pgfincore.git + or git://github.com/klando/pgfincore.git -And the project is on pgfoundry : http://pgfoundry.org/projects/pgfincore - ## INSTALL +* PgFincore is packaged for *RPM* at http://yum.postgresql.org/ +* PgFincore is packaged for *debian* at http://pgapt.debian.net/ +* PgFincore extension is available on some large SQL cloud providers. + From source code: make clean @@ -48,28 +52,17 @@ From source code: su make install -For PostgreSQL >= 9.1, log in your database and: +Log in your database and: mydb=# CREATE EXTENSION pgfincore; -For other release, create the functions from the sql script (it should be in -your contrib directory): - - psql mydb -f pgfincore.sql - PgFincore is also shipped with Debian scripts to build your own package: aptitude install debhelper postgresql-server-dev-all postgresql-server-dev-9.1 - # or postgresql-server-dev-8.4|postgresql-server-dev-9.0 + # or postgresql-server-dev-8.4|postgresql-server-dev-9.0 make deb dpkg -i ../postgresql-9.1-pgfincore_1.1.1-1_amd64.deb -PgFincore is packaged for *RPM* at http://yum.postgresql.org/ -PgFincore is packaged for *debian* at http://pgapt.debian.net/ - - - - ## EXAMPLES Here are some examples of usage. If you want more details go to Documentation_ @@ -217,6 +210,26 @@ Executing a snapshot and a restore is very simple: OUT group_dirty bigint) RETURNS setof record +:: pg_page_size() RETURNS bigint + + Returns PostgreSQL page size in bytes + +:: pg_segment_size() RETURNS int + + Returns PostgreSQL segment size in blocks + +:: vm_available_pages() RETURNS bigint + + Returns current number of available pages in system memory + +:: vm_page_size() RETURNS bigint + + Returns system page size in bytes + +:: vm_physical_pages() RETURNS bigint + + Returns total number of physical pages in system memory + ## DOCUMENTATION ### pgsysconf @@ -338,14 +351,12 @@ For example: ## REQUIREMENTS - * PgFincore needs mincore() or fincore() and POSIX_FADVISE + * PgFincore requires sysconf(), mincore() or fincore(), and POSIX_FADVISE. + * PostgreSQL >= 9.3 ## LIMITATIONS * PgFincore has a limited mode when POSIX_FADVISE is not provided by the platform. - - * PgFincore needs PostgreSQL >= 8.3 - * PgFincore does not work on windows. ## SEE ALSO diff --git a/expected/pgfincore.out b/expected/pgfincore.out index d1425ec..0ca128c 100644 --- a/expected/pgfincore.out +++ b/expected/pgfincore.out @@ -92,3 +92,36 @@ select NULL || pgfincore_drawer(databit) from pgfincore('test','main',true); (1 row) +-- +-- System/PostgreSQL info +-- +-- assume most systems have same defaults +-- it's possible to add another output file +-- to manage larger PostgreSQL and or system page size. +SELECT pg_page_size(); + pg_page_size +-------------- + 8192 +(1 row) + +SELECT pg_segment_size(); + pg_segment_size +----------------- + 131072 +(1 row) + +SELECT vm_page_size(); + vm_page_size +-------------- + 4096 +(1 row) + +-- no output for the following: +SELECT FROM vm_physical_pages(); +-- +(1 row) + +SELECT FROM vm_available_pages(); +-- +(1 row) + diff --git a/pgfincore--1.2--1.3.1.sql b/pgfincore--1.2--1.3.1.sql deleted file mode 100644 index e69de29..0000000 diff --git a/pgfincore--1.3.1--1.4.0.sql b/pgfincore--1.3.1--1.4.0.sql new file mode 100644 index 0000000..111e119 --- /dev/null +++ b/pgfincore--1.3.1--1.4.0.sql @@ -0,0 +1,24 @@ +CREATE FUNCTION pg_page_size() RETURNS bigint +AS '$libdir/pgfincore' LANGUAGE C STABLE; +COMMENT ON FUNCTION pg_page_size() +IS 'Returns PostgreSQL page size in bytes'; + +CREATE FUNCTION pg_segment_size() RETURNS bigint +AS '$libdir/pgfincore' LANGUAGE C STABLE; +COMMENT ON FUNCTION pg_segment_size() +IS 'Returns PostgreSQL segment size in blocks'; + +CREATE FUNCTION vm_available_pages() RETURNS bigint +AS '$libdir/pgfincore' LANGUAGE C STABLE; +COMMENT ON FUNCTION vm_available_pages() +IS 'Returns current number of free pages in system memory'; + +CREATE FUNCTION vm_page_size() RETURNS bigint +AS '$libdir/pgfincore' LANGUAGE C STABLE; +COMMENT ON FUNCTION vm_page_size() +IS 'Returns system page size in bytes'; + +CREATE FUNCTION vm_physical_pages(OUT sys_pages_free bigint) +AS '$libdir/pgfincore' LANGUAGE C STABLE; +COMMENT ON FUNCTION vm_physical_pages() +IS 'Returns number of pages in system memory'; diff --git a/pgfincore.c b/pgfincore.c index 45d0b88..568c28b 100644 --- a/pgfincore.c +++ b/pgfincore.c @@ -1111,3 +1111,74 @@ pgfincore_drawer(PG_FUNCTION_ARGS) *r = '\0'; PG_RETURN_CSTRING(result); } + +/* + * sysconf and PostgreSQL informations + */ +PG_FUNCTION_INFO_V1(pg_page_size); +PG_FUNCTION_INFO_V1(pg_segment_size); +PG_FUNCTION_INFO_V1(vm_available_pages); +PG_FUNCTION_INFO_V1(vm_page_size); +PG_FUNCTION_INFO_V1(vm_physical_pages); + +/* PostgreSQL Page size */ +static inline size_t pg_PageSize() +{ + return BLCKSZ; +} +Datum +pg_page_size(PG_FUNCTION_ARGS) +{ + PG_RETURN_UINT64(pg_PageSize()); +} + +/* PostgreSQL Segment size */ +static inline uint32 pg_SegmentSize() +{ + return RELSEG_SIZE; +} +Datum +pg_segment_size(PG_FUNCTION_ARGS) +{ + PG_RETURN_UINT32(pg_SegmentSize()); +} + +/* System Page size */ +static size_t _sc_pagesize = 0; +static inline size_t vm_PageSize() +{ + if (_sc_pagesize == 0) + _sc_pagesize = sysconf(_SC_PAGESIZE); + return ((size_t) _sc_pagesize); +} +Datum +vm_page_size(PG_FUNCTION_ARGS) +{ + PG_RETURN_UINT64(vm_PageSize()); +} + +/* System number of available pages */ +static inline size_t vm_AvPhysPages() +{ + return (size_t) sysconf(_SC_AVPHYS_PAGES); +} +Datum +vm_available_pages(PG_FUNCTION_ARGS) +{ + PG_RETURN_UINT64(vm_AvPhysPages()); +} + +/* System number of physical pages */ +static size_t _sc_phys_pages = 0; +static inline size_t vm_PhysPages() +{ + if (_sc_phys_pages == 0) + _sc_phys_pages = sysconf(_SC_PHYS_PAGES); + return _sc_phys_pages; +} +Datum +vm_physical_pages(PG_FUNCTION_ARGS) +{ + PG_RETURN_UINT64(vm_PhysPages()); +} + diff --git a/pgfincore.control b/pgfincore.control index f11627b..d95f886 100644 --- a/pgfincore.control +++ b/pgfincore.control @@ -1,6 +1,6 @@ # pgfincore extension comment = 'examine and manage the os buffer cache' -default_version = '1.3.1' +default_version = '1.4.0' module_pathname = '$libdir/pgfincore' directory = pgfincore relocatable = true diff --git a/sql/pgfincore.sql b/sql/pgfincore.sql index 3371cd1..dd3bf31 100644 --- a/sql/pgfincore.sql +++ b/sql/pgfincore.sql @@ -51,3 +51,17 @@ select from pgfadvise_normal('test'); -- tests drawers -- select NULL || pgfincore_drawer(databit) from pgfincore('test','main',true); + +-- +-- System/PostgreSQL info +-- +-- assume most systems have same defaults +-- it's possible to add another output file +-- to manage larger PostgreSQL and or system page size. +SELECT pg_page_size(); +SELECT pg_segment_size(); +SELECT vm_page_size(); +-- no output for the following: +SELECT FROM vm_physical_pages(); +SELECT FROM vm_available_pages(); +