Re: Custom cache implemented in a postgresql C function

From: Rob Sargent <robjsargent(at)gmail(dot)com>
To: pgsql-general(at)postgresql(dot)org
Subject: Re: Custom cache implemented in a postgresql C function
Date: 2010-10-21 00:19:14
Message-ID: 4CBF8702.5030702@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Are you sure you cache needs to grow endlessly? Otherwise you could use
RequestAddinShmemSpace and manage you're map within that space, perhaps
"overwriting" chunks on an LRU basis or a rollover. i.e. Grab it all and
do your own management within that single block of shmem.
Caches are best for thing revisited often, so old/unused ought to be
expendable with little performance loss, at least compared with the
heavy traffic.

On 10/20/2010 05:44 PM, Gabi Julien wrote:
> Hi,
>
> Here is my problem: I have a postgresql C function that looks like this:
>
> Datum filter(PG_FUNCTION_ARGS);
>
> It takes identifiers and queries a bunch of tables and ends up returning true or false. So far nothing difficult except that we want better performance. The function was already optimized to the best of my abilities and changing the structure of the database would not help. However, having a cache would be the perfect solution. I could implement this cache outside of postgresql if need be but nothing could beat implementing this directly in a postgresql C function.
>
> So this is what I want, a custom cache built into a postgresql C function. Since postgresql uses different processes, it would be best to use the shared memory. Can this be done safely? At its core, the cache could be considered as simple as a map protected by a mutex. With postgresql, I first need to initialized some shared memory. This is explained at the end of this link:
>
> http://www.postgresql.org/docs/8.2/static/xfunc-c.html
>
> However, it sounds like I need to reserve the shared memory in advance using:
>
> void RequestAddinShmemSpace(int size)
>
> In my case, I do not know how big my cache will be. I would preferably allocate the memory dynamically. Is this possible? In any case, am I trying to reinvent the wheel here? Is there already a shared map or a shared hash structure available in postgresql?
>
> If shared memory turns out too difficult to use, I could create separate caches for each postgresql processes. This would be a waste of space but it might be better then nothing. In this case, do I need to make my code thread safe? In other words, is postgresql using more then one thread per processes?
>
> Any insights would be more then welcome!
> Thank you,
> Gabi Julien
>

In response to

Browse pgsql-general by date

  From Date Subject
Next Message DM 2010-10-21 00:23:48 Re: Composite Index question
Previous Message Rob Sargent 2010-10-21 00:10:41 Re: Composite Index question