[Groonga-commit] pgroonga/pgroonga at 44e36d0 [master] Extract valid file node ID related codes

Back to archive index

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����������������������������...
下载 



More information about the Groonga-commit mailing list
Back to archive index