Kouhei Sutou
null+****@clear*****
Wed Nov 9 15:48:15 JST 2016
Kouhei Sutou 2016-11-09 15:48:15 +0900 (Wed, 09 Nov 2016) New Revision: 44e36d0ada9f428f70badeafa751c81b7f847437 https://github.com/pgroonga/pgroonga/commit/44e36d0ada9f428f70badeafa751c81b7f847437 Message: Extract valid file node ID related codes Added files: src/pgrn_pg.c src/pgrn_pg.h Modified files: sources.am src/pgroonga.c Modified: sources.am (+1 -0) =================================================================== --- sources.am 2016-11-09 15:01:28 +0900 (da0f69c) +++ sources.am 2016-11-09 15:48:15 +0900 (2b70fdf) @@ -14,6 +14,7 @@ SRCS = \ src/pgrn_match_positions_byte.c \ src/pgrn_match_positions_character.c \ src/pgrn_options.c \ + src/pgrn_pg.c \ src/pgrn_query_extract_keywords.c \ src/pgrn_snippet_html.c \ src/pgrn_value.c \ Added: src/pgrn_pg.c (+78 -0) 100644 =================================================================== --- /dev/null +++ src/pgrn_pg.c 2016-11-09 15:48:15 +0900 (b88d1da) @@ -0,0 +1,78 @@ +#include "pgroonga.h" + +#include "pgrn_compatible.h" + +#include "pgrn_pg.h" + +#include <access/heapam.h> +#include <access/htup_details.h> +#include <catalog/pg_tablespace.h> +#include <storage/lmgr.h> +#include <utils/rel.h> +#ifdef PGRN_SUPPORT_FILE_NODE_ID_TO_RELATION_ID +# include <utils/relfilenodemap.h> +#endif + +Relation +PGrnPGResolveFileNodeID(Oid fileNodeID, + Oid *relationID, + LOCKMODE lockMode) +{ +#ifdef PGRN_SUPPORT_FILE_NODE_ID_TO_RELATION_ID + Relation tableSpaces; + HeapScanDesc scan; + Relation relation = InvalidRelation; + + tableSpaces = heap_open(TableSpaceRelationId, AccessShareLock); + scan = heap_beginscan_catalog(tableSpaces, 0, NULL); + while (true) + { + HeapTuple tuple; + + tuple = heap_getnext(scan, ForwardScanDirection); + + if (!HeapTupleIsValid(tuple)) + break; + + *relationID = RelidByRelfilenode(HeapTupleGetOid(tuple), + fileNodeID); + if (!OidIsValid(*relationID)) + continue; + + LockRelationOid(*relationID, lockMode); + relation = RelationIdGetRelation(*relationID); + if (RelationIsValid(relation)) + break; + UnlockRelationOid(*relationID, lockMode); + } + heap_endscan(scan); + heap_close(tableSpaces, AccessShareLock); + + return relation; +#else + return InvalidRelation; +#endif +} + +bool +PGrnPGIsValidFileNodeID(Oid fileNodeID) +{ +#ifdef PGRN_SUPPORT_FILE_NODE_ID_TO_RELATION_ID + Relation relation; + Oid relationID = InvalidOid; + LOCKMODE lockMode = AccessShareLock; + bool valid; + + relation = PGrnPGResolveFileNodeID(fileNodeID, &relationID, lockMode); + valid = RelationIsValid(relation); + if (valid) + { + RelationClose(relation); + UnlockRelationOid(relationID, lockMode); + } + + return valid; +#else + return true; +#endif +} Added: src/pgrn_pg.h (+10 -0) 100644 =================================================================== --- /dev/null +++ src/pgrn_pg.h 2016-11-09 15:48:15 +0900 (7479547) @@ -0,0 +1,10 @@ +#pragma once + +#include <postgres.h> +#include <storage/lockdefs.h> +#include <utils/relcache.h> + +Relation PGrnPGResolveFileNodeID(Oid fileNodeID, + Oid *reationID, + LOCKMODE lockMode); +bool PGrnPGIsValidFileNodeID(Oid fileNodeID); Modified: src/pgroonga.c (+2 -49) =================================================================== --- src/pgroonga.c 2016-11-09 15:01:28 +0900 (242d19d) +++ src/pgroonga.c 2016-11-09 15:48:15 +0900 (e2df5f3) @@ -14,6 +14,7 @@ #include "pgrn_match_positions_byte.h" #include "pgrn_match_positions_character.h" #include "pgrn_options.h" +#include "pgrn_pg.h" #include "pgrn_query_extract_keywords.h" #include "pgrn_search.h" #include "pgrn_value.h" @@ -29,7 +30,6 @@ #include <access/relscan.h> #include <catalog/catalog.h> #include <catalog/index.h> -#include <catalog/pg_tablespace.h> #include <catalog/pg_type.h> #include <mb/pg_wchar.h> #include <miscadmin.h> @@ -38,7 +38,6 @@ #include <postmaster/bgworker.h> #include <storage/bufmgr.h> #include <storage/ipc.h> -#include <storage/lmgr.h> #include <utils/array.h> #include <utils/builtins.h> #include <utils/lsyscache.h> @@ -53,10 +52,6 @@ # include <utils/snapmgr.h> #endif -#ifdef PGRN_SUPPORT_FILE_NODE_ID_TO_RELATION_ID -# include <utils/relfilenodemap.h> -#endif - #include <groonga.h> #include <stdlib.h> @@ -3880,48 +3875,6 @@ pgroonga_bulkdelete(PG_FUNCTION_ARGS) PG_RETURN_POINTER(stats); } -#ifdef PGRN_SUPPORT_FILE_NODE_ID_TO_RELATION_ID -static bool -PGrnIsValidRelationFileNodeID(Oid relationFileNodeID) -{ - bool valid = false; - Relation tableSpaces; - HeapScanDesc scan; - - tableSpaces = heap_open(TableSpaceRelationId, AccessShareLock); - scan = heap_beginscan_catalog(tableSpaces, 0, NULL); - while (!valid) - { - HeapTuple tuple; - Oid relationID; - Relation relation; - - tuple = heap_getnext(scan, ForwardScanDirection); - - if (!HeapTupleIsValid(tuple)) - break; - - relationID = RelidByRelfilenode(HeapTupleGetOid(tuple), - relationFileNodeID); - if (!OidIsValid(relationID)) - continue; - - LockRelationOid(relationID, AccessShareLock); - relation = RelationIdGetRelation(relationID); - if (RelationIsValid(relation)) - { - RelationClose(relation); - valid = true; - } - UnlockRelationOid(relationID, AccessShareLock); - } - heap_endscan(scan); - heap_close(tableSpaces, AccessShareLock); - - return valid; -} -#endif - static void PGrnRemoveUnusedTables(void) { @@ -3947,7 +3900,7 @@ PGrnRemoveUnusedTables(void) if (nameEnd[0] == '.') continue; - if (PGrnIsValidRelationFileNodeID(relationFileNodeID)) + if (PGrnPGIsValidFileNodeID(relationFileNodeID)) continue; for (i = 0; true; i++) -------------- next part -------------- HTML����������������������������...下载