<?xml version="1.0"?>
<rss version="2.0">

<channel>
	<title>Planet Drizzle</title>
	<link>http://planetdrizzle.org</link>
	<language>en</language>
	<description>Planet Drizzle - http://planetdrizzle.org</description>

<item>
	<title>Stephen O'Grady: Open Source and the Cloud: Where’s the LAMP?</title>
	<guid>http://redmonk.com/sogrady/?p=2850</guid>
	<link>http://feedproxy.google.com/~r/tecosystems/~3/bUrZHaIFyeQ/</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/sog/3631752801/&quot; title=&quot;town of the clouds by sogrady, on Flickr&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2481/3631752801_ca061e6ec6.jpg&quot; width=&quot;500&quot; height=&quot;336&quot; alt=&quot;town of the clouds&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;“&lt;i&gt;My challenge to everyone competing with Amazon, Google and Microsoft is to remember that you’re competing with Amazon, Google and Microsoft. These are strong technology companies, and if you’re going to compete with them, open source is the only way to do that. Otherwise, you have no leverage&lt;/i&gt;.” &amp;#8211; &lt;a href=&quot;http://www.datacenterknowledge.com/archives/2009/06/25/mullenweg-open-source-trumps-the-cloud/&quot;&gt;Matt Mullenweg&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s accept up front that the next Amazon, Google or Microsoft is not going to be able to purchase hardware as cheaply as the last Amazon, Google and Microsoft. That&amp;#8217;s strike one. Bandwidth is also going to be a bit more dear. Strike two. Consider the challenges of managing all of the above, and that&amp;#8217;s strike three. &lt;/p&gt;
&lt;p&gt;But before we call them &amp;#8211; and count them &amp;#8211; out, let&amp;#8217;s consider for a moment the history of the software industry. Before the cloud, before software as a service there was this weird little trend called open source. This bizarre practice involved opening (read: giving away) your source code (read: your software) so that anyone, your competitors included, could use it. For &lt;i&gt;free&lt;/i&gt;. &lt;/p&gt;
&lt;p&gt;Odd as this might have seemed at the time, of course, open source allowed the small to compete with the big by leveraging rather than submitting to their weaknesses. It&amp;#8217;s sometimes difficult to remember in this Google-obsessed age, but during Windows 95&amp;#8217;s heyday, it was natural to conclude that Microsoft was the once and future provider of all the technology that one might reasonably require. Of course we&amp;#8217;d once thought the same about IBM, but this was different. Microsoft was different. &lt;/p&gt;
&lt;p&gt;My how things change. And stay the same, to be fair, as Microsoft hasn&amp;#8217;t exactly gone the way of SGI. But anyone who&amp;#8217;s watched the Microsoft business over the past decade or so will tell you that open source has been a disruptive influence on the firm, top to bottom. As if it wasn&amp;#8217;t enough that monopolies like the browser and operating system markets were threatened by open source alternatives, its biggest and most terrifying competitors were building their own businesses on software they didn&amp;#8217;t have to develop. Not that Microsoft&amp;#8217;s been alone in feeling the corrosive disruption of free software, of course; it could and has been argued, in fact, that the biggest single reason that Sun is about to be subsumed into Oracle is the LAMP stack. &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.newyorker.com/reporting/2009/05/11/090511fa_fact_gladwell?currentPage=all&quot;&gt;David versus Goliath&lt;/a&gt;, indeed. &lt;/p&gt;
&lt;p&gt;To explore the specifics of how open source might impact the cloud, let&amp;#8217;s indulge in a bit of Q&amp;#038;A. &lt;/p&gt;
&lt;p&gt;&lt;b&gt;Q&lt;/b&gt;: Before we begin, do you have anything to disclose?&lt;br /&gt;
&lt;b&gt;A&lt;/b&gt;: Yes indeed. Folks with relevant technologies like Canonical, Cloudera, Convirture, Dell, IBM, Reductive Labs, Red Hat, Microsoft, Sun and so on are RedMonk customers, while we ourselves are customers of providers of Amazon and Google. &lt;/p&gt;
&lt;p&gt;&lt;b&gt;Q&lt;/b&gt;: To continue the above: could history repeat itself? Could &lt;a href=&quot;http://www.newyorker.com/reporting/2009/05/11/090511fa_fact_gladwell?currentPage=all&quot;&gt;David beat Goliath&lt;/a&gt; &amp;#8211; again &amp;#8211; in the cloud space, on the backs of free software?&lt;br /&gt;
&lt;b&gt;A&lt;/b&gt;: Frankly, I doubt it. &lt;/p&gt;
&lt;p&gt;Free software is not, by itself, enough to overcome the aforementioned economy of scale advantages enjoyed by the Amazon&amp;#8217;s, Google&amp;#8217;s, and Microsoft&amp;#8217;s of the world, let alone the larger, enterprise focused systems players like HP, IBM, and Oracle (why not you too, Cisco?). But that, to me, is not the interesting question. &lt;/p&gt;
&lt;p&gt;&lt;b&gt;Q&lt;/b&gt;: What is the interesting question, then?&lt;br /&gt;
&lt;b&gt;A&lt;/b&gt;: What we should be asking is not whether free software can &lt;i&gt;replace&lt;/i&gt; Amazon et al, but whether or not it can power a viable cloud &lt;i&gt;alternative&lt;/i&gt;. An alternative sufficiently viable to keep the big guys honest and prevent lockin. On the answer to that question, to me, hinges nothing less than the future of the cloud market.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Q&lt;/b&gt;: Why is that question so important?&lt;br /&gt;
&lt;b&gt;A&lt;/b&gt;: First, there&amp;#8217;s the aforementioned question of lockin. Neither customers nor the governments that tax them can be trusted to stave off damaging monopolies, in my opinion. History demonstrates conclusively that IT staffs, necessarily focused on the present, will happily sacrifice the future for the sake of Getting Things Done today. Equally clear is the fact that governments, when finally awakened to anticompetitive threats, generally do too little, too late. Meaning that the best hope for an open and vibrant playing field &amp;#8211; i.e. a market of cloud providers not intent on locking you in at the first opportunity &amp;#8211; in future is competition for the existing players.&lt;/p&gt;
&lt;p&gt;Besides their monopoly-resistant properties, open source cloud software could play an important role in the rise of so-called private clouds &amp;#8211; cloud infrastructures that are run on-premise. Whether one &lt;a href=&quot;http://www.redmonk.com/cote/2009/07/02/itmanagement046/&quot;&gt;agrees or disagrees&lt;/a&gt; with the concept of private clouds or not, they&amp;#8217;re coming. For compliance, privacy, uptime and a host of other reasons. Given that one can&amp;#8217;t replicate the platforms of an Amazon, a Google or a Microsoft internally, it would seem to make public to private or vice versa transitions challenging in the extreme. &lt;/p&gt;
&lt;p&gt;(Re)enter open source. Though some might point to interoperability and standards conversations as the most promising candidates for ensuring adequate competition in the cloud space, my experience in other standards arenas leads me to assign greater value to reference implementations of said standards. Open source implementations, more specifically, because at the end of the day the entire interoperability and standards discussion is about ensuring a level playing field. Throw in the fact that open source could potentially allow replication of the public cloud stack privately and you might yet see enterprises and governments pushing for open source. &lt;/p&gt;
&lt;p&gt;&lt;b&gt;Q&lt;/b&gt;: Are the benefits for open source cloud offerings strongest within the customer, then?&lt;br /&gt;
&lt;b&gt;A&lt;/b&gt;: Not at all. Lost in discussion of cloud development has been the fact that the &lt;a href=&quot;http://redmonk.com/sogrady/2009/04/02/what-are-we-writing-to/&quot;&gt;development platforms and targets&lt;/a&gt; are changing, and quickly. The level of interoperability that even unwieldy standards like J2EE offer is generally absent in the cloud. Platform as a service (PaaS) customers are writing applications, typically, to a completely proprietary abstraction layer, whether it&amp;#8217;s offering by Google, Salesforce or someone else. And even Infrastructure as a Service (IaaS) customers deploying to enterprise standard platforms like RHEL will find their deployments regrettably unique, be that in the way that storage is accessed or the instances themselves are managed. &lt;/p&gt;
&lt;p&gt;As Matt points out above, then, open source is going to be the primary mechanism with which startups compete, in my view. In the two primary styles of cloud implementations, IaaS and PaaS &amp;#8211; what I&amp;#8217;ve previously termed &lt;a href=&quot;http://redmonk.com/sogrady/2008/11/14/cloud-types/&quot;&gt;instance and fabric&lt;/a&gt; &amp;#8211; we&amp;#8217;ve dramatically different economic opportunities. With IaaS, the opportunities for developers and vendors has typically been to abstract the infrastructure via management, clustering and provisioning type applications. These opportunities are, frankly, likely to dwindle as Amazon increasingly offers these services itself. Within PaaS ecosystems such as Google or Salesforce, there is even less opportunity, in that the fabric is responsible for many of the tasks currently being serviced by vendors operating in the IaaS ecosystem. Most cloud vendors are building on Google or Salesforce rather than around them. &lt;/p&gt;
&lt;p&gt;In other words, it&amp;#8217;s a competitive market, and it&amp;#8217;s only going to get more competitive as the bigger systems players rapidly pivot and reposition their wares for use in the cloud. &lt;/p&gt;
&lt;p&gt;So how do you compete? Realistically, unless you&amp;#8217;re company letterhead reads Google, IBM, Microsoft, Oracle or Salesforce, you&amp;#8217;re probably going to have a hard time convincing even medium size cloud customers to write to something other than Amazon.&lt;/p&gt;
&lt;p&gt;Unless, of course, you can develop a credible alternative that is popular enough to assuage concerns about longer term viability. Which pretty much means you&amp;#8217;re going the open source route, in my view. Thus it is that the combination of open source and cloud is even more important for developers than it is for customers. &lt;/p&gt;
&lt;p&gt;&lt;b&gt;Q&lt;/b&gt;: Are any developers seeing things in those terms?&lt;br /&gt;
&lt;b&gt;A&lt;/b&gt;: Sure. Take Cloudera, who&amp;#8217;s offering a suite of commercial services around the open source Hadoop platform. Or the folks from Reasonably Smart &amp;#8211; recently acquired by the folks from Joyent &amp;#8211; who offer up &lt;a href=&quot;http://code.reasonablysmart.com/&quot;&gt;the code&lt;/a&gt; from their Git and Javascript based PaaS layer with the following explanation: &amp;#8220;we see [open source] as the only real way to make our platform truly attractive. Other Platform-as-a-Service providers may state a desire to be open, we&amp;#8217;ve been that way from day one.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Elsewhere, Red Hat is throwing a &lt;a href=&quot;http://www.redhat.com/about/news/prarchive/2009/cloud-forum.html&quot;&gt;virtual conference&lt;/a&gt; strictly on the topic of open source cloud computing. &lt;/p&gt;
&lt;p&gt;&lt;b&gt;Q&lt;/b&gt;: Is the cloud a natural ally for open source?&lt;br /&gt;
&lt;b&gt;A&lt;/b&gt;: Not at all. One of the godfathers of the free software movement, Richard Stallman, has &lt;a href=&quot;http://redmonk.com/sogrady/2008/09/30/is-the-cloud-stupid/&quot;&gt;called&lt;/a&gt; cloud computing &amp;#8220;stupidity.&amp;#8221; Others have &lt;a href=&quot;http://radar.oreilly.com/archives/2006/08/open-source-licenses-are-obsol.html&quot;&gt;argued&lt;/a&gt; that software deployed to the cloud obsoletes open source licenses, undermining the point of the software itself, with some even going so far as to call the loophole that permits this &lt;a href=&quot;http://www.funambol.com/blog/capo/2008/03/agpl-is-osi-approved-sweet-victory.html&quot;&gt;&amp;#8220;a cancer&lt;/a&gt;.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Q&lt;/b&gt;: Is there evidence to support these concerns?&lt;br /&gt;
&lt;b&gt;A&lt;/b&gt;: Not much that I can see, candidly. Though the thinking is sound, in practice there are a great many healthy open source projects that are primarily deployed in network settings. From Hadoop to WordPress, well managed open source projects are succeeding &lt;a href=&quot;http://redmonk.com/sogrady/2009/04/15/open-source-licensing-in-a-networked-age/&quot;&gt;without resorting&lt;/a&gt; to the more severe restrictions of the AGPL. &lt;/p&gt;
&lt;p&gt;&lt;b&gt;Q&lt;/b&gt;: Besides customers like enterprises and governments, who might most benefit from an open source cloud stack?&lt;br /&gt;
&lt;b&gt;A&lt;/b&gt;: In a word: hosts. Given the stark economic reality that the major provider cloud providers&amp;#8217;s economic advantages will expand with the growth they&amp;#8217;re currently experiencing, what are smaller providers to do? Embracing open source seems to be the clearest response. Much as smaller and medium sized hosts worldwide today run Debian, Fedora, CentOS or Ubuntu as a means of minimizing their expense, so too are tomorrow&amp;#8217;s would be cloud providers likely to embrace open cloud stacks in an effort to remain competitive in the burgeoning cloud market. &lt;/p&gt;
&lt;p&gt;Besides, it&amp;#8217;s not clear how big a cloud market will be left when the big guys are finished carving it up. If you assume (as you probably should) that IBM customers are more than likely to leverage an IBM cloud, HP customers an HP cloud and so on, you&amp;#8217;ve already lost an important portion of the Global 100. Then consider the entrenched strength of the category&amp;#8217;s market pioneer in Amazon and the relative strengths of communities that the likes of Google and Salesforce.com can sell into, and the addressable market is dwindling rapidly. &lt;/p&gt;
&lt;p&gt;LAMP, with its flexibility, simplicity and perhaps most importantly &amp;#8211; lack of upfront licensing costs &amp;#8211; fueled an explosion in the hosting services market once upon a time. It&amp;#8217;s entirely possible that a similarly open source cloud stack could do the same, particularly since far more software is delivered via the network than when the hosting industry first expanded. &lt;/p&gt;
&lt;p&gt;&lt;b&gt;Q&lt;/b&gt;: What is this cloud LAMP stack going to look like?&lt;br /&gt;
&lt;b&gt;A&lt;/b&gt;: What we&amp;#8217;re going to see, what we&amp;#8217;re beginning to see, I think, is a loose coalition or confederation of projects and vendors that will together comprise an increasingly viable top to bottom alternative to some of the cloud providers today. We&amp;#8217;re clearly not going to see an Amazon or a Google spring forth, complete, overnight, but the fact is from management to virtualization to operating systems to cloud provisioning the open source alternatives to the current proprietary cloud stacks are more credible by the day. &lt;/p&gt;
&lt;p&gt;&lt;b&gt;Q&lt;/b&gt;: Which projects and vendors will be part of this &amp;#8220;coalition?&amp;#8221;&lt;br /&gt;
&lt;b&gt;A&lt;/b&gt;: Ultimately, there will have to be a variety of participants with varying aims and interests, but they&amp;#8217;re probably going to look a lot like the recent &lt;a href=&quot;http://blogs.computerworld.com/ubuntu_heads_to_the_clouds&quot;&gt;Eucalyptus/Ubuntu&lt;/a&gt; partnership. Besides Linux (all flavors) and Eucalyptus, examples of projects I would expect to see considered for various roles in an open source cloud stack would be things like ConVirt, Drizzle, Hadoop, Puppet, Reasonably Smart and so on. Which is not to mention critical enabling technologies like KVM or potential API candidates like the one GoGrid made available under a CC license. &lt;/p&gt;
&lt;p&gt;As you can tell, it&amp;#8217;s far too early to begin casting for the new acronym, but it&amp;#8217;s clear to me that there are going to be options for those that wish to pursue open source cloud computing. Which should be obvious, since most of the existing clouds are built on open source. &lt;/p&gt;
&lt;p&gt;&lt;b&gt;Q&lt;/b&gt;: What about timeframes: what are your expectations in terms of when the open source cloud will arrive?&lt;br /&gt;
&lt;b&gt;A&lt;/b&gt;: It&amp;#8217;s far too early to tell. What I would say instead is that the clock is ticking, and that the network effects favor the incumbents, so if I were an open source provider with cloud ambitions, I&amp;#8217;d be ramping up the partnership and alliance conversations as quickly as possible. &lt;/p&gt;
&lt;p&gt;If you happen to be one such developer or vendor, drop us a line and we&amp;#8217;ll do what we can to help connect you to similarly interested parties. &lt;/p&gt;
&lt;div class=&quot;acc_license&quot;&gt;&lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/3.0/&quot;&gt;&lt;img src=&quot;http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png&quot; alt=&quot;by-nc-sa&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;!--&lt;rdf:RDF xmlns=&quot;http://creativecommons.org/ns#&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;&lt;Work rdf:about=&quot;&quot;&gt;&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-sa/3.0/&quot; /&gt;&lt;/Work&gt;&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-sa/3.0/&quot;&gt;&lt;requires rdf:resource=&quot;http://creativecommons.org/ns#Attribution&quot; /&gt;&lt;permits rdf:resource=&quot;http://creativecommons.org/ns#Reproduction&quot; /&gt;&lt;permits rdf:resource=&quot;http://creativecommons.org/ns#Distribution&quot; /&gt;&lt;permits rdf:resource=&quot;http://creativecommons.org/ns#DerivativeWorks&quot; /&gt;&lt;requires rdf:resource=&quot;http://creativecommons.org/ns#ShareAlike&quot; /&gt;&lt;prohibits rdf:resource=&quot;http://creativecommons.org/ns#CommercialUse&quot; /&gt;&lt;requires rdf:resource=&quot;http://creativecommons.org/ns#Notice&quot; /&gt;&lt;/License&gt;&lt;/rdf:RDF&gt;--&gt;&lt;p class=&quot;akst_link&quot;&gt;&lt;a href=&quot;http://redmonk.com/sogrady/?p=2850&amp;amp;akst_action=share-this&quot; title=&quot;E-mail this, post to del.icio.us, etc.&quot; id=&quot;akst_link_2850&quot; class=&quot;akst_share_link&quot;&gt;Share This&lt;/a&gt;
&lt;/p&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/tecosystems?a=bUrZHaIFyeQ:gtUx2H0mAig:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/tecosystems?i=bUrZHaIFyeQ:gtUx2H0mAig:F7zBnMyn0Lo&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/tecosystems?a=bUrZHaIFyeQ:gtUx2H0mAig:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/tecosystems?i=bUrZHaIFyeQ:gtUx2H0mAig:D7DqB2pKExk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/tecosystems?a=bUrZHaIFyeQ:gtUx2H0mAig:dnMXMwOfBR0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/tecosystems?d=dnMXMwOfBR0&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/tecosystems/~4/bUrZHaIFyeQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 03 Jul 2009 00:16:34 +0000</pubDate>
</item>
<item>
	<title>Stewart Smith: Dogfooding a pastebin</title>
	<guid>http://www.flamingspork.com/blog/?p=1667</guid>
	<link>http://www.flamingspork.com/blog/2009/07/03/dogfooding-a-pastebin/</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://pastebin.flamingspork.com/&quot;&gt;http://pastebin.flamingspork.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A pastebin running Drizzle and  the Drizzle PHP Extension (which is on top of libdrizzle).&lt;/p&gt;</description>
	<pubDate>Thu, 02 Jul 2009 15:52:58 +0000</pubDate>
