<!-- 
RSS generated by JIRA (9.4.2#940002-sha1:46d1a51de284217efdcb32434eab47a99af2938b) at Mon Feb 12 03:43:51 CET 2024

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 append 'field=key&field=summary' to the URL of your request.
-->
<rss version="0.92" >
<channel>
    <title>Magnolia - Issue tracker</title>
    <link>https://jira.magnolia-cms.com</link>
    <description>This file is an XML representation of an issue</description>
    <language>en-uk</language>    <build-info>
        <version>9.4.2</version>
        <build-number>940002</build-number>
        <build-date>19-01-2023</build-date>
    </build-info>


<item>
            <title>[MAGNOLIA-3167] cache: single blocking request can block all other requests to cached content </title>
                <link>https://jira.magnolia-cms.com/browse/MAGNOLIA-3167</link>
                <project id="10000" key="MAGNOLIA">Magnolia</project>
                    <description>&lt;p&gt;the cache mechanism can block all requests:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;cache.get() will block if an other request is caching the same key (this is a feature of the BlockingCache)
	&lt;ul&gt;
		&lt;li&gt;mutex per key kept until cache.put() is called (either with an entry or null value)&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;this code is again in a synchronized block which synchronizes on the cache object itself
	&lt;ul&gt;
		&lt;li&gt;this blocks all other request trying to enter the synchronization block&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;The critical scenario which can prevent magnolia from responding any request (all threads blocked) is the following&lt;br/&gt;
1) first request to a resource which is slow or never returns (request to a service, poor database connection, ..)&lt;br/&gt;
2) second request to the same resource: --&amp;gt; thread is blocked at EhCacheWrapper.get(key):56, but also keeps the lock on the cache&lt;br/&gt;
3) all other caching requests are blocked (no matter which url) due to the synchronize block at Default.shouldCache(Cache, AggregationState, FlushPolicy):89&lt;/p&gt;

&lt;p&gt;Solution:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;don&apos;t synchronize on the cache (why are we doing this???)&lt;/li&gt;
	&lt;li&gt;allow configuration of &lt;a href=&quot;http://ehcache.org/apidocs/net/sf/ehcache/constructs/blocking/BlockingCache.html#timeoutMillis&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;BlockingCache.timeoutMillis&lt;/a&gt;
	&lt;ul&gt;
		&lt;li&gt;throw an exception if a request waits for to long&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;uncomment finally block at doFilter(HttpServletRequest, HttpServletResponse, FilterChain), this is a safety net and should log a FATAL ERROR message
	&lt;ul&gt;
		&lt;li&gt;only relevant if the result is a store request&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
                <environment></environment>
        <key id="18197">MAGNOLIA-3167</key>
            <summary>cache: single blocking request can block all other requests to cached content </summary>
                <type id="1" iconUrl="https://jira.magnolia-cms.com/secure/viewavatar?size=xsmall&amp;avatarId=10883&amp;avatarType=issuetype">Bug</type>
                                            <priority id="3" iconUrl="https://jira.magnolia-cms.com/images/icons/priorities/major.svg">Major</priority>
                        <status id="6" iconUrl="https://jira.magnolia-cms.com/images/icons/statuses/closed.png" description="The issue is considered finished, the resolution is correct. Issues which are not closed can be reopened.">Closed</status>
                    <statusCategory id="3" key="done" colorName="success"/>
                                    <resolution id="1">Fixed</resolution>
                                        <assignee username="had">Jan Haderka</assignee>
                                    <reporter username="pbaerfuss">Philipp B&#228;rfuss</reporter>
                        <labels>
                    </labels>
                <created>Fri, 26 Mar 2010 11:47:32 +0100</created>
                <updated>Wed, 23 Jan 2013 09:09:53 +0100</updated>
                            <resolved>Fri, 7 May 2010 14:26:28 +0200</resolved>
                                    <version>3.6.8</version>
                    <version>4.1.4</version>
                    <version>4.2.3</version>
                    <version>4.3.1</version>
                                    <fixVersion>4.3.2</fixVersion>
                                    <component>cache</component>
                        <due></due>
                            <votes>0</votes>
                                    <watches>3</watches>
                                                                                                                <comments>
                            <comment id="27649" author="pbaerfuss" created="Fri, 26 Mar 2010 11:48:59 +0100"  >&lt;p&gt;Patch against 3.6.8 (draft) can be found at SUPPORT-538&lt;/p&gt;</comment>
                            <comment id="27652" author="gjoseph" created="Fri, 26 Mar 2010 12:36:24 +0100"  >&lt;p&gt;I think the main reason we synchronize on the cache instance is to avoid relying on specifics of EhCache&apos;s implementation. &lt;/p&gt;

&lt;p&gt;Given the above, we could consider not doing it, but rather change our Cache interface to enforce locking at key level like EhCache&apos;s BlockingCache does (by means of simply naming methods appropriately, providing extra facilities to do said locking ourselves (should be doable with java 5&apos;s &lt;tt&gt;java.util.concurrent.locks&lt;/tt&gt;?), or define such contracts in the javadoc - or of course all of this)&lt;/p&gt;</comment>
                            <comment id="27656" author="had" created="Fri, 26 Mar 2010 14:41:12 +0100"  >&lt;p&gt;Actually the reason we synchronize is the related to the fact that we use blocking cache by default. If I&apos;m not mistaken the scenario that requires synchronization is this:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Requst A calls &lt;tt&gt;hasElement()&lt;/tt&gt; which in turn will call &lt;tt&gt;get(key)&lt;/tt&gt;. Since key is not yet in the cache &lt;tt&gt;get()&lt;/tt&gt; method will return null and place a mutex on the key. At which point &lt;tt&gt;hasElement()&lt;/tt&gt; return false and cache policy will return &quot;store&quot;. and request will proceed to generate the cache entry&lt;/li&gt;
	&lt;li&gt;while the cache entry is being generated, the request B comes for the same resource, and the &lt;tt&gt;hasElement()&lt;/tt&gt; will block in the subsequent call to &lt;tt&gt;cache.get(key)&lt;/tt&gt; (since we use the blocking cache)&lt;/li&gt;
	&lt;li&gt;still while the cache entry requested by the A is generated, the request C comes and gets stuck in the exactly same place as request B&lt;/li&gt;
	&lt;li&gt;now finally, the cache entry have been generated and placed in the cache at which point the request A returns.&lt;/li&gt;
	&lt;li&gt;since the cache entry have been put in the cache, it will remove the mutex and request B will proceed, find the entry in the cache, and will go on with the &quot;useCache&quot; behavior.&lt;/li&gt;
	&lt;li&gt;unfortunatelly, the reuqest C will be still blocked and will stay that way forever since removing the mutex by A released only the first blocked &lt;tt&gt;get()&lt;/tt&gt; call, but all of them. So what applies to C applies to any number of requests that come in that very same time window.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;The behavior above was a reason why we introduced the synchronization on cache in 3.6. I might have explained it in even more details in the user list in the past.&lt;/p&gt;

