]> granicus.if.org Git - postgresql/commitdiff
Tweaks for SSI out-of-shared memory behavior.
authorRobert Haas <rhaas@postgresql.org>
Thu, 7 Apr 2011 20:43:39 +0000 (16:43 -0400)
committerRobert Haas <rhaas@postgresql.org>
Thu, 7 Apr 2011 20:43:39 +0000 (16:43 -0400)
If we call hash_search() with HASH_ENTER, it will bail out rather than
return NULL, so it's redundant to check for NULL again in the caller.
Thus, in cases where we believe it's impossible for the hash table to run
out of slots anyway, we can simplify the code slightly.

On the flip side, in cases where it's theoretically possible to run out of
space, we don't want to rely on dynahash.c to throw an error; instead,
we pass HASH_ENTER_NULL and throw the error ourselves if a NULL comes
back, so that we can provide a more descriptive error message.

Kevin Grittner

src/backend/storage/lmgr/predicate.c

index 5096ea0c1c1722d2d47a67387930f542644c9297..46b86546ee074cda1b7cde47b2a79009fece1e50 100644 (file)
@@ -1604,12 +1604,7 @@ RegisterPredicateLockingXid(const TransactionId xid)
        sxid = (SERIALIZABLEXID *) hash_search(SerializableXidHash,
                                                                                   &sxidtag,
                                                                                   HASH_ENTER, &found);
-       if (!sxid)
-               /* This should not be possible, based on allocation. */
-               ereport(ERROR,
-                               (errcode(ERRCODE_OUT_OF_MEMORY),
-                                errmsg("out of shared memory")));
-
+       Assert(sxid != NULL);
        Assert(!found);
 
        /* Initialize the structure. */
@@ -2045,7 +2040,7 @@ CreatePredicateLock(const PREDICATELOCKTARGETTAG *targettag,
        target = (PREDICATELOCKTARGET *)
                hash_search_with_hash_value(PredicateLockTargetHash,
                                                                        targettag, targettaghash,
-                                                                       HASH_ENTER, &found);
+                                                                       HASH_ENTER_NULL, &found);
        if (!target)
                ereport(ERROR,
                                (errcode(ERRCODE_OUT_OF_MEMORY),
@@ -2060,7 +2055,7 @@ CreatePredicateLock(const PREDICATELOCKTARGETTAG *targettag,
        lock = (PREDICATELOCK *)
                hash_search_with_hash_value(PredicateLockHash, &locktag,
                        PredicateLockHashCodeFromTargetHashCode(&locktag, targettaghash),
-                                                                       HASH_ENTER, &found);
+                                                                       HASH_ENTER_NULL, &found);
        if (!lock)
                ereport(ERROR,
                                (errcode(ERRCODE_OUT_OF_MEMORY),
@@ -3251,7 +3246,7 @@ ReleaseOneSerializableXact(SERIALIZABLEXACT *sxact, bool partial,
                        predlock = hash_search_with_hash_value(PredicateLockHash, &tag,
                                                                PredicateLockHashCodeFromTargetHashCode(&tag,
                                                                                                                          targettaghash),
-                                                                                                  HASH_ENTER, &found);
+                                                                                                  HASH_ENTER_NULL, &found);
                        if (!predlock)
                                ereport(ERROR,
                                                (errcode(ERRCODE_OUT_OF_MEMORY),
@@ -4301,10 +4296,7 @@ predicatelock_twophase_recover(TransactionId xid, uint16 info,
                sxid = (SERIALIZABLEXID *) hash_search(SerializableXidHash,
                                                                                           &sxidtag,
                                                                                           HASH_ENTER, &found);
-               if (!sxid)
-                       ereport(ERROR,
-                                       (errcode(ERRCODE_OUT_OF_MEMORY),
-                                        errmsg("out of shared memory")));
+               Assert(sxid != NULL);
                Assert(!found);
                sxid->myXact = (SERIALIZABLEXACT *) sxact;