</item>
<item>
	<title>Eric Day: libdrizzle and PHP Extension Released</title>
	<guid>http://www.oddments.org/?p=72</guid>
	<link>http://www.oddments.org/?p=72</link>
	<description>&lt;p&gt;Version 0.4 of &lt;a href=&quot;https://launchpad.net/libdrizzle&quot;&gt;libdrizzle&lt;/a&gt; has been released. This was mostly a maintenance release with build system changes and small bug fixes. This is the client and protocol library for Drizzle and MySQL that provides both client and server interfaces.&lt;/p&gt;
&lt;p&gt;Version 0.4.1 of the &lt;a href=&quot;http://pecl.php.net/package/drizzle/&quot;&gt;Drizzle PHP Extension&lt;/a&gt; has also been released. &lt;a href=&quot;http://jluedke.com/&quot;&gt;James Luedke&lt;/a&gt; has moved development and releases of the extension into &lt;a href=&quot;http://pecl.php.net/&quot;&gt;PECL&lt;/a&gt;, and has also fixed a number of bugs, extended the interface, and worked with the PHP/PECL developers to get the extension up to the proper PHP coding standards. Thanks James!&lt;/p&gt;</description>
	<pubDate>Thu, 02 Jul 2009 07:14:24 +0000</pubDate>
</item>
<item>
	<title>Ronald Bradford - 42SQL: Benchmarking Drizzle with MyBench(DBD::drizzle)</title>
	<guid>http://ronaldbradford.com/blog/?p=1707</guid>
	<link>http://ronaldbradford.com/blog/benchmarking-drizzle-with-mybenchdbddrizzle-2009-07-01/</link>
	<description>&lt;p&gt;With thanks to  Patrick Galbraith and his &lt;a href=&quot;http://capttofu.livejournal.com/19704.html&quot;&gt;DBD::drizzle 0.200&lt;/a&gt; I am now able to test client benchmarks side by side with MySQL and Drizzle.&lt;/p&gt;
&lt;p&gt;For simple benchmarking with clients, generally when I have little time, I use a simple Perl framework &lt;a href=&quot;http://jeremy.zawodny.com/mysql/mybench/&quot;&gt;mybench&lt;/a&gt;. I was able to change just the connection string and run tests.&lt;/p&gt;
&lt;p&gt;The diff of my two scripts where:&lt;/p&gt;
&lt;pre&gt;
---
&gt; my $user      = $opt{u} || &quot;appuser&quot;;
&gt; my $pass      = $opt{p} || &quot;password&quot;;
&gt; my $port      = $opt{P} || 3306;
&gt; my $dsn       = &quot;DBI:mysql:$db:$host;port=$port&quot;;
---
 my $user      = $opt{u} || &quot;root&quot;;
 my $pass      = $opt{p} || &quot;&quot;;
 my $port      = $opt{P} || 4427;
 my $dsn       = &quot;DBI:drizzle:$db:$host;port=$port&quot;;
---
&lt;/pre&gt;
&lt;p&gt;It&amp;#8217;s too early to tell what improvement Drizzle will make. Just running my first test with single and multi thread tests shows an improvement in all figures in Drizzle via MySQL, however I will need to run this on various different versions of MySQL including the latest 5.0 to confirm.&lt;/p&gt;</description>
	<pubDate>Wed, 01 Jul 2009 17:14:52 +0000</pubDate>
</item>
<item>
	<title>Brian Aker: Drizzle, Rethinking MySQL for the Web (Video from OSBridge)</title>
	<guid>http://krow.livejournal.com/640375.html</guid>
	<link>http://krow.livejournal.com/640375.html</link>
	<description>Here is the link to the video of the talk I gave at OSBridge -&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://blip.tv/file/2296093&quot;&gt;http://blip.tv/file/2296093&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It is the standard &quot;this is Drizzle Talk&quot;.</description>
	<pubDate>Tue, 30 Jun 2009 16:21:31 +0000</pubDate>
</item>
<item>
	<title>Official Drizzle Blog: Drizzle and Gearman in Boston next week</title>
	<guid>http://blog.drizzle.org/?p=143</guid>
	<link>http://blog.drizzle.org/2009/06/30/143/</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://www.oddments.org/&quot;&gt;Eric Day&lt;/a&gt; will be heading back to his home state (Maine) next week for a visit, and while there both Eric and &lt;a href=&quot;http://capttofu.livejournal.com/&quot;&gt;Patrick Galbraith&lt;/a&gt;  will be talking at the &lt;a href=&quot;http://www.meetup.com/mysqlbos/&quot;&gt;Boston MySQL Meetup Group&lt;/a&gt; on Monday night about &lt;a href=&quot;http://drizzle.org/&quot;&gt;Drizzle&lt;/a&gt;, &lt;a href=&quot;http://www.gearman.org/&quot;&gt;Gearman&lt;/a&gt;, and how to combine the two with projects like &lt;a href=&quot;https://launchpad.net/narada&quot;&gt;Narada&lt;/a&gt;. If you are in the Boston area, be sure to check it out!&lt;/p&gt;</description>
	<pubDate>Tue, 30 Jun 2009 16:21:23 +0000</pubDate>
</item>
<item>
	<title>Eric Day: Drizzle and Gearman in Boston Next Week</title>
	<guid>http://www.oddments.org/?p=70</guid>
	<link>http://www.oddments.org/?p=70</link>
	<description>&lt;p&gt;I&amp;#8217;ll be heading back to my home state (Maine) this week for a visit, and while I&amp;#8217;m back there &lt;a href=&quot;http://capttofu.livejournal.com/&quot;&gt;Patrick Galbraith&lt;/a&gt; and I will be talking at the &lt;a href=&quot;http://www.meetup.com/mysqlbos/&quot;&gt;Boston MySQL Meetup Group&lt;/a&gt; on Monday night about &lt;a href=&quot;http://drizzle.org/&quot;&gt;Drizzle&lt;/a&gt;, &lt;a href=&quot;http://www.gearman.org/&quot;&gt;Gearman&lt;/a&gt;, and how to combine the two with projects like &lt;a href=&quot;https://launchpad.net/narada&quot;&gt;Narada&lt;/a&gt;. If you are in the Boston area, be sure to check it out!&lt;/p&gt;</description>
	<pubDate>Tue, 30 Jun 2009 08:46:09 +0000</pubDate>
</item>
<item>
	<title>Eric Day: Why You Won’t See a Drizzle Proxy</title>
	<guid>http://www.oddments.org/?p=69</guid>
	<link>http://www.oddments.org/?p=69</link>
	<description>&lt;p&gt;I&amp;#8217;ve been following the excellent work that &lt;a href=&quot;http://jan.kneschke.de/&quot;&gt;Jan&lt;/a&gt;, &lt;a href=&quot;http://blogs.sun.com/kay/&quot;&gt;Kay&lt;/a&gt;, and others have been doing with &lt;a href=&quot;http://forge.mysql.com/wiki/MySQL_Proxy&quot;&gt;MySQL Proxy&lt;/a&gt;, it has really matured into a great piece of software. I talked to Jan at the MySQL UC and toyed with the idea of integrating &lt;a href=&quot;https://launchpad.net/libdrizzle&quot;&gt;libdrizzle&lt;/a&gt; into MySQL Proxy. I&amp;#8217;ve also been asked by a number of folks when a &lt;a href=&quot;http://www.drizzle.org/&quot;&gt;Drizzle&lt;/a&gt; Proxy project will be started and if it will be as feature rich as MySQL Proxy. For a while I just said &amp;#8220;Someday, I just don&amp;#8217;t have the time.&amp;#8221; Lately though I am hoping we never have a Drizzle Proxy project.&lt;/p&gt;
&lt;p&gt;Let me explain.&lt;/p&gt;
&lt;p&gt;One of the fundamental ideas in software engineering is code reuse through libraries or modules. Rather than create a Drizzle Proxy project, why not add a proxy module into the Drizzle server? This way, at any point during the query execution path, you could toss the query to the proxy module to deal with, and the main execution engine would be done. You could of course run the Drizzle server in a &amp;#8220;proxy only&amp;#8221; mode where new queries may only be parsed and then a post-parsing module determines where and how that query is proxied. Post proxy hooks will be needed as well for result processing. Functionally, it&amp;#8217;s the same thing as the proxy, but without having to reinvent the components needed in the proxy. (Just as a side note, I understand this may not have been an option for the MySQL proxy folks).&lt;/p&gt;
&lt;p&gt;So, to be clear, I still want to have proxy functionality, just not as an independent project.&lt;/p&gt;
&lt;p&gt;Even with a proxy module inside of the server, I&amp;#8217;d like to address some of the reasons proxies are created and used. These are not necessarily specific to a database proxies, many of these reasons apply to other server types as well. In the case of a database proxy, especially with Drizzle, I would like to address the list of reasons below in a different way. Why? In most architectures, I see a proxy server as a fix for a shortcoming with another component, possibly in the client, server, or maybe even in the application data model. It also introduces latency and another failure point that may not be necessary. The less code and machines your application has to run through, the better. Don&amp;#8217;t get me wrong, there are reasons to use proxies, but sometimes they are used as a hack.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Query processing and rewriting&lt;/b&gt; - In Drizzle we plan to add query rewrite plugin hooks, both pre-parser and post-parser. At some point we want to add pluggable parser support and clean up the abstract syntax tree. These plugins would enable rewriting of queries at a few different levels, both with the raw strings or with rearranging the syntax tree before the optimizer takes over.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Query multi-cast, data partitioning, result merging&lt;/b&gt; - In my opinion, this may could probably be done at the client library layer or through another system such as &lt;a href=&quot;http://www.gearman.org/&quot;&gt;Gearman&lt;/a&gt;. If pushing that logic into the client is not an option, you could still accomplish this through the proxy module I mentioned above, possibly running the server in a mixed-mode (some queries answered locally, some proxied).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Connection Pooling/Concentration&lt;/b&gt; - People often confuse these two terms. &lt;b&gt;Pooling&lt;/b&gt; is the re-use of connection on a client side. This should be pushed to client APIs whenever possible. When this is not possible, you need to use a generic TCP proxy or database proxy, but these should only be run locally (not on a separate machine). &lt;b&gt;Concentration&lt;/b&gt; is a piece of software that acts as a connection multiplexer. It takes multiple client side connections and allows them to map onto a single connection to the server. This is usually because the server does not have an efficient threading or file descriptor handling model to withstand thousands of connections. It&amp;#8217;s not always an option to re-architect a server to handle this, but it should be preferred over creating another layer to do the concentration for you. In Drizzle, this is one thing I have a particular interest in. It involves improving or re-writing the pool-of-threads scheduler and making the execution engine more stateful so it can yield a thread when it knows it will block.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Sharding, HA/failover&lt;/b&gt; - Again, something I think belongs in the client library, and is part of the new Drizzle protocol. I&amp;#8217;ll be adding support into libdrizzle to manage sharding and connection failover shortly.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Debugging layer&lt;/b&gt; - At some point we should be adding probes into the server where output can be piped to a module of your choice. For example, you can register for a set of events and have a module send those out into a Gearman network for processing and debugging. This will give you the flexibility to process probe output however you want and does not introduce another layer just for debugging.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are things I plan to work on at some point or would like to help someone else work on inside Drizzle. Also, these are my own thoughts and may not be shared by fellow Drizzle developers. Treat this as an invitation for discussion. :)&lt;/p&gt;</description>
	<pubDate>Mon, 29 Jun 2009 20:21:52 +0000</pubDate>
</item>
<item>
	<title>Official Drizzle Blog: Drizzle source tarball 1063 has been released</title>
	<guid>http://blog.drizzle.org/?p=139</guid>
	<link>http://blog.drizzle.org/2009/06/22/drizzle-source-tarball-1063-has-been-released/</link>
	<description>&lt;p&gt;Drizzle source tarball based on &lt;a href=&quot;http://edge.launchpad.net/drizzle/trunk/aloha/+download/drizzle-2009.06.1063.tar.gz&quot;&gt;build 1063&lt;/a&gt; has now been released. The change log can be viewed at https://launchpad.net/drizzle/trunk/aloha. &lt;/p&gt;</description>
	<pubDate>Mon, 22 Jun 2009 17:17:33 +0000</pubDate>
</item>
<item>
	<title>Baron Schwartz: Recap of Southeast Linux Fest 2009</title>
	<guid>http://www.xaprb.com/blog/?p=483</guid>
	<link>http://www.xaprb.com/blog/2009/06/21/recap-of-southeast-linux-fest-2009/</link>
	<description>&lt;p&gt;Last weekend, my brother and I attended &lt;a href=&quot;http://www.southeastlinuxfest.org/&quot;&gt;SELF 2009&lt;/a&gt;.  A few thoughts on it:&lt;/p&gt;

&lt;p&gt;The mixture of sessions was interesting.  There were some really good ones.  I think the best session I attended was an OpenSolaris/NetBeans/Glassfish/Virtualbox/ZFS session, given by a Sun employee.  He was an excellent presenter, and really showed off the strengths of the technologies in a nice way.  He started up enough VMs to make his OpenSolaris laptop chew into swap, and I thought it was fun to see how it dealt with that.  I&amp;#8217;ve heard Solaris and OpenSolaris do a lot better at avoiding and managing swapping than GNU/Linux, but I couldn&amp;#8217;t make any opinion from watching.  I did think it was odd to have this session at a &amp;#8220;Linux&amp;#8221; (yes, they left off the GNU) conference.  But I thought the session was a good addition to the conference.  In other sessions, and in the hallways and expo, there was a lot more slant towards open-source software and gadgetry in general than there was towards GNU/Linux.  The sessions that were about Linux or GNU/Linux were top-heavy towards topics like educational initiatives.&lt;/p&gt;

&lt;p&gt;The Free Software Foundation had a booth in the expo hall.  It was funny that they didn&amp;#8217;t boycott the event, because I know RMS won&amp;#8217;t speak at so-called &amp;#8220;Linux User Groups&amp;#8221; and insists they be called &amp;#8220;GNU/Linux User Groups.&amp;#8221;  I guess the FSF is not unified behind that banner.  Regardless, I used the opportunity to renew my membership perpetually.  I&amp;#8217;m so lazy that I need something like this to stay involved!&lt;/p&gt;

&lt;p&gt;The expo hall was dominated by Red Hat, Fedora, and SUSE; PostgreSQL was there, but not MySQL.  There was a good variety and number of vendors.  It was great to see the healthy support of the event, which was free, by the way.&lt;/p&gt;

&lt;p&gt;Clemson, SC is not easy to get to, and while the Clemson campus was attractive and functioned fine, it&amp;#8217;s nothing you can&amp;#8217;t find elsewhere.  I ended up driving over 9 hours to get to it.  I&amp;#8217;d have preferred the technology triangle, which if nothing else is close to major airports, bus and train stops, and Red Hat.&lt;/p&gt;

