<!--
RSS generated by JIRA (4.4#649-r158309) at Tue May 21 18:28:22 CDT 2013

It is possible to restrict the fields that are returned in this document by specifying the 'field' parameter in your request.
For example, to request only the issue key and summary add field=key&field=summary to the URL of your request.
For example:
http://dev.clojure.org/jira/sr/jira.issueviews:searchrequest-xml/temp/SearchRequest.xml?jqlQuery=project+%3D+CCACHE&tempMax=1000&field=key&field=summary
-->
<!-- If you wish to do custom client-side styling of RSS, uncomment this:
<?xml-stylesheet href="http://dev.clojure.org/jira/styles/jiraxml2html.xsl" type="text/xsl"?>
-->
<rss version="0.92">
    <channel>
        <title>Clojure JIRA</title>
        <link>http://dev.clojure.org/jira/secure/IssueNavigator.jspa?reset=true&amp;jqlQuery=project+%3D+CCACHE</link>
        <description>An XML representation of a search request</description>
                <language>en-us</language>
                        <issue start="0" end="30" total="30"/>
                <build-info>
            <version>4.4</version>
            <build-number>649</build-number>
            <build-date>25-07-2011</build-date>
        </build-info>
<item>
            <title>[CCACHE-30] make-reference need not be dynamic</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-30</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;It looks like make-reference was made dynamic to support multiple clojure versions.  Rebinding make-reference is really only needed for tests, and it would be a shame if making it dynamic causes performance issues.&lt;/p&gt;

&lt;p&gt;Perhaps it is not enough of a performance issue to worry about.  Otherwise, it might be possible to work around it.  Perhaps directly pasting in and using the with-redefs macro, or something similar?&lt;/p&gt;</description>
                <environment></environment>
            <key id="15995">CCACHE-30</key>
            <summary>make-reference need not be dynamic</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="pjstadig">Paul Stadig</reporter>
                        <labels>
                    </labels>
                <created>Sat, 9 Feb 2013 06:26:33 -0600</created>
                <updated>Sat, 9 Feb 2013 06:26:33 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CCACHE-29] Is IPersistentCollection definition of cons correct?</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-29</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;Here&apos;s the definition of `cons` for caches:&lt;/p&gt;

