OSDN Git Service

Persuade GIN to react to control-C in a reasonable amount of time
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 16 May 2008 01:27:06 +0000 (01:27 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 16 May 2008 01:27:06 +0000 (01:27 +0000)
while building a GIN index.

src/backend/access/gin/gininsert.c

index 4449928..654bf13 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *                     $PostgreSQL: pgsql/src/backend/access/gin/gininsert.c,v 1.12 2008/05/12 00:00:44 alvherre Exp $
+ *                     $PostgreSQL: pgsql/src/backend/access/gin/gininsert.c,v 1.13 2008/05/16 01:27:06 tgl Exp $
  *-------------------------------------------------------------------------
  */
 
@@ -246,7 +246,11 @@ ginBuildCallback(Relation index, HeapTuple htup, Datum *values,
                uint32          nlist;
 
                while ((list = ginGetEntry(&buildstate->accum, &entry, &nlist)) != NULL)
+               {
+                       /* there could be many entries, so be willing to abort here */
+                       CHECK_FOR_INTERRUPTS();
                        ginEntryInsert(index, &buildstate->ginstate, entry, list, nlist, TRUE);
+               }
 
                MemoryContextReset(buildstate->tmpCtx);
                ginInitBA(&buildstate->accum);
@@ -331,9 +335,14 @@ ginbuild(PG_FUNCTION_ARGS)
        reltuples = IndexBuildHeapScan(heap, index, indexInfo,
                                                                   ginBuildCallback, (void *) &buildstate);
 
+       /* dump remaining entries to the index */
        oldCtx = MemoryContextSwitchTo(buildstate.tmpCtx);
        while ((list = ginGetEntry(&buildstate.accum, &entry, &nlist)) != NULL)
+       {
+               /* there could be many entries, so be willing to abort here */
+               CHECK_FOR_INTERRUPTS();
                ginEntryInsert(index, &buildstate.ginstate, entry, list, nlist, TRUE);
+       }
        MemoryContextSwitchTo(oldCtx);
 
        MemoryContextDelete(buildstate.tmpCtx);