<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<br><div><div>On Oct 4, 2007, at 8:24 , Brian Aker wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><span class="Apple-style-span" style="border-collapse: separate; 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; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0; "><div>It would be nice to do three additional things with tags:</div><div><br class="webkit-block-placeholder"></div><div>1) Get a list of all active keys associated with a tag (even if it is lossy). Two optimizations would be:</div><div>     * Give me the count of objects within this tag</div><div>     * For a read, take a snapshot version of the list to have read consistency (aka take an MVCC approach)</div></span></blockquote><div><br class="webkit-block-placeholder"></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>Tags aren't intended to be an index, just a mass invalidation mechanism.  It's *possible* to use them as an index, but not in any cheap way.</div><div><br class="webkit-block-placeholder"></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>Without indexing, you'd have to scan all of the stored items and for each one scan your tags and see if there is a match.  Without major changes to memcached, I don't see how you could do that without having the server hang.<br class="webkit-block-placeholder"></div><div><br class="webkit-block-placeholder"></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>If something like that did exist, people would just start tagging thing with ``all'' and using it for a key dump.  If a key dump couldn't exist before, I think it'd be even less likely with tags.<br class="webkit-block-placeholder"></div><br><blockquote type="cite"><span class="Apple-style-span" style="border-collapse: separate; 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; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0; "><div>2) Allow the "set" of an object with its tag name. This will solve the problem of creating an object and then tagging the object.</div></span></blockquote><div><br class="webkit-block-placeholder"></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>I don't see how there could be a problem here at all.  It's almost the same amount of information over the wire, but with two commands, you don't clutter up existing concepts.<br class="webkit-block-placeholder"></div><div><br class="webkit-block-placeholder"></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>When we were originally covering tags  (in the first binary protocol discussion), I suggested leaving room for tags in set.  Brad disagreed and said small, orthogonal commands are much better.  I agree with his disagreement.<br class="webkit-block-placeholder"></div><div><br class="webkit-block-placeholder"></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>If you can prove that setandtag is *considerably* cheaper than set+tag, then it could possibly be added as an extension.<br class="webkit-block-placeholder"></div><br><blockquote type="cite"><span class="Apple-style-span" style="border-collapse: separate; 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; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0; "><div>3) Clear an object from a tag.</div></span></blockquote><div><br class="webkit-block-placeholder"></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>You mean untagging an object?  It's not clear to me how that would ever be used.  I imagine people will be setting and tagging around the same time, and would never want to go back and say, ``no, that really *isn't* dependent on this information.''<br class="webkit-block-placeholder"></div><div><br class="webkit-block-placeholder"></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>How would you imagine this being used?<br class="webkit-block-placeholder"></div><br><blockquote type="cite"><span class="Apple-style-span" style="border-collapse: separate; 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; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0; "><div>4) Option to invalidate a tag, and blow away all keys associated with it (think of it as a mini-operation to save on round trips)</div></span></blockquote><div><br class="webkit-block-placeholder"></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>That's the purpose of invalidate_tag, however, it needs to execute in constant time.<br class="webkit-block-placeholder"></div><br><blockquote type="cite"><span class="Apple-style-span" style="border-collapse: separate; 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; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0; "><div><blockquote type="cite"><div><span class="Apple-style-span" style="-webkit-text-stroke-width: -1; "><span class="Apple-tab-span" style="white-space:pre">        </span>[It's unclear whether it's worth the effort to ever release a tag once it's been added.  If we assume that tags live forever, we don't have to refcount them and a few things get easier.  Any opinions?]</span></div></blockquote><div><br class="webkit-block-placeholder"></div>If you invalidate a tag, the tag should go away. </div></span></blockquote><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>OK, it's clear now.  :)<br class="webkit-block-placeholder"></div><br><div> <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; "><div>-- </div><div>Dustin Sallings</div><br class="Apple-interchange-newline"></span> </div><br></body></html>