<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
Dustin,<div><br class="webkit-block-placeholder"></div><div>I have the prototype of the CAS operation working from the latest memcache trunk in C using text protocol. I have also patched libmemcache to do support "gets" and "cas". I will be doing a cleanup, I can send you the patches later tonight.</div><div><br><div contenteditable="false"> <span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><br class="Apple-interchange-newline"><div><br class="khtml-block-placeholder"></div><div>Chris Goffinet</div><div><a href="mailto:goffinet@yahoo-inc.com">goffinet@yahoo-inc.com</a></div><div><br class="khtml-block-placeholder"></div><br class="Apple-interchange-newline"></span> </div><br><div><div>On Sep 8, 2007, at 11:26 AM, Dustin Sallings wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="word-wrap: break-word; -khtml-nbsp-mode: space; -khtml-line-break: after-white-space; "><div><br class="khtml-block-placeholder"></div><div>[replying back on the list to try to keep the discussion open and hopefully avoid repeating myself]</div><br><div><div>On Sep 8, 2007, at 7:31, Jehiah Czebotar wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">This sounds like the proposed "append" method which would allow</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">memcache to handle lists on the server side... with one caviat, you</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">want a conditional append which only appends if the value isn't</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">already there.</font></div></blockquote><div><br class="khtml-block-placeholder"></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>In this example usage...sort of.&nbsp; One would also want to remove items from the list to keep it from growing out of control.</div><div><br class="khtml-block-placeholder"></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>There was another proposal to allow updating parts of a value by offset or other such things.&nbsp; None of these things can work race-free without implementing advisory locks which, as already pointed out, may be subject to the LRU.</div><br><blockquote type="cite"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">If memcached were handling the lists, you wouldn't have to add all</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">that conditional logic and "replace if it's still the same" stuff</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica">which won't work in high concurrency situations anyway.</font></div> </blockquote></div><div><br class="khtml-block-placeholder"></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>Well, it's not entirely fair to say it doesn't work in high concurrency situations.&nbsp; The operation is always atomic, but it may need to be retried.&nbsp; This is a common strategy in concurrent programming for creating lock-free concurrent data structures.&nbsp; If a particular key is too hot, though, you could potentially split it into multiple keys to reduce retries in practice.&nbsp; In the current example, you could have a series of current_login keys hashed by uid.&nbsp; Your contention is reduced by the number of keys.&nbsp; There's never a case where you blindly overwrite values, though.</div><br><div><span class="Apple-tab-span" style="white-space:pre">        </span>Adding an add-this-to-a-list-if-it-does-not-exist-and-remove-something-else-to-keep-the-list-to-n-elements would be an unreasonable operation to add.&nbsp; The only reasonable way to do something like this would be to add server-side scripting and then effectively write the exact operations you need so that they may be performed atomically.</div><div><br class="khtml-block-placeholder"></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>Are there enough potential server-side operations to really justify a scripting interface?&nbsp; When it's been brought up in meetings, the response has varied from interest, to a warning about crossing streams or something.</div><div><br class="khtml-block-placeholder"></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>Both a CAS and a scripting interface provide a foundation for building atomic data structure manipulation without having to define all of the data structures and all of the operations at the protocol level.&nbsp; Each has downside.&nbsp; With CAS, you may have to retry a few times under contention and this would be amplified by the latency.&nbsp; With scripting, you may easily slow down the whole server, and you have to deal with how parameters are passed in and results are returned -- and this would mean very different things by protocol.</div><div><br class="khtml-block-placeholder"></div><div>--&nbsp;</div><div>Dustin</div></div></blockquote></div><br></div></body></html>