&lt;p&gt;Richard Hipp talked about the great fsync() bug, a similar talk to the one he gave at the first OpenSQL Camp.  Someone asked about Tokyo Cabinet and he responded that he hasn&amp;#8217;t found any fsync() calls in its source code.  *cough*  Something worth thinking about for on-disk usage (I haven&amp;#8217;t looked at its source much myself).  TC can also be used in-memory-only, and a while back I suggested that usage of it for Drizzle to replace the Memory engine; I don&amp;#8217;t know what became of that.&lt;/p&gt;

&lt;p&gt;Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://www.xaprb.com/blog/2009/04/11/sessions-of-interest-at-mysql-conference-and-expo-2009/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Sessions of interest at MySQL Conference and Expo 2009&quot;&gt;Sessions of interest at MySQL Conference and Expo 2009&lt;/a&gt; &lt;small&gt;I haven&lt;/small&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.xaprb.com/blog/2009/04/05/postgresql-conference-east-2009-day-three/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: PostgreSQL Conference East 2009, Day Three&quot;&gt;PostgreSQL Conference East 2009, Day Three&lt;/a&gt; &lt;small&gt;As I said &lt;/small&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.xaprb.com/blog/2009/04/14/sessions-of-interest-at-mysql-camp-2009/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: Sessions of interest at MySQL Camp 2009&quot;&gt;Sessions of interest at MySQL Camp 2009&lt;/a&gt; &lt;small&gt;I wrote pr&lt;/small&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;Related posts brought to you by &lt;a href=&quot;http://mitcho.com/code/yarpp/&quot;&gt;Yet Another Related Posts Plugin&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Sun, 21 Jun 2009 13:48:49 +0000</pubDate>
</item>
<item>
	<title>Michael Shadle: WordPress on Drizzle - Beaten To the Punch</title>
	<guid>http://michaelshadle.com/?p=174</guid>
	<link>http://michaelshadle.com/2009/06/17/wordpress-on-drizzle-beaten-to-the-punch/</link>
	<description>&lt;p&gt;Looks like &lt;a href=&quot;http://twitter.com/jdub&quot;&gt;Jeff Waugh&lt;/a&gt; actually beat me to it.&lt;/p&gt;
&lt;p&gt;Haven't seen the code...  but he's done it and sounds like he's done a somewhat thorough job.&lt;/p&gt;
&lt;p&gt;Sadly I learned this from Brian's presentation on Drizzle at OS Bridge. Doh.&lt;/p&gt;</description>
	<pubDate>Wed, 17 Jun 2009 23:52:28 +0000</pubDate>
</item>
<item>
	<title>Official Drizzle Blog: Article on Drizzle in Linux Magazine</title>
	<guid>http://blog.drizzle.org/?p=136</guid>
	<link>http://blog.drizzle.org/2009/06/16/article-on-drizzle-in-linux-magazine/</link>
	<description>&lt;p&gt;Great article by&lt;a href=&quot;http://jeremy.zawodny.com/blog/&quot;&gt; Jeremy Zawodny&lt;/a&gt; in &lt;a href=&quot;http://www.linux-mag.com/id/7379/&quot;&gt;Linux Magazine&lt;/a&gt;. Thanks Jeremy!&lt;/p&gt;</description>
	<pubDate>Tue, 16 Jun 2009 16:37:03 +0000</pubDate>
</item>
<item>
	<title>Pythian Group: Eric Day Speaks About Gearman and Drizzle July 6, 2009 in Boston</title>
	<guid>http://www.pythian.com/news/?p=2941</guid>
	<link>http://www.pythian.com/news/2941/eric-day-speaks-about-gearman-and-drizzle-july-6-2009-in-boston</link>
	<description>&lt;p&gt;The July meeting of the Boston MySQL User Group will feature Eric Day, a prominent Drizzle developer, talking about Drizzle and Gearman:&lt;/p&gt;
&lt;p&gt;In this talk we will discuss two growing technologies: Drizzle and Gearman. &lt;/p&gt;
&lt;p&gt;We will explain what the Drizzle project is, what we aim to accomplish, and an overview of where we are at. We will also be introducing the fundamentals of how to leverage Gearman, an open-source, distributed job queuing system. Gearman&amp;#8217;s generic design allows it to be used as a building block for almost any use - from speeding up your website to building your own Map/Reduce cluster. We will tie Drizzle and Gearman together and demonstrate how they work in a custom Search Engine application.&lt;/p&gt;
&lt;p&gt;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&lt;/p&gt;
&lt;p&gt;Here is the URL for MIT&amp;#8217;s Map with the location of this building:&lt;br /&gt;
&lt;a href=&quot;http://whereis.mit.edu/map-jpg?selection=E51&amp;#038;Buildings=go&quot;&gt;http://whereis.mit.edu/map-jpg?selection=E51&amp;#038;Buildings=go&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This map shows the MBTA Kendall Stop:&lt;br /&gt;
&lt;a href=&quot;http://whereis.mit.edu/map-jpg?selection=L5&amp;#038;Landmarks=go&quot;&gt;http://whereis.mit.edu/map-jpg?selection=L5&amp;#038;Landmarks=go&lt;/a&gt;&lt;br /&gt;
(the stop is in red on that map, and you can see E51 in the bottom right)&lt;/p&gt;
&lt;p&gt;Here are the URL&amp;#8217;s for the parking lots (free and open to the public after 3 pm):&lt;br /&gt;
&lt;a href=&quot;http://whereis.mit.edu/map-jpg?selection=P4&amp;#038;Parking=go&quot;&gt;http://whereis.mit.edu/map-jpg?selection=P4&amp;#038;Parking=go&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://whereis.mit.edu/map-jpg?selection=P5&amp;#038;Parking=go&quot;&gt;http://whereis.mit.edu/map-jpg?selection=P5&amp;#038;Parking=go&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Free pizza and soda will be served, so please RSVP accurately.&lt;/p&gt;
&lt;p&gt;To RSVP anonymously, please login to the Meetup site with the e-mail address &amp;#8220;admin at sheeri dot com&amp;#8221; and the password &amp;#8220;guest&amp;#8221;.&lt;/p&gt;
&lt;p&gt;For more information, see:  http://mysql.meetup.com/137/&lt;/p&gt;</description>
	<pubDate>Tue, 16 Jun 2009 13:40:18 +0000</pubDate>
</item>
<item>
	<title>Toru Maesaka: Storage Engine Dev Journal #3 : Supporting variable width tables</title>
	<guid>http://torum.net/?p=2165</guid>
	<link>http://torum.net/2009/06/supporting-variable-width-tables/</link>
	<description>&lt;p&gt;Something I&amp;#8217;ve added to BlitzDB recently that was pretty high on my todo list is support for variable width tables. So what is a variable width table? it is a table that contains columns that can vary in size, namely &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.4/en/blob.html&quot;&gt;BLOB and TEXT&lt;/a&gt; types.&lt;/p&gt;
&lt;p&gt;Going back to the basics, when a new row is to be written, a storage engine is given a pointer to the row data in MySQL format that it must somehow store for later lookup/retrieval. By meaning &amp;#8220;somehow&amp;#8221;, the storage engine is given the freedom to do whatever it likes with the row.&lt;/p&gt;
&lt;p&gt;Writing a row for a fixed length table (a table with columns that are always the same size) is deadly easy. A storage engine can choose to not temper with the row and simply write or copy the data to it&amp;#8217;s storage mechanism. This is because the storage engine is given a row that contains all the data. Rows for variable width tables however, are treated differently since things aren&amp;#8217;t as simple (it&amp;#8217;s variable!).&lt;/p&gt;
&lt;p&gt;The difference is that columns for BLOB and TEXT types are represented by two parts inside a MySQL/Drizzle row:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;length of the data&lt;/li&gt;
&lt;li&gt;pointer to the actual data&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is simple to understand since we need to know the size of the data to copy it.&lt;/p&gt;
&lt;h4&gt;Minor Complication&lt;/h4&gt;
&lt;p&gt;The minor complication as you would expect here is that you can&amp;#8217;t directly write the provided row to your engine like you can with fixed length tables. The data that you want to copy/write exists elsewhere (hence the pointer) so directly writing the row has no meaning (the data would have disappeared by your next access to that row). You need to make sure that the actual data for BLOB/TEXT column(s) are arranged appropriately on your engine&amp;#8217;s row buffer and written out to it&amp;#8217;s storage mechanism.&lt;/p&gt;
&lt;p&gt;This process is commonly referred to as row packing (converting to your engine format) and unpacking (convert back to MySQL format). So how is this done? it&amp;#8217;s actually pretty simple!&lt;/p&gt;
&lt;h4&gt;The solution is actually simple&lt;/h4&gt;
&lt;p&gt;As much as it sounds like a bother to support variable length rows, it&amp;#8217;s actually not that bad. First you need to understand what a MySQL row looks like internally.&lt;/p&gt;
&lt;p&gt;A MySQL row begins with a bitset that represents which fields are NULL. The length of this data obviously depends on the number of NULLable columns you have but this is easy to handle with Drizzle since we&amp;#8217;re given all the relevant information by the TableShare object (same goes for MySQL from a different object).&lt;/p&gt;
&lt;p&gt;After this data comes the actual column data in the order that appears in your CREATE TABLE statement. What you need to do to get packing working with this row is the not-so-obvious part that you really need an example to look at. Fortunately Tweeting about this attracted &lt;a href=&quot;http://twitter.com/brianaker/status/2026228307&quot;&gt;Brian&amp;#8217;s attention&lt;/a&gt; which helped me move forward.&lt;/p&gt;
&lt;h4&gt;Loop the fields!&lt;/h4&gt;
&lt;p&gt;So, let&amp;#8217;s take row insertion to a variable width table as an example. Imagine this table:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;sql&quot;&gt;&lt;span&gt;CREATE&lt;/span&gt; &lt;span&gt;TABLE&lt;/span&gt; t1 &lt;span&gt;&amp;#40;&lt;/span&gt;
  id int &lt;span&gt;PRIMARY&lt;/span&gt; &lt;span&gt;KEY&lt;/span&gt; &lt;span&gt;NOT&lt;/span&gt; &lt;span&gt;NULL&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
  description text&lt;span&gt;,&lt;/span&gt;
  arbitrary_data blob
&lt;span&gt;&amp;#41;&lt;/span&gt; engine&lt;span&gt;=&lt;/span&gt;your_engine;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;and let&amp;#8217;s imagine that we need to process this query:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;sql&quot;&gt;&lt;span&gt;INSERT&lt;/span&gt; &lt;span&gt;INTO&lt;/span&gt; t1 &lt;span&gt;VALUES&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;&amp;quot;hello world&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; &lt;span&gt;&amp;quot;blobbbbb&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now, the storage engine needs to &amp;#8220;pack&amp;#8221; the data for each column into it&amp;#8217;s buffer in the &lt;a href=&quot;http://forge.mysql.com/wiki/MySQL_Internals_Custom_Engine#Adding_Support_for_INSERT_to_a_Storage_Engine&quot;&gt;write_row()&lt;/a&gt; function. Conveniently, Drizzle/MySQL provides a pack() function for it&amp;#8217;s column types (fields) that will do the data packing for you. That is, you do not have to inspect the provided row for pointers to the actual data and do the packing/copying yourself. &lt;/p&gt;
&lt;p&gt;How? well, the table object (which is visible from your engine) conveniently holds a list of fields in the appropriate order. The actual pack() function is a member of these fields so you just need to call it as you loop over the list:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;&lt;span&gt;/* make sure row_buffer has enough memory */&lt;/span&gt;
&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; &lt;span&gt;*&lt;/span&gt;pos &lt;span&gt;=&lt;/span&gt; row_buffer&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;/* copy NULL bits, &amp;quot;table-&amp;gt;s&amp;quot; is the TableShare object */&lt;/span&gt;
memcpy&lt;span&gt;&amp;#40;&lt;/span&gt;pos&lt;span&gt;,&lt;/span&gt; row&lt;span&gt;,&lt;/span&gt; table&lt;span&gt;-&amp;gt;&lt;/span&gt;s&lt;span&gt;-&amp;gt;&lt;/span&gt;null_bytes&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
pos &lt;span&gt;+=&lt;/span&gt; table&lt;span&gt;-&amp;gt;&lt;/span&gt;s&lt;span&gt;-&amp;gt;&lt;/span&gt;null_bytes&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;/* &amp;quot;row&amp;quot; is the MySQL formatted row given by the core */&lt;/span&gt;
&lt;span&gt;for&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;Field &lt;span&gt;**&lt;/span&gt;field &lt;span&gt;=&lt;/span&gt; table&lt;span&gt;-&amp;gt;&lt;/span&gt;field&lt;span&gt;;&lt;/span&gt; &lt;span&gt;*&lt;/span&gt;field&lt;span&gt;;&lt;/span&gt; field&lt;span&gt;++&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;
  &lt;span&gt;if&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;field&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;is_null&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
    pos &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;field&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;pack&lt;span&gt;&amp;#40;&lt;/span&gt;pos&lt;span&gt;,&lt;/span&gt; row &lt;span&gt;+&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;field&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;offset&lt;span&gt;&amp;#40;&lt;/span&gt;row&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The above code snippet will populate &amp;#8220;row_buffer&amp;#8221; with the actual data that you want to write to your storage mechanism. You do not have to forward the &amp;#8220;pos&amp;#8221; pointer because pack() returns a pointer at the end of where it had worked in the buffer (think Pascal Strings). This is precisely why we created the pos pointer, to avoid row_buffer from being forwarded.&lt;/p&gt;
&lt;p&gt;For the opposite situation (when retrieving a row), an unpack() function is provided for each field so you just need to take advantage of it like we did with the pack() snippet above.&lt;/p&gt;
&lt;h4&gt;Little bit more on fields&lt;/h4&gt;
&lt;p&gt;The actual pack() function that gets called depends on the type of column since the Field class is an abstract base class for the sub classes that actually represents column types inside Drizzle/MySQL. If you want to know what a pack() function looks like for a BLOB type, grep for &amp;#8220;Field_blob&amp;#8221; in the source tree and there will be a pack() member function for it.&lt;/p&gt;
&lt;p&gt;The code layout for field subsystem in MySQL is rather difficult to comprehend since everything is crammed in &amp;#8220;sql/field.c&amp;#8221; and &amp;#8220;sql/field.h&amp;#8221; files (at least as of 5.4). So, if you want to get a good grasp of how things are architectured, you should take a look at Drizzle. Field subclasses are located individually in the &amp;#8220;drizzled/field/&amp;#8221; directory and the base class is located in &amp;#8220;drizzled/field.h&amp;#8221;.&lt;/p&gt;
&lt;p&gt;So, that&amp;#8217;s about it! Hopefully this information will help other engine developers when they come across a need to support variable width tables &lt;img src=&quot;http://torum.net/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;</description>
	<pubDate>Tue, 16 Jun 2009 12:14:52 +0000</pubDate>
</item>
<item>
	<title>Eric Day: Gearman Pluggable Protocol</title>
	<guid>http://www.oddments.org/?p=68</guid>
	<link>http://www.oddments.org/?p=68</link>
	<description>&lt;p&gt;I just finished adding pluggable protocol support to the Gearman job server, this will enable even more methods of submitting jobs into Gearman. If all the various Gearman APIs, MySQL UDFs, and Drizzle UDFs are not enough, it&amp;#8217;s now fairly easy to write a module that takes over the socket I/O and parsing hooks to map any protocol into the job server. As an example module, I added basic HTTP protocol support:&lt;/p&gt;
&lt;pre&gt;
&gt; gearmand -r http &amp;#038;
[1] 29911
&gt; ./examples/reverse_worker &gt; /dev/null &amp;#038;
[2] 29928
&gt; nc localhost 8080
POST /reverse HTTP/1.1
Content-Length: 12

Hello World!

HTTP/1.0 200 OK
X-Gearman-Job-Handle: H:lap:1
Content-Length: 12
Server: Gearman/0.8

!dlroW olleH
&lt;/pre&gt;
&lt;p&gt;I&amp;#8217;ve added a few headers for setting things like background, priority, and unique key. For example, if you want to run the above job in the background:&lt;/p&gt;
&lt;pre&gt;
POST /reverse HTTP/1.1
Content-Length: 12
X-Gearman-Background: true

Hello World!

HTTP/1.0 200 OK
X-Gearman-Job-Handle: H:lap:2
Content-Length: 0
Server: Gearman/0.8
&lt;/pre&gt;
&lt;p&gt;So what protocols are we looking at? HTTP and memcached were on the top of the list, but I&amp;#8217;m guessing other folks may have better ideas or perhaps could use it for custom integration with their existing infrastructure. This is now tested in my development branch and will be pushed to trunk in the next couple days. If anyone is interested in working on the HTTP module, please hack away, patches are welcome! :)  It may be interesting to map a worker interface in as well depending on headers, along with better support for client requests and HTTP error codes.&lt;/p&gt;
&lt;p&gt;Here is another quick example that shows how this can be useful. With the job server we started above still running, use the gearman command line client/worker to start up a worker that can do the function &amp;#8216;proto&amp;#8217; and responds with dumping the file PROTOCOL (use any other file you have around):&lt;/p&gt;
&lt;pre&gt;
&gt; gearman -w -f proto cat PROTOCOL
&lt;/pre&gt;
&lt;p&gt;If you&amp;#8217;ve note used this command line tool before, &lt;b&gt;-w&lt;/b&gt; makes the process act like a worker, &lt;b&gt;-f function&lt;/b&gt; specifies which function the worker should register as, and everything after is executed every time a job is run (it fork()s, remaps stdin/out to pass the payload/read result, and then exec()s).&lt;/p&gt;
&lt;p&gt;Now point your browser to &lt;b&gt;http://localhost:8080/proto&lt;/b&gt; and you will see the contents of the file (assuming you are running all this on your local machine). This may not seem too useful, but now imagine more complex workers running on a distributed cluster. We now have a simple web server with distributed CGI scripts! :)&lt;/p&gt;</description>
	<pubDate>Fri, 12 Jun 2009 22:30:08 +0000</pubDate>
