"Kevin Grittner" <kevin.gritt...@wicourts.gov> wrote:
 
> I'm still looking at whether it's sane to try to issue a warning
> when an HTAB exceeds the number of entries declared as its
> max_size when it was created.
 
I think this does it.
 
If nothing else, it might be instructive to use it while testing the
SSI patch.  Would it make any sense to slip this into 9.1, or should
I add it to the first 9.2 CF?
 
-Kevin

*** a/src/backend/storage/ipc/shmem.c
--- b/src/backend/storage/ipc/shmem.c
***************
*** 268,273 **** ShmemInitHash(const char *name, /* table string name for shmem 
index */
--- 268,274 ----
         *
         * The shared memory allocator must be specified too.
         */
+       infoP->max_size = max_size;
        infoP->dsize = infoP->max_dsize = hash_select_dirsize(max_size);
        infoP->alloc = ShmemAlloc;
        hash_flags |= HASH_SHARED_MEM | HASH_ALLOC | HASH_DIRSIZE;
*** a/src/backend/utils/hash/dynahash.c
--- b/src/backend/utils/hash/dynahash.c
***************
*** 129,134 **** struct HASHHDR
--- 129,135 ----
        long            ffactor;                /* target fill factor */
        long            max_dsize;              /* 'dsize' limit if directory 
is fixed size */
        long            ssize;                  /* segment size --- must be 
power of 2 */
+       long            max_size;               /* maximum number of entries 
expected */
        int                     sshift;                 /* segment shift = 
log2(ssize) */
        int                     nelem_alloc;    /* number of entries to 
allocate at once */
  
***************
*** 368,373 **** hash_create(const char *tabname, long nelem, HASHCTL *info, 
int flags)
--- 369,375 ----
        hdefault(hashp);
  
        hctl = hashp->hctl;
+       hctl->max_size = info->max_size;
  
        if (flags & HASH_PARTITION)
        {
***************
*** 1333,1338 **** element_alloc(HTAB *hashp, int nelem)
--- 1335,1341 ----
        HASHELEMENT *tmpElement;
        HASHELEMENT *prevElement;
        int                     i;
+       bool            warningNeeded;
  
        /* Each element has a HASHELEMENT header plus user data. */
        elementSize = MAXALIGN(sizeof(HASHELEMENT)) + 
MAXALIGN(hctlv->entrysize);
***************
*** 1360,1369 **** element_alloc(HTAB *hashp, int nelem)
--- 1363,1378 ----
        /* freelist could be nonempty if two backends did this concurrently */
        firstElement->link = hctlv->freeList;
        hctlv->freeList = prevElement;
+       warningNeeded = (hctlv->max_size > 0 && hctlv->nentries == 
hctlv->max_size);
  
        if (IS_PARTITIONED(hctlv))
                SpinLockRelease(&hctlv->mutex);
  
+       if (warningNeeded)
+               ereport(WARNING,
+                               (errmsg("hash table \"%s\" has more entries 
than expected", hashp->tabname),
+                                errdetail("The maximum was set to %li on 
creation.", hctlv->max_size)));
+ 
        return true;
  }
  
*** a/src/include/utils/hsearch.h
--- b/src/include/utils/hsearch.h
***************
*** 69,74 **** typedef struct HASHCTL
--- 69,75 ----
        long            dsize;                  /* (initial) directory size */
        long            max_dsize;              /* limit to dsize if dir size 
is limited */
        long            ffactor;                /* fill factor */
+       long            max_size;               /* maximum number of entries 
expected */
        Size            keysize;                /* hash key length in bytes */
        Size            entrysize;              /* total user element size in 
bytes */
        HashValueFunc hash;                     /* hash function */
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to