&lt;p&gt;Now, considering this issue, the timeout is probably bast solution to avoid being locked forever if the thread handling request A gets stuck forever.&lt;/p&gt;

&lt;p&gt;As for serving multiple entries from the cache, we should lock on the key rather then on the whole cache so only the requests to the cache for given key ever gets serialized access as Greg already suggested above. ... Alternatively we can drop whole policy/executor based implementation and implement cache in a way that would not allow calls to cache to escape ever.&lt;/p&gt;
</comment>
                            <comment id="27658" author="pbaerfuss" created="Fri, 26 Mar 2010 17:07:45 +0100"  >&lt;blockquote&gt;&lt;p&gt;unfortunatelly, the reuqest C will be still blocked and will stay that way forever since removing the mutex&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;If I understand that right the following will happen if the synchronization block is removed&lt;br/&gt;
1) A gets mutext&lt;br/&gt;
2) B tries to acquire the mutix&lt;br/&gt;
3) C tries to acquire the mutix&lt;br/&gt;
4) A releases (calls put)&lt;br/&gt;
5) B succeeds but does never release the mutex&lt;br/&gt;
--&amp;gt; C is blocked for ever&lt;/p&gt;

&lt;p&gt;Well then we have to find a better solution, just blocking all requests for that reason is not an option. But looking at the following code of net.sf.ehcache.constructs.blocking.BlockingCache.get(Object) (version 1.5)&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;            &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (element != &lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;) {
                &lt;span class=&quot;code-comment&quot;&gt;//ok let the other threads in
&lt;/span&gt;                lock.release();
                &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; element;
            } &lt;span class=&quot;code-keyword&quot;&gt;else&lt;/span&gt; {

&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It seams as if they handle the case in which the cache was populated while that thread was blocked. Either something is very fishy but that extra synchronization block is wrong/obsolete.&lt;/p&gt;</comment>
                            <comment id="27660" author="had" created="Fri, 26 Mar 2010 17:58:00 +0100"  >&lt;p&gt;Yes, that is correct.&lt;br/&gt;
AFAIK this scenario was not re-tested after upgrading to ehcache 1.5 so it might be indeed obsolete.&lt;/p&gt;

&lt;p&gt;OTOH looking at current trunk of ehcache, I&apos;m not so sure you had a right code, there the BlockingCache.get(key) method looks like:&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;    /**
     * Looks up an entry.  Blocks &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; the entry is &lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt; until a call to {@link #put} is done
     * to put an Element in.
     * &amp;lt;p/&amp;gt;
     * If a put is not done, the lock is never released.
     * &amp;lt;p/&amp;gt;
     * If &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; method &lt;span class=&quot;code-keyword&quot;&gt;throws&lt;/span&gt; an exception, it is the responsibility of the caller to &lt;span class=&quot;code-keyword&quot;&gt;catch&lt;/span&gt; that exception and call
     * &amp;lt;code&amp;gt;put(&lt;span class=&quot;code-keyword&quot;&gt;new&lt;/span&gt; Element(key, &lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;));&amp;lt;/code&amp;gt; to release the lock acquired. See {@link net.sf.ehcache.constructs.blocking.SelfPopulatingCache}
     * &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; an example.
     * &amp;lt;p/&amp;gt;
     * Note. If a LockTimeoutException is thrown &lt;span class=&quot;code-keyword&quot;&gt;while&lt;/span&gt; doing a &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; it means the lock was never acquired,
     * therefore it is a threading error to call {@link #put}
     *
     * @&lt;span class=&quot;code-keyword&quot;&gt;throws&lt;/span&gt; LockTimeoutException &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; timeout millis is non zero and &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; method has been unable to
     *                              acquire a lock in that time
     * @&lt;span class=&quot;code-keyword&quot;&gt;throws&lt;/span&gt; RuntimeException     &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; thrown the lock will not released. Catch and call&amp;lt;code&amp;gt;put(&lt;span class=&quot;code-keyword&quot;&gt;new&lt;/span&gt; Element(key, &lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;));&amp;lt;/code&amp;gt;
     *                              to release the lock acquired.
     */
    &lt;span class=&quot;code-keyword&quot;&gt;public&lt;/span&gt; Element get(&lt;span class=&quot;code-keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;code-object&quot;&gt;Object&lt;/span&gt; key) &lt;span class=&quot;code-keyword&quot;&gt;throws&lt;/span&gt; RuntimeException, LockTimeoutException {

        Sync lock = getLockForKey(key);
        Element element;
        acquiredLockForKey(key, lock, LockType.READ);
        element = cache.get(key);
        lock.unlock(LockType.READ);
        &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (element == &lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;) {
        acquiredLockForKey(key, lock, LockType.WRITE);
        element = cache.get(key);
        &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (element != &lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;) {
            lock.unlock(LockType.WRITE);
        }
        }
        &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; element;
    }
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;and browsing through the code I&apos;m not convinced that this issue is solved. There is something fishy in that and related code, i just can&apos;t pinpoint it out yet. I&apos;ll try to write simple test for this on Monday and re-read all the code again to be sure.&lt;/p&gt;

&lt;p&gt;It might be (speculation!) that the write lock prevents second call to &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;        element = cache.get(key);
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;to be executed, but since this internal cache is not synchronized, there is no guarantee by JVM that given thread will see already value put in by other thread. Those locks serialize only the code execution but not memory visibility (oh that sounds soo smart ... must be just effect of re-reading Concurency in Practice &lt;img class=&quot;emoticon&quot; src=&quot;https://jira.magnolia-cms.com/images/icons/emoticons/biggrin.png&quot; height=&quot;16&quot; width=&quot;16&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt; )&lt;/p&gt;
</comment>
                            <comment id="27661" author="gjoseph" created="Fri, 26 Mar 2010 18:18:43 +0100"  >&lt;p&gt;Let&apos;s spend some time &quot;asap&quot; setting up a few reproducible test scenarios (jmeter) so we can retest this, especially when upgrading ehcache ? (we&apos;re a few versions behind)&lt;/p&gt;</comment>
                            <comment id="27680" author="pbaerfuss" created="Mon, 29 Mar 2010 10:37:38 +0200"  >&lt;p&gt;source: I looked at the code for ehcache 1.5 (what we bundle with 4.x) and ehcache 1.4.1 (bundled with 3.6.8)&lt;/p&gt;

&lt;p&gt;re-reading: now that this code uses a mutex object and a cache object I think this is not the case&lt;/p&gt;

&lt;p&gt;test: the basic scenarios can be tested with unit tests&lt;/p&gt;

&lt;p&gt;test a) on request blocked for key &quot;a&quot; -&amp;gt; test that a request for key &quot;b&quot; enters the rendering&lt;br/&gt;
test b) three request to the same key (two blocked) -&amp;gt; test that all three request return&lt;/p&gt;</comment>
                            <comment id="27705" author="had" created="Tue, 30 Mar 2010 14:49:01 +0200"  >&lt;p&gt;Added test to expose the scenario outlined above.&lt;br/&gt;