&lt;p&gt;      clojure.lang.IPersistentCollection&lt;br/&gt;
       (cons &lt;a href=&quot;#elem#&quot;&gt;_# elem#&lt;/a&gt;&lt;br/&gt;
         (clojure.core/cons ~base-field elem#))&lt;/p&gt;

&lt;p&gt;This seems wrong to me. Note first that the arguments to `clojure.core/cons` are in the wrong order. As a result, the result of (for example) conj is incorrect. Consider this:&lt;/p&gt;

&lt;p&gt;user=&amp;gt; (def starts-with-a (cache/fifo-cache-factory {:a 1} :threshold 3))&lt;/p&gt;

&lt;p&gt;#&apos;user/starts-with-a&lt;br/&gt;
user=&amp;gt; starts-with-a&lt;br/&gt;
{:a 1}&lt;br/&gt;
user=&amp;gt; (conj starts-with-a &lt;span class=&quot;error&quot;&gt;&amp;#91;:c 3&amp;#93;&lt;/span&gt;)&lt;br/&gt;
({:a 1} :c 3)&lt;/p&gt;

&lt;p&gt;Even if the argument order was correct, the result would still be a sequence rather than the type of the base field. I think you want something more like &lt;/p&gt;


&lt;p&gt;     clojure.lang.IPersistentCollection&lt;br/&gt;
       (cons &lt;a href=&quot;#elem#&quot;&gt;this# elem#&lt;/a&gt;&lt;br/&gt;
         (apply assoc this# elem#))&lt;/p&gt;

&lt;p&gt;After all, this particular collection is an IPersistentMap, so its `conj` and `into` behavior should be the same as other objects for which `map?` is true.&lt;/p&gt;
</description>
                <environment></environment>
            <key id="15832">CCACHE-29</key>
            <summary>Is IPersistentCollection definition of cons correct?</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="marick">Brian Marick</reporter>
                        <labels>
                    </labels>
                <created>Sun, 18 Nov 2012 15:44:43 -0600</created>
                <updated>Sun, 18 Nov 2012 15:44:43 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CCACHE-28] SoftCache NullPointerException in has? with many threads</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-28</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;&quot;cell&quot; can be null on this call to SoftReference.get():&lt;br/&gt;
&lt;a href=&quot;https://github.com/clojure/core.cache/blob/master/src/main/clojure/clojure/core/cache.clj#L501&quot;&gt;https://github.com/clojure/core.cache/blob/master/src/main/clojure/clojure/core/cache.clj#L501&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the cache did not contain &quot;item&quot; in the call to (get cache item) in the let binding, but another thread pre-empts and adds it before the subsequent call to contains?, we&apos;ll attempt to call .get() on nil.&lt;/p&gt;

&lt;p&gt;Would it perhaps be sufficient to just check whether cell is nil instead of calling contains? in the check on the previous line?&lt;/p&gt;</description>
                <environment>Linux, Oracle JRE 1.6</environment>
            <key id="15775">CCACHE-28</key>
            <summary>SoftCache NullPointerException in has? with many threads</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="jaley">James Aley</reporter>
                        <labels>
                    </labels>
                <created>Wed, 24 Oct 2012 08:42:28 -0500</created>
                <updated>Sat, 9 Feb 2013 06:27:03 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30573" author="pjstadig" created="Sat, 9 Feb 2013 06:13:39 -0600"  >&lt;p&gt;Good catch!&lt;/p&gt;

&lt;p&gt;This is rather simple to reproduce:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(use &apos;clojure.core.cache)
(def cache (soft-reference-cache {}))
(def mutator (&lt;span class=&quot;code-object&quot;&gt;Thread&lt;/span&gt;. #(loop [] (assoc cache :foo :bar) (dissoc cache :foo) (recur))))
(.start mutator)
(loop [] (has? cache :foo) (recur))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The attached patch fixes the issue, by not referring back to the cache after attempting to pull out a SoftReference.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11844" name="0001-CCACHE-28-fixes-concurrency-bug-in-has.patch" size="1108" author="pjstadig" created="Sat, 9 Feb 2013 06:13:39 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CCACHE-27] Missing LU and LRU is linear complexity - performance</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-27</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;Profiling some code with YourKit showed a hotspot in cache statistics on (miss) for LU and LRU caches.&lt;/p&gt;

&lt;p&gt;Basically two issues:  (count (keys {....})) is a count of a seq, not efficient. Replaced with a count of the map.&lt;/p&gt;

&lt;p&gt;Secondly, (apply f anything) is slow. Profiler showed that the (apply min-key) was really slow.  This is mitigated by using a c.d.priority-map instead.   On a priority-map, (ffirst {}) or (first (peek {}).&lt;/p&gt;

&lt;p&gt;Also inverted the logic for threshold comparison.  Since there is a (build-leastness-queue) that populates statistics, should caches should favor codepaths for the state of being full all the time?&lt;/p&gt;</description>
                <environment>Mac Oracle JDK, Linux OpenJDK</environment>
            <key id="15672">CCACHE-27</key>
            <summary>Missing LU and LRU is linear complexity - performance</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="gshayban@gmail.com">Ghadi Shayban</reporter>
                        <labels>
                        <label>enhancement</label>
                        <label>performance</label>
                    </labels>
                <created>Tue, 4 Sep 2012 11:26:54 -0500</created>
                <updated>Wed, 12 Sep 2012 09:27:56 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29391" author="gshayban" created="Thu, 6 Sep 2012 22:49:14 -0500"  >&lt;p&gt;I take back the part about (apply) being slow.  I think it&apos;s more the fact that it&apos;s doing a linear scan on keys every single time.&lt;/p&gt;

&lt;p&gt;(apply) does show up a lot in a profiler, but I haven&apos;t figured out why.  (apply + (range big)) seems to even be slightly faster than (reduce +) on the same range.&lt;/p&gt;
</comment>
                    <comment id="29426" author="gshayban" created="Wed, 12 Sep 2012 09:27:56 -0500"  >&lt;p&gt;Patch in proper format&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11492" name="priority-map-fixed.patch" size="5639" author="gshayban" created="Wed, 12 Sep 2012 09:27:56 -0500" />
                    <attachment id="11475" name="priority-map.patch" size="4909" author="gshayban@gmail.com" created="Tue, 4 Sep 2012 11:26:54 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CCACHE-26] hit function in LRU cache can give funny results</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-26</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;A common-sense usage in caches is hit/get. But if I naively do this to an LRUCache, without checking first for the presence of the key, I can break the limit.&lt;/p&gt;

&lt;p&gt;(-&amp;gt; (cache/lru-cache-factory {} :threshold 2)&lt;br/&gt;
    (cache/hit :x)&lt;br/&gt;
    (cache/hit :y)&lt;br/&gt;
    (cache/hit :z)&lt;br/&gt;
    (assoc :a 1)&lt;br/&gt;
    (assoc :b 2)&lt;br/&gt;
    (assoc :c 3)&lt;br/&gt;
    (assoc :d 4)&lt;br/&gt;
    (assoc :e 5))&lt;/p&gt;

&lt;p&gt;; {:e 5, :d 4, :c 3, :b 2, :a 1}&lt;/p&gt;</description>
                <environment></environment>
            <key id="15642">CCACHE-26</key>
            <summary>hit function in LRU cache can give funny results</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="arthuredelstein">Arthur Edelstein</reporter>
                        <labels>
                    </labels>
                <created>Wed, 22 Aug 2012 21:06:13 -0500</created>
                <updated>Wed, 22 Aug 2012 21:06:13 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CCACHE-25] TTLCache appears to have inconsistent behavior with respect to the TTL parameter</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-25</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;There appears to be some inconsistency in the implementation of TTLCache. Specifically, it appears that if you lookup a value whose TTL has expired, but no new items have been added to the cache, it will still be present. But if you ask if the cache has? the value, it will report that it does not. For example: &lt;/p&gt;

&lt;p&gt;```&lt;br/&gt;
user&amp;gt; (defn sleepy &lt;span class=&quot;error&quot;&gt;&amp;#91;e t&amp;#93;&lt;/span&gt; (Thread/sleep t) e)&lt;br/&gt;
#&apos;user/sleepy&lt;br/&gt;
user&amp;gt; (-&amp;gt; (ttl-cache-factory {} :ttl 1000) (assoc :a 1) &lt;br/&gt;
          (assoc :b 2)&lt;br/&gt;
	  (sleepy 2200)&lt;br/&gt;
          (has? :a))&lt;br/&gt;
false&lt;br/&gt;
user&amp;gt; (-&amp;gt; (ttl-cache-factory {} :ttl 1000) (assoc :a 1) &lt;br/&gt;
          (assoc :b 2)&lt;br/&gt;
	  (sleepy 2200)&lt;br/&gt;
          (get :a))&lt;br/&gt;
1&lt;br/&gt;
```&lt;/p&gt;

&lt;p&gt;So here we see, has? reports the value is no longer in the cache, but get will still give you the value. Unless I am misunderstanding the purpose or contract of these two functions, it seems that they should agree in whether or not a value is in the cache. &lt;/p&gt;

&lt;p&gt;This also brings up the question of whether a value in a TTL cache that has passed the TTL should remain in the cache until the cache is updated. My expectation was that an item is not in the cache after the TTL has passed (ie, has? is currently correct). I can also see the argument that the TTL parameter is merely a lower bound on the amount of time it is cached; if it can be accommodated for longer, it will be (and thus lookup is currently correct). &lt;/p&gt;

&lt;p&gt;As I said, my expectation was that things are no longer in the cache after the TTL, and I would still vote for this behavior as the correct one for a TTL cache, as it seems like a reasonable cache to use for things that can change out from under you, but a short period where it is out of date is acceptable (which is how I was trying to use it).&lt;/p&gt;</description>
                <environment></environment>
            <key id="15609">CCACHE-25</key>
            <summary>TTLCache appears to have inconsistent behavior with respect to the TTL parameter</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="santiago">David Santiago</reporter>
                        <labels>
                    </labels>
                <created>Thu, 2 Aug 2012 03:05:49 -0500</created>
                <updated>Tue, 14 Aug 2012 20:33:04 -0500</updated>
                    <resolved>Tue, 14 Aug 2012 20:33:03 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29143" author="santiago" created="Tue, 14 Aug 2012 18:39:06 -0500"  >&lt;p&gt;core.cache 0.6.2 fixes this issue for me; the call to get in the code above now returns &apos;nil&apos; to match the false return from has?. I&apos;d close the issue if I could. &lt;/p&gt;

&lt;p&gt;Thanks Fogus. &lt;/p&gt;</comment>
                    <comment id="29151" author="fogus" created="Tue, 14 Aug 2012 20:33:04 -0500"  >&lt;p&gt;Fixed in v0.6.2&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CCACHE-24] Numerous Reflective Calls in core.cache</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-24</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;When I run lein check on my code, core.cache is a source of many reflective calls. Fortunately they don&apos;t seem to account for much time in my own profiling. But given that the purpose of a cache is to provide access to time-critical things, and the library can&apos;t easily anticipate the usage patterns of its users, it would be nice if we could remove these reflective calls, particularly where there does not appear to be any restriction to the use of the cache by doing so (that is, most of these appear to be from Java interop calls that are entirely inside the implementation of the caches).&lt;/p&gt;

&lt;p&gt;Here&apos;s the output from lein check listing the reflective call sites: &lt;/p&gt;

&lt;p&gt;Reflection warning, clojure/core/cache.clj:87 - reference to field iterator can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:87 - call to equiv can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:107 - reference to field iterator can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:107 - call to equiv can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:149 - reference to field iterator can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:149 - call to equiv can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:187 - reference to field iterator can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:187 - call to equiv can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:241 - reference to field iterator can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:241 - call to equiv can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:273 - reference to field iterator can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:273 - call to equiv can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:398 - reference to field iterator can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:398 - call to equiv can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:471 - reference to field poll can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:473 - call to remove can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:474 - call to remove can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:475 - reference to field poll can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:482 - reference to field iterator can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:482 - call to equiv can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:486 - reference to field get can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:488 - reference to field get can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:491 - reference to field get can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:500 - reference to field get can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:507 - call to put can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:508 - call to put can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:515 - call to remove can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:516 - call to remove can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:528 - reference to field get can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:528 - reference to field get can&apos;t be resolved.&lt;br/&gt;
Reflection warning, clojure/core/cache.clj:562 - reference to field q can&apos;t be resolved.&lt;/p&gt;</description>
                <environment>core.cache 0.6.1, Clojure 1.3</environment>
            <key id="15581">CCACHE-24</key>
            <summary>Numerous Reflective Calls in core.cache</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="santiago">David Santiago</reporter>
                        <labels>
                    </labels>
                <created>Thu, 19 Jul 2012 05:01:06 -0500</created>
                <updated>Tue, 14 Aug 2012 20:33:34 -0500</updated>
                    <resolved>Tue, 14 Aug 2012 20:33:34 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29142" author="santiago" created="Tue, 14 Aug 2012 18:35:31 -0500"  >&lt;p&gt;core.cache 0.6.2 fixes this issue for me. I&apos;d close the issue if I could.&lt;/p&gt;</comment>
                    <comment id="29152" author="fogus" created="Tue, 14 Aug 2012 20:33:34 -0500"  >&lt;p&gt;fixed in v0.6.2&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CCACHE-23] Overwriting entries in LRU-cache deletes LRU key-values unnecessarily</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-23</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;To &quot;overwrite&quot; the value in an LRUCache, one uses assoc. Surprisingly, another k,v entry is evicted, even though the total number of items in the cache should not be increased by overwriting.&lt;/p&gt;


&lt;p&gt;Demo:&lt;/p&gt;

&lt;p&gt;(def C0 (lru-cache-factory {} :threshold 3))&lt;br/&gt;
; --&amp;gt; #&amp;lt;Var@7ec74910: {}&amp;gt;&lt;/p&gt;

&lt;p&gt;(def C1 (-&amp;gt; C0 (assoc :a 1) (assoc :b 2) (assoc :c 3)))&lt;br/&gt;
; --&amp;gt; #&amp;lt;Var@315863e4: {:c 3, :b 2, :a 1}&amp;gt;&lt;/p&gt;

&lt;p&gt;(-&amp;gt; C1 (assoc :a 4) (assoc :a 5) (assoc :a 6))&lt;br/&gt;
; --&amp;gt; {:a 6}&lt;/p&gt;</description>
                <environment></environment>
            <key id="15548">CCACHE-23</key>
            <summary>Overwriting entries in LRU-cache deletes LRU key-values unnecessarily</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="arthuredelstein">Arthur Edelstein</reporter>
                        <labels>
                    </labels>
                <created>Fri, 22 Jun 2012 12:22:20 -0500</created>
                <updated>Wed, 22 Aug 2012 19:28:53 -0500</updated>
                    <resolved>Fri, 13 Jul 2012 10:46:13 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28977" author="fogus" created="Thu, 12 Jul 2012 06:40:56 -0500"  >&lt;p&gt;I&apos;ve pushed a commit to master that I believe fixes this problem. I&apos;ll look at it a bit more and will release a v0.6.1 version ASAP.&lt;br/&gt;
Thank you&lt;/p&gt;</comment>
                    <comment id="28982" author="fogus" created="Thu, 12 Jul 2012 15:24:10 -0500"  >&lt;p&gt;version 0.6.1 has been pushed out to Maven central.&lt;/p&gt;</comment>
                    <comment id="28985" author="fogus" created="Fri, 13 Jul 2012 10:46:13 -0500"  >&lt;p&gt;v0.6.1 pushed to Maven Central.&lt;/p&gt;</comment>
                    <comment id="28988" author="siyu" created="Mon, 16 Jul 2012 13:30:51 -0500"  >&lt;p&gt;It appears v0.6.1 still has not fixed the issue&lt;/p&gt;

&lt;p&gt;(-&amp;gt; (cache/lru-cache-factory {} :threshold 2)&lt;br/&gt;
          (assoc :a 1)&lt;br/&gt;
          (assoc :b 2)&lt;br/&gt;
          (assoc :b 3))&lt;br/&gt;
{:b 3}&lt;/p&gt;</comment>
                    <comment id="29255" author="arthuredelstein" created="Wed, 22 Aug 2012 19:28:53 -0500"  >&lt;p&gt;Works for me in 0.6.2. Thanks, Fogus!&lt;/p&gt;


&lt;p&gt;(-&amp;gt; (cache/lru-cache-factory {} :threshold 2)&lt;br/&gt;
  (assoc :a 1)&lt;br/&gt;
  (assoc :b 2)&lt;br/&gt;
  (assoc :b 3))&lt;/p&gt;

&lt;p&gt;; {:b 3, :a 1}&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CCACHE-22] Change limit parameter name in TTLCache</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-22</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;&quot;limit&quot; is used in other caches to represent quantity, for TTL it represents time. Using the same name is confusing&lt;/p&gt;</description>
                <environment></environment>
            <key id="15309">CCACHE-22</key>
            <summary>Change limit parameter name in TTLCache</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="5" iconUrl="http://dev.clojure.org/jira/images/icons/priority_trivial.gif">Trivial</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="paraseba">Sebasti&#225;n Bernardo Galkin</reporter>
                        <labels>
                        <label>enhancement</label>
                        <label>patch,</label>
                        <label>ttl</label>
                    </labels>
                <created>Fri, 30 Mar 2012 09:05:57 -0500</created>
                <updated>Fri, 15 Jun 2012 13:49:12 -0500</updated>
                    <resolved>Fri, 15 Jun 2012 13:48:43 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28821" author="fogus" created="Fri, 15 Jun 2012 13:48:43 -0500"  >&lt;p&gt;Changed to :ttl-ms&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11027" name="Changed-limit-parameter-name-in-TTLCache.patch" size="2096" author="paraseba" created="Fri, 30 Mar 2012 09:05:57 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CCACHE-21] LRU and LU caches never evict entries that came in as a seed and are never accessed</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-21</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;If one initializes an LRU or LU cache with seed data and those datum are never touched, then they are never evicted.  &lt;/p&gt;

&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;  (def C (lru-cache-factory {:a 1, :b 2} :limit 2))
  
  (-&amp;gt; C (assoc :c 3) (assoc :d 4) (assoc :e 5))
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You would expect that the cache should contain only &lt;tt&gt;:d&lt;/tt&gt; and &lt;tt&gt;:e&lt;/tt&gt;, but it instead includes &lt;tt&gt;:a&lt;/tt&gt;, &lt;tt&gt;:b&lt;/tt&gt;, &lt;tt&gt;:d&lt;/tt&gt; and &lt;tt&gt;:e&lt;/tt&gt;!  The problem is that seeds are never added to the eviction queue.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15276">CCACHE-21</key>
            <summary>LRU and LU caches never evict entries that came in as a seed and are never accessed</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="fogus">Fogus</reporter>
                        <labels>
                        <label>bug</label>
                        <label>cache</label>
                        <label>lru</label>
                        <label>lu</label>
                    </labels>
                <created>Wed, 14 Mar 2012 08:13:25 -0500</created>
                <updated>Wed, 14 Mar 2012 08:15:59 -0500</updated>
                    <resolved>Wed, 14 Mar 2012 08:15:17 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="27943" author="fogus" created="Wed, 14 Mar 2012 08:15:17 -0500"  >&lt;p&gt;Fixed in 5751b7e8d8d2f10c87b8a79c8ed9b0324368514d&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CCACHE-20] Add some examples to github page</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-20</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;Could you add some examples on how to use core.cache to github readme?&lt;/p&gt;</description>
                <environment></environment>
            <key id="15213">CCACHE-20</key>
            <summary>Add some examples to github page</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="jsyrjala">Juha Syrj&#228;l&#228;</reporter>
                        <labels>
                    </labels>
                <created>Wed, 8 Feb 2012 23:21:54 -0600</created>
                <updated>Sun, 19 Feb 2012 18:24:14 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="27769" author="fogus" created="Sun, 19 Feb 2012 18:24:14 -0600"  >&lt;p&gt;Can do.  In the meantime checkout how core.memoize uses it at &lt;a href=&quot;https://github.com/clojure/core.memoize/blob/master/src/main/clojure/clojure/core/memoize.clj#L50&quot;&gt;https://github.com/clojure/core.memoize/blob/master/src/main/clojure/clojure/core/memoize.clj#L50&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I think I might bring this &lt;tt&gt;through&lt;/tt&gt; fn into core.cache in a more generic way.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CCACHE-19] Create 3-arg version of lookup</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-19</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;Currently, &lt;tt&gt;lookup&lt;/tt&gt; comes in only the 2-arg flavor (i.e. gimme a key and I&apos;ll give you a value or &lt;tt&gt;nil&lt;/tt&gt;).  The issue with this is that &lt;tt&gt;nil&lt;/tt&gt; is potentially a legal value.  Therefore, the 3-arg version logic is the same as the 3-arg `assoc` &lt;tt&gt;(.lookup this key not-found)&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;This change should propagate to all of the existing cache impls.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15095">CCACHE-19</key>
            <summary>Create 3-arg version of lookup</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="fogus">Fogus</reporter>
                        <labels>
                        <label>cache</label>
                        <label>lookup</label>
                    </labels>
                <created>Wed, 4 Jan 2012 18:56:18 -0600</created>
                <updated>Thu, 5 Jan 2012 07:36:38 -0600</updated>
                    <resolved>Thu, 5 Jan 2012 07:36:38 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="27508" author="fogus" created="Thu, 5 Jan 2012 07:36:38 -0600"  >&lt;p&gt;Added in f4450a039ef703ce62c61dd497aafed73194f1c2&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10007">Ok</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                    <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CCACHE-18] Explore JSR 107- Java Temporary Caching API</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-18</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;Is this relevant to core.cache? And many other questions answered.&lt;/p&gt;

&lt;p&gt;&amp;lt;&lt;a href=&quot;http://jcp.org/en/jsr/detail?id=107&quot;&gt;http://jcp.org/en/jsr/detail?id=107&lt;/a&gt;&amp;gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15081">CCACHE-18</key>
            <summary>Explore JSR 107- Java Temporary Caching API</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="5" iconUrl="http://dev.clojure.org/jira/images/icons/priority_trivial.gif">Trivial</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="fogus">Fogus</reporter>
                        <labels>
                        <label>jsr-107</label>
                        <label>research</label>
                    </labels>
                <created>Mon, 19 Dec 2011 07:23:32 -0600</created>
                <updated>Mon, 19 Dec 2011 07:23:32 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CCACHE-17] Create function backed cache</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-17</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;A cache implementation that is backed by a function that performs some action on a cache miss could serve as a front for any of the existing cache impls.&lt;/p&gt;