</item>
<item>
	<title>Pythian Group: Log Buffer #150</title>
	<guid>http://www.pythian.com/news/?p=2852</guid>
	<link>http://www.pythian.com/news/2852/log-buffer-150</link>
	<description>&lt;p&gt;This is the 150th edition of Log Buffer, the weekly review of database blogs.  Someone accidentally left &lt;a href=&quot;http://www.pythian.com/news/author/edwards/&quot;&gt;Dave Edwards&lt;/a&gt;&amp;#8216; cage unlocked, and he escaped, thus leaving me with the pleasurable duty of compiling the 150th weekly Log Buffer.&lt;/p&gt;
&lt;p&gt;Many people other than Dave are finding release this week.  &lt;span id=&quot;more-2852&quot;&gt;&lt;/span&gt;&lt;a href=&quot;http://blogs.sun.com/datacharmer/&quot;&gt;Giuseppe Maxia&lt;/a&gt; explains some details of &lt;a href=&quot;http://blogs.sun.com/datacharmer/entry/mysql_has_a_new_release&quot;&gt;MySQL&amp;#8217;s New Release Model&lt;/a&gt;.  &lt;a href=&quot;http://www.clusterdb.com/mysql-cluster/&quot;&gt;Andrew Morgan&lt;/a&gt; announces a &lt;a href=&quot;http://www.clusterdb.com/mysql-cluster/new-mysql-cluster-maintenance-release-706/&quot;&gt;New MySQL Cluster Maintenance Release&lt;/a&gt;.  Aleksandr Kuzminsky of the &lt;a href=&quot;http://www.mysqlperformanceblog.com/&quot;&gt;MySQL Performance Blog&lt;/a&gt; releases &lt;a href=&quot;http://www.mysqlperformanceblog.com/2009/06/11/5077-5082-build16-percona-binaries/&quot;&gt;build16 of the Percona MySQL binaries (versions 5.0.77 and 5.0.82)&lt;/a&gt;, which adds some 5.4 features and fixes some bugs.  &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://mysqlpreacher.com/wordpress/&quot;&gt;Darran Cassar, the MySQL Preacher,&lt;/a&gt; has created a package for &lt;a href=&quot;http://mysqlpreacher.com/wordpress/2009/06/security-roles-and-password-expiry-on-mysql-using-securich/&quot;&gt;&lt;/a&gt;Security Roles and Password Expiry on MySQL&lt;/p&gt;.  And for a future MySQL release, look for &lt;a href=&quot;http://blogs.sun.com/LinuxJedi/entry/two_new_status_variable_patches&quot;&gt;Two New Status Variable Patches&lt;/a&gt;, for query invalidation count and a last received datetime for replication heartbeat.  These patches were contributed by MySQL Support Team member &lt;a href=&quot;http://blogs.sun.com/LinuxJedi/&quot;&gt;Andrew Hutchins&lt;/a&gt;.  
&lt;p&gt;&lt;a href=&quot;http://davebeulke.com&quot;&gt;Dave Beulke&lt;/a&gt; points out a new feature in DB2 9.7 &amp;#8212; &lt;a href=&quot;http://davebeulke.com/?p=401&quot;&gt;DB2 Compatible with Oracle&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To prepare for a future SQL Server release where CREATE DEFAULT, sp_bindefault and sp_unbindefault will be deprecated, &lt;a href=&quot;http://sqlblogcasts.com/blogs/martinbell/&quot;&gt;Martin Bell&lt;/a&gt; advocates &lt;a href=&quot;http://sqlblogcasts.com/blogs/martinbell/archive/2009/06/11/Changing-bound-defaults-to-default-constraints.aspx&quot;&gt;Changing Bound Defaults to Default Constraints&lt;/a&gt;.  If you are going to upgrade SQL Server, definitely look at the notes from &lt;a href=&quot;http://sqlserver-qa.net/&quot;&gt;SQL Master of SQL Server QA&lt;/a&gt;&amp;#8217;s presentation on &lt;a href=&quot;http://sqlserver-qa.net/blogs/tools/archive/2009/06/09/sql-server-upgrade-issues-how-to-evaluate-potential-issues.aspx&quot;&gt;SQL Server Upgrade Issues and How To Evaluate Potential Issues&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flamingspork.com/&quot;&gt;Stewart Smith&lt;/a&gt; lets is know that &lt;a href=&quot;http://www.flamingspork.com/blog/2009/06/09/drizzle-tarballs-for-next-milestone-aloha/&quot;&gt;Drizzle Tarballs for the Next Milestone - Aloha&lt;/a&gt; are being released weekly.  Meanwhile, &lt;a href=&quot;http://jpipes.com&quot;&gt;Jay Pipes&lt;/a&gt; and the rest of the Drizzle team find, fix and explain the cause of a performance regression in &lt;a href=&quot;http://jpipes.com/index.php?/archives/296-Drizzle-Performance-Regression-Solved-TCMalloc-vs.-No-TCMalloc.html&quot;&gt;Drizzle Performance Regression Solved - TCMalloc vs. No TCMalloc&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.lenzg.net/&quot;&gt;Lenz Grimmer&lt;/a&gt; has started organizing OpenSQLCamp 2009, Aug 22-23 in Germany; he posts details and links in &lt;a href=&quot;http://www.lenzg.net/archives/258-Speaking-at-FrOSCon-and-organizing-the-OpenSQLCamp-2009,-European-Edition.html&quot;&gt;Speaking at FrOSCon and Organizing the OpenSQLCamp 2009, European Edition&lt;/a&gt;.  If you want to speak, Lenz also lets you know that &lt;a href=&quot;http://www.lenzg.net/archives/260-The-Call-for-Papers-for-the-OpenSQLCamp-2009-is-now-open!.html&gt;the Call for Papers for the OpenSQLCAmp 2009 is Now Open!&lt;/A&gt;  In other conference news, &lt;A HREF=&quot;&gt;the Call for Papers for the OpenSQLCAmp 2009 is Now Open!&lt;/a&gt;  In other conference news, &lt;a href=&quot;&gt;the Call for Papers for the OpenSQLCAmp 2009 is Now Open!&lt;/a&gt;  In other conference news, &lt;a href=&quot;&gt;the Call for Papers for the OpenSQLCAmp 2009 is Now Open!&lt;/a&gt;  In other conference news, &lt;a href=&quot;&gt;the Call for Papers for the OpenSQLCAmp 2009 is Now Open!&lt;/a&gt;  In other conference news, &lt;a href=&quot;&gt;the Call for Papers for the OpenSQLCAmp 2009 is Now Open!&lt;/a&gt;  In other conference news, &lt;a href=&quot;&gt;the Call for Papers for the OpenSQLCAmp 2009 is Now Open!&lt;/a&gt;  In other conference news, &lt;a href=&quot;&gt;the Call for Papers for the OpenSQLCAmp 2009 is Now Open!&lt;/a&gt;  In other conference news, &lt;a href=&quot;http://ronaldbradford.com/blog/&quot;&gt;Ronald Bradford&lt;/a&gt; gives out a discount code and reminds us that we can still attend &lt;a href=&quot;http://ronaldbradford.com/blog/oscon-2009-at-a-discounted-rate-2009-06-05/&quot;&gt;OSCon 2009 at a Discounted Rate&lt;/a&gt; (until June 23rd).  OSCon 2009 will be held July 20-24 in San Jose, California.  And in Iowa, &lt;a href=&quot;http://sqlfool.com/&quot;&gt;Michelle Ufford&lt;/a&gt; sends out the &lt;a href=&quot;http://sqlfool.com/2009/06/east-iowa-sql-saturday-call-for-speakers/&quot;&gt;East Iowa SQL Saturday Call for Speakers&lt;/a&gt; to be held on Saturday, October 10, 2009.&lt;/p&gt;
&lt;p&gt;Getting back to basics, &lt;a href=&quot;http://richardfoote.wordpress.com&quot;&gt;Richard Foote&lt;/a&gt; explains Oracle&amp;#8217;s cost-based optimizer in &lt;a href=&quot;http://richardfoote.wordpress.com/2009/06/09/the-cbo-and-indexes-an-introduction-absolute-beginners/&quot;&gt;CBO and Indexes, an Introduction for Absolute Beginners&lt;/a&gt;.  Speaking of optimizations, &lt;a href=&quot;http://blog.valcora.com/index.php?/authors/1-Valcora&quot;&gt;Valcora&lt;/a&gt; has &lt;a href=&quot;http://blog.valcora.com/index.php?/archives/17-Another-Way-To-Do-Performance-Tuning.html&quot;&gt;Another Way To Do Performance Tuning&lt;/a&gt; &amp;#8212; make sure you actually need the queries that are running against your system!  &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.tanelpoder.com/2009/06/09/using-perfsheet-and-tpt-scripts-for-solving-real-life-performance-problems/&quot;&gt;Tanel Poder&lt;/a&gt; points to a blog post on &lt;a href=&quot;http://blog.tanelpoder.com/2009/06/09/using-perfsheet-and-tpt-scripts-for-solving-real-life-performance-problems/&quot;&gt;Using Perfsheet and TPT Scripts for Solving Real Life Performance Problems&lt;/a&gt; in an Oracle RAC environment.  And &lt;a href=&quot;http://jonathanlewis.wordpress.com/&quot;&gt;Jonathan Lewis&lt;/a&gt; provides a script you can run if you are concerned about the potantial of Oracle &lt;a href=&quot;http://jonathanlewis.wordpress.com/2009/06/07/pga-leaks/&quot;&gt;PGA leaks&lt;/a&gt;.  Over at &lt;a href=&quot;http://oraclue.com&quot;&gt;Oraclue, Miladin Modrakovic&lt;/a&gt; shows how to discover memory &amp;#8220;leaks and other problems with allocations of memory&amp;#8221; in &lt;a href=&quot;http://oraclue.com/2009/06/10/memory-annotations-and-oradebug/&quot;&gt;Memory Annotations and Oradebug&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you are migrating a database from Oracle to MySQL, you may be interested in &lt;a href=&quot;http://mysql-dba-journey.blogspot.com/&quot;&gt;George Trujillo&lt;/a&gt;&amp;#8217;s process of &lt;a href=&quot;http://mysql-dba-journey.blogspot.com/2009/06/converting-oracle-schema-to-mysql.html&quot;&gt;Converting an Oracle Schema to MySQL&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.sqlskills.com/BLOGS/KIMBERLY/&quot;&gt;Kimberly L. Tripp&lt;/a&gt; reveals a lot of information about how SQL Server optimizes queries and common myths when she reveals &lt;a href=&quot;http://www.sqlskills.com/BLOGS/KIMBERLY/post/The-Tipping-Point-Query-Answers.aspx&quot;&gt;The Tipping Point Query Answers&lt;/a&gt;.  &lt;a href=&quot;http://people.planetpostgresql.org/dfetter/&quot;&gt;David Fetter&lt;/a&gt; shares &lt;a href=&quot;http://people.planetpostgresql.org/dfetter/index.php?/archives/21-Materialized-Views-Performance-Tips.html#extended&quot;&gt;Materialized Views Performance Tips&lt;/a&gt; in Postgres, and &lt;a href=&quot;http://www.postgresonline.com/journal/&quot;&gt;Leo Hsu and Regina Obe&lt;/a&gt; talk about &lt;a href=&quot;http://www.postgresonline.com/journal/index.php?/archives/120-Planner-Statistics.html#extended&quot;&gt;&lt;/a&gt;Planner Statistics&lt;/p&gt; in the Postgres optimizer.
&lt;p&gt;In the land of DB2, &lt;a href=&quot;http://blog.4loeser.net/&quot;&gt;Henrik Loeser&lt;/a&gt; shares a &lt;a href=&quot;http://blog.4loeser.net/2009/06/purexml-performance-tip-sequence-of.html&quot;&gt;PureXML Performance Tip: A Sequence of Good Indexes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://coskan.wordpress.com/&quot;&gt;Coskan&lt;/a&gt; explains&lt;br /&gt;
&lt;a href=&quot;http://coskan.wordpress.com/2009/06/11/how-to-use-sysman-schema-without-em/&quot;&gt;How to Use Sysman Schema Without Oracle Enterprise Manager&lt;/a&gt;.  &lt;a href=&quot;http://jhdba.wordpress.com&quot;&gt;John Hallas&lt;/a&gt; notes that using Oracle&amp;#8217;s EM to migrate a database to ASM is easy, but seems slow, in &lt;a href=&quot;http://jhdba.wordpress.com/2009/06/10/asm-metadata-and-migrating-a-database-to-asm/&quot;&gt;ASM Metadata and Migrating a Database to ASM&lt;/a&gt;.  He then goes on to share a coworker&amp;#8217;s &lt;a href=&quot;http://jhdba.wordpress.com/2009/06/11/script-to-backup-asm-metadata/&quot;&gt;Script to Backup ASM Metadata&lt;/a&gt;.  &lt;a href=&quot;http://jarneil.wordpress.com&quot;&gt;J. Arneil&lt;/a&gt; shows how to go about &lt;a href=&quot;http://jarneil.wordpress.com/2009/06/08/fixing-up-asm-disk-header-corruption/&quot;&gt;Fixing up ASM Disk Header Corruption&lt;/a&gt;, should you find yourself in a rough spot.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://thehobt.blogspot.com/&quot;&gt;Aaron Alton&lt;/a&gt; has a great article telling us that in &lt;a href=&quot;http://thehobt.blogspot.com/2009/06/defensive-programming-assumptions-must.html&quot;&gt;Defensive Programming, Assumptions Must be Guaranteed or Tested&lt;/a&gt;, and another one on handling tags efficiently in &lt;a href=&quot;http://thehobt.blogspot.com/2009/06/full-text-search-vs-denormalized-tables.html&quot;&gt;Full Text Search vs. Denormalized Tables&lt;/a&gt;  &lt;a href=&quot;http://rusanu.com/&quot;&gt;Remus Rusanu&lt;/a&gt; provides a Transact-SQL stored procedure template for &lt;a href=&quot;http://rusanu.com/2009/06/11/exception-handling-and-nested-transactions/&quot;&gt;Exception Handling and Nested Transactions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ll end with a link to another survey on &lt;a href=&quot;http://www.sqlskills.com/BLOGS/PAUL/post/Weekly-Survey-whats-the-hardest-part-of-becomng-an-involuntary-DBA.aspx&quot;&gt;What&amp;#8217;s the hardest part of becoming an involuntary DBA?&lt;/a&gt;  It&amp;#8217;s one simple question, so go fill it out!  You have the time, especially since &lt;a href=&quot;http://www.neonesoft.com/blog/blogs/cmullins/&quot;&gt;Craig Mullins&lt;/a&gt; points out that on average, we got a 4.6% salary increase in 2008 in &lt;a href=&quot;http://www.neonesoft.com/blog/blogs/cmullins/archive/2009/06/11/Salaries-for-Data-Professionals-Inching-Upward.aspx&quot;&gt;Salaries for Data Professionals Inching Upward&lt;/a&gt;.  To learn more and become even better in your field, get a 15-day &lt;a href=&quot;https://www.ibm.com/developerworks/mydeveloperworks/blogs/SusanVisser/entry/free_trial_to_safari_books_online&quot;&gt;free trial to Safari Books Online&lt;/a&gt; from O&amp;#8217;Reilly, with a 15% discount if you continue past the free trial, courtesy of &lt;a href=&quot;https://www.ibm.com/developerworks/mydeveloperworks/blogs/SusanVisser/&quot;&gt;Susan Visser&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Fri, 12 Jun 2009 16:11:49 +0000</pubDate>
</item>
<item>
	<title>Ronald Bradford - 42SQL: Problems compiling MySQL 5.4</title>
	<guid>http://ronaldbradford.com/blog/?p=1607</guid>
	<link>http://ronaldbradford.com/blog/problems-compiling-mysql-54-2009-06-11/</link>
	<description>&lt;p&gt;Seem&amp;#8217;s the year &lt;a href=&quot;http://sun.com&quot;&gt;Sun&lt;/a&gt; had for improving &lt;a href=&quot;http://mysql.com&quot;&gt;MySQL&lt;/a&gt;, and with an entire new 5.4 branch the development team could not fix the autoconf and compile dependencies that has been in MySQL for all the years I&amp;#8217;ve been compiling MySQL.  &lt;a href=&quot;http://drizzle.org&quot;&gt;Drizzle&lt;/a&gt; has got it right, thanks to the great work of &lt;a href=&quot;http://mysql-ha.com/&quot;&gt;Monty Taylor&lt;/a&gt;.  &lt;/p&gt;
