>From a24973508710c965035fca45e933823ce49a5a4f Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Thu, 8 May 2014 16:13:44 +0200 Subject: [PATCH] Minor cleanups and comment improvements in the cache invalidation code. --- src/backend/storage/ipc/sinvaladt.c | 11 ++++++++--- src/backend/utils/cache/inval.c | 9 +++++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/backend/storage/ipc/sinvaladt.c b/src/backend/storage/ipc/sinvaladt.c index 0328660..3966ccc 100644 --- a/src/backend/storage/ipc/sinvaladt.c +++ b/src/backend/storage/ipc/sinvaladt.c @@ -453,7 +453,6 @@ SIInsertDataEntries(const SharedInvalidationMessage *data, int n) while (n > 0) { int nthistime = Min(n, WRITE_QUANTUM); - int numMsgs; int max; int i; @@ -466,11 +465,17 @@ SIInsertDataEntries(const SharedInvalidationMessage *data, int n) * queue and reset anyone who is preventing space from being freed. * Otherwise, clean the queue only when it's exceeded the next * fullness threshold. We have to loop and recheck the buffer state - * after any call of SICleanupQueue. + * after any call of SICleanupQueue because the cleanup sometimes + * require releasing the write lock acquired above. */ for (;;) { - numMsgs = segP->maxMsgNum - segP->minMsgNum; + int numMsgs; + /* use volatile pointer to prevent code rearrangement */ + volatile SISeg *vsegP = segP; + + numMsgs = vsegP->maxMsgNum - vsegP->minMsgNum; + if (numMsgs + nthistime > MAXNUMMESSAGES || numMsgs >= segP->nextThreshold) SICleanupQueue(true, nthistime); diff --git a/src/backend/utils/cache/inval.c b/src/backend/utils/cache/inval.c index dd46e18..4c3197b 100644 --- a/src/backend/utils/cache/inval.c +++ b/src/backend/utils/cache/inval.c @@ -374,7 +374,7 @@ AddRelcacheInvalidationMessage(InvalidationListHeader *hdr, /* Don't add a duplicate item */ /* We assume dbId need not be checked because it will never change */ ProcessMessageList(hdr->rclist, - if (msg->rc.id == SHAREDINVALRELCACHE_ID && + if (msg->id == SHAREDINVALRELCACHE_ID && msg->rc.relId == relId) return); @@ -400,7 +400,7 @@ AddSnapshotInvalidationMessage(InvalidationListHeader *hdr, /* Don't add a duplicate item */ /* We assume dbId need not be checked because it will never change */ ProcessMessageList(hdr->rclist, - if (msg->sn.id == SHAREDINVALSNAPSHOT_ID && + if (msg->id == SHAREDINVALSNAPSHOT_ID && msg->sn.relId == relId) return); @@ -580,7 +580,8 @@ LocalExecuteInvalidationMessage(SharedInvalidationMessage *msg) RelFileNodeBackend rnode; rnode.node = msg->sm.rnode; - rnode.backend = (msg->sm.backend_hi << 16) | (int) msg->sm.backend_lo; + rnode.backend = (BackendId) (((uint32) msg->sm.backend_hi << 16) + |(uint32) msg->sm.backend_lo); smgrclosenode(rnode); } else if (msg->id == SHAREDINVALRELMAP_ID) @@ -1257,7 +1258,7 @@ CacheInvalidateSmgr(RelFileNodeBackend rnode) SharedInvalidationMessage msg; msg.sm.id = SHAREDINVALSMGR_ID; - msg.sm.backend_hi = rnode.backend >> 16; + msg.sm.backend_hi = (uint32) rnode.backend >> 16; msg.sm.backend_lo = rnode.backend & 0xffff; msg.sm.rnode = rnode.node; /* check AddCatcacheInvalidationMessage() for an explanation */ -- 1.8.5.rc2.dirty