</description>
                <environment></environment>
            <key id="15075">CCACHE-17</key>
            <summary>Create function backed cache</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="fogus">Fogus</reporter>
                        <labels>
                        <label>cache</label>
                        <label>fn-cache</label>
                        <label>new-feature</label>
                    </labels>
                <created>Fri, 16 Dec 2011 08:57:37 -0600</created>
                <updated>Mon, 19 Dec 2011 07:29:30 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="27477" author="richhickey" created="Fri, 16 Dec 2011 09:45:18 -0600"  >&lt;p&gt;It doesn&apos;t perform an action per se, it gets a passed key and returns a value, which the cache then caches (associates with the key) and returns. The tricky bit is when the function can&apos;t get a value. There needs to be some protocol for communicating that (could be like 3 arg get), and, should the cache be asked again later for the same key, calling the fn again.&lt;/p&gt;</comment>
                    <comment id="27483" author="fogus" created="Mon, 19 Dec 2011 07:29:30 -0600"  >&lt;p&gt;Thanks for the feedback Rich.  I believe I understand the subtleties now.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CCACHE-16] Benchmark v0.5.x against Google Guava</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-16</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;Perform some tests and benchmarks of core.cache and Google Guava&apos;s com.google.common.cache library.&lt;/p&gt;
</description>
                <environment></environment>
            <key id="15074">CCACHE-16</key>
            <summary>Benchmark v0.5.x against Google Guava</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="fogus">Fogus</reporter>
                        <labels>
                        <label>benchmark</label>
                        <label>cache</label>
                        <label>guava</label>
                    </labels>
                <created>Fri, 16 Dec 2011 08:55:39 -0600</created>
                <updated>Fri, 16 Dec 2011 08:55:39 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CCACHE-15] It appears that TTL cache exhibits quadratic performance (+ its evict is buggy)</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-15</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;The library looks useful, thanks! &lt;/p&gt;

