replace cb_metapage_find_free_segment with something less clever but
authorRobert Haas <[email protected]>
Wed, 22 Sep 2021 19:18:53 +0000 (15:18 -0400)
committerRobert Haas <[email protected]>
Wed, 22 Sep 2021 19:18:53 +0000 (15:18 -0400)
maybe more correct

src/backend/access/conveyor/cbmetapage.c

index 188089b71b7f664fdb370e111623f42bf1ff7946..091bce072f58a31ab20d3575872438774712b62c 100644 (file)
@@ -467,24 +467,19 @@ CBSegNo
 cb_metapage_find_free_segment(CBMetapageData *meta)
 {
        unsigned        i;
+       unsigned        j;
 
-       StaticAssertStmt(CB_METAPAGE_FREESPACE_BYTES % sizeof(uint64) == 0,
-                                        "CB_METAPAGE_FREESPACE_BYTES should be a multiple of 8");
-
-       for (i = 0; i < CB_METAPAGE_FREESPACE_BYTES; i += sizeof(uint64))
+       for (i = 0; i < CB_METAPAGE_FREESPACE_BYTES; ++i)
        {
-               uint64          word = *(uint64 *) &meta->cbm_freespace_map[i];
-
-               if (word != PG_UINT64_MAX)
-               {
-                       uint64          flipword = ~word;
-                       int                     b = fls((int) flipword);
+               uint8   b = meta->cbm_freespace_map[i];
 
-                       if (b == 0)
-                               b = 32 + fls((int) (flipword >> 32));
+               if (b == 0xFF)
+                       continue;
 
-                       Assert(b >= 1 && b <= 64);
-                       return (i * BITS_PER_BYTE) + (b - 1);
+               for (j = 0; j < BITS_PER_BYTES; ++j)
+               {
+                       if ((b & (1 << j)) == 0)
+                               return (i * BITS_PER_BYTE) + j;
                }
        }