Skip to content

Commit c15789e

Browse files
committed
add pg_cfm to pg_visibility. Delete it after debugging
1 parent db39866 commit c15789e

File tree

5 files changed

+76
-5
lines changed

5 files changed

+76
-5
lines changed

contrib/pg_visibility/pg_visibility--1.1.sql

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,14 @@ AS 'MODULE_PATHNAME', 'pg_truncate_visibility_map'
6464
LANGUAGE C STRICT
6565
PARALLEL UNSAFE; -- let's not make this any more dangerous
6666

67+
-- Show visibility map and page-level visibility information.
68+
CREATE FUNCTION pg_cfm(regclass, segno int,
69+
physSize OUT int, virtSize OUT int,
70+
usedSize OUT int, generation OUT bigint)
71+
RETURNS record
72+
AS 'MODULE_PATHNAME', 'pg_cfm'
73+
LANGUAGE C STRICT;
74+
6775
-- Don't want these to be available to public.
6876
REVOKE ALL ON FUNCTION pg_visibility_map(regclass, bigint) FROM PUBLIC;
6977
REVOKE ALL ON FUNCTION pg_visibility(regclass, bigint) FROM PUBLIC;

contrib/pg_visibility/pg_visibility.c

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,16 @@
2020
#include "storage/procarray.h"
2121
#include "storage/smgr.h"
2222
#include "utils/rel.h"
23+
#include "storage/cfs.h"
24+
#ifndef WIN32
25+
#include <sys/mman.h>
26+
#endif
27+
#include <sys/file.h>
28+
#include <sys/param.h>
29+
#include <sys/stat.h>
30+
#include <limits.h>
31+
#include <unistd.h>
32+
#include <fcntl.h>
2333

2434
PG_MODULE_MAGIC;
2535

@@ -747,3 +757,53 @@ tuple_all_visible(HeapTuple tup, TransactionId OldestXmin, Buffer buffer)
747757

748758
return true;
749759
}
760+
761+
PG_FUNCTION_INFO_V1(pg_cfm);
762+
763+
Datum
764+
pg_cfm(PG_FUNCTION_ARGS)
765+
{
766+
Oid relid = PG_GETARG_OID(0);
767+
int32 segno = PG_GETARG_INT32(1);
768+
Relation rel = relation_open(relid, AccessShareLock);
769+
char* path = relpathbackend(rel->rd_node, rel->rd_backend, MAIN_FORKNUM);
770+
char* map_path = (char*)palloc(strlen(path) + 16);
771+
int md;
772+
FileMap* map;
773+
TupleDesc tupdesc;
774+
Datum values[4];
775+
bool nulls[4];
776+
777+
if (segno == 0)
778+
sprintf(map_path, "%s.cfm", path);
779+
else
780+
sprintf(map_path, "%s.%u.cfm", path, segno);
781+
782+
md = open(map_path, O_RDWR|PG_BINARY, 0);
783+
784+
map = cfs_mmap(md);
785+
if (map == MAP_FAILED)
786+
elog(ERROR, "pg_cfm failed to read map file %s: %m", map_path);
787+
788+
tupdesc = CreateTemplateTupleDesc(4, false);
789+
TupleDescInitEntry(tupdesc, (AttrNumber) 1, "physSize", INT4OID, -1, 0);
790+
TupleDescInitEntry(tupdesc, (AttrNumber) 2, "virtSize", INT4OID, -1, 0);
791+
TupleDescInitEntry(tupdesc, (AttrNumber) 3, "usedSize", INT4OID, -1, 0);
792+
TupleDescInitEntry(tupdesc, (AttrNumber) 4, "generation", INT8OID, -1, 0);
793+
tupdesc = BlessTupleDesc(tupdesc);
794+
795+
MemSet(nulls, 0, sizeof(nulls));
796+
values[0] = UInt32GetDatum(pg_atomic_read_u32(&map->physSize));
797+
values[1] = UInt32GetDatum(pg_atomic_read_u32(&map->virtSize));
798+
values[2] = UInt32GetDatum(pg_atomic_read_u32(&map->usedSize));
799+
values[3] = UInt64GetDatum(map->generation);
800+
801+
802+
if (cfs_munmap(map) < 0)
803+
elog(ERROR, "pg_cfm failed to unmap file %s: %m", map_path);
804+
if (close(md) < 0)
805+
elog(ERROR, "pg_cfm failed to close file %s: %m", map_path);
806+
relation_close(rel, AccessShareLock);
807+
808+
PG_RETURN_DATUM(HeapTupleGetDatum(heap_form_tuple(tupdesc, values, nulls)));
809+
}

src/backend/storage/file/cfs.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -842,7 +842,7 @@ static bool cfs_gc_file(char* map_path)
842842
pg_atomic_write_u32(&map->usedSize, newSize);
843843
pg_atomic_write_u32(&map->physSize, newSize);
844844
map->generation += 1; /* force all backends to reopen the file */
845-
845+
846846
/* Before removing backup files and releasing locks
847847
* we need to flush updated map file */
848848
if (cfs_msync(map) < 0)
@@ -906,7 +906,7 @@ static bool cfs_gc_file(char* map_path)
906906
else if (cfs_state->max_iterations == 1)
907907
elog(LOG, "%d: file %.*s: physical size %d, logical size %d, used %d, compression ratio %f",
908908
MyProcPid, suf, map_path, physSize, virtSize, usedSize, (double)virtSize/physSize);
909-
909+
910910
if (cfs_munmap(map) < 0)
911911
{
912912
elog(LOG, "CFS failed to unmap file %s: %m", map_path);
@@ -1204,7 +1204,7 @@ Datum cfs_compression_ratio(PG_FUNCTION_ARGS)
12041204

12051205
virtSize += pg_atomic_read_u32(&map->virtSize);
12061206
physSize += pg_atomic_read_u32(&map->physSize);
1207-
1207+
12081208
if (cfs_munmap(map) < 0)
12091209
elog(LOG, "CFS failed to unmap file %s: %m", map_path);
12101210
if (close(md) < 0)
@@ -1255,7 +1255,7 @@ Datum cfs_fragmentation(PG_FUNCTION_ARGS)
12551255
}
12561256
usedSize += pg_atomic_read_u32(&map->usedSize);
12571257
physSize += pg_atomic_read_u32(&map->physSize);
1258-
1258+
12591259
if (cfs_munmap(map) < 0)
12601260
elog(LOG, "CFS failed to unmap file %s: %m", map_path);
12611261
if (close(md) < 0)

src/backend/storage/file/fd.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1665,6 +1665,7 @@ FileLock(File file)
16651665

16661666
cfs_lock_file(vfdP->map, vfdP->fileName); /* protect file from GC */
16671667

1668+
/* Reopen file, because it was rewritten by gc */
16681669
if (vfdP->generation != vfdP->map->generation)
16691670
{
16701671
close(vfdP->fd);

src/include/storage/cfs.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@
3535
#define CFS_COMPRESSOR ZLIB_COMPRESSOR
3636
#endif
3737

38-
/* Encryption related variables*/
38+
/* Encryption related variables.
39+
* TODO We're going to change this algorithm till PGPROEE2_0
40+
*/
3941
#define CFS_RC4_DROP_N 3072
4042
#define CFS_CIPHER_KEY_SIZE 256
4143

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy