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 <ermo...@gmail.com> 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