&lt;p&gt;I looked at the code, and unless I&apos;m mistaken, every cache miss seems to result in a full pass over the entire cache to evict old entries.  The performance implications of this would be unacceptable for my target application.  Replacing the TTL data structure with a persistent analog of a LinkedHashMap and using a take-while instead could fix this problem.&lt;/p&gt;

&lt;p&gt;Also, evict seems to pass the cache in twice, rather than the cache and the TTL...&lt;/p&gt;
</description>
                <environment></environment>
            <key id="15073">CCACHE-15</key>
            <summary>It appears that TTL cache exhibits quadratic performance (+ its evict is buggy)</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="jawolfe">Jason Wolfe</reporter>
                        <labels>
                    </labels>
                <created>Wed, 14 Dec 2011 19:20:01 -0600</created>
                <updated>Thu, 15 Dec 2011 12:21:46 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="27468" author="fogus" created="Thu, 15 Dec 2011 12:21:46 -0600"  >&lt;p&gt;TTLCache eviction fixed.  Patches welcomed for the other change, but we might be able to get away with a sorted map  ttl map.&lt;/p&gt;
</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CCACHE-14] Asynchronous Cache Support</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-14</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;If people start implementing the cache protocol on top of external caches: Memcache, Redis, or others, an async version could make sense. &lt;/p&gt;