&lt;p&gt;I&amp;#8217;m working on the &lt;a href=&quot;http://wafflegrid.com&quot;&gt;Wafflegrid AWS EC2 AMI&amp;#8217;s&lt;/a&gt; for &lt;a href=&quot;http://bigdbahead.com&quot;&gt;Matt Yonkovit&lt;/a&gt; and while compiling 5.1 was straight forward under Ubuntu 8.10 Intrepid, compiling 5.4 was more complicated.&lt;/p&gt;
&lt;p&gt;For MySQL 5.1 I needed only to do the following:&lt;/p&gt;
&lt;pre&gt;
apt-get install -y build-essential
apt-get install libncurses5-dev
./configure
make
make install
&lt;/pre&gt;
&lt;p&gt;For MySQL 5.4, I elected to use the BUILD scripts (based on Wafflegrid recommendations).  That didn&amp;#8217;t go far before I needed.&lt;/p&gt;
&lt;pre&gt;
apt-get install -y automake libtool
&lt;/pre&gt;
&lt;p&gt;You then have to go compiling MySQL 5.4 for 10+ minutes to get an abstract error, then you need to consider what dependencies may be missing.&lt;br /&gt;
I don&amp;#8217;t like to do a blanket apt-get of a long list of proposed packages unless I know they are actually needed.&lt;/p&gt;
&lt;p&gt;The error was:&lt;/p&gt;
&lt;pre&gt;
make[1]: Entering directory `/src/mysql-5.4.0-beta/sql'
make[1]: warning: -jN forced in submake: disabling jobserver mode.
/bin/bash ../ylwrap sql_yacc.yy y.tab.c sql_yacc.cc y.tab.h sql_yacc.h y.output sql_yacc.output -- -d --verbose
make -j 6 gen_lex_hash
make[2]: Entering directory `/src/mysql-5.4.0-beta/sql'
rm -f mini_client_errors.c
/bin/ln -s ../libmysql/errmsg.c mini_client_errors.c
make[2]: warning: -jN forced in submake: disabling jobserver mode.
rm -f pack.c
../ylwrap: line 111: -d: command not found
/bin/ln -s ../sql-common/pack.c pack.c
....
make[1]: Leaving directory `/src/mysql-5.4.0-beta/sql'
make: *** [all-recursive] Error 1
&lt;/pre&gt;
&lt;p&gt;What a lovely error &lt;b&gt; ../ylwrap: line 111: -d: command not found&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;ylwrap is part of yacc, and by default in this instance it&amp;#8217;s not even an installed package. I&amp;#8217;ve compiled MySQL long enough that it requires yacc, and actually bison but to you think it would hurt if the configure told the user this.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s also been some time since I&amp;#8217;ve compiled MySQL source, rather focusing on Drizzle.  I had forgotten just how many compile warnings MySQL throws. Granted a warning is not an error, but you should not just ignore them in building a quality product.&lt;/p&gt;</description>
	<pubDate>Thu, 11 Jun 2009 19:05:44 +0000</pubDate>
</item>
<item>
	<title>Official Drizzle Blog: Drizzle’s Regression Issue Discovered (a.k.a. Eric [Saves The] Day!)</title>
	<guid>http://blog.drizzle.org/?p=127</guid>
	<link>http://blog.drizzle.org/2009/06/11/drizzles-regression-issue-discovered/</link>
	<description>&lt;p&gt;I won&amp;#8217;t re-post what has already been said on the other blogs, but this seemed like a great central place to share the news.&lt;/p&gt;
&lt;p&gt;After a couple months of trying to hunt down the mysterious little gnome causing headache to the team, it seems Eric stumbled upon the solution, probably in the shower, where all good ideas come to us. Take a look at his blog post for all the sexy statistics (last link) &amp;#8211; I assume he did all the work after the shower, of course. Safety first, Eric!&lt;/p&gt;
&lt;p&gt;Links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://krow.livejournal.com/639040.html&quot;&gt;http://krow.livejournal.com/639040.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://jpipes.com/index.php?/archives/296-Drizzle-Performance-Regression-Solved-TCMalloc-vs.-No-TCMalloc.html&quot;&gt;http://jpipes.com/index.php?/archives/296-Drizzle-Performance-Regression-Solved-TCMalloc-vs.-No-TCMalloc.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.oddments.org/?p=67&quot;&gt;http://www.oddments.org/?p=67&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Thu, 11 Jun 2009 17:48:18 +0000</pubDate>
</item>
<item>
	<title>Official Drizzle Blog: Drizzle lines of code</title>
	<guid>http://blog.drizzle.org/?p=90</guid>
	<link>http://blog.drizzle.org/2009/06/11/drizzle-lines-of-code/</link>
	<description>&lt;p&gt;Jay along with help from many of you has done a great job automating a lot of our tools to provide Drizzle metrics to get a handle on how we are doing. You&amp;#8217;ve seen the regular emails that now generate &lt;a href=&quot;https://launchpad.net/sysbench&quot;&gt;sysbench&lt;/a&gt; numbers for each build, we also have regular automated builds to generate data for &lt;a href=&quot;http://valgrind.org/&quot;&gt;valgrind&lt;/a&gt;, &lt;a href=&quot;http://drizzle.org/lcov/&quot;&gt;lcov&lt;/a&gt;, &lt;a href=&quot;http://drizzle.org/doxygen/&quot;&gt;doxygen&lt;/a&gt; and &lt;a href=&quot;http://www.dwheeler.com/sloccount/&quot;&gt;sloc&lt;/a&gt;. Oh and lets not forget &lt;a href=&quot;http://gorf.tangent.org/source/&quot;&gt;OpenGrok&lt;/a&gt; which was setup by Trond.&lt;/p&gt;
&lt;p&gt;If you look at lcov we still have a few rough edges to work out and actually could use some help if any of you are familiar with the inner workings of lcov. &lt;/p&gt;
&lt;p&gt;The sloc graph below is showing data going back to March. Nice steady progress downwards which in this case is great! The big drop around build 960 was due to plugin clean up work by Monty and the slight increase around build 984 was from protocol work from Eric (all necessary and important!). Now if we could get one of you to help generate a nice dynamic web page to display this information&amp;#8230;&amp;#8230;any takers?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.drizzle.org/wordpress/wp-content/uploads/2009/06/drizzle-lines-of-code-300x224.jpg&quot; alt=&quot;drizzle-lines-of-code&quot; title=&quot;drizzle-lines-of-code&quot; width=&quot;600&quot; height=&quot;374&quot; class=&quot;alignnone size-medium wp-image-105&quot; /&gt;&lt;br /&gt;
See &lt;a href=&quot;http://drizzle.org/wiki/Image:Drizzle_Lines_of_Code.pdf&quot;&gt;here&lt;/a&gt; for a pdf of the graph&lt;/p&gt;</description>
	<pubDate>Thu, 11 Jun 2009 15:50:30 +0000</pubDate>
</item>
<item>
	<title>Trond Norbye: Compiling Drizzle on OpenSolaris 2009.06</title>
	<guid>http://blogs.sun.com/trond/entry/compiling_drizzle_on_opensolaris_2009</guid>
	<link>http://blogs.sun.com/trond/entry/compiling_drizzle_on_opensolaris_2009</link>
	<description>&lt;p&gt;
I thought it would be appropriate with a new and updated blog post on how to compile &lt;a href=&quot;http://drizzle.org/wiki/Main_Page&quot;&gt;Drizzle&lt;/a&gt; with the release of &lt;a href=&quot;http://www.opensolaris.org/os/downloads/&quot;&gt;OpenSolaris 2009.06&lt;/a&gt;. To make the blog more copy'n'paste friendly I have removed the prompt from all of the command's I am displaying :-)
&lt;/p&gt; 

&lt;p&gt;
The first thing we need to do is to install a complier, and all of the common tools used to build opensource projects. &lt;a href=&quot;http://drizzle.org/wiki/Main_Page&quot;&gt;Drizzle&lt;/a&gt; also require &lt;a href=&quot;http://monkey.org/~provos/libevent/&quot;&gt;libevent&lt;a&gt; and &lt;a href=&quot;http://www.gnu.org/software/gperf/&quot;&gt;gperf&lt;/a&gt;, and there exists precompiled packages for them. So let's go ahead and install the software with the following command:
&lt;/a&gt;&lt;/a&gt;&lt;/p&gt; 

&lt;pre&gt;
   &lt;b&gt;pfexec pkg install ss-dev SUNWlibevent SUNWgnu-gperf&lt;/b&gt;
&lt;/pre&gt;

  &lt;p&gt;I like to put the software I compile in separate &lt;a href=&quot;http://opensolaris.org/os/community/zfs/&quot;&gt;ZFS&lt;/a&gt; filesystems, so let's go ahead and create:&lt;/p&gt;
  &lt;p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;code&gt;/opt/dscm&lt;/code&gt; - To hold the scm systems&lt;/li&gt;
      &lt;li&gt;&lt;code&gt;/opt/drizzle&lt;/code&gt; - This is where we want our Drizzle installation&lt;/li&gt;
      &lt;li&gt;&lt;code&gt;/opt/gearman&lt;/code&gt; - This is where we want our Gearman installation&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/p&gt;
  &lt;p&gt;&lt;em&gt;&quot;Why not just put everything in &lt;code&gt;/usr/local&lt;/code&gt;?&quot;&lt;/em&gt; you may ask. Well, I don't like that because then I have a hard time figuring what files to remove when I want to uninstall a package. &lt;em&gt;&quot;This must turn into a long and complex path?&quot;&lt;/em&gt; would probably be your next question. The answer is no. Just create the appropriate symbolic links and you are good to go :-)&lt;/p&gt;
  &lt;p&gt;So let's go ahead and create the &lt;a href=&quot;http://opensolaris.org/os/community/zfs/&quot;&gt;ZFS&lt;/a&gt; filesystems:&lt;/p&gt;
  &lt;pre&gt;
for f in dscm drizzle gearman google
do
   pfexec zfs create -o mountpoint=/opt/$f rpool/$f
   pfexec chown `/usr/bin/id -u`:`/usr/bin/id -g` /opt/$f
done
  &lt;/pre&gt;
&lt;p&gt;
&lt;a href=&quot;http://drizzle.org/wiki/Main_Page&quot;&gt;Drizzle&lt;/a&gt;, &lt;a href=&quot;http://www.gearman.org&quot;&gt;Gearman&lt;/a&gt; and &lt;a href=&quot;http://launchpad.net/libmemcached&quot;&gt;libmemcached&lt;/a&gt; all use &lt;a href=&quot;http://bazaar-vcs.org/&quot;&gt;Bazaar&lt;/a&gt; for development, and there isn't a package available for &lt;a href=&quot;http://www.opensolaris.org/os/downloads/&quot;&gt;OpenSolaris&lt;/a&gt; so we need to install this ourself. The &lt;a href=&quot;http://bazaar-vcs.org/&quot;&gt;Bazaar&lt;/a&gt; team is really active and using the &quot;release early, release often&quot; model, and I want a easy way to keep up with the versions. Instead of having zombie files / versions laying around, I ended up with a model where I install each version into its own directory, and I have a symbolic link to the version I want to use. Because we install in a &quot;nonstandard&quot; location, we need to create a startup-script so that &lt;a href=&quot;http://www.python.org/&quot;&gt;Python&lt;/a&gt; can find the modules. So let's go ahead and install &lt;a href=&quot;http://bazaar-vcs.org/&quot;&gt;Bazaar&lt;/a&gt; (1.15 is the latest stable version right now) :
&lt;/p&gt;
&lt;pre&gt;
wget --no-check-certificate http://launchpad.net/bzr/1.15/1.15final/+download/bzr-1.15.tar.gz
gtar xfz bzr-1.15.tar.gz
cd bzr-1.15
python setup.py install --prefix=/opt/dscm/bazaar-1.15
mkdir /opt/dscm/bin
cat &amp;gt; /opt/dscm/bin/bzr &amp;lt;&amp;lt;EOF
#! /bin/ksh
export PYTHONPATH=/opt/dscm/bazaar/lib/python2.4/site-packages
exec /opt/dscm/bazaar/bin/bzr &quot;\$@&quot;
EOF
chmod a+x /opt/dscm/bin/bzr
ln -s bazaar-1.15 /opt/dscm/bazaar
cd ..
rm -rf bzr-1.15.tar.gz bzr-1.15
&lt;/pre&gt;
&lt;p&gt;
The next time you want to upgrade &lt;a href=&quot;http://bazaar-vcs.org/&quot;&gt;Bazaar&lt;/a&gt;, all you need to do is to move the symbolic link &lt;code&gt;/opt/dscm/bazaar&lt;/code&gt; to point to the new version. You can now either put /opt/dscm/bin into your path, or you can create something like &lt;code&gt;/opt/local/bin&lt;/code&gt; and create a symbolic link to &lt;code&gt;/opt/dscm/bin/bzr&lt;/code&gt; from there (and then put &lt;code&gt;/opt/local/bin&lt;/code&gt; in your path. To avoid path problems,  I'll keep on referring to &lt;code&gt;bzr&lt;/code&gt; with absolute path throughout the example.
&lt;/p&gt;
&lt;p&gt;
For some reason &lt;a href=&quot;http://www.opensolaris.org/os/downloads/&quot;&gt;OpenSolaris&lt;/a&gt; doesn't contain a prebuilt 64-bit version of &lt;a href=&quot;http://en.wikipedia.org/wiki/GNU_readline&quot;&gt;GNU readline&lt;/a&gt;, so that we need to compile that ourself (It is scheduled for an upcoming build AFAIK). To keep the example simple, I'll just install the readline library into &lt;code&gt;/opt/drizzle&lt;/code&gt;. So just execute the following commands to download, build and install:
&lt;/p&gt;
&lt;pre&gt;
wget http://ftp.gnu.org/gnu/readline/readline-6.0.tar.gz
gtar xfz readline-6.0.tar.gz
cd readline-6.0
./configure --disable-static --prefix=/opt/drizzle 
gmake all install
gmake clean
./configure --disable-static --prefix=/opt/drizzle --libdir=/opt/drizzle/lib/`isainfo -k` CFLAGS=&quot;-m64&quot;
gmake all install
ln -s `isainfo -k` /opt/drizzle/lib/64
ln -s . /opt/drizzle/lib/32
cd ..
rm -rf readline-6.0.tar.gz readline-6.0
&lt;/pre&gt;
&lt;p&gt;
&lt;em&gt;&lt;b&gt;Stop!&lt;/b&gt; why do you build it two times?&quot;&lt;/em&gt; If you look at the options there I compile one version with &quot;-m64&quot;, and that option will create a 64bit binary. Most people would probably not care for the 32bit binary, but I like to build both versions when I build a library (so that I don't have problems later on if I want to build a 32 (or 64 bit) binary using the library. The reason for the two symbolic links I create at the end is explained in chapter &lt;a href=&quot;http://docs.sun.com/app/docs/doc/816-5138/dev-env?l=en&amp;amp;a=view&quot;&gt;32-bit and 64-bit Libraries&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://drizzle.org/wiki/Main_Page&quot;&gt;Drizzle&lt;/a&gt; use &lt;a href=&quot;http://code.google.com/p/protobuf/&quot;&gt;Google Protocol buffers&lt;/a&gt; in the communication protocol, so let's go ahead and compile them. I don't use the latest version, because there is a compilation error in that version (and I haven't had the time to look at that yet):
&lt;/p&gt;
&lt;pre&gt;
wget http://protobuf.googlecode.com/files/protobuf-2.0.3.tar.gz
gtar xfz protobuf-2.0.3.tar.gz
cd protobuf-2.0.3
./configure --disable-static --with-zlib --prefix=/opt/google CPPFLAGS=&quot;-fast -m32&quot; LDFLAGS=&quot;-fast&quot; \
            --bindir=/opt/google/bin/i86
gmake all install
gmake clean
./configure --disable-static --with-zlib --prefix=/opt/google CPPFLAGS=&quot;-fast -m64&quot; LDFLAGS=&quot;-fast -m64&quot; \
            --libdir=/opt/google/lib/`isainfo -k` --bindir=/opt/google/bin/`isainfo -k`
gmake all install
cd ..
ln -s `isainfo -k` /opt/google/lib/64
ln -s . /opt/google/lib/32
cp /usr/lib/isaexec /opt/google/bin/protoc
rm -rf protobuf-2.0.3.tar.gz protobuf-2.0.3
&lt;/pre&gt;
&lt;p&gt;
With all the dependencies installed, we can go ahead and grab the source for &lt;a href=&quot;http://launchpad.net/libmemcached&quot;&gt;libmemcached&lt;/a&gt;, &lt;a href=&quot;http://launchpad.net/libdrizzle&quot;&gt;libdrizzle&lt;/a&gt;, &lt;a href=&quot;http://launchpad.net/gearman&quot;&gt;Gearman&lt;/a&gt; and &lt;a href=&quot;http://launchpad.net/drizzle&quot;&gt;Drizzle&lt;/a&gt;:
&lt;/p&gt;
&lt;pre&gt;
for f in libdrizzle gearmand libmemcached drizzle 
do
   /opt/dscm/bin/bzr branch lp:$f
done
&lt;/pre&gt;
&lt;p&gt;
So let's go ahead and start building them. &lt;a href=&quot;http://launchpad.net/libdrizzle&quot;&gt;libdrizzle&lt;/a&gt; is first up:
&lt;/p&gt;
&lt;pre&gt;
cd libdrizzle
./config/autorun.sh
./configure --disable-static --prefix=/opt/drizzle CFLAGS=&quot;-fast -m32&quot; LDFAGS=&quot;-fast&quot;
gmake all install
./configure --disable-static --prefix=/opt/drizzle --libdir=/opt/drizzle/lib/`isainfo -k` CFLAGS=&quot;-fast -m64&quot; LDFAGS=&quot;-fast&quot;
gmake clean
gmake all install
cd ..
&lt;/pre&gt;
&lt;p&gt;
The next one on the list is &lt;a href=&quot;http://launchpad.net/libmemcached&quot;&gt;libmemcached&lt;/a&gt;:
&lt;/p&gt;
&lt;pre&gt;
cd libmemcached
./config/bootstrap
PATH=$PATH:/usr/perl5/bin ./configure --disable-static --prefix=/opt/drizzle CFLAGS=&quot;-fast -m32&quot; LDFAGS=&quot;-fast&quot; \
    --without-memcached --bindir=/opt/drizzle/bin/i86
gmake all install
PATH=$PATH:/usr/perl5/bin ./configure --enable-64bit --disable-static --prefix=/opt/drizzle \
    --libdir=/opt/drizzle/lib/`isainfo -k` CFLAGS=&quot;-fast&quot; LDFAGS=&quot;-fast&quot; --without-memcached --bindir=/opt/drizzle/bin/`isainfo -k`
gmake clean
gmake all install
for f in memcat memrm memcp memerror memflush memslap memstat
do
cp /usr/lib/isaexec /opt/drizzle/bin/$f
done
cd ..
&lt;/pre&gt;
&lt;p&gt;
There is a problem with the configure script for &lt;a href=&quot;http://launchpad.net/gearman&quot;&gt;Gearman&lt;/a&gt;, so it is not able to create a 32 bit binary on a machine capable of running in 64 bit mode, so from now on we will only create 64 bit binaries (I will work on a patch for this):
&lt;/p&gt;
&lt;pre&gt;
cd gearmand
./config/bootstrap
./configure --prefix=/opt/gearman --disable-static --sbindir=/opt/gearman/sbin/`isainfo -k` --libdir=/opt/gearman/lib/`isainfo -k` \
            --bindir=/opt/gearman/bin/`isainfo -k` CFLAGS=&quot;-fast -I/opt/drizzle/include -m64&quot; \
            LDFLAGS=&quot;-L/opt/drizzle/lib/64 -R/opt/drizzle/lib/64&quot;
gmake clean
gmake all install
cd ..
cp /usr/lib/isaexec /opt/gearman/sbin/gearmand
cp /usr/lib/isaexec /opt/gearman/bin/gearman
&lt;/pre&gt;
&lt;p&gt;
Before we can start compiling &lt;a href=&quot;http://drizzle.org/wiki/Main_Page&quot;&gt;Drizzle&lt;/a&gt; we need to make sure that &lt;a href=&quot;http://drizzle.org/wiki/Main_Page&quot;&gt;Drizzle&lt;/a&gt; can detect our &lt;a href=&quot;http://www.pcre.org&quot;&gt;PCRE&lt;/a&gt; installation. &lt;a href=&quot;http://www.opensolaris.org/os/downloads/&quot;&gt;OpenSolaris&lt;/a&gt; ships with a version that is too new for the &lt;a href=&quot;http://drizzle.org/wiki/Main_Page&quot;&gt;Drizzle&lt;/a&gt; configure script, so that we need to create a symbolic link to make sure it detects it properly:
&lt;/p&gt;
&lt;pre&gt;
pfexec ln -s pcre/pcre.h /usr/include/pcre.h
&lt;/pre&gt;
&lt;p&gt;
Now all is set for compiling &lt;a href=&quot;http://drizzle.org/wiki/Main_Page&quot;&gt;Drizzle&lt;/a&gt;:
&lt;/p&gt;
&lt;pre&gt;
cd drizzle
PATH=$PATH:/opt/dscm/bin ./config/autorun.sh
PATH=$PATH:/opt/google/bin ./configure CPPFLAGS=&quot;-I/opt/google/include -I/opt/gearman/include -I/opt/drizzle/include&quot; \
   LDFLAGS=&quot;-L/opt/google/lib/64 -L/opt/gearman/lib/64 -L/opt/drizzle/lib/64 -R/opt/drizzle/lib/64:/opt/gearman/lib/64:/opt/google/lib/64&quot; \
   --prefix=/opt/drizzle --libdir=/opt/drizzle/lib/`isainfo -k` 
PATH=$PATH:/opt/google/bin gmake all install
&lt;/pre&gt;
&lt;p&gt;
Now you should have &lt;a href=&quot;http://drizzle.org/wiki/Main_Page&quot;&gt;Drizzle&lt;/a&gt; installed in &lt;code&gt;/opt/drizzle&lt;/code&gt;. If you look in some of my previous blog posts you should be able to find out how to install it as an SMF service :-)
&lt;/p&gt;
&lt;p&gt;Cheers&lt;/p&gt;</description>
	<pubDate>Thu, 11 Jun 2009 10:58:27 +0000</pubDate>
</item>
<item>
	<title>Brian Aker: Regression, The Bummer</title>
	<guid>http://krow.livejournal.com/639040.html</guid>
	<link>http://krow.livejournal.com/639040.html</link>
	<description>Wahoo!&lt;br /&gt;&lt;br /&gt;We finally &lt;a href=&quot;http://jpipes.com/index.php?/archives/296-Drizzle-Performance-Regression-Solved-TCMalloc-vs.-No-TCMalloc.html&quot;&gt;found the regression problem in Drizzle&lt;/a&gt; that we have been looking for over the last couple of months.&lt;br /&gt;&lt;br /&gt;In the processes of doing this was have walked every line of code. I sat the other night doing a single step through the entire sysbench run looking for anything out of place. Nothing came up at all.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.oddments.org/?p=67&quot;&gt;Eric&lt;/a&gt; was the person who finally asked the question &quot;could it be tcmalloc&quot;? No one had assumed it because it typically is a good solution (and we will be looking into why it turned out to be at fault, we will probably push now to more aggressively remove the MEMROOT system we inherited since we suspect it/it doesn't play well with C++).&lt;br /&gt;&lt;br /&gt;We have not been able to push any patches in the last couple of months that really fixed other performance issues that we know exist.&lt;br /&gt;&lt;br /&gt;Why?&lt;br /&gt;&lt;br /&gt;Because we feared complicating the problem of finding the original problem. We have all spent time looking through our ancestors to see if there was something we missed.&lt;br /&gt;&lt;br /&gt;1) Could it be C++?&lt;br /&gt;2) Could reducing the number of locks, creating a traffic jam around a single lock?&lt;br /&gt;3) Was UTF-8 at fault?&lt;br /&gt;&lt;br /&gt;In the end it was none of these :)&lt;br /&gt;&lt;br /&gt;So for us?&lt;br /&gt;&lt;br /&gt;We have patches coming soon to optimize the UTF-8 system, to minimize LOCK_open,  optimize/simplify the THR lock system simpler, and to partition caches internally.&lt;br /&gt;&lt;a href=&quot;http://pics.livejournal.com/krow/pic/0010251p/&quot;&gt;&lt;img src=&quot;http://pics.livejournal.com/krow/pic/0010251p/s320x240&quot; alt=&quot;chart.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;</description>
	<pubDate>Wed, 10 Jun 2009 19:14:26 +0000</pubDate>
</item>
<item>
	<title>Brian Aker: Stored Procedures or Server Side Scripting?</title>
	<guid>http://krow.livejournal.com/638941.html</guid>
	<link>http://krow.livejournal.com/638941.html</link>
	<description>Here is a bit of code I worked up for us a recently for Drizzle:&lt;br /&gt;&lt;br /&gt;drizzle&amp;gt; DELIMITER |&lt;br /&gt;Note that there is no semicolon after the '|' symbol, which we will use as the delimiter for our purposes. You have to choose a delimiter that does not appear in your procedure, and it can be more than one character.&lt;br /&gt;&lt;br /&gt;drizzle&amp;gt; CREATE PROCEDURE perl_hello (param1 string)&lt;br /&gt;    -&amp;gt; return &quot;Hello &quot; . $_[0] . &quot;!&quot;&lt;br /&gt;    -&amp;gt; |&lt;br /&gt;Query OK, 0 rows affected (0.05 sec)&lt;br /&gt;&lt;br /&gt;drizzle&amp;gt; CALL perl_hello('Brian');&lt;br /&gt;    -&amp;gt; |&lt;br /&gt;Query OK, 1 row affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;drizzle&amp;gt; DELIMITER ;&lt;br /&gt;drizzle&amp;gt; SELECT @perl\G&lt;br /&gt;*************************** 1. row ***************************&lt;br /&gt;@perl: Hello Brian!&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Stored Procedures!?!&lt;br /&gt;&lt;br /&gt;In an actual language!?!&lt;br /&gt;&lt;br /&gt;About a week ago I was talking to a CTO for a company who is looking at adoption of Drizzle. One of things he came back with was &quot;I don't need stored procedures, but I do need server side scripting&quot;.&lt;br /&gt;&lt;br /&gt;Back at the very first MySQL User's Conference we had a debate over the future of stored procedures in MySQL. I and some others really wanted the first stored procedure language to be external, David really wanted it to be PHP. I didn't see the value in implementing a single language. I thought people would be more interested in writing code in whatever language they wanted. Also, I figured that an external system would allow for different groups to develop languages more rapidly.&lt;br /&gt;&lt;br /&gt;Fast forward to when we began Drizzle. Parsers are where you spend a lot of your time. The smaller the parser the better off you are. So I went to task removing all of the signs of the SP language from Drizzle. We have been free of them now for over a year now (yes, long before we went public). Things are finally shaping up so that when we begin on Bell, our next milestone, stored procedures, or something like them, are now on our list.&lt;br /&gt;&lt;br /&gt;Though are they stored procedures, or is this server-side scripting?&lt;br /&gt;&lt;br /&gt;A few premises of the design:&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Any language should be pluggable. We won't have a native language.&lt;br /&gt;&lt;li&gt; We only support re-entrant engines. This solves all of the pre-locking problems that exist currently. We haven't removed 40% of the locks in Drizzle, only to have to come up with a bunch of new ones to support engines which were never built to handle this stuff.&lt;br /&gt;&lt;li&gt; While it won't be required, we will focus first on enabling scripting languages that are not in-process. Why is that? We don't want anyone to crash the database. Informix had this problem early on and got a bad rep for it. We want to avoid this.&lt;br /&gt;&lt;li&gt; We will enable driver writers to be able to communicate in a native way. AKA if you are writing something in Java, you will be able to use a JDBC interface inside of the database. For Perl DBI, etc. I want to be able to test my SP's in any environment. The difference between running in of the database, and out of should be trivial or non-existent.&lt;br /&gt;&lt;br /&gt;I am a little bit torn about using the SP call/creation SQL commands in Drizzle. You won't be doing the typical SP language (well... unless someone wants to write a plugin for them!). I would also like to encourage people to think differently about what writing server side code should look like. Personally I don't feel that stored procedures are the right solution for a lot of the cases, keep your business logic in your application layer(!), but we also know that users expect to be able to be able to run code locally. Triggering/Callback mechanisms can be very useful though, and enabling them is a part of this. Doing Triggers today in C is simple, but that is not something that everyone should/would/could want to do.&lt;br /&gt;&lt;br /&gt;Putting this in the plugin structure means no overhead to the parser or the rest of the database. Keeping them out of process means no drain or memory expansion of the Database. SMP boxes will benefit because you can confine the language VM to a particular set of processors/amount of memory.&lt;br /&gt;&lt;br /&gt;We don't want the database to ever blow up because of bugs in the execution language!&lt;br /&gt;&lt;br /&gt;And if you never want them? You never load the plugin in the first place.&lt;br /&gt;&lt;br /&gt;Why Perl? I've embedded Perl for years and know how to make it work. I've only done Java once, so I will leave that to other experts.&lt;br /&gt;&lt;br /&gt;I suspect I can find a Java person somewhere inside of Sun :)&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;</description>
	<pubDate>Wed, 10 Jun 2009 18:24:34 +0000</pubDate>
</item>
<item>
	<title>Jay Pipes: Drizzle Performance Regression Solved - TCMalloc vs. No TCMalloc</title>
	<guid>http://jpipes.com/index.php?/archives/296-guid.html</guid>
	<link>http://jpipes.com/index.php?/archives/296-Drizzle-Performance-Regression-Solved-TCMalloc-vs.-No-TCMalloc.html</link>
	<description>&lt;p&gt;
As many of you who follow the &lt;a href=&quot;https://lists.launchpad.net/drizzle-discuss/msg03687.html&quot;&gt;drizzle-discuss mailing list&lt;/a&gt; know, for the last three months, Drizzle developers have been hot (and many times cold) on the tail of a performance problem that we were seeing when comparing Drizzle with MySQL (any version of MySQL, not just 5.4).
&lt;/p&gt;
&lt;p&gt;
Briefly, on &lt;em&gt;certain&lt;/em&gt; machines, we were seeing Drizzle performing at approximately 50% of MySQL, with throughput measured in transactions per second on both a readonly and readwrite workload with Sysbench.  The frustrating part of the results was that on other machines, even other machines with virtually identical architectures, compilers, and operating system, we were seeing Drizzle &lt;em&gt;outperforming&lt;/em&gt; MySQL by around 20-30%.
&lt;/p&gt;
&lt;p&gt;
So, the Sun Drizzle team, friends in the Sun PAE (performance applications engineering?) team and various contributors set out to iteratively analyze exactly what was going on during sysbench runs in both MySQL and Drizzle.  We analyzed the call stacks of both servers using callgrind, cachegrind, vmstat, and other tools, looking for differences which could explain the differences in performance.
&lt;/p&gt;
&lt;p&gt;
These efforts ultimately showed either red herrings, or showed results which did not indicate where such a dramatic performance difference was coming from.  The efforts did, however, lead us to a much better understanding of the calling patterns, lock contention, and other parts of the servers, and this work will, I am sure, prove very valuable in the coming months as we continue to refine the execution of the server and remove more global contention points.
&lt;/p&gt;
&lt;p&gt;
So, what was the eventual culprit?  Turns out that Drizzle was, by default, linking the TCMalloc library from Google (libgoogle-perftools-dev package on Debian systems) when it was found installed on the machine.  This makes sense.  We thought that the TCMalloc library would provide a benefit to our Session-mem_root-based allocation strategy adopted from the MySQL core kernel.  Unfortunately, it turns out that TCMalloc dramatically degrades the throughput of the server.  When we disabled tcmalloc in our build and re-ran the benchmarks, our numbers went through the roof.
&lt;/p&gt;
&lt;p&gt;
The machine these results are from has the following specifications:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;16-core Quad Xeon quad-core Intel processors&lt;/li&gt;
&lt;li&gt;4M L2 cache size&lt;/li&gt;
&lt;li&gt;32GB RAM - though this is irrelevant as the benchmark was fully in-memory for a 1M row table and 256M innodb buffer pool...&lt;/li&gt;
&lt;li&gt;Ubuntu 8.10 OS - Linux kernel: 2.6.27-11-server x86_64&lt;/li&gt;
&lt;li&gt;GCC 4.3.2&lt;/li&gt;
&lt;li&gt;Disk system software RAID 5 across 3 146GB 15K RPM disks - though this is irrelevant as the benchmark was fully in-memory for a 1M row table and 256M innodb buffer pool...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The benchmarks were run for a minimum of 10 iterations of 60 seconds each on a readonly and readwrite workload with 1M rows in the table.  The configuration was:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;--innodb_buffer_pool_size=256M&lt;/li&gt;
&lt;li&gt;--innodb_log_file_size=128M&lt;/li&gt;
&lt;li&gt;--innodb_log_buffer_size=8M&lt;/li&gt;
&lt;li&gt;--innodb_additional_mem_pool_size=16M&lt;/li&gt;
&lt;li&gt;--innodb_thread_concurrency=0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The &lt;a href=&quot;http://drizzle.org/wiki/Automation_Documentation&quot; title=&quot;Drizzle Automation Suite&quot;&gt;Drizzle Automation Suite&lt;/a&gt; was used for benchmarking.
&lt;/p&gt;
&lt;p&gt;
Below, you'll see the before and afters of disabling TCMalloc on both a readonly and readwrite workload.  We think you'll agree the results are, well, dramatic.
&lt;/p&gt;
&lt;h2&gt;READONLY workload&lt;/h2&gt;
&lt;p&gt;
&lt;strong&gt;With TCMalloc linked:&lt;/strong&gt;
&lt;/p&gt;
&lt;pre&gt;
+------+-------------+
| c    | tps         |
+------+-------------+
|    2 | 1067.444444 | 
|    4 | 1435.190000 | 
|    8 | 1937.624444 | 
|   16 | 2601.817778 | 
|   32 | 3367.795556 | 
|   64 | 3930.240000 | 
|  128 | 3940.764444 | 
|  256 | 3071.503333 | 
|  512 | 2003.308889 | 
| 1024 | 1224.704444 | 
| 2048 |  530.994444 | 
+------+-------------+
&lt;/pre&gt;
&lt;p&gt;
&lt;strong&gt;Without TCMalloc linked:&lt;/strong&gt;
&lt;/p&gt;
&lt;pre&gt;
+------+-------------+
| c    | tps         |
+------+-------------+
|    2 | 1511.681000 | 
|    4 | 2714.570000 | 
|    8 | 4408.986000 | 
|   16 | 5795.430000 | 
|   32 | 5619.712000 | 
|   64 | 4988.760000 | 
|  128 | 4483.512000 | 
|  256 | 3914.125000 | 
|  512 | 2541.946000 | 
| 1024 | 1325.511000 | 
| 2048 |  643.446000 | 
+------+-------------+
&lt;/pre&gt;
&lt;p&gt;
And for you pretty graph people:
&lt;/p&gt;
&lt;img src=&quot;http://chart.apis.google.com/chart?chtt=READONLY+workload&amp;chts=000000,10&amp;chs=500x300&amp;chf=bg,s,ffffff|c,s,ffffff&amp;chxt=x,y&amp;chxl=0:|2|4|8|16|32|64|128|256|512|1024|2048|1:|0.00|2,897.71|5,795.43&amp;cht=bvg&amp;chd=t:18.41,24.76,33.43,44.89,58.11,67.81,67.99,52.99,34.56,21.13,9.16|26.08,46.83,76.07,100.00,96.96,86.08,77.36,67.53,43.86,22.87,11.10&amp;chdl=TCMalloc|No+TCMalloc&amp;chco=990000,ffcc00&amp;chbh=10&quot; alt=&quot;Google Chart&quot; /&gt;
&lt;h2&gt;READWRITE workload&lt;/h2&gt;
&lt;p&gt;
&lt;strong&gt;With TCMalloc linked:&lt;/strong&gt;
&lt;/p&gt;
&lt;pre&gt;
+------+-------------+
| c    | tps         |
+------+-------------+
|    2 |  589.006667 | 
|    4 |  842.576667 | 
|    8 | 1142.627778 | 
|   16 | 1561.532222 | 
|   32 | 2160.194444 | 
|   64 | 2169.077778 | 
|  128 | 1793.243333 | 
|  256 | 1241.846667 | 
|  512 |  860.450000 | 
| 1024 |  491.360000 | 
+------+-------------+
&lt;/pre&gt;
&lt;p&gt;
&lt;strong&gt;Without TCMalloc linked:&lt;/strong&gt;
&lt;/p&gt;
&lt;pre&gt;
+------+-------------+
| c    | tps         |
+------+-------------+
|    2 |  676.238000 | 
|    4 | 1096.708000 | 
|    8 | 1661.204000 | 
|   16 | 2210.335000 | 
|   32 | 2353.749000 | 
|   64 | 2202.926000 | 
|  128 | 2087.273000 | 
|  256 | 1717.978000 | 
|  512 | 1361.468000 | 
| 1024 | 1000.169000 | 
| 2048 |  288.299000 | 
+------+-------------+
&lt;/pre&gt;
&lt;p&gt;
Again, pretty graph:
&lt;/p&gt;
&lt;img src=&quot;http://chart.apis.google.com/chart?chtt=READWRITE+workload&amp;chts=000000,10&amp;chs=500x300&amp;chf=bg,s,ffffff|c,s,ffffff&amp;chxt=x,y&amp;chxl=0:|2|4|8|16|32|64|128|256|512|1024|1:|0.00|1,176.87|2,353.74&amp;cht=bvg&amp;chd=t:25.02,35.79,48.54,66.34,91.77,92.15,76.18,52.76,36.55,20.87|28.73,46.59,70.57,93.90,100.00,93.59,88.67,72.98,57.84,42.49&amp;chdl=TCMalloc|No+TCMalloc&amp;chco=990000,ffcc00&amp;chbh=10&quot; alt=&quot;Google Chart&quot; /&gt;
&lt;p&gt;
Note: With TCMalloc linked, the readwrite workload would not complete at 2048 connections. Without TCMalloc linked, it did complete, although with a significant reduction in throughput.  This is likely because of the known InnoDB issue regarding 1024 active transactions limit...
&lt;/p&gt;
&lt;h2&gt;Open Invitation to Benchmark Drizzle, MySQL, XtraDB and PostgreSQL&lt;/h2&gt;
&lt;p&gt;
The above results compare only Drizzle to itself with and without TCMalloc.  We benchmarked also against MySQL 5.4, but as we've previously stated, we don't think comparison numbers should be published unless by a third or objective party.  &lt;strong&gt;This serves as an open invitation to benchmark Drizzle against MySQL 5.4, XTraDB, PostgreSQL 8.4 and anything else&lt;/strong&gt;.  We'd love to see a validation that our principles of smaller, cleaner code with fewer global contention points, using standard libraries and having features live in a module ecosystem truly does enable a faster, leaner query-running machine.  By the same token, if published benchmarks identify cases where Drizzle underperforms compared to another RDBMS, we'd love to tackle the performance problems the benchmarks show.  The more data, the better &lt;img src=&quot;http://jpipes.com/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; class=&quot;emoticon&quot; /&gt;
&lt;/p&gt;</description>
	<pubDate>Wed, 10 Jun 2009 17:03:12 +0000</pubDate>
	<author>nospam@example.com (Jay Pipes)</author>
</item>
<item>
	<title>Eric Day: Drizzle Regression Hunting</title>
	<guid>http://www.oddments.org/?p=67</guid>
	<link>http://www.oddments.org/?p=67</link>
	<description>&lt;p&gt;We&amp;#8217;ve been looking for a &lt;a href=&quot;http://drizzle.org/&quot;&gt;Drizzle&lt;/a&gt; regression for some time now, and today I decided I would take a step back and make another attempt to find it. The first step in doing this was to reproduce this consistently and find a baseline. We&amp;#8217;ve noticed it most dramatically with a 16 concurrent connection test from sysbench in read-only mode. I used two 16-core Intel machines running Linux we have for development. We&amp;#8217;ve noticed the regression on certain machines but not all, and these two machines provided one of each. I also setup a MySQL 5.1.35 server to use as a baseline to give some comparisons outside of Drizzle. So first, a few more details on the machines:&lt;/p&gt;
&lt;pre&gt;
Machine 1: 16 core, 16GB RAM, cache sizes from dmesg:
[    0.010000] CPU: L1 I cache: 32K, L1 D cache: 32K
[    0.010000] CPU: L2 cache: 4096K
From /proc/cpuinfo:
cache_alignment : 64

Machine 2: 16 core, 40GB RAM, cache sizes from dmesg:
[    0.010000] CPU: Trace cache: 12K uops, L1 D cache: 16K
[    0.010000] CPU: L2 cache: 1024K
[    0.010000] CPU: L3 cache: 16384K
From /proc/cpuinfo
cache_alignment : 128
&lt;/pre&gt;
&lt;p&gt;For Drizzle I used the latest trunk in Launchpad (r1058), and for MySQL I downloaded mysql-5.1.35-linux-x86_64-glibc23.tar.gz from &lt;a href=&quot;http://www.mysql.com/&quot;&gt;mysql.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For sysbench, I grabbed the Drizzle branch of it at lp:~drizzle-developers/sysbench/trunk since this has the libdrizzle driver. The libdrizzle driver also supports the MySQL so I use it to test against both. The sysbench commands I used were:&lt;/p&gt;
&lt;p&gt;Drizzle: &lt;i&gt;sysbench &amp;#8211;test=oltp &amp;#8211;oltp-read-only=on &amp;#8211;max-time=15 &amp;#8211;max-requests=0 &amp;#8211;oltp-table-size=1000000 &amp;#8211;num-threads=16 &amp;#8211;db-ps-mode=disable &amp;#8211;db-driver=drizzle &amp;#8211;drizzle-host=127.0.0.1 &amp;#8211;drizzle-port=4427 &amp;#8211;drizzle-db=test &amp;#8211;drizzle-user=root &amp;#8211;drizzle-table-engine=innodb run&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;MySQL: &lt;i&gt;sysbench &amp;#8211;test=oltp &amp;#8211;oltp-read-only=on &amp;#8211;max-time=15 &amp;#8211;max-requests=0 &amp;#8211;oltp-table-size=1000000 &amp;#8211;num-threads=16 &amp;#8211;db-ps-mode=disable &amp;#8211;db-driver=drizzle &amp;#8211;drizzle-host=127.0.0.1 &amp;#8211;drizzle-port=3306 &amp;#8211;drizzle-db=test &amp;#8211;drizzle-user=root &amp;#8211;drizzle-table-engine=innodb &amp;#8211;drizzle-mysql=on run&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;I started Drizzle and MySQL with the following options. These are not meant to be finely tuned options, but just enough to get the servers running with some sane comparable defaults and able to reproduce the regression.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;bin/mysqld &amp;#8211;no-defaults &amp;#8211;server-id=1 &amp;#8211;port=3306 &amp;#8211;socket=/home/eday/other/mysql.data/sock.master &amp;#8211;basedir=/home/eday/other/mysql &amp;#8211;datadir=/home/eday/other/mysql.data/db.master &amp;#8211;log-error=/home/eday/other/mysql.data/db.master/error &amp;#8211;innodb-buffer-pool-size=128M &amp;#8211;innodb-log-file-size=64M &amp;#8211;innodb-log-buffer-size=8M &amp;#8211;innodb-thread-concurrency=0 &amp;#8211;innodb-additional-mem-pool-size=16M &amp;#8211;character-set-server=utf8 &amp;#8211;table-open-cache=4096 &amp;#8211;open-files-limit=4096 &amp;#8211;pid-file=/home/eday/other/mysql.data/db.master/pid&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;drizzled &amp;#8211;datadir=/home/eday/other/drizzle.data &amp;#8211;innodb-buffer-pool-size=128M &amp;#8211;innodb-log-file-size=64M &amp;#8211;innodb-log-buffer-size=8M &amp;#8211;innodb-thread-concurrency=0 &amp;#8211;innodb-additional-mem-pool-size=16M &amp;#8211;table-open-cache=4096 &amp;#8211;table-definition-cache=4096&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Now with everything up and running, I gathered some data. Headings are: -&lt;/p&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;1-drizzle&lt;/td&gt;
&lt;td&gt;1-mysql&lt;/td&gt;
&lt;td&gt;2-drizzle&lt;/td&gt;
&lt;td&gt;2-mysql&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TPS&lt;/td&gt;
&lt;td&gt;1335&lt;/td&gt;
&lt;td&gt;2434&lt;/td&gt;
&lt;td&gt;1559&lt;/td&gt;
&lt;td&gt;1239&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;5&quot;&gt;vmstat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;in&lt;/td&gt;
&lt;td&gt;6k&lt;/td&gt;
&lt;td&gt;110k&lt;/td&gt;
&lt;td&gt;60k&lt;/td&gt;
&lt;td&gt;50k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cs&lt;/td&gt;
&lt;td&gt;100k&lt;/td&gt;
&lt;td&gt;210k&lt;/td&gt;
&lt;td&gt;120k&lt;/td&gt;
&lt;td&gt;100k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;us&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sy&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;id&lt;/td&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wa&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;5&quot;&gt;valgrind with cachegrind tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TPS&lt;/td&gt;
&lt;td&gt;5.21&lt;/td&gt;
&lt;td&gt;3.15&lt;/td&gt;
&lt;td&gt;3.55&lt;/td&gt;
&lt;td&gt;1.96&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iref&lt;/td&gt;
&lt;td&gt;858M&lt;/td&gt;
&lt;td&gt;1011M&lt;/td&gt;
&lt;td&gt;668M&lt;/td&gt;
&lt;td&gt;789M&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;As you can see, we hit the major regression in column one. Our interrupts and context switches are way out of line, and the CPU is mostly idle. Note though that when run under cachegrind (valgrind &amp;#8211;tool=callgrind ), we see the normal pattern and don&amp;#8217;t notice the regression. This means to reproduce we can&amp;#8217;t have any intrusive debugging tools. I also tried counting system calls as a sanity check and found (using strace -fc ):&lt;/p&gt;
&lt;pre&gt;
1-drizzle: 402 TPS
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 55.47  106.807940        2867     37252     11127 futex
 13.97   26.907878      220556       122           select
  5.67   10.913999    10913999         1           rt_sigtimedwait
  5.29   10.181982      565666        18           poll
  2.16    3.1154314          11    362463           read
  1.63    2.1146381        1479      2128           pread
  1.55    2.981563          16    181220           write
  0.67    0.1297864         122     10598           sched_yield
  0.67    0.1288412        1394       924           nanosleep

1-mysql: 245 TPS
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 60.03  108.1509367        4594     23836      5835 futex
 15.42   27.1119721      100788       279         1 select
  5.25    8.1579991     1064443         9           rt_sigtimedwait
  1.65    2.1005637         637      4716           pread
  1.30    1.1367183          21    110986           write
  1.07    1.950471           9    221889    221889 sched_setscheduler
  1.06    1.929137           9    223097      1044 read

2-drizzle: 276 TPS
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 65.93  115.556211        3704     31198      8101 futex
 15.30   26.810000      203106       132           select
  5.89   10.330000    10330000         1           rt_sigtimedwait
  5.80   10.170000      565000        18           poll
  2.65    4.647123          37    125060           write
  2.35    4.116470          16    250158           read
  1.72    3.021068        1483      2037           pread
  0.27    0.477662       20768        23           fsync
  0.04    0.072760           4     18218           madvise
  0.02    0.043264          18      2357           sched_yield

2-mysql: 168 TPS
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 68.25  100.851565        6704     15044      3328 futex
 21.22   31.350000      116111       270         1 select
  5.17    7.642591      347391        22           rt_sigtimedwait
  1.93    2.853778         619      4612           pread
  1.15    1.694888          11    153040       346 read
  0.90    1.327743           9    152529    152529 sched_setscheduler
  0.78    1.145964          15     76305           write
  0.32    0.468542          37     12705           madvise
&lt;/pre&gt;
&lt;p&gt;Again, when tracing the process to count system calls, we see the regression disappear, which leaves us with a smaller set of tools to use.&lt;/p&gt;
&lt;p&gt;So what next? One theory we were tossing around is a cache alignment issues. This seems like a pretty dramatic drop in performance to be caused by this, but I ran a test to see what the behavior of a process is when you are being throttled by a shared cache line. The results showed idle CPU, but the interrupts and context switches did not drop off. This does not follow the same pattern we saw in Drizzle (interrupts and context switches did drop off). Our cache line size is also smaller on the machine showing the regression, so that did not help support this theory.&lt;/p&gt;
&lt;p&gt;While stabbing at a few other ideas, I ran ldd to see which libraries were being use in the two drizzled binaries on each machine. Suppressing some common libs:&lt;/p&gt;
&lt;pre&gt;
1-drizzle: ldd drizzled/drizzled
        ...
        libpcre.so.3 =&gt; /lib/libpcre.so.3 (0x00007f9a88532000)
        libtbb.so.2 =&gt; /usr/lib/libtbb.so.2 (0x00007f9a88320000)
        libtcmalloc.so.0 =&gt; /usr/lib/libtcmalloc.so.0 (0x00007fcced5bc000)
        ...

2-drizzle: ldd drizzled/drizzled
        ...
        libpcre.so.3 =&gt; /lib/libpcre.so.3 (0x00007fc0af803000)
        libtbb.so.2 =&gt; /usr/lib/libtbb.so.2 (0x00007fc0af5e9000)
        ...
&lt;/pre&gt;
&lt;p&gt;The machine showing the regression is linking with tcmalloc. Looking at the drizzle configure.ac, we use libtcmalloc by default if it is found (machine 2 does not have tcmalloc installed). I relinked drizzled without tcmalloc and received these results:&lt;/p&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;1-drizzle&lt;/td&gt;
&lt;td&gt;1-mysql&lt;/td&gt;
&lt;td&gt;2-drizzle&lt;/td&gt;
&lt;td&gt;2-mysql&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TPS&lt;/td&gt;
&lt;td&gt;2751&lt;/td&gt;
&lt;td&gt;2434&lt;/td&gt;
&lt;td&gt;1559&lt;/td&gt;
&lt;td&gt;1239&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;There it is! For some reason tcmalloc was giving us a 51% performance drop. Perhaps this is due to the tcmalloc version or settings we need to tweak for performance (something to look into later), but for now disabling this by default is the solution. We&amp;#8217;re verifying the fix now and should be in the Drizzle trunk shortly.&lt;/p&gt;</description>
	<pubDate>Tue, 09 Jun 2009 22:32:03 +0000</pubDate>
</item>
<item>
	<title>Stewart Smith: Drizzle pluggable MetadataStore (or: no table definition file on disk)</title>
	<guid>http://www.flamingspork.com/blog/?p=1655</guid>
	<link>http://www.flamingspork.com/blog/2009/06/09/drizzle-pluggable-metadatastore-or-no-table-definition-file-on-disk/</link>
	<description>&lt;p&gt;My code is shaping up rather nicely (see&lt;a href=&quot;https://code.launchpad.net/~stewart-flamingspork/drizzle/discovery&quot;&gt; https://code.launchpad.net/~stewart-flamingspork/drizzle/discovery&lt;/a&gt;) and I&amp;#8217;m planning to submit a merge-request for it later today.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m about to commit code that implements a MetadataStore for the ARCHIVE engine. This means that for ARCHIVE tables, you only have the .ARZ file on disk. The table definition protobuf is stored in the ARZ during createTable() and the ARCHIVE MetadataStore can read it.&lt;/p&gt;
&lt;p&gt;The StorageEngine now gets the drizzled::message::Table (i.e. the table definition protobuf) as a parameter. Eventually, we will fully be using this to tell the engine about the table structure (this is a work-in-progress). The advantages of using the proto as the standard way of passing around table definitions are numerous. I see it as almost essential to get this into the replication log for cross-DBMS replication.&lt;/p&gt;
&lt;p&gt;We still have the default way of storing table metadata- in a table definition file (for MySQL it&amp;#8217;s the FRM, for Drizzle it&amp;#8217;s the table proto serialized into a file ending in &amp;#8216;.dfe&amp;#8217;). However, in my &lt;a href=&quot;https://code.launchpad.net/~stewart-flamingspork/drizzle/discovery&quot;&gt;discovery branch&lt;/a&gt; if an engine provides its own MetadataStore, then it is the StorageEngine who is responsible for storing the table definition (either in it&amp;#8217;s data file or data dictionary). It is also then responsible for making sure rename works and that the definition is cleaned up on drop table.&lt;/p&gt;
&lt;p&gt;The MetadataStore provided by the StorageEngine is also used when searching for metadata such as for SHOW CREATE TABLE, SHOW TABLES, INFORMATION_SCHEMA, CREATE LIKE and when getting the table definition before opening the table.&lt;/p&gt;
&lt;p&gt;The way the ARCHIVE MetadataStore works is that it reads the table proto out of the header of the ARZ file when asked for it. This has the side effect of now being able to copy ARZ files between servers and have it &amp;#8220;just work&amp;#8221;.&lt;/p&gt;
&lt;p&gt;It will be really nice if we directly interface to the InnoDB Data Dictionary (or even just store the table protos in an InnoDB table manipulated in the same transaction as the DDL) as then we move a lot closer to closing a number of places where we (and MySQL) are not crash-safe.&lt;/p&gt;</description>
	<pubDate>Tue, 09 Jun 2009 03:25:17 +0000</pubDate>
</item>
<item>
	<title>Stewart Smith: Drizzle Tarballs for next milestone: aloha</title>
	<guid>http://www.flamingspork.com/blog/?p=1653</guid>
	<link>http://www.flamingspork.com/blog/2009/06/09/drizzle-tarballs-for-next-milestone-aloha/</link>
	<description>&lt;p&gt;Wanting a quick build-and-play way to get &lt;a href=&quot;https://launchpad.net/drizzle/&quot;&gt;Drizzle&lt;/a&gt;? We&amp;#8217;re dropping weekly-ish &lt;a href=&quot;https://launchpad.net/drizzle/trunk/aloha&quot;&gt;tarballs for the Aloha milestone&lt;/a&gt;. The latest milestone also has preliminary GCC 4.4 support&lt;/p&gt;
&lt;p&gt;You can see regular announcements on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://planetdrizzle.org/&quot;&gt;http://planetdrizzle.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.drizzle.org/&quot;&gt;http://blog.drizzle.org/&lt;/a&gt; &amp;#8211; which is just announcements and the like.&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Tue, 09 Jun 2009 02:02:45 +0000</pubDate>
</item>
<item>
	<title>Official Drizzle Blog: Drizzle source tarball 1055 has been released</title>
	<guid>http://blog.drizzle.org/?p=87</guid>
	<link>http://blog.drizzle.org/2009/06/08/drizzle-source-tarball-1055-has-been-released/</link>
	<description>&lt;p&gt;Drizzle source tarball based on build 1055 has now been released. The change log can be viewed at https://launchpad.net/drizzle/trunk/aloha. &lt;/p&gt;
&lt;p&gt;For this release we continue to focus on code clean up, build improvements, increased test coverage and performance improvements. We also removed LOCK TABLES, BIT_COUNT and BIT_LENGTH, made several logging improvements, started the first several phases of refactoring JOIN and provided initial support for gcc 4.4 although for now you still need &lt;a href=&quot;https://lists.launchpad.net/drizzle-discuss/msg04208.html&quot;&gt;Monty&amp;#8217;s patch&lt;/a&gt; for protobuf to use gcc 4.4. &lt;/p&gt;
&lt;p&gt;-Lee&lt;/p&gt;</description>
	<pubDate>Mon, 08 Jun 2009 20:49:46 +0000</pubDate>
</item>
<item>
	<title>Ronald Bradford - 42SQL: OSCON 2009 at a discounted rate</title>
	<guid>http://ronaldbradford.com/blog/?p=1590</guid>
	<link>http://ronaldbradford.com/blog/oscon-2009-at-a-discounted-rate-2009-06-05/</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://en.oreilly.com/oscon2009&quot;&gt;OSCON&lt;/a&gt; moves this year from Portland to San Jose.  &lt;/p&gt;
&lt;p&gt;As one the community panel for &lt;a href=&quot;http://en.oreilly.com/oscon2009/public/schedule/detail/8196&quot;&gt;Drizzle: Status, Principles, and Ecosystem&lt;/a&gt; I also have a speaker discount which you can combine with O&amp;#8217;Reilly having also extended early bird registration until June 23.&lt;/p&gt;
&lt;p&gt;Be sure to add the &lt;b&gt;os09fos&lt;/b&gt; code for an additional 20% off, and be sure to shout me a drink there.&lt;/p&gt;</description>
	<pubDate>Fri, 05 Jun 2009 21:33:31 +0000</pubDate>
</item>
<item>
	<title>Marcus Eriksson: Pluggable Batch Update Handlers</title>
	<guid>tag:blogger.com,1999:blog-6543848899761399219.post-5585923381620045604</guid>
	<link>http://developian.blogspot.com/2009/05/pluggable-batch-update-handlers.html</link>
	<description>Reading about the awesome batch insert performance blog post by Mark Matthews last week (&lt;a href=&quot;http://www.jroller.com/mmatthews/entry/speeding_up_batch_inserts_for&quot;&gt;http://www.jroller.com/mmatthews/entry/speeding_up_batch_inserts_for&lt;/a&gt;) got me thinking, why has this not been done before? Connector/J must be the most deployed JDBC driver in the world and batch inserts are a common use case, why hasn't the community stepped up and implemented the query rewrite feature before? Most likely because it is a complex issue that requires deep knowledge of the rest of the driver. I have been a happy Connector/J user myself for several years and never considered doing something like this.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To handle this complexity in drizzle-jdbc the batch query functionality is pluggable, i.e. you can implement a small interface and tell the connection to use that implementation. So, if anyone out there has some crazy ideas about how to improve performance of batch inserts/updates, it should be fairly easy.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;First you need to implement the ParameterizedBatchHandler interface, it has two methods:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;void addToBatch(ParameterizedQuery query);&lt;br /&gt;int [] executeBatch(Protocol protocol) throws QueryException;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;addToBatch is called when addBatch() is called on the PreparedStatement. I.e. when someone wants to add the current set of parameters in a prepared statement to the current batch - the query parameter contains all the information you need to make something smart.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;executeBatch is called when executeBatch() is called on the PreparedStatement. The protocol sent to this method should be used to send the query to the server (though, you could make new connections to the server, fork up a few threads and send queries to the server in parallel).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Then, to make the connection use your handler:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Connection connection = DriverManager.getConnection(&quot;jdbc:drizzle://localhost:4427/test_units_jdbc&quot;);&lt;br /&gt;if(connection.isWrapperFor(DrizzleConnection.class)) {&lt;br /&gt;   DrizzleConnection dc = connection.unwrap(DrizzleConnection.class);&lt;br /&gt;   dc.setBatchQueryHandler(VerrrryFastBatchHandler.class);&lt;br /&gt;}&lt;br /&gt;PreparedStatement ps = connection.prepareStatement(&quot;insert into asdf (somecol) values (?)&quot;);&lt;br /&gt;ps.setString(1,&quot;aa&quot;);&lt;br /&gt;ps.addBatch();&lt;br /&gt;ps.executeBatch();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The current implementation in drizzle-jdbc simply stores all queries in a list and when doing executeBatch, the queries are sent, one-by-one, to the server. I'm planning on doing a rewrite handler in the near future.&lt;br /&gt;&lt;br /&gt;Look at these files for more information:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href=&quot;http://bazaar.launchpad.net/~krummas/drizzle-jdbc/trunk/annotate/head%3A/src/main/java/org/drizzle/jdbc/internal/common/ParameterizedBatchHandler.java&quot;&gt;ParameterizedBatchHandler.java&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href=&quot;http://bazaar.launchpad.net/~krummas/drizzle-jdbc/trunk/annotate/head%3A/src/main/java/org/drizzle/jdbc/internal/common/DefaultParameterizedBatchHandler.java&quot;&gt;DefaultParameterizedBatchHandler.java&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://bazaar.launchpad.net/~krummas/drizzle-jdbc/trunk/annotate/head%3A/src/test/java/org/drizzle/jdbc/DriverTest.java#L430&quot;&gt;DriverTest.java&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/6543848899761399219-5585923381620045604?l=developian.blogspot.com&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 04 Jun 2009 20:07:24 +0000</pubDate>
	<author>noreply@blogger.com (Marcus Eriksson)</author>
</item>
<item>
	<title>Brian Aker: Drizzle, State of Testing</title>
	<guid>http://krow.livejournal.com/638654.html</guid>
	<link>http://krow.livejournal.com/638654.html</link>
	<description>Testing, Testing, Testing...&lt;br /&gt;&lt;br /&gt;I've gotten a number of questions about how we are doing testing, and even how our methodology for accepting code works :)&lt;br /&gt;&lt;br /&gt;A lot of this comes from running open source projects for almost a couple of decades (hell, if I toss in uploading public domain to software to BBS'es for the Commodore 64 it is a bit longer!).&lt;br /&gt;&lt;br /&gt;One of the most important rules I have learned over the years is that anything that is not automated and not required, will get skipped.&lt;br /&gt;&lt;br /&gt;Today Drizzle runs 213 tests, the entire MySQL test suite minus tests that are for features we don't have. We don't allow for any regression, meaning that no one is allowed to disable a test in order to get their code pushed. Our test suite was also modified so that we can run all of the tests against a particular engine. Today we do this with both Innodb and PBXT. So instead of having &quot;engine specific&quot; tests, we can test everything. Feedback we are getting from storage engine vendors is that this is golden. Even if they never release for Drizzle, they can use it to vastly increase the testing they do today.&lt;br /&gt;&lt;br /&gt;We also do not allow any code to be pushed that causes a compiler to toss a warning. We do this for a wide set of versions of gcc, and also for Sun Studio. We treat warnings as errors :)&lt;br /&gt;&lt;br /&gt;We are also enormously proud of this fact. This took a lot of effort :)&lt;br /&gt;&lt;br /&gt;Our most recent change is that we now include a regression test for performance for sysbench. For each push into our &quot;staging&quot; tree we run a full test at different steps  of &quot;connections&quot;. We test both read-only and read-write workloads. My only real complaint right now about this system is that we look at absolute numbers, and being a math geek, I would really like some more information on standard deviation :)&lt;br /&gt;&lt;br /&gt;The development process we use maximizes our use of tools. For Drizzle we accept no patches via email. Your patch must come through Launchpad, where you must have an account. We do this so that we can always track down &quot;who did what&quot;. This is done almost entirely without exception, and the exception being that I am sure someone at some time as either pointed out a bug in code to me or has made a comment on how something should be written while reading over my shoulder. &lt;br /&gt;&lt;br /&gt;We don't require anyone to sign a &quot;all your bases belong to us&quot; sort of contract. Speaking as myself, I personally find them unpalatable and frequently suggests developers think about them before ever signing. Code flowing is what I find important. With Drizzle we have had a 100+ contributors, and I suspect that number would be much smaller if we had taken a different point of view on this. One of the most interesting conversations I ever had about this topic was with Rasmus, who has continued to refuse to sign the Apache Foundation's agreement. If someone was to ever put code in from their employer, we can strip the code back out in seconds.  We can also hand over all of their information to the original copyright holder for them to prosecute. The ones of us who do final review of code are very nitpicky about this. One of the nice things about &quot;source code&quot; is that it has finger prints. Anything that doesn't follow our coding style, which is very specific, stands out.&lt;br /&gt;&lt;br /&gt;Code which was not original tends to always show it roots. I know from talking to Theodore Tso that IBM gives its developers who take in code to its open source projects, a class in how to identify copyright violations. IBM's general handling of open source always tends to impress me.&lt;br /&gt;&lt;br /&gt;Having a modular approach in our design also means that any &quot;large&quot; sort of change can be reduced down to a plugin. Our average patches are bug fixes or refactoring bits. If you find that you enjoy making code readable, fast, and standard looking, you will probably enjoy working on Drizzle.&lt;br /&gt;&lt;br /&gt;If you want to write fun and new code, then you should look at writing plugins!&lt;br /&gt;&lt;br /&gt;On a personal note, if I was to write a database from scratch, I would go after a completely different problem domain. I still happen to need a relational database though, which is why I work on Drizzle.&lt;br /&gt;&lt;br /&gt;That and the people who are working on the project are both awesome and fun :)&lt;br /&gt;&lt;br /&gt;Code flow in Drizzle is pretty simple. You write a patch, you submit a tree to Laundpad, and one of the captains reviews it and puts it into their tree. I pull from one of their trees and merge into a local tree. Before I push the code it has to pass all tests/etc on 64bit Intel Fedora, Open Solaris Sparc, Solaris Sparc, and OSX. When I get around to buying myself a new desktop Mac I am going to spin up a few more platforms in virtual boxes, so that I can test more platforms. There is a simple Gearman system I use to populate and run the code on all of these systems.&lt;br /&gt;&lt;br /&gt;Once the code passes on all of the above it goes to our staging tree on launchpad. From there the automated system gives me feedback on regression. If we pass then the code goes to trunk. Our turn around time for code is frequently about 24 hours. Since all of the above testing is done, we drop tarballs anytime we want too.&lt;br /&gt;&lt;br /&gt;It is pretty much clockwork for us. If a human wasn't involved I suspect we could just set a cronjob to handle it every two weeks (and who knows... if Lee gets bored with this, maybe he will do exactly that!).&lt;br /&gt;&lt;br /&gt;What is the future?&lt;br /&gt;&lt;br /&gt;Today we generate automated reports for cachegrind, callgrind, and valgrind. We run pahole by hand. We are told that there is a new tool for generating random queries for MySQL for crash testing, we need to look into this.&lt;br /&gt;&lt;br /&gt;I've also got a set of tests written around drizzleslap (aka mysqlslap) that we need to toss in soon.&lt;br /&gt;&lt;br /&gt;All of these need to go into the process. We should never regress on L2 misses or branch predictions. We should never see holes in our structures/classes.&lt;br /&gt;&lt;br /&gt;We don't have enough tests for failure cases. Our test coverage is public:&lt;br /&gt;&lt;a href=&quot;http://drizzle.org/lcov/index.html&quot;&gt;http://drizzle.org/lcov/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I want to see that increased. The problem is that there has never been a test system for &quot;this is how to fail at X&quot;. A few hacks have been written, but we need to come up with a complete methodology for this. The one open source database that has an awesome test suite for this is SQLite, and we need to spend some time learning from them all of what they do.&lt;br /&gt;&lt;br /&gt;Over dinner recently with Josh Berkus, he mentioned the work they are doing on pgbench. I am hoping that we can get a patch in it so that it will support libdrizzle. That way we could use one of the Postgres tools as well. &lt;br /&gt;&lt;br /&gt;These are our next big steps :)&lt;br /&gt;&lt;br /&gt;Have any suggestions? Want to contribute? All of our tools are open source. We welcome extensions and they are general enough that almost any other database could use them as well!</description>
	<pubDate>Thu, 04 Jun 2009 17:05:56 +0000</pubDate>
</item>
<item>
	<title>Marcus Eriksson: Drizzle-JDBC 0.3</title>
	<guid>tag:blogger.com,1999:blog-6543848899761399219.post-8665424453936793324</guid>
	<link>http://developian.blogspot.com/2009/06/drizzle-jdbc-03.html</link>
	<description>I just pushed up 0.3 of drizzle-jdbc to the maven repository, g