Fix alignment problems with SharedInvalSmgrMsg.
authorRobert Haas <rhaas@postgresql.org>
Wed, 28 Sep 2022 11:51:48 +0000 (07:51 -0400)
committerRobert Haas <rhaas@postgresql.org>
Wed, 28 Sep 2022 11:58:09 +0000 (07:58 -0400)
SharedInvalSmgrMsg can't require 8-byte alignment, because then
SharedInvalidationMessage will require 8-byte alignment, which will
then cause ParseCommitRecord to fail on machines that are picky
about alignment, because it assumes that everything that gets
packed into a commit record requires only 4-byte alignment.

Another problem with 05d4cbf9b6ba708858984b01ca0fc56d59d4ec7c.

Discussion: http://postgr.es/m/3825454.1664310917@sss.pgh.pa.us

src/backend/utils/cache/inval.c
src/include/storage/sinval.h

index eb5782f82a47a104c5e8aa9052c35b0036e42a17..fecbf06a04d8d3af2637a524a6f0cee34a35c477 100644 (file)
@@ -663,7 +663,9 @@ LocalExecuteInvalidationMessage(SharedInvalidationMessage *msg)
                 */
                RelFileLocatorBackend rlocator;
 
-               rlocator.locator = msg->sm.rlocator;
+               rlocator.locator.dbOid = msg->sm.dbOid;
+               rlocator.locator.spcOid = msg->sm.spcOid;
+               rlocator.locator.relNumber = (((uint64) msg->sm.relNumber_hi) << 32) | msg->sm.relNumber_lo;
                rlocator.backend = (msg->sm.backend_hi << 16) | (int) msg->sm.backend_lo;
                smgrcloserellocator(rlocator);
        }
@@ -1466,7 +1468,10 @@ CacheInvalidateSmgr(RelFileLocatorBackend rlocator)
        msg.sm.id = SHAREDINVALSMGR_ID;
        msg.sm.backend_hi = rlocator.backend >> 16;
        msg.sm.backend_lo = rlocator.backend & 0xffff;
-       msg.sm.rlocator = rlocator.locator;
+       msg.sm.dbOid = rlocator.locator.dbOid;
+       msg.sm.spcOid = rlocator.locator.spcOid;
+       msg.sm.relNumber_hi = rlocator.locator.relNumber >> 32;
+       msg.sm.relNumber_lo = rlocator.locator.relNumber & 0xffffffff;
        /* check AddCatcacheInvalidationMessage() for an explanation */
        VALGRIND_MAKE_MEM_DEFINED(&msg, sizeof(msg));
 
index aca0347a3d3c89fad49e28e7ae477126ba789162..4a267be935c4bbf7901186874a66f6c2e36bc075 100644 (file)
@@ -86,11 +86,14 @@ typedef struct
 
 typedef struct
 {
-       /* note: field layout chosen to pack into 16 bytes */
+       /* note: field layout chosen to pack into 20 bytes */
        int8            id;                             /* type field --- must be first */
        int8            backend_hi;             /* high bits of backend ID, if temprel */
        uint16          backend_lo;             /* low bits of backend ID, if temprel */
-       RelFileLocator rlocator;        /* spcOid, dbOid, relNumber */
+       Oid                     dbOid;
+       Oid                     spcOid;
+       uint32          relNumber_hi;   /* avoid 8 byte alignment requirement */
+       uint32          relNumber_lo;
 } SharedInvalSmgrMsg;
 
 #define SHAREDINVALRELMAP_ID   (-4)