As of ehCache 1.5 the issue occurs only when &lt;tt&gt;MaxElementsInMemory&lt;/tt&gt; is set to &lt;tt&gt;0&lt;/tt&gt; (there are also posts on the net warning against such setting)&lt;br/&gt;
As of ehCache 2.0, even with &lt;tt&gt;MaxElementsInMemory&lt;/tt&gt; set to &lt;tt&gt;0&lt;/tt&gt; everything works fine. There are however some API changes (&lt;tt&gt;SourceConfiguration&lt;/tt&gt;) that need to be accommodated before full upgrade to ehCache 2.0.&lt;/p&gt;</comment>
                            <comment id="27708" author="had" created="Tue, 30 Mar 2010 15:26:41 +0200"  >&lt;p&gt;It would also seem that the meaning of &lt;tt&gt;maxElementsInMemory==0&lt;/tt&gt; has changed in ehCache 2.0: &lt;a href=&quot;http://ehcache.org/documentation/faq.html&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;http://ehcache.org/documentation/faq.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;Can I use Ehcache as a disk cache only&lt;/cite&gt;?&lt;br/&gt;
&lt;cite&gt;As of Ehcache 2.0 this is not possible. You can set the maxElementsInMemory to 1, but setting the max size to 0 now gives an infinite capacity.&lt;/cite&gt;&lt;/p&gt;</comment>
                            <comment id="27728" author="had" created="Wed, 31 Mar 2010 14:26:07 +0200"  >&lt;p&gt;Two most common scenarios (i could think of) under which cache can block. The first one (multiple requests) is solved by synchronizing on whole cache, tho the price for that is probably too high.&lt;br/&gt;
The second scenario is AFAIK currently not taken care of since flush policy doesn&apos;t synchronize on cache so the lock can be introduced by &lt;tt&gt;flushAll&lt;/tt&gt; or &lt;tt&gt;flushByUuid&lt;/tt&gt; calls. And more dangerously since &lt;tt&gt;Default&lt;/tt&gt; cache policy does synchronize on the cache one such blocking request blocks whole cache forever.&lt;/p&gt;
</comment>
                            <comment id="28241" author="had" created="Fri, 7 May 2010 10:27:24 +0200"  >&lt;p&gt;Implementing timeout as shown in patch attached to SUPPORT-538 certainly ensures there is no single request blocking forever. However this doesn&apos;t justify removal of the synchronized block.&lt;br/&gt;
The main purpose of removing synchronized block is to ensure the mutex is always placed in the &lt;tt&gt;hasElement()&lt;/tt&gt; call and not in the subsequent &lt;tt&gt;get()&lt;/tt&gt; call. Cache is accessible by other threads and items can be removed by them directly (&lt;tt&gt;remove(Key)&lt;/tt&gt;/&lt;tt&gt;clear()&lt;/tt&gt;) or indirectly by eviction of expired items or due to reaching max amount of allowed elements. &lt;br/&gt;
Due to the facts outlined above, we need either &lt;tt&gt;synchronized&lt;/tt&gt; block to make sure that only one thread is able to execute such two calls in a sequence or we need to avoid using such construction altogether. (And yes, there is still the possibility that item will be evicted after the &lt;tt&gt;hasElement()&lt;/tt&gt; and before the &lt;tt&gt;get()&lt;/tt&gt; call, in which case &lt;tt&gt;get()&lt;/tt&gt; will cause mutex to be placed and error page returned to the user.)&lt;br/&gt;
Anyway, the synchronization would need to be in all places we manipulate the cache (&lt;tt&gt;cache.clear()&lt;/tt&gt;, &lt;tt&gt;cache.remove(Key)&lt;/tt&gt; and also &lt;tt&gt;cache.put(Key, Val)&lt;/tt&gt; and if we ever expire entries by time to live, we would need to synchronize there too).&lt;br/&gt;
Below, are outlined few scenarios which help to clarify the sort of problems that occur due to lack of synchronization:&lt;/p&gt;

&lt;p&gt;Scenario 1:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Thread A: &lt;tt&gt;hasElement(KeyA) --&amp;gt; ehCache.get(KeyA) != null ==&amp;gt; false, &lt;span class=&quot;error&quot;&gt;&amp;#91;place mutex&amp;#93;&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
	&lt;li&gt;Thread A: &lt;tt&gt;store(KeyA) --&amp;gt; &amp;lt;takes time&amp;gt;&lt;/tt&gt;&lt;/li&gt;
	&lt;li&gt;Thread B: &lt;tt&gt;hasElement(KeyA) --&amp;gt; ehCache.get(KeyA) ==&amp;gt; LockTimeoutEx&lt;/tt&gt;&lt;/li&gt;
	&lt;li&gt;Thread B: &lt;tt&gt;&amp;lt;return error to user&amp;gt;&lt;/tt&gt;&lt;/li&gt;
	&lt;li&gt;Thread A: &lt;tt&gt;store(KeyA) --&amp;gt; &amp;lt;finishes now&amp;gt; --&amp;gt; ehCache.put(KeyA, ValA) ==&amp;gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;remove mutex&amp;#93;&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
	&lt;li&gt;Thread A: &lt;tt&gt;&amp;lt;return page to user&amp;gt;&lt;/tt&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Scenario 2:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Thread A: &lt;tt&gt;hasElement(KeyA) --&amp;gt; ehCache.get(KeyA) != null ==&amp;gt; true&lt;/tt&gt;&lt;/li&gt;
	&lt;li&gt;Thread B: &lt;tt&gt;evict/expire(KeyA)&lt;/tt&gt;&lt;/li&gt;
	&lt;li&gt;Thread A: &lt;tt&gt;get(KeyA) --&amp;gt; ehCache.get(KeyA) ==&amp;gt; null, &lt;span class=&quot;error&quot;&gt;&amp;#91;place mutex&amp;#93;&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
	&lt;li&gt;Thread A: &lt;tt&gt;&amp;lt;return error to the user&amp;gt;&lt;/tt&gt;&lt;/li&gt;
	&lt;li&gt;Thread C: &lt;tt&gt;hasElement(KeyA) --&amp;gt; ehCache.get(KeyA) ==&amp;gt; LockTimeoutEx&lt;/tt&gt;&lt;/li&gt;
	&lt;li&gt;Thread C: &lt;tt&gt;&amp;lt;return error to the user&amp;gt;&lt;/tt&gt;&lt;/li&gt;
&lt;/ol&gt;



&lt;p&gt;The synchronization issue could be dealt with in multiple ways:&lt;/p&gt;
&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;add &lt;tt&gt;synchronized&lt;/tt&gt; to all places as outlined above. cons: hard to maintain, test and ensure that it is always the case. Synchronization of whole cache means only one request can be processed at a time, creating performance bottleneck&lt;/li&gt;
	&lt;li&gt;synchronize everywhere, but use system of mutexes, one per key similar to ehCache own system. pros: removing the bottleneck. cons: extra code to write and maintain, significant increase in complexity&lt;/li&gt;
	&lt;li&gt;abandon usage of problematic construction. There is no need to do the double check.&lt;/li&gt;