&lt;p&gt;I started toying with an AsyncCacheProtocol which for all functions returning values would take two arities, a standard one which would return an instance of IRef, a second one which would take an extra callback argument to be called with the results. This doesn&apos;t solve everything though and async versions of LRU and friends would have to be implemented.&lt;/p&gt;

&lt;p&gt;The alternative would be to have additional calls in CacheProtocol, such as async-has? async-lookup which would implement the 2 arity semantics and then rely on the fact that the underlying cache respects some sort of async semantics, since we cannot do that with Associative, maybe another middleman protocol CacheStorage could be used, this way, all external cache providers would have to do is implement a CacheProvider with optional asynchronous support.&lt;/p&gt;

&lt;p&gt;I hope at least part of this makes sense.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15068">CCACHE-14</key>
            <summary>Asynchronous Cache Support</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="pyr">Pierre-Yves Ritschard</reporter>
                        <labels>
                    </labels>
                <created>Tue, 13 Dec 2011 16:33:21 -0600</created>
                <updated>Tue, 13 Dec 2011 16:33:21 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CCACHE-13] Deprecate Clache</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-13</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;core.cache was originally &lt;a href=&quot;http://github.com/fogus/clache&quot;&gt;Clache &lt;/a&gt;, but its inclusion into contrib means the latter is redundant.  The Clache repo should indicate the move and change to a place for docs and examples.  Likewise, a formal announcement should be made.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15065">CCACHE-13</key>
            <summary>Deprecate Clache</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="fogus">Fogus</reporter>
                        <labels>
                        <label>clache</label>
                        <label>documentation</label>
                    </labels>
                <created>Tue, 13 Dec 2011 07:56:31 -0600</created>
                <updated>Tue, 14 Aug 2012 20:34:42 -0500</updated>
                    <resolved>Tue, 14 Aug 2012 20:34:42 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CCACHE-12] LRUCache miss explodes if given an empty lru table</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-12</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;The min-key method used to determine least tick explodes with:&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;clojure.lang.ArityException: Wrong number of args (1) passed to: core$min-key&lt;/tt&gt;&lt;/p&gt;

