mperham/dalli — pull request #436 by leonid-shevtsov (2014-02-26 11:01:23+00:00)
Title: Fix for expiration intervals longer than 30 days

I have found out (the hard way) that memcached silently doesn't store values with expiration over 30 days. (previously: #55 #251 #357)

Upon studying the code, I've decided that the best way to handle this is to transparently rewrite long expiration intervals into expiration timestamps, as the Memcached API asks.

Tests are provided, I've also tested the code integrated into my own environment, a debug message is logged when the translation happens, and nothing changes in the documented API.

What will change in existing apps is

* apps that unknowingly use bad expiration intervals (such as 1 year) will suddenly start caching as intended
* apps that knowingly exploit the "bug" will get wrong expiration timestamps in the far future.

I think compliance to APIs is worth breaking the latter. An safer alternative could be to provide both `:expires_in` and `:expires_on` options, and throw exceptions on invalid timestamps and intervals, but Rails, for one, doesn't even have `:expires_on`.