Re: Caching results of _list functions

2016-05-18 Thread Johs Ensby
Hi Ermouth,
this sounds like a bonus feature of significant value:)
Together with the rewrite function this discovery would keep the couchapp 
enthusiasts of the community happy for a looong time, I believe.

If I understand you right, 
- a function in a _list of a certain ddoc called directly via the _list endpint 
(NOT via  _rewrite)
- can cache a rendered result (e.g. a html page)
- for a subsequent request via _rewrite (of the same ddoc) to pick up the 
cached result from RAM
- using a timestamp inside that _rewrite function to compare against the 
timestamped name of the cached result to validate that the age is within a 
chosen tolerance

Following this 2-step approach (_list, then _rewrite)..
- the _list function would have the full request context
- while the _rewrite would have the limited request object available
- the _rewrite and _list endpoints would need to be available

Control questions
- does this mean that you cannot point a vhost to _rewrite and run all calls to 
_list via rewrite functions?
- if you have one vhost pointing to _rewrite of a ddoc and another to e.g. 
_list would they still share the cache?

Testing this
- could you give us som sinppets on how to test this, I would love to see this 
in action and test it towards my JS rewrite functions.
 
br
johs


> On 19. mai 2016, at 00.01, ermouth  wrote:
> 
> Since JS rewrites landed in 2.0, and I use JS rewrites heavily, I discover
> some tricks with the new feature time to time. Despite I use patched 1.6.1
> with js rewrites, tricks are suitable for at least single node 2.0 as well.
> 
> JS rewrites function runs in the context of a query server instance. QS
> instance is a Spidermonkey process with 64Mb of RAM by default. It‘s single
> threaded.
> 
> Actually, seems that all query server functions of one particular design
> doc are executed inside one dedicated Spidermonkey instance. It means they
> all share global context (also it means they share one thread).
> 
> Ddoc global context persists until Spidermonkey process is restarted. It
> happens when SM instance crashes (runs out of RAM quota, unrecoverable
> error happens etc), or when underlying design doc is changed.
> 
> It means _list function can cache results of rendering into RAM, and
> _rewrite function can later quickly respond with cached version, skipping
> redirect to heavy map/list. Cache container is just JS closure,
> instantiated/accessed using built-in require().
> 
> Unlike _list, JS rewrite function does not receive req.info, it would be
> too slow to tap DB on each request. It means we can not invalidate cache on
> local sequence change (DB update) – rewrite function just does not know DB
> was updated.
> 
> However we can use timestamp-based caching, even several seconds TTL of
> cache entries is enough to reduce average response time significantly (say,
> order of magnitude).
> 
> I‘ve tested approach a little and found it very promising.
> 
> Since this dirty hack is possible with _list fns only, without js rewrites,
> may be someone already employs it? Or at least tried?
> 
> ermouth



Caching results of _list functions

2016-05-18 Thread ermouth
Since JS rewrites landed in 2.0, and I use JS rewrites heavily, I discover
some tricks with the new feature time to time. Despite I use patched 1.6.1
with js rewrites, tricks are suitable for at least single node 2.0 as well.

JS rewrites function runs in the context of a query server instance. QS
instance is a Spidermonkey process with 64Mb of RAM by default. It‘s single
threaded.

Actually, seems that all query server functions of one particular design
doc are executed inside one dedicated Spidermonkey instance. It means they
all share global context (also it means they share one thread).

Ddoc global context persists until Spidermonkey process is restarted. It
happens when SM instance crashes (runs out of RAM quota, unrecoverable
error happens etc), or when underlying design doc is changed.

It means _list function can cache results of rendering into RAM, and
_rewrite function can later quickly respond with cached version, skipping
redirect to heavy map/list. Cache container is just JS closure,
instantiated/accessed using built-in require().

Unlike _list, JS rewrite function does not receive req.info, it would be
too slow to tap DB on each request. It means we can not invalidate cache on
local sequence change (DB update) – rewrite function just does not know DB
was updated.

However we can use timestamp-based caching, even several seconds TTL of
cache entries is enough to reduce average response time significantly (say,
order of magnitude).

I‘ve tested approach a little and found it very promising.

Since this dirty hack is possible with _list fns only, without js rewrites,
may be someone already employs it? Or at least tried?

ermouth