&lt;/ul&gt;
</comment>
                    </comments>
                <issuelinks>
                            <issuelinktype id="10020">
                    <name>dependency</name>
                                                                <inwardlinks description="is depended upon by">
                                        <issuelink>
            <issuekey id="18450">MGNLADVCACHE-15</issuekey>
        </issuelink>
                            </inwardlinks>
                                    </issuelinktype>
                            <issuelinktype id="10010">
                    <name>relation</name>
                                            <outwardlinks description="is related to">
                                        <issuelink>
            <issuekey id="19164">MAGNOLIA-3333</issuekey>
        </issuelink>
                            </outwardlinks>
                                                                <inwardlinks description="is related to">
                                        <issuelink>
            <issuekey id="18430">MGNLCACHE-36</issuekey>
        </issuelink>
                            </inwardlinks>
                                    </issuelinktype>
                            <issuelinktype id="10022">
                    <name>supersession</name>
                                            <outwardlinks description="supersedes">
                                                        </outwardlinks>
                                                        </issuelinktype>
                    </issuelinks>
                <attachments>
                            <attachment id="13288" name="cacheBlock.png" size="52401" author="had" created="Wed, 31 Mar 2010 14:26:07 +0200"/>
                            <attachment id="13289" name="cacheBlockOnflush.png" size="46060" author="had" created="Wed, 31 Mar 2010 14:26:07 +0200"/>
                    </attachments>
                <subtasks>
                    </subtasks>
                <customfields>
                                                                            <customfield id="customfield_14166" key="com.okapya.jira.checklist:checklist">
                        <customfieldname>Acceptance criteria</customfieldname>
                        <customfieldvalues>
                            
        <checklist>
        <![CDATA[
                            




                
                                    <div class="o-completion" style="display: flex; flex-shrink: 0;"><span  class="aui-lozenge aui-lozenge-complete" style="font-size: 12px; font-weight: normal; display: flex; flex-direction: row; align-items: center;" ><span style="padding-right: 4px; vertical-align: middle;"><svg width="15" height="15" viewBox="0 0 15 15" xmlns="http://www.w3.org/2000/svg" fill="white"><path clip-rule="evenodd" d="m10.41037,3.42544l-7.86501,0c-0.72395,0 -1.31084,0.58688 -1.31084,1.31084l0,7.86508c0,0.7239 0.58689,1.3108 1.31084,1.3108l7.86501,0c0.724,0 1.3109,-0.5869 1.3109,-1.3108l0,-7.86508c0,-0.72396 -0.5869,-1.31084 -1.3109,-1.31084zm-7.86501,-0.65542c-1.08593,0 -1.96626,0.88032 -1.96626,1.96626l0,7.86508c0,1.0859 0.88033,1.9662 1.96626,1.9662l7.86501,0c1.086,0 1.9663,-0.8803 1.9663,-1.9662l0,-7.86508c0,-1.08594 -0.8803,-1.96626 -1.9663,-1.96626l-7.86501,0z" fill-rule="evenodd"/><path d="m5.09049,10.18526l-1.82767,-1.82766l-0.78479,0.78479l2.61246,2.61246l5.38758,-5.38754l-0.78483,-0.78479l-4.60275,4.60274z"/></svg></span><span>Empty</span></span></div>
                        ]]>
    </checklist>


                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                            <customfield id="customfield_14169" key="com.okapya.jira.checklist:checklist">
                        <customfieldname>Bug DoR</customfieldname>
                        <customfieldvalues>
                            
        <checklist>
        <![CDATA[
                            




                
                        
        <div style="margin-bottom: 8px;">
                            <div class="o-completion" style="display: flex; flex-shrink: 0;"><span  class="aui-lozenge" style="font-size: 12px; font-weight: normal; display: flex; flex-direction: row; align-items: center;" ><span style="padding-right: 4px; vertical-align: middle;"><svg width="15" height="15" viewBox="0 0 15 15" xmlns="http://www.w3.org/2000/svg" fill="white"><path clip-rule="evenodd" d="m10.41037,3.42544l-7.86501,0c-0.72395,0 -1.31084,0.58688 -1.31084,1.31084l0,7.86508c0,0.7239 0.58689,1.3108 1.31084,1.3108l7.86501,0c0.724,0 1.3109,-0.5869 1.3109,-1.3108l0,-7.86508c0,-0.72396 -0.5869,-1.31084 -1.3109,-1.31084zm-7.86501,-0.65542c-1.08593,0 -1.96626,0.88032 -1.96626,1.96626l0,7.86508c0,1.0859 0.88033,1.9662 1.96626,1.9662l7.86501,0c1.086,0 1.9663,-0.8803 1.9663,-1.9662l0,-7.86508c0,-1.08594 -0.8803,-1.96626 -1.9663,-1.96626l-7.86501,0z" fill-rule="evenodd"/><path d="m5.09049,10.18526l-1.82767,-1.82766l-0.78479,0.78479l2.61246,2.61246l5.38758,-5.38754l-0.78483,-0.78479l-4.60275,4.60274z"/></svg></span><span>0/2</span></span></div>
                    
            <div class="checklist-progress-bar-wrapper" style="">
        <div class="checklist-progress-bar" style="position: relative; width: 100%; background-color: #cccccc; margin-bottom: 2px; margin-top: 5px;">
                        <div class="checklist-progress" style="display: block; float: none; width: 0%; height: 2px; background: #14892c;">
                            </div>
        </div>
    </div>
        </div>
    
                                    <div style="display: flex; align-items: flex-start; padding: 0; margin-left: 12px; float: none; font-size: 14px;">
                                                                <span style="padding-right: 5px; align-self: flex-start;">
                                <svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg" class="unchecked"><path d="M0.441406 6.94141C0.441406 5.28455 1.78455 3.94141 3.44141 3.94141H15.4414C17.0983 3.94141 18.4414 5.28455 18.4414 6.94141V18.9414C18.4414 20.5983 17.0983 21.9414 15.4414 21.9414H3.44141C1.78455 21.9414 0.441406 20.5983 0.441406 18.9414V6.94141Z" fill="#EFF4FB" /><path fill-rule="evenodd" clip-rule="evenodd" d="M12.4414 3.94141H3.44141C1.78455 3.94141 0.441406 5.28455 0.441406 6.94141V18.9414C0.441406 20.5983 1.78455 21.9414 3.44141 21.9414H15.4414C17.0983 21.9414 18.4414 20.5983 18.4414 18.9414V9.94141H17.4414V18.9414C17.4414 20.046 16.546 20.9414 15.4414 20.9414H3.44141C2.33684 20.9414 1.44141 20.046 1.44141 18.9414V6.94141C1.44141 5.83684 2.33684 4.94141 3.44141 4.94141H12.4414V3.94141Z" fill="#ADBBD0" /><path d="M21.5306 5.91574L19.3486 4.58101L21.5306 3.24628C21.5681 3.22328 21.595 3.18633 21.6053 3.14348C21.6156 3.10063 21.6084 3.05545 21.5855 3.01792L20.9444 1.96985C20.8966 1.89162 20.7942 1.86696 20.716 1.91479L18.6331 3.18898V0.747138C18.6331 0.65546 18.5587 0.581055 18.4671 0.581055H17.2386C17.1469 0.581055 17.0725 0.65546 17.0725 0.747138V3.18898L14.9896 1.91487C14.9112 1.86704 14.8091 1.89162 14.7612 1.96993L14.1201 3.018C14.0972 3.05554 14.09 3.10071 14.1003 3.14356C14.1106 3.18641 14.1375 3.22336 14.175 3.24637L16.3571 4.58101L14.175 5.91574C14.1375 5.93866 14.1106 5.9757 14.1003 6.01847C14.09 6.0614 14.0972 6.10657 14.1201 6.14411L14.7612 7.1921C14.8091 7.27032 14.9112 7.29507 14.9896 7.24724L17.0725 5.97304V8.41489C17.0725 8.50657 17.1469 8.58097 17.2386 8.58097H18.4671C18.5587 8.58097 18.6331 8.50657 18.6331 8.41489V5.97313L20.7161 7.24715C20.7943 7.29499 20.8967 7.27032 20.9444 7.19218L21.5856 6.14411C21.6085 6.10657 21.6157 6.0614 21.6054 6.01855C21.5952 5.97562 21.5682 5.93875 21.5306 5.91574Z" fill="#de350b" /></svg>
                        </span>
                                        <div style="cursor: default; text-align: left; flex-grow: 1; padding-right: 3px; margin-top: 2px;">
                                                
                                                
                                                <span >
                                                        <span>Steps to reproduce, expected, and actual results filled</span>

                        </span>
                    </div>
                                                                    <span style="padding-right: 1px; white-space: nowrap;">
                                                        
                                                        
                                                                                </span>
                                    </div>
                                                <div style="display: flex; align-items: flex-start; padding: 0; margin-left: 12px; float: none; font-size: 14px;">
                                                                <span style="padding-right: 5px; align-self: flex-start;">
                                <svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg" class="unchecked"><path d="M0.441406 6.94141C0.441406 5.28455 1.78455 3.94141 3.44141 3.94141H15.4414C17.0983 3.94141 18.4414 5.28455 18.4414 6.94141V18.9414C18.4414 20.5983 17.0983 21.9414 15.4414 21.9414H3.44141C1.78455 21.9414 0.441406 20.5983 0.441406 18.9414V6.94141Z" fill="#EFF4FB" /><path fill-rule="evenodd" clip-rule="evenodd" d="M12.4414 3.94141H3.44141C1.78455 3.94141 0.441406 5.28455 0.441406 6.94141V18.9414C0.441406 20.5983 1.78455 21.9414 3.44141 21.9414H15.4414C17.0983 21.9414 18.4414 20.5983 18.4414 18.9414V9.94141H17.4414V18.9414C17.4414 20.046 16.546 20.9414 15.4414 20.9414H3.44141C2.33684 20.9414 1.44141 20.046 1.44141 18.9414V6.94141C1.44141 5.83684 2.33684 4.94141 3.44141 4.94141H12.4414V3.94141Z" fill="#ADBBD0" /><path d="M21.5306 5.91574L19.3486 4.58101L21.5306 3.24628C21.5681 3.22328 21.595 3.18633 21.6053 3.14348C21.6156 3.10063 21.6084 3.05545 21.5855 3.01792L20.9444 1.96985C20.8966 1.89162 20.7942 1.86696 20.716 1.91479L18.6331 3.18898V0.747138C18.6331 0.65546 18.5587 0.581055 18.4671 0.581055H17.2386C17.1469 0.581055 17.0725 0.65546 17.0725 0.747138V3.18898L14.9896 1.91487C14.9112 1.86704 14.8091 1.89162 14.7612 1.96993L14.1201 3.018C14.0972 3.05554 14.09 3.10071 14.1003 3.14356C14.1106 3.18641 14.1375 3.22336 14.175 3.24637L16.3571 4.58101L14.175 5.91574C14.1375 5.93866 14.1106 5.9757 14.1003 6.01847C14.09 6.0614 14.0972 6.10657 14.1201 6.14411L14.7612 7.1921C14.8091 7.27032 14.9112 7.29507 14.9896 7.24724L17.0725 5.97304V8.41489C17.0725 8.50657 17.1469 8.58097 17.2386 8.58097H18.4671C18.5587 8.58097 18.6331 8.50657 18.6331 8.41489V5.97313L20.7161 7.24715C20.7943 7.29499 20.8967 7.27032 20.9444 7.19218L21.5856 6.14411C21.6085 6.10657 21.6157 6.0614 21.6054 6.01855C21.5952 5.97562 21.5682 5.93875 21.5306 5.91574Z" fill="#de350b" /></svg>
                        </span>
                                        <div style="cursor: default; text-align: left; flex-grow: 1; padding-right: 3px; margin-top: 2px;">
                                                
                                                
                                                <span >
                                                        <span>Affected version filled</span>

                        </span>
                    </div>
                                                                    <span style="padding-right: 1px; white-space: nowrap;">
                                                        
                                                        
                                                                                </span>
                                    </div>
                                            ]]>
    </checklist>


                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                        <customfield id="customfield_10111" key="com.atlassian.jira.toolkit:reporterdomain">
                        <customfieldname>Company</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>woowai.com</customfieldvalue>
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                <customfield id="customfield_10031" key="com.atlassian.jira.ext.charting:firstresponsedate">
                        <customfieldname>Date of First Response</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>Fri, 26 Mar 2010 12:36:24 +0100</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_12730" key="com.atlassian.jira.plugins.jira-development-integration-plugin:devsummary">
                        <customfieldname>Development</customfieldname>
                        <customfieldvalues>
                            
                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_14151" key="com.atlassian.jira.toolkit:message">
                        <customfieldname>Docu info</customfieldname>
                        <customfieldvalues>
                            
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            <customfield id="customfield_10061" key="com.atlassian.jira.toolkit:lastusercommented">
                        <customfieldname>Last comm is not jira-dev</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>false</customfieldvalue>
                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10071" key="com.atlassian.jira.toolkit:lastupdaterorcommenter">
                        <customfieldname>Last participant</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>mmuehlebach</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_13136" key="com.atlassian.jira.toolkit:LastCommentDate">
                        <customfieldname>Last public comment date</customfieldname>
                        <customfieldvalues>
                            13 years, 42 weeks, 2 days ago
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                            <customfield id="customfield_10020" key="com.atlassian.jira.toolkit:attachments">
                        <customfieldname>Number of attachments</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>2.0</customfieldvalue>
                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10150" key="com.atlassian.jira.toolkit:comments">
                        <customfieldname>Number of comments</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>11.0</customfieldvalue>
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        <customfield id="customfield_10011" key="com.atlassian.jira.toolkit:participants">
                        <customfieldname>Participants</customfieldname>
                        <customfieldvalues>
                                        <customfieldvalue>had</customfieldvalue>
            <customfieldvalue>gjoseph</customfieldvalue>
            <customfieldvalue>pbaerfuss</customfieldvalue>
    
                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10090" key="com.atlassian.jira.plugin.system.customfieldtypes:multicheckboxes">
                        <customfieldname>Patch included</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="10100"><![CDATA[Yes]]></customfieldvalue>
    
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                        <customfield id="customfield_10833" key="com.pyxis.greenhopper.jira:gh-lexo-rank">
                        <customfieldname>Rank</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>0|i00xen:</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10244" key="com.pyxis.greenhopper.jira:gh-global-rank">
                        <customfieldname>Rank (Obsolete)</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>5462</customfieldvalue>
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            <customfield id="customfield_14168" key="com.okapya.jira.checklist:checklist">
                        <customfieldname>Task DoD</customfieldname>
                        <customfieldvalues>
                            
        <checklist>
        <![CDATA[
                            




                
                        
        <div style="margin-bottom: 8px;">
                            <div class="o-completion" style="display: flex; flex-shrink: 0;"><span  class="aui-lozenge" style="font-size: 12px; font-weight: normal; display: flex; flex-direction: row; align-items: center;" ><span style="padding-right: 4px; vertical-align: middle;"><svg width="15" height="15" viewBox="0 0 15 15" xmlns="http://www.w3.org/2000/svg" fill="white"><path clip-rule="evenodd" d="m10.41037,3.42544l-7.86501,0c-0.72395,0 -1.31084,0.58688 -1.31084,1.31084l0,7.86508c0,0.7239 0.58689,1.3108 1.31084,1.3108l7.86501,0c0.724,0 1.3109,-0.5869 1.3109,-1.3108l0,-7.86508c0,-0.72396 -0.5869,-1.31084 -1.3109,-1.31084zm-7.86501,-0.65542c-1.08593,0 -1.96626,0.88032 -1.96626,1.96626l0,7.86508c0,1.0859 0.88033,1.9662 1.96626,1.9662l7.86501,0c1.086,0 1.9663,-0.8803 1.9663,-1.9662l0,-7.86508c0,-1.08594 -0.8803,-1.96626 -1.9663,-1.96626l-7.86501,0z" fill-rule="evenodd"/><path d="m5.09049,10.18526l-1.82767,-1.82766l-0.78479,0.78479l2.61246,2.61246l5.38758,-5.38754l-0.78483,-0.78479l-4.60275,4.60274z"/></svg></span><span>0/6</span></span></div>
                    
            <div class="checklist-progress-bar-wrapper" style="">
        <div class="checklist-progress-bar" style="position: relative; width: 100%; background-color: #cccccc; margin-bottom: 2px; margin-top: 5px;">
                        <div class="checklist-progress" style="display: block; float: none; width: 0%; height: 2px; background: #14892c;">
                            </div>
        </div>
    </div>
        </div>
    
                                    <div style="display: flex; align-items: flex-start; padding: 0; margin-left: 12px; float: none; font-size: 14px;">
                                                                <span style="padding-right: 5px; align-self: flex-start;">
                                <svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg" class="unchecked"><path d="M0.441406 6.94141C0.441406 5.28455 1.78455 3.94141 3.44141 3.94141H15.4414C17.0983 3.94141 18.4414 5.28455 18.4414 6.94141V18.9414C18.4414 20.5983 17.0983 21.9414 15.4414 21.9414H3.44141C1.78455 21.9414 0.441406 20.5983 0.441406 18.9414V6.94141Z" fill="#EFF4FB" /><path fill-rule="evenodd" clip-rule="evenodd" d="M12.4414 3.94141H3.44141C1.78455 3.94141 0.441406 5.28455 0.441406 6.94141V18.9414C0.441406 20.5983 1.78455 21.9414 3.44141 21.9414H15.4414C17.0983 21.9414 18.4414 20.5983 18.4414 18.9414V9.94141H17.4414V18.9414C17.4414 20.046 16.546 20.9414 15.4414 20.9414H3.44141C2.33684 20.9414 1.44141 20.046 1.44141 18.9414V6.94141C1.44141 5.83684 2.33684 4.94141 3.44141 4.94141H12.4414V3.94141Z" fill="#ADBBD0" /><path d="M21.5306 5.91574L19.3486 4.58101L21.5306 3.24628C21.5681 3.22328 21.595 3.18633 21.6053 3.14348C21.6156 3.10063 21.6084 3.05545 21.5855 3.01792L20.9444 1.96985C20.8966 1.89162 20.7942 1.86696 20.716 1.91479L18.6331 3.18898V0.747138C18.6331 0.65546 18.5587 0.581055 18.4671 0.581055H17.2386C17.1469 0.581055 17.0725 0.65546 17.0725 0.747138V3.18898L14.9896 1.91487C14.9112 1.86704 14.8091 1.89162 14.7612 1.96993L14.1201 3.018C14.0972 3.05554 14.09 3.10071 14.1003 3.14356C14.1106 3.18641 14.1375 3.22336 14.175 3.24637L16.3571 4.58101L14.175 5.91574C14.1375 5.93866 14.1106 5.9757 14.1003 6.01847C14.09 6.0614 14.0972 6.10657 14.1201 6.14411L14.7612 7.1921C14.8091 7.27032 14.9112 7.29507 14.9896 7.24724L17.0725 5.97304V8.41489C17.0725 8.50657 17.1469 8.58097 17.2386 8.58097H18.4671C18.5587 8.58097 18.6331 8.50657 18.6331 8.41489V5.97313L20.7161 7.24715C20.7943 7.29499 20.8967 7.27032 20.9444 7.19218L21.5856 6.14411C21.6085 6.10657 21.6157 6.0614 21.6054 6.01855C21.5952 5.97562 21.5682 5.93875 21.5306 5.91574Z" fill="#de350b" /></svg>
                        </span>
                                        <div style="cursor: default; text-align: left; flex-grow: 1; padding-right: 3px; margin-top: 2px;">
                                                
                                                
                                                <span >
                                                        <span>Doc/release notes changes? Comment present?</span>

                        </span>
                    </div>
                                                                    <span style="padding-right: 1px; white-space: nowrap;">
                                                        
                                                        
                                                                                </span>
                                    </div>
                                                <div style="display: flex; align-items: flex-start; padding: 0; margin-left: 12px; float: none; font-size: 14px;">
                                                                <span style="padding-right: 5px; align-self: flex-start;">
                                <svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg" class="unchecked"><path d="M0.441406 6.94141C0.441406 5.28455 1.78455 3.94141 3.44141 3.94141H15.4414C17.0983 3.94141 18.4414 5.28455 18.4414 6.94141V18.9414C18.4414 20.5983 17.0983 21.9414 15.4414 21.9414H3.44141C1.78455 21.9414 0.441406 20.5983 0.441406 18.9414V6.94141Z" fill="#EFF4FB" /><path fill-rule="evenodd" clip-rule="evenodd" d="M12.4414 3.94141H3.44141C1.78455 3.94141 0.441406 5.28455 0.441406 6.94141V18.9414C0.441406 20.5983 1.78455 21.9414 3.44141 21.9414H15.4414C17.0983 21.9414 18.4414 20.5983 18.4414 18.9414V9.94141H17.4414V18.9414C17.4414 20.046 16.546 20.9414 15.4414 20.9414H3.44141C2.33684 20.9414 1.44141 20.046 1.44141 18.9414V6.94141C1.44141 5.83684 2.33684 4.94141 3.44141 4.94141H12.4414V3.94141Z" fill="#ADBBD0" /><path d="M21.5306 5.91574L19.3486 4.58101L21.5306 3.24628C21.5681 3.22328 21.595 3.18633 21.6053 3.14348C21.6156 3.10063 21.6084 3.05545 21.5855 3.01792L20.9444 1.96985C20.8966 1.89162 20.7942 1.86696 20.716 1.91479L18.6331 3.18898V0.747138C18.6331 0.65546 18.5587 0.581055 18.4671 0.581055H17.2386C17.1469 0.581055 17.0725 0.65546 17.0725 0.747138V3.18898L14.9896 1.91487C14.9112 1.86704 14.8091 1.89162 14.7612 1.96993L14.1201 3.018C14.0972 3.05554 14.09 3.10071 14.1003 3.14356C14.1106 3.18641 14.1375 3.22336 14.175 3.24637L16.3571 4.58101L14.175 5.91574C14.1375 5.93866 14.1106 5.9757 14.1003 6.01847C14.09 6.0614 14.0972 6.10657 14.1201 6.14411L14.7612 7.1921C14.8091 7.27032 14.9112 7.29507 14.9896 7.24724L17.0725 5.97304V8.41489C17.0725 8.50657 17.1469 8.58097 17.2386 8.58097H18.4671C18.5587 8.58097 18.6331 8.50657 18.6331 8.41489V5.97313L20.7161 7.24715C20.7943 7.29499 20.8967 7.27032 20.9444 7.19218L21.5856 6.14411C21.6085 6.10657 21.6157 6.0614 21.6054 6.01855C21.5952 5.97562 21.5682 5.93875 21.5306 5.91574Z" fill="#de350b" /></svg>
                        </span>
                                        <div style="cursor: default; text-align: left; flex-grow: 1; padding-right: 3px; margin-top: 2px;">
                                                
                                                
                                                <span >
                                                        <span>Downstream builds green?</span>

                        </span>
                    </div>
                                                                    <span style="padding-right: 1px; white-space: nowrap;">
                                                        
                                                        
                                                                                </span>
                                    </div>
                                                <div style="display: flex; align-items: flex-start; padding: 0; margin-left: 12px; float: none; font-size: 14px;">
                                                                <span style="padding-right: 5px; align-self: flex-start;">
                                <svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg" class="unchecked"><path d="M0.441406 6.94141C0.441406 5.28455 1.78455 3.94141 3.44141 3.94141H15.4414C17.0983 3.94141 18.4414 5.28455 18.4414 6.94141V18.9414C18.4414 20.5983 17.0983 21.9414 15.4414 21.9414H3.44141C1.78455 21.9414 0.441406 20.5983 0.441406 18.9414V6.94141Z" fill="#EFF4FB" /><path fill-rule="evenodd" clip-rule="evenodd" d="M12.4414 3.94141H3.44141C1.78455 3.94141 0.441406 5.28455 0.441406 6.94141V18.9414C0.441406 20.5983 1.78455 21.9414 3.44141 21.9414H15.4414C17.0983 21.9414 18.4414 20.5983 18.4414 18.9414V9.94141H17.4414V18.9414C17.4414 20.046 16.546 20.9414 15.4414 20.9414H3.44141C2.33684 20.9414 1.44141 20.046 1.44141 18.9414V6.94141C1.44141 5.83684 2.33684 4.94141 3.44141 4.94141H12.4414V3.94141Z" fill="#ADBBD0" /><path d="M21.5306 5.91574L19.3486 4.58101L21.5306 3.24628C21.5681 3.22328 21.595 3.18633 21.6053 3.14348C21.6156 3.10063 21.6084 3.05545 21.5855 3.01792L20.9444 1.96985C20.8966 1.89162 20.7942 1.86696 20.716 1.91479L18.6331 3.18898V0.747138C18.6331 0.65546 18.5587 0.581055 18.4671 0.581055H17.2386C17.1469 0.581055 17.0725 0.65546 17.0725 0.747138V3.18898L14.9896 1.91487C14.9112 1.86704 14.8091 1.89162 14.7612 1.96993L14.1201 3.018C14.0972 3.05554 14.09 3.10071 14.1003 3.14356C14.1106 3.18641 14.1375 3.22336 14.175 3.24637L16.3571 4.58101L14.175 5.91574C14.1375 5.93866 14.1106 5.9757 14.1003 6.01847C14.09 6.0614 14.0972 6.10657 14.1201 6.14411L14.7612 7.1921C14.8091 7.27032 14.9112 7.29507 14.9896 7.24724L17.0725 5.97304V8.41489C17.0725 8.50657 17.1469 8.58097 17.2386 8.58097H18.4671C18.5587 8.58097 18.6331 8.50657 18.6331 8.41489V5.97313L20.7161 7.24715C20.7943 7.29499 20.8967 7.27032 20.9444 7.19218L21.5856 6.14411C21.6085 6.10657 21.6157 6.0614 21.6054 6.01855C21.5952 5.97562 21.5682 5.93875 21.5306 5.91574Z" fill="#de350b" /></svg>
                        </span>
                                        <div style="cursor: default; text-align: left; flex-grow: 1; padding-right: 3px; margin-top: 2px;">
                                                
                                                
                                                <span >
                                                        <span>Solution information and context easily available?</span>

                        </span>
                    </div>
                                                                    <span style="padding-right: 1px; white-space: nowrap;">
                                                        
                                                        
                                                                                </span>
                                    </div>
                                                <div style="display: flex; align-items: flex-start; padding: 0; margin-left: 12px; float: none; font-size: 14px;">
                                                                <span style="padding-right: 5px; align-self: flex-start;">
                                <svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg" class="unchecked"><path d="M0.441406 6.94141C0.441406 5.28455 1.78455 3.94141 3.44141 3.94141H15.4414C17.0983 3.94141 18.4414 5.28455 18.4414 6.94141V18.9414C18.4414 20.5983 17.0983 21.9414 15.4414 21.9414H3.44141C1.78455 21.9414 0.441406 20.5983 0.441406 18.9414V6.94141Z" fill="#EFF4FB" /><path fill-rule="evenodd" clip-rule="evenodd" d="M12.4414 3.94141H3.44141C1.78455 3.94141 0.441406 5.28455 0.441406 6.94141V18.9414C0.441406 20.5983 1.78455 21.9414 3.44141 21.9414H15.4414C17.0983 21.9414 18.4414 20.5983 18.4414 18.9414V9.94141H17.4414V18.9414C17.4414 20.046 16.546 20.9414 15.4414 20.9414H3.44141C2.33684 20.9414 1.44141 20.046 1.44141 18.9414V6.94141C1.44141 5.83684 2.33684 4.94141 3.44141 4.94141H12.4414V3.94141Z" fill="#ADBBD0" /><path d="M21.5306 5.91574L19.3486 4.58101L21.5306 3.24628C21.5681 3.22328 21.595 3.18633 21.6053 3.14348C21.6156 3.10063 21.6084 3.05545 21.5855 3.01792L20.9444 1.96985C20.8966 1.89162 20.7942 1.86696 20.716 1.91479L18.6331 3.18898V0.747138C18.6331 0.65546 18.5587 0.581055 18.4671 0.581055H17.2386C17.1469 0.581055 17.0725 0.65546 17.0725 0.747138V3.18898L14.9896 1.91487C14.9112 1.86704 14.8091 1.89162 14.7612 1.96993L14.1201 3.018C14.0972 3.05554 14.09 3.10071 14.1003 3.14356C14.1106 3.18641 14.1375 3.22336 14.175 3.24637L16.3571 4.58101L14.175 5.91574C14.1375 5.93866 14.1106 5.9757 14.1003 6.01847C14.09 6.0614 14.0972 6.10657 14.1201 6.14411L14.7612 7.1921C14.8091 7.27032 14.9112 7.29507 14.9896 7.24724L17.0725 5.97304V8.41489C17.0725 8.50657 17.1469 8.58097 17.2386 8.58097H18.4671C18.5587 8.58097 18.6331 8.50657 18.6331 8.41489V5.97313L20.7161 7.24715C20.7943 7.29499 20.8967 7.27032 20.9444 7.19218L21.5856 6.14411C21.6085 6.10657 21.6157 6.0614 21.6054 6.01855C21.5952 5.97562 21.5682 5.93875 21.5306 5.91574Z" fill="#de350b" /></svg>
                        </span>
                                        <div style="cursor: default; text-align: left; flex-grow: 1; padding-right: 3px; margin-top: 2px;">
                                                
                                                
                                                <span >
                                                        <span><strong>Tests</strong></span>

                        </span>
                    </div>
                                                                    <span style="padding-right: 1px; white-space: nowrap;">
                                                        
                                                        
                                                                                </span>
                                    </div>
                                                <div style="display: flex; align-items: flex-start; padding: 0; margin-left: 12px; float: none; font-size: 14px;">
                                                                <span style="padding-right: 5px; align-self: flex-start;">
                                <svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg" class="unchecked"><path d="M0.441406 6.94141C0.441406 5.28455 1.78455 3.94141 3.44141 3.94141H15.4414C17.0983 3.94141 18.4414 5.28455 18.4414 6.94141V18.9414C18.4414 20.5983 17.0983 21.9414 15.4414 21.9414H3.44141C1.78455 21.9414 0.441406 20.5983 0.441406 18.9414V6.94141Z" fill="#EFF4FB" /><path fill-rule="evenodd" clip-rule="evenodd" d="M12.4414 3.94141H3.44141C1.78455 3.94141 0.441406 5.28455 0.441406 6.94141V18.9414C0.441406 20.5983 1.78455 21.9414 3.44141 21.9414H15.4414C17.0983 21.9414 18.4414 20.5983 18.4414 18.9414V9.94141H17.4414V18.9414C17.4414 20.046 16.546 20.9414 15.4414 20.9414H3.44141C2.33684 20.9414 1.44141 20.046 1.44141 18.9414V6.94141C1.44141 5.83684 2.33684 4.94141 3.44141 4.94141H12.4414V3.94141Z" fill="#ADBBD0" /><path d="M21.5306 5.91574L19.3486 4.58101L21.5306 3.24628C21.5681 3.22328 21.595 3.18633 21.6053 3.14348C21.6156 3.10063 21.6084 3.05545 21.5855 3.01792L20.9444 1.96985C20.8966 1.89162 20.7942 1.86696 20.716 1.91479L18.6331 3.18898V0.747138C18.6331 0.65546 18.5587 0.581055 18.4671 0.581055H17.2386C17.1469 0.581055 17.0725 0.65546 17.0725 0.747138V3.18898L14.9896 1.91487C14.9112 1.86704 14.8091 1.89162 14.7612 1.96993L14.1201 3.018C14.0972 3.05554 14.09 3.10071 14.1003 3.14356C14.1106 3.18641 14.1375 3.22336 14.175 3.24637L16.3571 4.58101L14.175 5.91574C14.1375 5.93866 14.1106 5.9757 14.1003 6.01847C14.09 6.0614 14.0972 6.10657 14.1201 6.14411L14.7612 7.1921C14.8091 7.27032 14.9112 7.29507 14.9896 7.24724L17.0725 5.97304V8.41489C17.0725 8.50657 17.1469 8.58097 17.2386 8.58097H18.4671C18.5587 8.58097 18.6331 8.50657 18.6331 8.41489V5.97313L20.7161 7.24715C20.7943 7.29499 20.8967 7.27032 20.9444 7.19218L21.5856 6.14411C21.6085 6.10657 21.6157 6.0614 21.6054 6.01855C21.5952 5.97562 21.5682 5.93875 21.5306 5.91574Z" fill="#de350b" /></svg>
                        </span>
                                        <div style="cursor: default; text-align: left; flex-grow: 1; padding-right: 3px; margin-top: 2px;">
                                                
                                                
                                                <span >
                                                        <span><strong>FixVersion</strong> filled and not yet released</span>

                        </span>
                    </div>
                                                                    <span style="padding-right: 1px; white-space: nowrap;">
                                                        
                                                        
                                                                                </span>
                                    </div>
                                                <div style="display: flex; align-items: flex-start; padding: 0; margin-left: 12px; float: none; font-size: 14px;">
                                                                <span style="padding-right: 5px; align-self: flex-start;">
                                <svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg" class="unchecked"><rect fill="#EFF4FB" height="17.5" rx="2.5" stroke="#ADBBD0" width="18" x="0.44141" y="3.94141"/></svg>
                        </span>
                                        <div style="cursor: default; text-align: left; flex-grow: 1; padding-right: 3px; margin-top: 2px;">
                                                
                                                
                                                <span >
                                                        <span>Architecture Decision Record (<strong>ADR</strong>)</span>

                        </span>
                    </div>
                                                                    <span style="padding-right: 1px; white-space: nowrap;">
                                                        
                                                        
                                                                                </span>
                                    </div>
                                            ]]>
    </checklist>


                        </customfieldvalues>
                    </customfield>
                                                                                                                                                    <customfield id="customfield_14145" key="com.intenso.jira.issue-templates:issue-templates-customfield">
                        <customfieldname>Template</customfieldname>
                        <customfieldvalues>
                            


                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                <customfield id="customfield_15131" key="com.onresolve.jira.groovy.groovyrunner:scripted-field">
                        <customfieldname>Time in Discovery</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>0</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10032" key="com.atlassian.jira.ext.charting:timeinstatus">
                        <customfieldname>Time in Status</customfieldname>
                        <customfieldvalues>
                            
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        </customfields>
    </item>
</channel>
</rss>