&lt;p&gt;This is a corner case that should be handled.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15061">CCACHE-12</key>
            <summary>LRUCache miss explodes if given an empty lru table</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="fogus">Fogus</reporter>
                        <labels>
                    </labels>
                <created>Fri, 9 Dec 2011 09:40:59 -0600</created>
                <updated>Fri, 9 Dec 2011 09:42:11 -0600</updated>
                    <resolved>Fri, 9 Dec 2011 09:42:11 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="27440" author="fogus" created="Fri, 9 Dec 2011 09:42:11 -0600"  >&lt;p&gt;Fixed in beaa62d02c964b1c0114ab088c6a835ca4391f80.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CCACHE-11] Add eviction implementation to LIRSCache</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-11</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;The &lt;tt&gt;evict&lt;/tt&gt; method in the ProtocolCache needs implementation for &lt;tt&gt;LIRSCache&lt;/tt&gt;.  I will start initially with a single key eviction method to start.  The &lt;tt&gt;evict&lt;/tt&gt; method would form the basis for the associative &lt;tt&gt;dissoc&lt;/tt&gt; which in turn forms the basis for proper limited seeding.  LIRS poses an additional complication due to its dual limit lists.  Currently only the &lt;tt&gt;BasicCache&lt;/tt&gt; impl has &lt;tt&gt;evict&lt;/tt&gt;.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15056">CCACHE-11</key>
            <summary>Add eviction implementation to LIRSCache</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="fogus">Fogus</reporter>
                        <labels>
                        <label>associative</label>
                        <label>cache</label>
                        <label>evict</label>
                        <label>lirs</label>
                    </labels>
                <created>Thu, 8 Dec 2011 14:38:28 -0600</created>
                <updated>Thu, 8 Dec 2011 14:38:50 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CCACHE-10] Add eviction implementation to LUCache</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-10</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;The &lt;tt&gt;evict&lt;/tt&gt; method in the ProtocolCache needs implementation for &lt;tt&gt;LUCache&lt;/tt&gt;.  I will start initially with a single key eviction method to start.  The &lt;tt&gt;evict&lt;/tt&gt; method would form the basis for the associative &lt;tt&gt;dissoc&lt;/tt&gt; which in turn forms the basis for proper limited seeding.  Currently only the &lt;tt&gt;BasicCache&lt;/tt&gt; impl has &lt;tt&gt;evict&lt;/tt&gt;.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15055">CCACHE-10</key>
            <summary>Add eviction implementation to LUCache</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="fogus">Fogus</reporter>
                        <labels>
                        <label>associative</label>
                        <label>cache</label>
                        <label>evict</label>
                        <label>lu</label>
                    </labels>
                <created>Thu, 8 Dec 2011 14:37:19 -0600</created>
                <updated>Mon, 12 Dec 2011 07:54:29 -0600</updated>
                    <resolved>Mon, 12 Dec 2011 07:54:28 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="27456" author="fogus" created="Mon, 12 Dec 2011 07:54:29 -0600"  >&lt;p&gt;Implemented in ca4587bdbdca2728b191bf98472a778231250e61.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CCACHE-9] Add eviction implementation to TTLCache</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-9</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;The &lt;tt&gt;evict&lt;/tt&gt; method in the ProtocolCache needs implementation for &lt;tt&gt;TTLCache&lt;/tt&gt;.  I will start initially with a single key eviction method to start.  The &lt;tt&gt;evict&lt;/tt&gt; method would form the basis for the associative &lt;tt&gt;dissoc&lt;/tt&gt;.  Currently only the &lt;tt&gt;BasicCache&lt;/tt&gt; impl has &lt;tt&gt;evict&lt;/tt&gt;.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15054">CCACHE-9</key>
            <summary>Add eviction implementation to TTLCache</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="fogus">Fogus</reporter>
                        <labels>
                        <label>associative</label>
                        <label>ccahe</label>
                        <label>evict</label>
                        <label>ttl</label>
                    </labels>
                <created>Thu, 8 Dec 2011 14:36:46 -0600</created>
                <updated>Sat, 10 Dec 2011 07:35:22 -0600</updated>
                    <resolved>Sat, 10 Dec 2011 07:35:22 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="27450" author="fogus" created="Sat, 10 Dec 2011 07:35:22 -0600"  >&lt;p&gt;Added in c25022137d55be6aab9e34b5c0f91bc933a05926.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CCACHE-8] Add eviction implementation to LRUCache</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-8</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;The &lt;tt&gt;evict&lt;/tt&gt; method in the ProtocolCache needs implementation for &lt;tt&gt;LRUCache&lt;/tt&gt;.  I will start initially with a single key eviction method to start.  The &lt;tt&gt;evict&lt;/tt&gt; method would form the basis for the associative &lt;tt&gt;dissoc&lt;/tt&gt; which in turn forms the basis for proper limited seeding.  Currently only the &lt;tt&gt;BasicCache&lt;/tt&gt; impl has &lt;tt&gt;evict&lt;/tt&gt;.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15053">CCACHE-8</key>
            <summary>Add eviction implementation to LRUCache</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="fogus">Fogus</reporter>
                        <labels>
                        <label>associative</label>
                        <label>cache</label>
                        <label>evict</label>
                        <label>lru</label>
                    </labels>
                <created>Thu, 8 Dec 2011 14:35:28 -0600</created>
                <updated>Fri, 9 Dec 2011 21:11:23 -0600</updated>
                    <resolved>Fri, 9 Dec 2011 21:11:23 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="27449" author="fogus" created="Fri, 9 Dec 2011 21:11:23 -0600"  >&lt;p&gt;Added in 77174780ac030ca3e72d51cae4dfb3eb2ac286ee.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CCACHE-7] Add eviction implementation to FIFOCache</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-7</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;The &lt;tt&gt;evict&lt;/tt&gt; method in the ProtocolCache needs implementation for &lt;tt&gt;FIFOCache&lt;/tt&gt;.  I will start initially with a single key eviction method to start.  The &lt;tt&gt;evict&lt;/tt&gt; method would form the basis for the associative &lt;tt&gt;dissoc&lt;/tt&gt; which in turn forms the basis for proper limited seeding.  Currently only the &lt;tt&gt;BasicCache&lt;/tt&gt; impl has &lt;tt&gt;evict&lt;/tt&gt;.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15052">CCACHE-7</key>
            <summary>Add eviction implementation to FIFOCache</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="fogus">Fogus</reporter>
                        <labels>
                        <label>associative</label>
                        <label>cache</label>
                        <label>evict</label>
                        <label>fifo</label>
                    </labels>
                <created>Thu, 8 Dec 2011 14:34:03 -0600</created>
                <updated>Fri, 9 Dec 2011 08:52:30 -0600</updated>
                    <resolved>Fri, 9 Dec 2011 08:52:30 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="27434" author="fogus" created="Fri, 9 Dec 2011 08:52:30 -0600"  >&lt;p&gt;Added in 094363f48dbd5d4399d5e7df2b3fe995cdaf1737.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CCACHE-6] Cut 0.5.0 release jar</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-6</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;The core.cache functionality, with LIRS will be inline with Clache.  A release should be cut and pushed to Maven central pending &lt;a href=&quot;http://dev.clojure.org/jira/browse/CCACHE-4&quot; title=&quot;Added LIRS factory fn&quot;&gt;&lt;del&gt;CCACHE-4&lt;/del&gt;&lt;/a&gt;.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15051">CCACHE-6</key>
            <summary>Cut 0.5.0 release jar</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="fogus">Fogus</reporter>
                        <labels>
                        <label>release</label>
                    </labels>
                <created>Tue, 6 Dec 2011 08:46:40 -0600</created>
                <updated>Tue, 13 Dec 2011 12:02:42 -0600</updated>
                    <resolved>Tue, 13 Dec 2011 12:02:42 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="27459" author="fogus" created="Tue, 13 Dec 2011 07:44:33 -0600"  >&lt;p&gt;v0.5.0 jar deployed to Maven central.  Release notes outstanding.&lt;/p&gt;</comment>
                    <comment id="27461" author="fogus" created="Tue, 13 Dec 2011 12:02:42 -0600"  >&lt;p&gt;Announced at: &lt;a href=&quot;http://groups.google.com/group/clojure/browse_frm/thread/69d08572ab265dc7&quot;&gt;http://groups.google.com/group/clojure/browse_frm/thread/69d08572ab265dc7&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Release notes at: &lt;a href=&quot;https://github.com/clojure/core.cache/blob/master/docs/release-notes/release-0.5.0.markdown&quot;&gt;https://github.com/clojure/core.cache/blob/master/docs/release-notes/release-0.5.0.markdown&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;README at: &lt;a href=&quot;https://github.com/clojure/core.cache/blob/master/README.md&quot;&gt;https://github.com/clojure/core.cache/blob/master/README.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Post at: &lt;a href=&quot;http://blog.fogus.me/2011/12/13/announcing-core-cache-v0-5-0/&quot;&gt;http://blog.fogus.me/2011/12/13/announcing-core-cache-v0-5-0/&lt;/a&gt;&lt;/p&gt;
