18
18
#include <unistd.h>
19
19
20
20
21
- //-8
21
+ /* Effective data size */
22
22
#define MAPSIZE (BLCKSZ - MAXALIGN(SizeOfPageHeaderData))
23
23
24
24
/* Number of bits allocated for each heap block. */
@@ -49,6 +49,7 @@ static void ptrack_set(BlockNumber heapBlk, Buffer vmBuf);
49
49
void SetPtrackClearLSN (bool set_invalid );
50
50
Datum pg_ptrack_test (PG_FUNCTION_ARGS );
51
51
52
+ /* Tracking memory block inside critical zone */
52
53
void
53
54
ptrack_add_block (BlockNumber block_number , RelFileNode rel )
54
55
{
@@ -59,10 +60,12 @@ ptrack_add_block(BlockNumber block_number, RelFileNode rel)
59
60
Assert (blocks_track_count < XLR_MAX_BLOCK_ID );
60
61
}
61
62
62
- void ptrack_save (void )
63
+ /* Save tracked memory block after end of critical zone */
64
+ void
65
+ ptrack_save (void )
63
66
{
64
67
Buffer pbuf = InvalidBuffer ;
65
- int i ;
68
+ unsigned int i ;
66
69
67
70
for (i = 0 ; i < blocks_track_count ; i ++ )
68
71
{
@@ -88,11 +91,9 @@ void ptrack_save(void)
88
91
blocks_track_count = 0 ;
89
92
}
90
93
94
+ /* Set one bit to buffer */
91
95
void
92
- ptrack_set (
93
- BlockNumber heapBlk ,
94
- Buffer vmBuf
95
- )
96
+ ptrack_set (BlockNumber heapBlk , Buffer vmBuf )
96
97
{
97
98
BlockNumber mapBlock = HEAPBLK_TO_MAPBLOCK (heapBlk );
98
99
uint32 mapByte = HEAPBLK_TO_MAPBYTE (heapBlk );
@@ -109,6 +110,7 @@ ptrack_set(
109
110
110
111
if (!(map [mapByte ] & (1 << mapBit )))
111
112
{
113
+ /* Bad luck. Take an exclusive lock now after unlock share.*/
112
114
LockBuffer (vmBuf , BUFFER_LOCK_UNLOCK );
113
115
LockBuffer (vmBuf , BUFFER_LOCK_EXCLUSIVE );
114
116
if (!(map [mapByte ] & (1 << mapBit )))
@@ -133,7 +135,7 @@ ptrack_readbuf(RelFileNode rnode, BlockNumber blkno, bool extend)
133
135
SMgrRelation smgr = smgropen (rnode , InvalidBackendId );
134
136
135
137
/*
136
- * If we haven't cached the size of the visibility map fork yet, check it
138
+ * If we haven't cached the size of the ptrack map fork yet, check it
137
139
* first.
138
140
*/
139
141
if (smgr -> smgr_ptrack_nblocks == InvalidBlockNumber )
@@ -214,7 +216,9 @@ ptrack_extend(SMgrRelation smgr, BlockNumber vm_nblocks)
214
216
UnlockSmgrForExtension (smgr , ExclusiveLock );
215
217
}
216
218
217
- void ptrack_clear (void )
219
+ /* Clear all ptrack files */
220
+ void
221
+ ptrack_clear (void )
218
222
{
219
223
HeapTuple tuple ;
220
224
Relation catalog = heap_open (RelationRelationId , AccessShareLock );
@@ -308,6 +312,7 @@ SetPtrackClearLSN(bool set_invalid)
308
312
//LWLockRelease(ControlFileLock);
309
313
}
310
314
315
+ /* Test ptrack file */
311
316
Datum
312
317
pg_ptrack_test (PG_FUNCTION_ARGS )
313
318
{
0 commit comments