]> granicus.if.org Git - postgresql/commitdiff
Fixes in bloom contrib module
authorTeodor Sigaev <teodor@sigaev.ru>
Sat, 2 Apr 2016 10:47:04 +0000 (13:47 +0300)
committerTeodor Sigaev <teodor@sigaev.ru>
Sat, 2 Apr 2016 10:47:04 +0000 (13:47 +0300)
Looking at result of buildfarm member jaguarundi it seems to me that
BloomOptions isn't inited sometime, but I don't see yet how it's possible.
Nevertheless, check of signature length's is missed, so, add
a limit of it. Also add missed GenericXLogAbort() in case of already
deleted page in vacuum + minor code refactoring.

contrib/bloom/bloom.h
contrib/bloom/blutils.c
contrib/bloom/blvacuum.c

index 63095723c9a55331cc0bc97e3f1f77a5b8a813d5..fb0bc07f2846d9b58b70f23ac7cea8c708985ffa 100644 (file)
@@ -63,6 +63,12 @@ typedef BloomPageOpaqueData *BloomPageOpaque;
 #define BLOOM_METAPAGE_BLKNO   (0)
 #define BLOOM_HEAD_BLKNO               (1)             /* first data page */
 
+/*
+ * Maximum of bloom signature length in uint16. Actual value
+ * is 512 bytes
+ */
+#define MAX_BLOOM_LENGTH               (256)
+
 /* Bloom index options */
 typedef struct BloomOptions
 {
index b86f51fb8255994301a723b642aed5b287f08040..f301f415ab21debc115df707eedba9fb069b9d13 100644 (file)
@@ -177,7 +177,7 @@ myRand()
        /*
         * Compute x = (7^5 * x) mod (2^31 - 1)
         * without overflowing 31 bits:
-        *      (2^31 - 1) = 127773 * (7^5) + 2836
+        *              (2^31 - 1) = 127773 * (7^5) + 2836
         * From "Random number generators: good ones are hard to find",
         * Park and Miller, Communications of the ACM, vol. 31, no. 10,
         * October 1988, p. 1195.
@@ -370,8 +370,11 @@ adjustBloomOptions(BloomOptions *opts)
        /* Default length of bloom filter is 5 of 16-bit integers */
        if (opts->bloomLength <= 0)
                opts->bloomLength = 5;
-       else
-               opts->bloomLength = opts->bloomLength;
+       else if (opts->bloomLength > MAX_BLOOM_LENGTH)
+               ereport(ERROR,
+                               (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+                                errmsg("length of bloom signature (%d) is greater than maximum %d",
+                                               opts->bloomLength, MAX_BLOOM_LENGTH)));
 
        /* Check singnature length */
        for (i = 0; i < INDEX_MAX_KEYS; i++)
@@ -382,7 +385,7 @@ adjustBloomOptions(BloomOptions *opts)
                 * with 2 bits default.
                 */
                if (opts->bitSize[i] <= 0
-                       || opts->bitSize[i] >= opts->bloomLength * sizeof(SignType))
+                       || opts->bitSize[i] >= opts->bloomLength * sizeof(SignType) * BITS_PER_BYTE)
                        opts->bitSize[i] = 2;
        }
 }
index d976ce53305ebf82fade0ea967947fc43c4a3a6d..9fee3c1294fbeb99637f7c48e08942a5e2b5f2c5 100644 (file)
@@ -70,14 +70,15 @@ blbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats,
                if (BloomPageIsDeleted(page))
                {
                        UnlockReleaseBuffer(buffer);
+                       GenericXLogAbort(gxlogState);
                        CHECK_FOR_INTERRUPTS();
                        continue;
                }
 
                /* Iterate over the tuples */
-               itup = BloomPageGetTuple(&state, page, 1);
-               itupPtr = BloomPageGetTuple(&state, page, 1);
-               itupEnd = BloomPageGetTuple(&state, page, BloomPageGetMaxOffset(page) + 1);
+               itup = itupPtr = BloomPageGetTuple(&state, page, FirstOffsetNumber);
+               itupEnd = BloomPageGetTuple(&state, page,
+                                                               OffsetNumberNext(BloomPageGetMaxOffset(page)));
                while (itup < itupEnd)
                {
                        /* Do we have to delete this tuple? */
@@ -104,10 +105,10 @@ blbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats,
                        itup = BloomPageGetNextTuple(&state, itup);
                }
 
-               Assert(itupPtr == BloomPageGetTuple(&state, page, BloomPageGetMaxOffset(page) + 1));
+               Assert(itupPtr == BloomPageGetTuple(&state, page,
+                                                               OffsetNumberNext(BloomPageGetMaxOffset(page))));
 
-               if (!BloomPageIsDeleted(page) &&
-                       BloomPageGetFreeSpace(&state, page) > state.sizeOfBloomTuple &&
+               if (BloomPageGetFreeSpace(&state, page) > state.sizeOfBloomTuple &&
                        countPage < BloomMetaBlockN)
                        notFullPage[countPage++] = blkno;