</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CCACHE-5] Implement SoftCache</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-5</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;Clache had a buggy implementation of a cache backed by soft references.  This capability should be explored further and implemented properly for core.cache.&lt;/p&gt;
</description>
                <environment></environment>
            <key id="15049">CCACHE-5</key>
            <summary>Implement SoftCache</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="fogus">Fogus</reporter>
                        <labels>
                    </labels>
                <created>Tue, 6 Dec 2011 08:43:25 -0600</created>
                <updated>Fri, 13 Jul 2012 10:47:16 -0500</updated>
                    <resolved>Tue, 19 Jun 2012 06:54:09 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28709" author="pjstadig" created="Mon, 4 Jun 2012 10:20:55 -0500"  >&lt;p&gt;I&apos;d be interested in taking a crack at this, but would find it useful to have more infos about what bugs existed in the Clache implementation.&lt;/p&gt;</comment>
                    <comment id="28829" author="pjstadig" created="Sat, 16 Jun 2012 08:14:46 -0500"  >&lt;p&gt;I&apos;ve implemented a mutable SoftCache.  I felt as though the tradeoffs made it worth using a ConcurrentHashMap as the base for SoftCache.&lt;/p&gt;

&lt;p&gt;SoftReference objects are mutable (and tied to a specific instance of ReferenceQueue).  ReferenceQueue is mutable.  Using an immutable map as the base for SoftCache would cost {O(n)} when removing cleared SoftReference objects from the cache.&lt;br/&gt;
&lt;br/&gt;
If immutability is desirable, I also have an implementation of an immutable SoftCache, but it suffers from the above {O(n)} cost.&lt;/p&gt;</comment>
                    <comment id="28879" author="fogus" created="Tue, 19 Jun 2012 06:53:18 -0500"  >&lt;p&gt;I have no problem with internal mutability in the cache impls, so that immutable code might not be needed.  I&apos;ve pushed the 0.7.0-SNAPSHOT version with your additions and will run it through the paces post-haste.  Thank you for tackling this Paul, it&apos;s a huge help.&lt;/p&gt;</comment>
                    <comment id="28880" author="fogus" created="Tue, 19 Jun 2012 06:54:09 -0500"  >&lt;p&gt;Planned for v0.7.0&lt;/p&gt;</comment>
                    <comment id="28986" author="fogus" created="Fri, 13 Jul 2012 10:47:16 -0500"  >&lt;p&gt;Actually released in version 0.6.1.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11328" name="mutable-soft-cache.diff" size="7530" author="pjstadig" created="Sat, 16 Jun 2012 08:14:46 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CCACHE-4] Added LIRS factory fn</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-4</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;LIRS is implemented as a type only ATM.  There should also be a corresponding factory fn.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15048">CCACHE-4</key>
            <summary>Added LIRS factory fn</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="fogus">Fogus</reporter>
                        <labels>
                        <label>cache</label>
                        <label>enhancement</label>
                    </labels>
                <created>Tue, 6 Dec 2011 08:41:41 -0600</created>
                <updated>Thu, 8 Dec 2011 12:11:00 -0600</updated>
                    <resolved>Thu, 8 Dec 2011 12:11:00 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="27426" author="fogus" created="Thu, 8 Dec 2011 12:11:00 -0600"  >&lt;p&gt;Completed in f4d1bf9f1069ba875a7a6a8a65646b35c6fbfd8f&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CCACHE-3] Add LIRS support.</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-3</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;Clache had an implementation of the LIRS &lt;a href=&quot;http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.116.2184&quot;&gt;http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.116.2184&lt;/a&gt; strategy.  This capability should be merged into core.cache also.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15046">CCACHE-3</key>
            <summary>Add LIRS support.</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="fogus">Fogus</reporter>
                        <labels>
                        <label>cache</label>
                        <label>lirs</label>
                    </labels>
                <created>Sun, 4 Dec 2011 07:52:18 -0600</created>
                <updated>Tue, 6 Dec 2011 08:40:23 -0600</updated>
                    <resolved>Tue, 6 Dec 2011 08:40:23 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="27423" author="fogus" created="Tue, 6 Dec 2011 08:40:23 -0600"  >&lt;p&gt;Added LIRS stock from Clache in f71d276695adc5c3af77799201140ea840cd5f79.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CCACHE-2] FIFOCache seed does not properly seed the FIFO queue</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-2</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;(def c (clojure.core.cache/seed (FIFOCache. {} nil 1) {:a 1 :b 2}))

(defmethod print-method clojure.lang.PersistentQueue [q, w]
  (print-method &apos;&amp;lt;- w)
  (print-method (seq q) w)
  (print-method &apos;-&amp;lt; w))

(str c )
;=&amp;gt; &quot;{:a 1, :b 2}, &amp;lt;-(:clojure.core.cache/free)-&amp;lt;&quot;

(str (assoc c :c 3))
;=&amp;gt; &quot;{:a 1, :c 3, :b 2}, &amp;lt;-(:c)-&amp;lt;&quot;

&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The queue never gets the seed keys &lt;tt&gt;:a&lt;/tt&gt; and &lt;tt&gt;:b&lt;/tt&gt; and so they will never get expelled.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15041">CCACHE-2</key>
            <summary>FIFOCache seed does not properly seed the FIFO queue</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="fogus">Fogus</reporter>
                        <labels>
                    </labels>
                <created>Wed, 30 Nov 2011 11:01:26 -0600</created>
                <updated>Fri, 9 Dec 2011 06:46:42 -0600</updated>
                    <resolved>Fri, 9 Dec 2011 06:46:42 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="27432" author="fogus" created="Fri, 9 Dec 2011 06:46:42 -0600"  >&lt;p&gt;Fixed in 7be1589095b48b7158584897a6b08c93322c3607&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CCACHE-1] Storing falsey value in underlying struct causes failure in get with not-found arg </title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-1</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;Cache &lt;tt&gt;c&lt;/tt&gt; seeded with {:a nil} and accessed via &lt;tt&gt;(get c :a 42)&lt;/tt&gt; returns &lt;tt&gt;42&lt;/tt&gt; instead of &lt;tt&gt;nil&lt;/tt&gt;.  The reason for this is that the map &lt;tt&gt;vatAt&lt;/tt&gt; delegates directly to the &lt;tt&gt;lookup&lt;/tt&gt; protocol function without a &lt;tt&gt;has?&lt;/tt&gt; guard.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15034">CCACHE-1</key>
            <summary>Storing falsey value in underlying struct causes failure in get with not-found arg </summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="fogus">Fogus</reporter>
                        <labels>
                        <label>associative</label>
                        <label>bug</label>
                    </labels>
                <created>Mon, 28 Nov 2011 22:04:28 -0600</created>
                <updated>Wed, 30 Nov 2011 10:57:33 -0600</updated>
                    <resolved>Wed, 30 Nov 2011 10:57:33 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="27373" author="fogus" created="Wed, 30 Nov 2011 10:57:33 -0600"  >&lt;p&gt;Fixed in  &lt;a href=&quot;https://github.com/clojure/core.cache/commit/7f77aee164d59441caa56979821bae8f64affba7&quot;&gt;https://github.com/clojure/core.cache/commit/7f77aee164d59441caa56979821bae8f64affba7&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>
</channel>
</rss>