<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss version="2.0">

<channel>
	<title>Planet Drizzle</title>
	<link>http://planetdrizzle.org</link>
	<language>en</language>
	<description>Planet Drizzle - http://planetdrizzle.org</description>

<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/drizzle" type="application/rss+xml" /><item>
	<title>Brian Aker: Drizzle,  Views And Triggers</title>
	<guid>http://krow.livejournal.com/641510.html</guid>
	<link>http://krow.livejournal.com/641510.html</link>
	<description>I've been trading twitter responses back and forth with &lt;a href="http://twitter.com/jswanhart"&gt; jswanhart&lt;/a&gt; of &lt;a href="http://www.kickfire.com/"&gt;Kickfire&lt;/a&gt; recently on the state and planning of Views in Drizzle.&lt;br /&gt;&lt;br /&gt;In Drizzle right now we do not have views. There are plans to add views which never "materialize", but that is still a couple of milestones off.&lt;br /&gt;&lt;br /&gt;One of the problems when talking about views is that the word "materialize" has been over used.&lt;br /&gt;&lt;br /&gt;To "materialize" a view, means that you take the view definition, turn it into a temporary table, and then join it against a query. In Drizzle we consider this a "no no".&lt;br /&gt;&lt;br /&gt;Why? Because any query that does this is more then likely going to turn out to be to slow to be of any real use in our domain space. The same problem exists with subqueries though for the time being we are leaving them in. Subqueries at this point are only semi-useful. Many of the common methods of using them result in a materialized table, which just makes them too slow. Our plans involve eliminating these sorts of queries and only allowing ones which can be "merged".&lt;br /&gt;&lt;br /&gt;This will be limiting, but experience shows that the current state of use is that most users don't want to be able to write a query that will under perform (unless I am wrong, Google has disabled the subquery system in their version of MySQL just to make sure no developer gets anywhere near this part of the system).&lt;br /&gt;&lt;br /&gt;Frankly, I would like to take this one step further at some point, and eliminate cartesian joins unless they are explicitly requested. How often do you really want one? Pretty much never. Typically they are done by accident and you either wait out the mistake or start hitting "CTRL-C" hoping to kill the query before it eats up the machine.&lt;br /&gt;&lt;br /&gt;So "materializing" is out, but what is not out is "materialized views".  This is an SQL feature whereby a table is created and is updated based on entries from one or more tables, either syncronously or asycronously. This is something I do expect us to support at some point.&lt;br /&gt;&lt;br /&gt;One of the strengths in the current design is that the replication system lives as a service to the micro-kernel.&lt;br /&gt;&lt;br /&gt;What does this mean?&lt;br /&gt;&lt;br /&gt;It means that we internally have triggers on any sort of DDL/DML event that occurs in the server. As soon as someone wants to write up some parser goodness we can have basic triggers in whatever language you want.&lt;br /&gt;&lt;br /&gt;We also gain materialized views via the same method. The "tires" on this project have been kicked around but no one has started it yet.&lt;br /&gt;&lt;br /&gt;Having everything built on the same entry point to the micro-kernel really simplifies the design of a lot of different components. We have someone doing the design on direct to memcached replication for instance (we will have UDF as well, but this will simplify cache coherency and not require you to modify any SQL to make it work).&lt;br /&gt;&lt;br /&gt;Materialized Views are pretty cool, materializing a view though pretty much make you want to cry.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;BTW It was just pointed out to me that Justin had some of his &lt;a href="http://swanhart.livejournal.com/128280.html"&gt;own thoughts&lt;/a&gt; about this.</description>
	<pubDate>Wed, 15 Jul 2009 20:15:43 +0000</pubDate>
</item>
<item>
	<title>Official Drizzle Blog: OSCON 2009 – Drizzle and Gearman</title>
	<guid>http://blog.drizzle.org/?p=224</guid>
	<link>http://blog.drizzle.org/2009/07/15/oscon-2009-drizzle-and-gearman/</link>
	<description>&lt;p&gt;Lots of activity at &lt;a href="http://en.oreilly.com/oscon2009"&gt;OSCON&lt;/a&gt; next week where there will be several presentations, tutorials, BOF&amp;#8217;s and a Drizzle and &lt;a href="http://www.gearman.org/index.php"&gt;Gearman&lt;/a&gt; booth in the conference hall. Hope to see you there!&lt;/p&gt;
&lt;li&gt;&lt;a href="http://wiki.postgresql.org/wiki/PgDaySanJose2009#pgGearman:_A_distributed_worker_queue_for_PostgreSQL"&gt;PgDay San Jose 2009: pgGearman: A distributed worker queue for PostgreSQL &lt;/a&gt; &amp;#8211; Sunday 4:25 p.m.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.oreilly.com/oscon2009/public/schedule/detail/8206"&gt;Gearman &amp;#8211; Build Your Own Distributed Platform in 3 Hours&lt;/a&gt; &amp;#8211; Tuesday 8:30 a.m.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.oreilly.com/oscon2009/public/schedule/detail/8198"&gt;Gearman &amp;#8211; Bringing the Power of Map/Reduce to Everyday Applications&lt;/a&gt; &amp;#8211; Wed 11:35 a.m.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.oreilly.com/oscon2009/public/schedule/detail/9775"&gt;Gearman BOF&lt;/a&gt; &amp;#8211; Wed 7:00 p.m.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.oreilly.com/oscon2009/public/schedule/detail/8196"&gt;Drizzle: Status, Principles, and Ecosystem&lt;/a&gt; Thursday 10:45 a.m.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.oreilly.com/oscon2009/public/schedule/detail/9776"&gt;Drizzle BOF&lt;/a&gt; &amp;#8211; Thursday 7:00 p.m.&lt;/li&gt;</description>
	<pubDate>Wed, 15 Jul 2009 17:55:50 +0000</pubDate>
</item>
<item>
	<title>Marcus Eriksson: Drizzle JDBC 0.4 - Rewrite batch handler</title>
	<guid>tag:blogger.com,1999:blog-6543848899761399219.post-547140548251314670</guid>
	<link>http://developian.blogspot.com/2009/07/drizzle-jdbc-04-rewrite-batch-handler.html</link>
	<description>I just pushed up Drizzle JDBC 0.4, which, most importantly, contains a rewrite batch handler (I guess much like the one Mark Matthews announced for Connector/J a couple of months ago). It gives the expected 10x+ batch insert improvements, on my laptop I can insert 1M "simple" rows in under 20 seconds.&lt;br /&gt;&lt;br /&gt;It is written as a plugin, so you need to do this to your Connection to enable it:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;if(connection.isWrapperFor(DrizzleConnection.class)) {&lt;br /&gt;  DrizzleConnection dc = connection.unwrap(DrizzleConnection.class);&lt;br /&gt;  dc.setBatchQueryHandlerFactory(new RewriteParameterizedBatchHandlerFactory());&lt;br /&gt;}&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;(Yes, it will be possible to configure plugins via the connection string and by setting properties). Please, try it out and report any bugs you find!&lt;br /&gt;&lt;br /&gt;I also wrote a Scala version of the plugin, it is not bundled with the 0.4 release though - if you are interrested, it is on &lt;a href="https://code.launchpad.net/~krummas/+junk/rw-bh-scala-drizzle-jdbc"&gt;Launchpad&lt;/a&gt;. Scala is awesome, hoping to do some more Scala development in the near future.&lt;br /&gt;&lt;br /&gt;This is the changelog for 0.4:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Findbug fixes&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Internal refactorings&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Make sure all tests pass against both MySQL and Drizzle&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Batch handler API cleanups, details &lt;a href="http://drizzle.org/wiki/JDBC/PluginInterfaces#Batch_Query_Handler"&gt;here.&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Fix read of 16bit word (by Trond Norbye)&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;A query rewrite batch handler&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Download 0.4 &lt;a href="http://jdbc.drizzle.org/mavenrepo/releases/org/drizzle/jdbc/drizzle-jdbc/0.4/"&gt;here.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/6543848899761399219-547140548251314670?l=developian.blogspot.com" /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 14 Jul 2009 21:00:13 +0000</pubDate>
	<author>noreply@blogger.com (Marcus Eriksson)</author>
</item>
<item>
	<title>Brian Aker: Drizzle in the News...</title>
	<guid>http://krow.livejournal.com/641179.html</guid>
	<link>http://krow.livejournal.com/641179.html</link>
	<description>I've been too busy to blog lately. On our plate right now for Drizzle is pretty full.  We have the new event system pushed for Drizzle, the OOP fixes that allow us to use C++ in the codebase, the refactoring on the Storage Engine interface... and on top of this all of the great work being done by Google Summer of Code Students!&lt;br /&gt;&lt;br /&gt;Here are some blog posts by others :)&lt;br /&gt;&lt;br /&gt;Want to know a little more about our build system?&lt;br /&gt;&lt;a href="http://blog.drizzle.org/2009/07/09/drizzle-build-system/"&gt;http://blog.drizzle.org/2009/07/09/drizzle-build-system/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;How about a write up from one of the engine writers on changes he is making for the new engine interface:&lt;br /&gt;&lt;a href="http://torum.net/2009/07/changes-to-the-drizzle-storage-subsystem/"&gt;http://torum.net/2009/07/changes-to-the-drizzle-storage-subsystem/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We keep adding more tools to our regression system, here is a load emulator:&lt;br /&gt;&lt;a href="http://torum.net/2009/07/introducing-skyload/"&gt;http://torum.net/2009/07/introducing-skyload/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A mention of Drizzle from RedMonk:&lt;br /&gt;&lt;a href="http://redmonk.com/sogrady/2009/07/02/lamp-of-the-clouds/"&gt;http://redmonk.com/sogrady/2009/07/02/lamp-of-the-clouds/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Finally, a blog on moving Wordpress to Drizzle:&lt;br /&gt;&lt;a href="http://bethesignal.org/blog/2009/07/08/wordpress-and-drizzle/"&gt;http://bethesignal.org/blog/2009/07/08/wordpress-and-drizzle/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Getting Started with Drizzle and PHP:&lt;br /&gt;&lt;a href="http://devzone.zend.com/article/4793-Getting-Started-with-Drizzle-and-PHP"&gt;http://devzone.zend.com/article/4793-Getting-Started-with-Drizzle-and-PHP&lt;/a&gt;</description>
	<pubDate>Fri, 10 Jul 2009 17:56:12 +0000</pubDate>
</item>
<item>
	<title>Monty Taylor: pandora-build - make your software compile as pedantically as ours!</title>
	<guid>http://mysql-ha.com/post/63</guid>
	<link>http://mysql-ha.com/post/63</link>
	<description>&lt;p&gt;I've been working on cleanups to the Drizzle autoconf and automake system. Actually, to be fair, I've been doing this work on Drizzle, Gearmand, libdrizzle and libmemcached. &lt;/p&gt;&lt;p&gt;In all of those projects, we have the same set of build ideas:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Warnings == Errors&lt;/li&gt;&lt;li&gt;As many warnings as we can enable&lt;/li&gt;&lt;li&gt;Lots of people will be building directly from bzr&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;As it turns out, I'm pretty lazy, and I got tired of remember to port the latest m4 macro fix that we made in one project across to the other three. O, hai - code reuse!&lt;/p&gt;&lt;p&gt;So I did some refactoring and split the several macros and large portions of the configure.ac files out into a set of m4 macro files. These now live in their own project, which you can grab from bzr via:&lt;/p&gt;&lt;p&gt;&amp;nbsp;bzr branch lp:pandora-build&lt;/p&gt;&lt;p&gt;Although each of the macros is useful by itself, the fun part is that you can just put:&lt;/p&gt;&lt;p&gt;&amp;nbsp;PANDORA_CANONICAL_TARGET&lt;/p&gt;&lt;p&gt;at the top of your configure.ac file right after AC_INIT&amp;nbsp; and the normal AC_CONFIG macros. It will set up libtool, automake, run some standard tests, and turn on assloads of warnings, etc.. essentially setting your build env up to be just like we're running for all of our projects. There are a few parameters that you can pass to control some optional features (drizzle, for instance, is the only one of our projects that uses gnulib)&lt;/p&gt;&lt;p&gt;To add the macros to your project, you can do one of two things. First, you can just copy all of the m4 files in to your m4 dir, but that will make Robert Collins sad. The better way is that you can do:&lt;/p&gt;&lt;p&gt;&amp;nbsp;autoreconf&lt;/p&gt;&lt;p&gt;&amp;nbsp;./configure &lt;/p&gt;&lt;p&gt;&amp;nbsp;make install&lt;/p&gt;&lt;p&gt;in the pandora-build tree, which will add all of these macros to /usr/share/aclocal. &lt;/p&gt;&lt;p&gt;I welcome folks to start using them in their projects and to give me feedback. I'm sure feedback #1 will be &amp;quot;better documentation&amp;quot;...&amp;nbsp; &lt;/p&gt;</description>
	<pubDate>Fri, 10 Jul 2009 16:57:14 +0000</pubDate>
</item>
<item>
	<title>Official Drizzle Blog: Drizzle Build System</title>
	<guid>http://blog.drizzle.org/?p=156</guid>
	<link>http://blog.drizzle.org/2009/07/09/drizzle-build-system/</link>
	<description>&lt;p&gt;I wanted to follow up from &lt;a href="http://krow.livejournal.com/638654.html"&gt;Brian&amp;#8217;s blog&lt;/a&gt; last month where he was talking about how we do our testing in the &lt;a href="http://launchpad.net/drizzle"&gt;Drizzle&lt;/a&gt; project. Brian mentioned our build system and I thought I would expand on that. &lt;/p&gt;
&lt;p&gt;Right now in Drizzle we use both &lt;a href="https://hudson.dev.java.net/"&gt;Hudson&lt;/a&gt; and &lt;a href="http://buildbot.net/trac"&gt;Buildbot&lt;/a&gt; for automated and continuous builds. Our dashboards can be seen &lt;a href="http://solace.inaugust.com/"&gt;here&lt;/a&gt; and &lt;a href="http://gorf.tangent.org/hudson/drizzle/"&gt;here&lt;/a&gt;.  We use both email and IRC for notifications when builds fail. While the dashboards are not as Green as we would like right now, we are only a few fixes away from having it generally back on track and our goal is to keep it on track as we move forward! &lt;/p&gt;
&lt;p&gt;We have a wide variety of build clients as you can see and run our build process from both the trunk and staging code base. All changes first go through staging for verification which means making sure it still builds (warnings are always treated as errors), passes all unit tests (no disabling of tests) and has not regressed in our &lt;a href="http://drizzle.org/performance/"&gt;sysbench numbers&lt;/a&gt;.  After code is promoted to trunk we also run updates for &lt;a href="http://drizzle.org/lcov/"&gt;LCOV&lt;/a&gt;, &lt;a href="http://drizzle.org/sloc/"&gt;SLOC&lt;/a&gt; and &lt;a href="http://drizzle.org/doxygen/"&gt;Doxygen&lt;/a&gt;.  Trond&lt;/p&gt; also set up regular runs for &lt;a href="http://gorf.tangent.org/source/"&gt;OpenGrok&lt;/a&gt;. 
&lt;p&gt;Jay&lt;/p&gt; put together a great &lt;a href="http://drizzle.org/wiki/Automation_Documentation"&gt;automation system&lt;/a&gt; to run sysbench, doxygen, lcov, sloc as well as the ability to run  Valgrind tools as part of the sysbench run. Eric and Monty also extended this to use &lt;a href="http://www.gearman.org/"&gt;Gearman&lt;/a&gt; so we can &lt;a href="http://drizzle.org/wiki/Gearman_Integration"&gt;submit jobs&lt;/a&gt; on demand to various machines if we want to run jobs out of cycle. 
&lt;p&gt;Thanks to &lt;a href="http://michaelshadle.com/"&gt;Michael Shadle&lt;/a&gt; for putting together our &lt;a href="http://drizzle.org/performance/"&gt;fancy graphs&lt;/a&gt; on the wiki and also donating a few machines for buildbot clients. &lt;/p&gt;
&lt;p&gt;Always looking for more clients so if you have a machine you can provide, let us know.  &lt;/p&gt;
&lt;p&gt;Any suggestions for improvement? &lt;/p&gt;</description>
	<pubDate>Fri, 10 Jul 2009 03:34:09 +0000</pubDate>
</item>
<item>
	<title>Toru Maesaka: Notes on changes made to the Drizzle Storage Subsystem</title>
	<guid>http://torum.net/?p=2274</guid>
	<link>http://torum.net/2009/07/changes-to-the-drizzle-storage-subsystem/</link>
	<description>&lt;p&gt;Yesterday I merged the&lt;a href="https://code.launchpad.net/~tmaesaka/blitzdb/trunk"&gt; BlitzDB tree&lt;/a&gt; with &lt;a href="https://launchpad.net/drizzle"&gt;Drizzle&lt;/a&gt;&amp;#8217;s trunk for the first time in a long time (yeah&amp;#8230;) and discovered some interesting changes made to the storage subsystem while I was away.&lt;/p&gt;
&lt;p&gt;Previously all functions that caused an action to the storage engine was a member of the handler class but various things like table creation and transaction related functions have now moved to the StorageEngine class. These changes are somewhat drastic but makes good sense for Drizzle to grow further since it makes the subsystem easier to understand and frees Drizzle from the interface design that was strongly affected by MyISAM. For those that are interested, the StorageEngine class is located in &amp;#8220;drizzled/plugin/storage_engine.h&amp;#8221;. &lt;/p&gt;
&lt;p&gt;For me it was pretty easy to update BlitzDB to work with the new subsystem since I don&amp;#8217;t have anything special in the engine that required me to use my brain. I only had to move &lt;a href="http://forge.mysql.com/wiki/MySQL_Internals_Custom_Engine#bas_ext"&gt;bas_ext()&lt;/a&gt;, table creation and rename functions over to the StorageEngine class and adjust it to the new interface:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="c"&gt;&lt;span&gt;int&lt;/span&gt; createTableImpl&lt;span&gt;&amp;#40;&lt;/span&gt;Session &lt;span&gt;*&lt;/span&gt;session&lt;span&gt;,&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; &lt;span&gt;*&lt;/span&gt;table_name&lt;span&gt;,&lt;/span&gt; 
                    Table &lt;span&gt;*&lt;/span&gt;table_arg&lt;span&gt;,&lt;/span&gt; HA_CREATE_INFO &lt;span&gt;*&lt;/span&gt;ha_create_info&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; 
&amp;nbsp;
&lt;span&gt;int&lt;/span&gt; renameTableImpl&lt;span&gt;&amp;#40;&lt;/span&gt;Session &lt;span&gt;*&lt;/span&gt;session&lt;span&gt;,&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; &lt;span&gt;*&lt;/span&gt;from&lt;span&gt;,&lt;/span&gt; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;char&lt;/span&gt; &lt;span&gt;*&lt;/span&gt;to&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For a real example, I recommend comparing the old InnobaseEngine class declaration with the updated one. As for where this redesign is going, this is the answer I got on the Drizzle channel from &lt;a href="http://www.flamingspork.com/blog/"&gt;Stewart&lt;/a&gt; who did the actual work for all this.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;stewart: tmaesaka: the basic idea is that handler becomes a cursor. the StorageEngine is for actions on the engine.&lt;br /&gt;
stewart: tmaesaka: and handler is a cursor on a table.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Something to keep in mind if you&amp;#8217;re thinking about creating or porting a storage engine to Drizzle &lt;img src="http://torum.net/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /&gt; &lt;/p&gt;</description>
	<pubDate>Thu, 09 Jul 2009 09:26:43 +0000</pubDate>
</item>
<item>
	<title>Toru Maesaka: Introducing skyload: a libdrizzle based load emulator</title>
	<guid>http://torum.net/?p=2272</guid>
	<link>http://torum.net/2009/07/introducing-skyload/</link>
	<description>&lt;p&gt;Today, I would like to introduce &amp;#8220;&lt;strong&gt;skyload&lt;/strong&gt;&amp;#8220;, a small project that I&amp;#8217;ve been working on for the last couple of weeks. In brief, skyload is a &lt;a href="https://launchpad.net/libdrizzle"&gt;libdrizzle&lt;/a&gt; based load emulation tool that is capable of running concurrent load tests against database instances that can speak &lt;a href="https://launchpad.net/drizzle"&gt;Drizzle&lt;/a&gt; (and/or) the &lt;a href="http://www.mysql.com"&gt;MySQL&lt;/a&gt; protocol.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/skyload/"&gt;http://code.google.com/p/skyload/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Something I&amp;#8217;d like to emphasize here is that, skyload is not a replacement for &lt;a href="http://dev.mysql.com/doc/refman/5.4/en/mysqlslap.html"&gt;mysqlslap&lt;/a&gt; or drizzleslap since it only provides a subset of what they can do. As I&amp;#8217;ve stated on the project description, skyload is designed to do a good job at this subset of tasks by giving you more control over how you emulate the load in an intuitive way. For instructions on installing skyload and quickly getting up to speed, take a look at the following URL:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/skyload/wiki/Tutorial_en"&gt;http://code.google.com/p/skyload/wiki/Tutorial_en&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As you will see, the first release only contains bare minimum specifications (only INSERT load emulation). The next step I want to take is to discuss features that other storage engine developers would actually find useful. This is because I started writing skyload for primarily myself and other storage engine developers (more on this next).&lt;/p&gt;
&lt;h3&gt;Original Intentions&lt;/h3&gt;
&lt;p&gt;I originally began writing skyload for BlitzDB development since I wanted to see the concurrent insertion performance of &lt;a href="http://tokyocabinet.sourceforge.net"&gt;Tokyo Cabinet&lt;/a&gt; based row storage mechanism that I wrote. I first tried benchmarking the write performance with drizzleslap but it turned out that drizzleslap&amp;#8217;s original code (inherited from MySQL 6.0) is rather buggy and segfaulted quite easily (I&amp;#8217;m planning on contributing a fix for this).&lt;/p&gt;
&lt;p&gt;So I gave up on drizzleslap for the time being and started looking at the &lt;a href="http://sysbench.sourceforge.net/"&gt;sysbench&lt;/a&gt; port for Drizzle that Monty Taylor has been working on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mysql-ha.com/post/62"&gt;sysbench: now with Drizzle&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sysbench for Drizzle is a lovely piece of software but it couldn&amp;#8217;t quite provide what I was looking for (concurrent insertion benchmark). After having a quick conversation with Monty about my requirements on the Drizzle IRC channel, I decided to write a libdrizzle based benchmark tool that can be used for both Drizzle and MySQL.&lt;/p&gt;
&lt;h3&gt;Future Plans&lt;/h3&gt;
&lt;p&gt;I don&amp;#8217;t want to reinvent existing software that works (or those that can be fixed). The project positioning that I&amp;#8217;m hoping for skyload is a good mix between (mysql|drizzle)slap and sysbench. Hopefully it will be useful to folks that works on Drizzle and MySQL related projects.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m totally open for ideas, patches, and contributors. If this project had caught your attention, please don&amp;#8217;t hesitate to ping me or the Drizzle community &lt;img src="http://torum.net/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /&gt; &lt;/p&gt;
&lt;p&gt;I haven&amp;#8217;t setup a mailing list since I don&amp;#8217;t see the need for it yet so if you&amp;#8217;d like to share your thoughts I think either the &lt;a href="https://launchpad.net/~drizzle-discuss"&gt;Drizzle mailing list&lt;/a&gt; or IRC (#drizzle @ irc.freenode.net) is the quickest way for me to get back to you.&lt;/p&gt;
&lt;p&gt;Happy Hacking!&lt;/p&gt;</description>
	<pubDate>Tue, 07 Jul 2009 02:38:00 +0000</pubDate>
</item>
<item>
	<title>Official Drizzle Blog: Drizzle source tarball 1088 has been released</title>
	<guid>http://blog.drizzle.org/?p=148</guid>
	<link>http://blog.drizzle.org/2009/07/06/drizzle-source-tarball-1088-has-been-released/</link>
	<description>&lt;p&gt;Drizzle source tarball based on &lt;a href="https://launchpad.net/drizzle/trunk/aloha"&gt;build 1088&lt;/a&gt; has been released. The change log can be viewed &lt;a href="https://launchpad.net/drizzle/trunk/aloha"&gt;here&lt;/a&gt;. While continuing to do a lot of great code clean up, this release also features work by Padraig who has got a great start working on extracting I_S out into plugins.&lt;/p&gt;
&lt;p&gt;We also now support &lt;a href="http://code.google.com/p/protobuf/"&gt;protobuf 2.1&lt;/a&gt; except when using gcc 4.4 or if you are running on Solaris. Monty is working on getting a patch into protobuf 2.1.1 for the gcc 4.4 issue. He is also working closely with the SunStudio engineers to get that issue resolved as well.&lt;/p&gt;
&lt;p&gt;-Lee &lt;/p&gt;</description>
	<pubDate>Mon, 06 Jul 2009 18:01:15 +0000</pubDate>
</item>
<item>
	<title>Ronald Bradford - 42SQL: An important Drizzle/MySQL difference</title>
	<guid>http://ronaldbradford.com/blog/?p=1719</guid>
	<link>http://ronaldbradford.com/blog/an-important-drizzlemysql-difference-2009-07-04/</link>
	<description>&lt;p&gt;There are many features that are similar in MySQL and Drizzle. There are also many that are not.  &lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve previously discussed topics like &lt;a href="http://ronaldbradford.com/blog/a-beginners-look-at-drizzle-datatypes-and-tables-2009-04-01/"&gt;Datatypes and tables&lt;/a&gt;, &lt;a href="http://ronaldbradford.com/blog/a-beginners-look-at-drizzle-sql_mode-2009-04-06/"&gt;SQL_MODE&lt;/a&gt; and &lt;a href="http://ronaldbradford.com/blog/a-beginners-look-at-drizzle-getting-around-with-show-2009-03-31/"&gt;SHOW&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A key difference in Drizzle is the definition of utf8 as 4 bytes, not 3 bytes as in MySQL. This combined with no other character sets leads to an impact on the length in keys supported in Innodb.&lt;/p&gt;
&lt;p&gt;During a recent test with a client, I was unable to successfully migrated the schema and provide the same schema due to unique indexes defined for utf8 VARHAR(255) fields.  &lt;/p&gt;
&lt;p&gt;Here is the problem.&lt;/p&gt;
&lt;pre&gt;
mysql&gt; create table t1(c1 int unsigned not null auto_increment primary key, c2 varchar(255) not null, unique key (c2)) engine=innodb default charset latin1;
Query OK, 0 rows affected (0.05 sec)
mysql&gt; create table t2(c1 int unsigned not null auto_increment primary key, c2 varchar(255) not null, unique key (c2)) engine=innodb default charset utf8;
Query OK, 0 rows affected (0.03 sec)
mysql&gt; create table t3(c1 int unsigned not null auto_increment primary key, c2 varchar(256) not null, unique key (c2)) engine=innodb default charset utf8;
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
&lt;/pre&gt;
&lt;pre&gt;
drizzle&gt; create table t1(c1 int not null auto_increment primary key, c2 varchar(255) not null, unique key (c2)) engine=innodb default charset latin1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your Drizzle server version for the right syntax to use near 'charset latin1' at line 1
drizzle&gt; create table t1(c1 int not null auto_increment primary key, c2 varchar(255) not null, unique key (c2)) engine=innodb;
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
&lt;/pre&gt;
&lt;p&gt;Only a maximum of 191 is now possible.&lt;/p&gt;
&lt;pre&gt;
drizzle&gt; create table t1(c1 int not null auto_increment primary key, c2 varchar(191) not null, unique key (c2)) engine=innodb;
Query OK, 0 rows affected (0.03 sec)
drizzle&gt; create table t1(c1 int not null auto_increment primary key, c2 varchar(192) not null, unique key (c2)) engine=innodb;
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
&lt;/pre&gt;</description>
	<pubDate>Sat, 04 Jul 2009 04:01:11 +0000</pubDate>
</item>
<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="http://www.flickr.com/photos/sog/3631752801/" title="town of the clouds by sogrady, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2481/3631752801_ca061e6ec6.jpg" width="500" height="336" alt="town of the clouds" /&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="http://www.datacenterknowledge.com/archives/2009/06/25/mullenweg-open-source-trumps-the-cloud/"&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="http://www.newyorker.com/reporting/2009/05/11/090511fa_fact_gladwell?currentPage=all"&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="http://www.newyorker.com/reporting/2009/05/11/090511fa_fact_gladwell?currentPage=all"&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="http://www.redmonk.com/cote/2009/07/02/itmanagement046/"&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="http://redmonk.com/sogrady/2009/04/02/what-are-we-writing-to/"&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="http://redmonk.com/sogrady/2008/11/14/cloud-types/"&gt;instance and fabric&lt;/a&gt; &amp;#8211; we&amp;#8217;ve seen 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 your 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="http://code.reasonablysmart.com/"&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="http://www.redhat.com/about/news/prarchive/2009/cloud-forum.html"&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="http://redmonk.com/sogrady/2008/09/30/is-the-cloud-stupid/"&gt;called&lt;/a&gt; cloud computing &amp;#8220;stupidity.&amp;#8221; Others have &lt;a href="http://radar.oreilly.com/archives/2006/08/open-source-licenses-are-obsol.html"&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="http://www.funambol.com/blog/capo/2008/03/agpl-is-osi-approved-sweet-victory.html"&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="http://redmonk.com/sogrady/2009/04/15/open-source-licensing-in-a-networked-age/"&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="http://blogs.computerworld.com/ubuntu_heads_to_the_clouds"&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="acc_license"&gt;&lt;a href="http://creativecommons.org/licenses/by-nc-sa/3.0/"&gt;&lt;img src="http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png" alt="by-nc-sa" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;!--&lt;rdf:RDF xmlns="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"&gt;&lt;Work rdf:about=""&gt;&lt;license rdf:resource="http://creativecommons.org/licenses/by-nc-sa/3.0/" /&gt;&lt;/Work&gt;&lt;License rdf:about="http://creativecommons.org/licenses/by-nc-sa/3.0/"&gt;&lt;requires rdf:resource="http://creativecommons.org/ns#Attribution" /&gt;&lt;permits rdf:resource="http://creativecommons.org/ns#Reproduction" /&gt;&lt;permits rdf:resource="http://creativecommons.org/ns#Distribution" /&gt;&lt;permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /&gt;&lt;requires rdf:resource="http://creativecommons.org/ns#ShareAlike" /&gt;&lt;prohibits rdf:resource="http://creativecommons.org/ns#CommercialUse" /&gt;&lt;requires rdf:resource="http://creativecommons.org/ns#Notice" /&gt;&lt;/License&gt;&lt;/rdf:RDF&gt;--&gt;&lt;p class="akst_link"&gt;&lt;a href="http://redmonk.com/sogrady/?p=2850&amp;amp;akst_action=share-this" title="E-mail this, post to del.icio.us, etc." id="akst_link_2850" class="akst_share_link"&gt;Share This&lt;/a&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tecosystems?a=bUrZHaIFyeQ:gtUx2H0mAig:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tecosystems?i=bUrZHaIFyeQ:gtUx2H0mAig:F7zBnMyn0Lo" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/tecosystems?a=bUrZHaIFyeQ:gtUx2H0mAig:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tecosystems?i=bUrZHaIFyeQ:gtUx2H0mAig:D7DqB2pKExk" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/tecosystems?a=bUrZHaIFyeQ:gtUx2H0mAig:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tecosystems?d=dnMXMwOfBR0" border="0" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tecosystems/~4/bUrZHaIFyeQ" height="1" width="1" /&gt;</description>
	<pubDate>Fri, 03 Jul 2009 00:16:34 +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="https://launchpad.net/libdrizzle"&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="http://pecl.php.net/package/drizzle/"&gt;Drizzle PHP Extension&lt;/a&gt; has also been released. &lt;a href="http://jluedke.com/"&gt;James Luedke&lt;/a&gt; has moved development and releases of the extension into &lt;a href="http://pecl.php.net/"&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="http://capttofu.livejournal.com/19704.html"&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="http://jeremy.zawodny.com/mysql/mybench/"&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} || "appuser";
&gt; my $pass      = $opt{p} || "password";
&gt; my $port      = $opt{P} || 3306;
&gt; my $dsn       = "DBI:mysql:$db:$host;port=$port";
---
 my $user      = $opt{u} || "root";
 my $pass      = $opt{p} || "";
 my $port      = $opt{P} || 4427;
 my $dsn       = "DBI:drizzle:$db:$host;port=$port";
---
&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="http://blip.tv/file/2296093"&gt;http://blip.tv/file/2296093&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It is the standard "this is Drizzle Talk".</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="http://www.oddments.org/"&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="http://capttofu.livejournal.com/"&gt;Patrick Galbraith&lt;/a&gt;  will be talking at the &lt;a href="http://www.meetup.com/mysqlbos/"&gt;Boston MySQL Meetup Group&lt;/a&gt; on Monday night about &lt;a href="http://drizzle.org/"&gt;Drizzle&lt;/a&gt;, &lt;a href="http://www.gearman.org/"&gt;Gearman&lt;/a&gt;, and how to combine the two with projects like &lt;a href="https://launchpad.net/narada"&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="http://capttofu.livejournal.com/"&gt;Patrick Galbraith&lt;/a&gt; and I will be talking at the &lt;a href="http://www.meetup.com/mysqlbos/"&gt;Boston MySQL Meetup Group&lt;/a&gt; on Monday night about &lt;a href="http://drizzle.org/"&gt;Drizzle&lt;/a&gt;, &lt;a href="http://www.gearman.org/"&gt;Gearman&lt;/a&gt;, and how to combine the two with projects like &lt;a href="https://launchpad.net/narada"&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="http://jan.kneschke.de/"&gt;Jan&lt;/a&gt;, &lt;a href="http://blogs.sun.com/kay/"&gt;Kay&lt;/a&gt;, and others have been doing with &lt;a href="http://forge.mysql.com/wiki/MySQL_Proxy"&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="https://launchpad.net/libdrizzle"&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="http://www.drizzle.org/"&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="http://www.gearman.org/"&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="http://edge.launchpad.net/drizzle/trunk/aloha/+download/drizzle-2009.06.1063.tar.gz"&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="http://www.southeastlinuxfest.org/"&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="http://www.xaprb.com/blog/2009/04/11/sessions-of-interest-at-mysql-conference-and-expo-2009/" rel="bookmark" title="Permanent Link: Sessions of interest at MySQL Conference and Expo 2009"&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="http://www.xaprb.com/blog/2009/04/05/postgresql-conference-east-2009-day-three/" rel="bookmark" title="Permanent Link: PostgreSQL Conference East 2009, Day Three"&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="http://www.xaprb.com/blog/2009/04/14/sessions-of-interest-at-mysql-camp-2009/" rel="bookmark" title="Permanent Link: Sessions of interest at MySQL Camp 2009"&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="http://mitcho.com/code/yarpp/"&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="http://twitter.com/jdub"&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="http://jeremy.zawodny.com/blog/"&gt; Jeremy Zawodny&lt;/a&gt; in &lt;a href="http://www.linux-mag.com/id/7379/"&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="http://whereis.mit.edu/map-jpg?selection=E51&amp;#038;Buildings=go"&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="http://whereis.mit.edu/map-jpg?selection=L5&amp;#038;Landmarks=go"&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="http://whereis.mit.edu/map-jpg?selection=P4&amp;#038;Parking=go"&gt;http://whereis.mit.edu/map-jpg?selection=P4&amp;#038;Parking=go&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://whereis.mit.edu/map-jpg?selection=P5&amp;#038;Parking=go"&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="http://dev.mysql.com/doc/refman/5.4/en/blob.html"&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="http://twitter.com/brianaker/status/2026228307"&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="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="sql"&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="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="sql"&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="http://forge.mysql.com/wiki/MySQL_Internals_Custom_Engine#Adding_Support_for_INSERT_to_a_Storage_Engine"&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="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="c"&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="http://torum.net/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /&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="http://www.pythian.com/news/author/edwards/"&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="more-2852"&gt;&lt;/span&gt;&lt;a href="http://blogs.sun.com/datacharmer/"&gt;Giuseppe Maxia&lt;/a&gt; explains some details of &lt;a href="http://blogs.sun.com/datacharmer/entry/mysql_has_a_new_release"&gt;MySQL&amp;#8217;s New Release Model&lt;/a&gt;.  &lt;a href="http://www.clusterdb.com/mysql-cluster/"&gt;Andrew Morgan&lt;/a&gt; announces a &lt;a href="http://www.clusterdb.com/mysql-cluster/new-mysql-cluster-maintenance-release-706/"&gt;New MySQL Cluster Maintenance Release&lt;/a&gt;.  Aleksandr Kuzminsky of the &lt;a href="http://www.mysqlperformanceblog.com/"&gt;MySQL Performance Blog&lt;/a&gt; releases &lt;a href="http://www.mysqlperformanceblog.com/2009/06/11/5077-5082-build16-percona-binaries/"&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="http://mysqlpreacher.com/wordpress/"&gt;Darran Cassar, the MySQL Preacher,&lt;/a&gt; has created a package for &lt;a href="http://mysqlpreacher.com/wordpress/2009/06/security-roles-and-password-expiry-on-mysql-using-securich/"&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="http://blogs.sun.com/LinuxJedi/entry/two_new_status_variable_patches"&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="http://blogs.sun.com/LinuxJedi/"&gt;Andrew Hutchins&lt;/a&gt;.  
&lt;p&gt;&lt;a href="http://davebeulke.com"&gt;Dave Beulke&lt;/a&gt; points out a new feature in DB2 9.7 &amp;#8212; &lt;a href="http://davebeulke.com/?p=401"&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="http://sqlblogcasts.com/blogs/martinbell/"&gt;Martin Bell&lt;/a&gt; advocates &lt;a href="http://sqlblogcasts.com/blogs/martinbell/archive/2009/06/11/Changing-bound-defaults-to-default-constraints.aspx"&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="http://sqlserver-qa.net/"&gt;SQL Master of SQL Server QA&lt;/a&gt;&amp;#8217;s presentation on &lt;a href="http://sqlserver-qa.net/blogs/tools/archive/2009/06/09/sql-server-upgrade-issues-how-to-evaluate-potential-issues.aspx"&gt;SQL Server Upgrade Issues and How To Evaluate Potential Issues&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.flamingspork.com/"&gt;Stewart Smith&lt;/a&gt; lets is know that &lt;a href="http://www.flamingspork.com/blog/2009/06/09/drizzle-tarballs-for-next-milestone-aloha/"&gt;Drizzle Tarballs for the Next Milestone - Aloha&lt;/a&gt; are being released weekly.  Meanwhile, &lt;a href="http://jpipes.com"&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="http://jpipes.com/index.php?/archives/296-Drizzle-Performance-Regression-Solved-TCMalloc-vs.-No-TCMalloc.html"&gt;Drizzle Performance Regression Solved - TCMalloc vs. No TCMalloc&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.lenzg.net/"&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="http://www.lenzg.net/archives/258-Speaking-at-FrOSCon-and-organizing-the-OpenSQLCamp-2009,-European-Edition.html"&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="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="&gt;the Call for Papers for the OpenSQLCAmp 2009 is Now Open!&lt;/a&gt;  In other conference news, &lt;a href="&gt;the Call for Papers for the OpenSQLCAmp 2009 is Now Open!&lt;/a&gt;  In other conference news, &lt;a href="&gt;the Call for Papers for the OpenSQLCAmp 2009 is Now Open!&lt;/a&gt;  In other conference news, &lt;a href="&gt;the Call for Papers for the OpenSQLCAmp 2009 is Now Open!&lt;/a&gt;  In other conference news, &lt;a href="&gt;the Call for Papers for the OpenSQLCAmp 2009 is Now Open!&lt;/a&gt;  In other conference news, &lt;a href="&gt;the Call for Papers for the OpenSQLCAmp 2009 is Now Open!&lt;/a&gt;  In other conference news, &lt;a href="&gt;the Call for Papers for the OpenSQLCAmp 2009 is Now Open!&lt;/a&gt;  In other conference news, &lt;a href="http://ronaldbradford.com/blog/"&gt;Ronald Bradford&lt;/a&gt; gives out a discount code and reminds us that we can still attend &lt;a href="http://ronaldbradford.com/blog/oscon-2009-at-a-discounted-rate-2009-06-05/"&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="http://sqlfool.com/"&gt;Michelle Ufford&lt;/a&gt; sends out the &lt;a href="http://sqlfool.com/2009/06/east-iowa-sql-saturday-call-for-speakers/"&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="http://richardfoote.wordpress.com"&gt;Richard Foote&lt;/a&gt; explains Oracle&amp;#8217;s cost-based optimizer in &lt;a href="http://richardfoote.wordpress.com/2009/06/09/the-cbo-and-indexes-an-introduction-absolute-beginners/"&gt;CBO and Indexes, an Introduction for Absolute Beginners&lt;/a&gt;.  Speaking of optimizations, &lt;a href="http://blog.valcora.com/index.php?/authors/1-Valcora"&gt;Valcora&lt;/a&gt; has &lt;a href="http://blog.valcora.com/index.php?/archives/17-Another-Way-To-Do-Performance-Tuning.html"&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="http://blog.tanelpoder.com/2009/06/09/using-perfsheet-and-tpt-scripts-for-solving-real-life-performance-problems/"&gt;Tanel Poder&lt;/a&gt; points to a blog post on &lt;a href="http://blog.tanelpoder.com/2009/06/09/using-perfsheet-and-tpt-scripts-for-solving-real-life-performance-problems/"&gt;Using Perfsheet and TPT Scripts for Solving Real Life Performance Problems&lt;/a&gt; in an Oracle RAC environment.  And &lt;a href="http://jonathanlewis.wordpress.com/"&gt;Jonathan Lewis&lt;/a&gt; provides a script you can run if you are concerned about the potantial of Oracle &lt;a href="http://jonathanlewis.wordpress.com/2009/06/07/pga-leaks/"&gt;PGA leaks&lt;/a&gt;.  Over at &lt;a href="http://oraclue.com"&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="http://oraclue.com/2009/06/10/memory-annotations-and-oradebug/"&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="http://mysql-dba-journey.blogspot.com/"&gt;George Trujillo&lt;/a&gt;&amp;#8217;s process of &lt;a href="http://mysql-dba-journey.blogspot.com/2009/06/converting-oracle-schema-to-mysql.html"&gt;Converting an Oracle Schema to MySQL&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.sqlskills.com/BLOGS/KIMBERLY/"&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="http://www.sqlskills.com/BLOGS/KIMBERLY/post/The-Tipping-Point-Query-Answers.aspx"&gt;The Tipping Point Query Answers&lt;/a&gt;.  &lt;a href="http://people.planetpostgresql.org/dfetter/"&gt;David Fetter&lt;/a&gt; shares &lt;a href="http://people.planetpostgresql.org/dfetter/index.php?/archives/21-Materialized-Views-Performance-Tips.html#extended"&gt;Materialized Views Performance Tips&lt;/a&gt; in Postgres, and &lt;a href="http://www.postgresonline.com/journal/"&gt;Leo Hsu and Regina Obe&lt;/a&gt; talk about &lt;a href="http://www.postgresonline.com/journal/index.php?/archives/120-Planner-Statistics.html#extended"&gt;&lt;/a&gt;Planner Statistics&lt;/p&gt; in the Postgres optimizer.
&lt;p&gt;In the land of DB2, &lt;a href="http://blog.4loeser.net/"&gt;Henrik Loeser&lt;/a&gt; shares a &lt;a href="http://blog.4loeser.net/2009/06/purexml-performance-tip-sequence-of.html"&gt;PureXML Performance Tip: A Sequence of Good Indexes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://coskan.wordpress.com/"&gt;Coskan&lt;/a&gt; explains&lt;br /&gt;
&lt;a href="http://coskan.wordpress.com/2009/06/11/how-to-use-sysman-schema-without-em/"&gt;How to Use Sysman Schema Without Oracle Enterprise Manager&lt;/a&gt;.  &lt;a href="http://jhdba.wordpress.com"&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="http://jhdba.wordpress.com/2009/06/10/asm-metadata-and-migrating-a-database-to-asm/"&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="http://jhdba.wordpress.com/2009/06/11/script-to-backup-asm-metadata/"&gt;Script to Backup ASM Metadata&lt;/a&gt;.  &lt;a href="http://jarneil.wordpress.com"&gt;J. Arneil&lt;/a&gt; shows how to go about &lt;a href="http://jarneil.wordpress.com/2009/06/08/fixing-up-asm-disk-header-corruption/"&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="http://thehobt.blogspot.com/"&gt;Aaron Alton&lt;/a&gt; has a great article telling us that in &lt;a href="http://thehobt.blogspot.com/2009/06/defensive-programming-assumptions-must.html"&gt;Defensive Programming, Assumptions Must be Guaranteed or Tested&lt;/a&gt;, and another one on handling tags efficiently in &lt;a href="http://thehobt.blogspot.com/2009/06/full-text-search-vs-denormalized-tables.html"&gt;Full Text Search vs. Denormalized Tables&lt;/a&gt;  &lt;a href="http://rusanu.com/"&gt;Remus Rusanu&lt;/a&gt; provides a Transact-SQL stored procedure template for &lt;a href="http://rusanu.com/2009/06/11/exception-handling-and-nested-transactions/"&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="http://www.sqlskills.com/BLOGS/PAUL/post/Weekly-Survey-whats-the-hardest-part-of-becomng-an-involuntary-DBA.aspx"&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="http://www.neonesoft.com/blog/blogs/cmullins/"&gt;Craig Mullins&lt;/a&gt; points out that on average, we got a 4.6% salary increase in 2008 in &lt;a href="http://www.neonesoft.com/blog/blogs/cmullins/archive/2009/06/11/Salaries-for-Data-Professionals-Inching-Upward.aspx"&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="https://www.ibm.com/developerworks/mydeveloperworks/blogs/SusanVisser/entry/free_trial_to_safari_books_online"&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="https://www.ibm.com/developerworks/mydeveloperworks/blogs/SusanVisser/"&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="http://sun.com"&gt;Sun&lt;/a&gt; had for improving &lt;a href="http://mysql.com"&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="http://drizzle.org"&gt;Drizzle&lt;/a&gt; has got it right, thanks to the great work of &lt;a href="http://mysql-ha.com/"&gt;Monty Taylor&lt;/a&gt;.  &lt;/p&gt;
&lt;p&gt;I&amp;#8217;m working on the &lt;a href="http://wafflegrid.com"&gt;Wafflegrid AWS EC2 AMI&amp;#8217;s&lt;/a&gt; for &lt;a href="http://bigdbahead.com"&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="http://krow.livejournal.com/639040.html"&gt;http://krow.livejournal.com/639040.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jpipes.com/index.php?/archives/296-Drizzle-Performance-Regression-Solved-TCMalloc-vs.-No-TCMalloc.html"&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="http://www.oddments.org/?p=67"&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="https://launchpad.net/sysbench"&gt;sysbench&lt;/a&gt; numbers for each build, we also have regular automated builds to generate data for &lt;a href="http://valgrind.org/"&gt;valgrind&lt;/a&gt;, &lt;a href="http://drizzle.org/lcov/"&gt;lcov&lt;/a&gt;, &lt;a href="http://drizzle.org/doxygen/"&gt;doxygen&lt;/a&gt; and &lt;a href="http://www.dwheeler.com/sloccount/"&gt;sloc&lt;/a&gt;. Oh and lets not forget &lt;a href="http://gorf.tangent.org/source/"&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="http://blog.drizzle.org/wordpress/wp-content/uploads/2009/06/drizzle-lines-of-code-300x224.jpg" alt="drizzle-lines-of-code" title="drizzle-lines-of-code" width="600" height="374" class="alignnone size-medium wp-image-105" /&gt;&lt;br /&gt;
See &lt;a href="http://drizzle.org/wiki/Image:Drizzle_Lines_of_Code.pdf"&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="http://drizzle.org/wiki/Main_Page"&gt;Drizzle&lt;/a&gt; with the release of &lt;a href="http://www.opensolaris.org/os/downloads/"&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="http://drizzle.org/wiki/Main_Page"&gt;Drizzle&lt;/a&gt; also require &lt;a href="http://monkey.org/~provos/libevent/"&gt;libevent&lt;a&gt; and &lt;a href="http://www.gnu.org/software/gperf/"&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="http://opensolaris.org/os/community/zfs/"&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;"Why not just put everything in &lt;code&gt;/usr/local&lt;/code&gt;?"&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;"This must turn into a long and complex path?"&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="http://opensolaris.org/os/community/zfs/"&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="http://drizzle.org/wiki/Main_Page"&gt;Drizzle&lt;/a&gt;, &lt;a href="http://www.gearman.org"&gt;Gearman&lt;/a&gt; and &lt;a href="http://launchpad.net/libmemcached"&gt;libmemcached&lt;/a&gt; all use &lt;a href="http://bazaar-vcs.org/"&gt;Bazaar&lt;/a&gt; for development, and there isn't a package available for &lt;a href="http://www.opensolaris.org/os/downloads/"&gt;OpenSolaris&lt;/a&gt; so we need to install this ourself. The &lt;a href="http://bazaar-vcs.org/"&gt;Bazaar&lt;/a&gt; team is really active and using the "release early, release often" 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 "nonstandard" location, we need to create a startup-script so that &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; can find the modules. So let's go ahead and install &lt;a href="http://bazaar-vcs.org/"&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 "\$@"
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="http://bazaar-vcs.org/"&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="http://www.opensolaris.org/os/downloads/"&gt;OpenSolaris&lt;/a&gt; doesn't contain a prebuilt 64-bit version of &lt;a href="http://en.wikipedia.org/wiki/GNU_readline"&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="-m64"
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?"&lt;/em&gt; If you look at the options there I compile one version with "-m64", 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="http://docs.sun.com/app/docs/doc/816-5138/dev-env?l=en&amp;amp;a=view"&gt;32-bit and 64-bit Libraries&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://drizzle.org/wiki/Main_Page"&gt;Drizzle&lt;/a&gt; use &lt;a href="http://code.google.com/p/protobuf/"&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="-fast -m32" LDFLAGS="-fast" \
            --bindir=/opt/google/bin/i86
gmake all install
gmake clean
./configure --disable-static --with-zlib --prefix=/opt/google CPPFLAGS="-fast -m64" LDFLAGS="-fast -m64" \
            --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="http://launchpad.net/libmemcached"&gt;libmemcached&lt;/a&gt;, &lt;a href="http://launchpad.net/libdrizzle"&gt;libdrizzle&lt;/a&gt;, &lt;a href="http://launchpad.net/gearman"&gt;Gearman&lt;/a&gt; and &lt;a href="http://launchpad.net/drizzle"&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="http://launchpad.net/libdrizzle"&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="-fast -m32" LDFAGS="-fast"
gmake all install
./configure --disable-static --prefix=/opt/drizzle --libdir=/opt/drizzle/lib/`isainfo -k` CFLAGS="-fast -m64" LDFAGS="-fast"
gmake clean
gmake all install
cd ..
&lt;/pre&gt;
&lt;p&gt;
The next one on the list is &lt;a href="http://launchpad.net/libmemcached"&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="-fast -m32" LDFAGS="-fast" \
    --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="-fast" LDFAGS="-fast" --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="http://launchpad.net/gearman"&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="-fast -I/opt/drizzle/include -m64" \
            LDFLAGS="-L/opt/drizzle/lib/64 -R/opt/drizzle/lib/64"
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="http://drizzle.org/wiki/Main_Page"&gt;Drizzle&lt;/a&gt; we need to make sure that &lt;a href="http://drizzle.org/wiki/Main_Page"&gt;Drizzle&lt;/a&gt; can detect our &lt;a href="http://www.pcre.org"&gt;PCRE&lt;/a&gt; installation. &lt;a href="http://www.opensolaris.org/os/downloads/"&gt;OpenSolaris&lt;/a&gt; ships with a version that is too new for the &lt;a href="http://drizzle.org/wiki/Main_Page"&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="http://drizzle.org/wiki/Main_Page"&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="-I/opt/google/include -I/opt/gearman/include -I/opt/drizzle/include" \
   LDFLAGS="-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" \
   --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="http://drizzle.org/wiki/Main_Page"&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="http://jpipes.com/index.php?/archives/296-Drizzle-Performance-Regression-Solved-TCMalloc-vs.-No-TCMalloc.html"&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="http://www.oddments.org/?p=67"&gt;Eric&lt;/a&gt; was the person who finally asked the question "could it be tcmalloc"? 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="http://pics.livejournal.com/krow/pic/0010251p/"&gt;&lt;img src="http://pics.livejournal.com/krow/pic/0010251p/s320x240" alt="chart.png" border="0" /&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 "Hello " . $_[0] . "!"&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 "I don't need stored procedures, but I do need server side scripting".&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="https://lists.launchpad.net/drizzle-discuss/msg03687.html"&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="http://drizzle.org/wiki/Automation_Documentation" title="Drizzle Automation Suite"&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="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" alt="Google Chart" /&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="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" alt="Google Chart" /&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="http://jpipes.com/templates/default/img/emoticons/smile.png" alt=":-)" class="emoticon" /&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="http://drizzle.org/"&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="http://www.mysql.com/"&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="1"&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="5"&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="5"&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="1"&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>
	<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>
	<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="https://lists.launchpad.net/drizzle-discuss/msg04208.html"&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="http://en.oreilly.com/oscon2009"&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="http://en.oreilly.com/oscon2009/public/schedule/detail/8196"&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="http://www.jroller.com/mmatthews/entry/speeding_up_batch_inserts_for"&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("jdbc:drizzle://localhost:4427/test_units_jdbc");&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("insert into asdf (somecol) values (?)");&lt;br /&gt;ps.setString(1,"aa");&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="http://bazaar.launchpad.net/~krummas/drizzle-jdbc/trunk/annotate/head%3A/src/main/java/org/drizzle/jdbc/internal/common/ParameterizedBatchHandler.java"&gt;ParameterizedBatchHandler.java&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://bazaar.launchpad.net/~krummas/drizzle-jdbc/trunk/annotate/head%3A/src/main/java/org/drizzle/jdbc/internal/common/DefaultParameterizedBatchHandler.java"&gt;DefaultParameterizedBatchHandler.java&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bazaar.launchpad.net/~krummas/drizzle-jdbc/trunk/annotate/head%3A/src/test/java/org/drizzle/jdbc/DriverTest.java#L430"&gt;DriverTest.java&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/6543848899761399219-5585923381620045604?l=developian.blogspot.com" /&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 "engine specific" 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 "staging" tree we run a full test at different steps  of "connections". 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 "who did what". 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 "all your bases belong to us" 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 "source code" 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 "large" 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="http://drizzle.org/lcov/index.html"&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 "this is how to fail at X". 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, go &lt;a href="http://jdbc.drizzle.org/mavenrepo/releases/org/drizzle/jdbc/drizzle-jdbc/0.3/"&gt;here&lt;/a&gt; to download. It will soon be synced to the official maven repository.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Changes from 0.2 to 0.3:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Add the services file to make the driver autoload.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Throw proper JDBC4 SQLExceptions.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Make blobs + getObject() work against new versions of drizzled.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Fix bug with generated keys and prepared statements.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Fix bug with prepared statements and adding parameters several times (fix by Trond Norbye).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Name the packet fetcher thread.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Fix bug with getSchemas() - returned columns in wrong order.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Rework of the packet fetching by Trond.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Pluggable batch query handlers (I'll blog about this soon)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/6543848899761399219-8665424453936793324?l=developian.blogspot.com" /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 01 Jun 2009 09:54:55 +0000</pubDate>
	<author>noreply@blogger.com (Marcus Eriksson)</author>
</item>
<item>
	<title>Official Drizzle Blog: JavaOne/Community One next week</title>
	<guid>http://blog.drizzle.org/?p=74</guid>
	<link>http://blog.drizzle.org/2009/05/30/javaonecommunity-one-next-week/</link>
	<description>&lt;p&gt;We will be showing a great demo next week at &lt;a href="http://developers.sun.com/events/communityone/2009/west/index.jsp"&gt;Community One&lt;/a&gt; and &lt;a href="http://java.sun.com/javaone/"&gt;Java One&lt;/a&gt; which will highlight a scalable open source search engine using &lt;a href="http://launchpad.net/drizzle"&gt;Drizzle&lt;/a&gt;, &lt;a href="http://www.danga.com/memcached/"&gt;Memcached&lt;/a&gt;, &lt;a href="http://www.gearman.org/doku.php"&gt;Gearman&lt;/a&gt; and &lt;a href="http://www.sphinxsearch.com/"&gt;Sphinx&lt;/a&gt;. See &lt;a href="http://blog.drizzle.org/feed/ http://www.oddments.org/?p=65"&gt;Eric&amp;#8217;s write up&lt;/a&gt; for more details. &lt;/p&gt;
&lt;p&gt;If you are going, please drop by the Drizzle booth and check out the demo and say hello. Hope to see you there. &lt;/p&gt;</description>
	<pubDate>Sun, 31 May 2009 04:13:07 +0000</pubDate>
</item>
<item>
	<title>Eric Day: libdrizzle 0.3 Released</title>
	<guid>http://www.oddments.org/?p=66</guid>
	<link>http://www.oddments.org/?p=66</link>
	<description>&lt;p&gt;I&amp;#8217;m pleased to announce a new version of &lt;a href="https://launchpad.net/libdrizzle"&gt;libdrizzle&lt;/a&gt;! This is mostly a bug fixing and maintenance release before I start in on more significant development. One of the new features I added was a hook to be able to use your own I/O event mechanism rather than the default poll(). This will allow you to use libraries like libevent, which can be useful when dealing with a large number of file descriptors, or to mix with other file descriptors in your application (for example, you could listen on other fd&amp;#8217;s alongside the non-blocking Drizzle/MySQL socket connections). There is not much for examples or documentation yet with this feature, but for now you can email or find me in #drizzle on irc.freenode.net if you would like to know more.&lt;/p&gt;
&lt;p&gt;One of the next steps with libdrizzle is a better protocol abstraction, since the Drizzle protocol is diverging quite a bit from how the MySQL protocol works. With these abstractions, it will also be possible to easily add other database-like protocols (where column/row/fields make sense). I&amp;#8217;m also going to start looking into more memory optimizations and performance tuning.&lt;/p&gt;</description>
	<pubDate>Fri, 29 May 2009 23:11:16 +0000</pubDate>
</item>
<item>
	<title>Marcus Eriksson: JavaOne sessions</title>
	<guid>tag:blogger.com,1999:blog-6543848899761399219.post-3887797517412923821</guid>
	<link>http://developian.blogspot.com/2009/05/javaone-sessions.html</link>
	<description>I'm attending JavaOne this year, it starts on Tuesday. These are the sessions i look forward the most to (in no particular order):&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Return of the Puzzlers: Schlock and Awe (TS-5186)&lt;/span&gt;&lt;br /&gt;Josh Bloch and Neal Gafter present a couple of interresting programming puzzles, will be fun.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Effective Java: Still effective after all these years (TS-5217)&lt;/span&gt;&lt;br /&gt;Again, Joshua Bloch. His book "Effective Java" is one of the best programming books i've read.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Java Platform Concurrency Gotchas (TS-4863)&lt;/span&gt;&lt;br /&gt;Concurrency is a difficult issue, this session presents issues with code examples.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Ghost in the virtual machine: A reference to references (TS-5245)&lt;/span&gt;&lt;br /&gt;Bob is the author of google guice (see below) and from what I've heard, he is also a great speaker.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Defective Java Code: Mistakes that matter (TS-5335)&lt;/span&gt;&lt;br /&gt;About bugs in java code, static analysis etc.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Drizzle: A new database for the cloud (TS-5410)&lt;/span&gt;&lt;br /&gt;Drizzle is a great project, positive, helpful people.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;JDBC? We don't need no stinkin' JDBC: How LinkedIn scaled with memcached, SOA and a bit of SQL. (TS-4696)&lt;/span&gt;&lt;br /&gt;Always interesting to hear how big companies handle scalability issues really job related for me.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Introduction to Google Guice: The Java Programming language is fun again (TS-5434)&lt;/span&gt;&lt;br /&gt;Google Guice really opened my eyes to what you can do with java, the subject of the talk is so true, it shows what java is capable of and that java can be fun. This is how modern java development should be done.&lt;div class="blogger-post-footer"&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/6543848899761399219-3887797517412923821?l=developian.blogspot.com" /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 29 May 2009 15:15:18 +0000</pubDate>
	<author>noreply@blogger.com (Marcus Eriksson)</author>
</item>
<item>
	<title>Eric Day: Narada - A Scalable Open Source Search Engine</title>
	<guid>http://www.oddments.org/?p=65</guid>
	<link>http://www.oddments.org/?p=65</link>
	<description>&lt;p&gt;I&amp;#8217;ve been working with &lt;a href="http://capttofu.livejournal.com/"&gt;Patrick Galbraith&lt;/a&gt; for the past couple weeks on a new project that started as an example in his &lt;a href="http://www.amazon.com/Developing-Applications-Apache-MySQL-memcached/dp/0470414642"&gt;upcoming book&lt;/a&gt;. It is a search engine built using &lt;a href="http://www.gearman.org/"&gt;Gearman&lt;/a&gt;, &lt;a href="http://www.sphinxsearch.com"&gt;Sphinx&lt;/a&gt;, &lt;a href="http://www.drizzle.org"&gt;Drizzle&lt;/a&gt; or MySQL, and memcached. Patrick wrote the first implementation in Perl to tie all these pieces together, but there is also a Java version underway bring written by Trond Norbye and Eric Lambert that will be shown at the CommunityOne and JavaOne conferences next week. I&amp;#8217;ve been helping get the system setup on a new cluster and with the port to Drizzle.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://launchpad.net/narada"&gt;Narada&lt;/a&gt; provides interfaces that allow you to submit URLs to be indexed and crawled, and then to search those indexes and get a result set back. This allows you to index and search your own set of URLs, possibly for a single website or just for your own personal archive. The crawler in the back-end will be able to stop after some recursion limit from the original URL and also be able to apply URL filters (for example, only index pages under the domain &amp;#8220;oddments.org&amp;#8221;). Other filters and extensions should be easy to add. Narada is interesting because it is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Open Source&lt;/b&gt; - You can modify it to fit your own needs, hopefully in a modular way so that changes can be contributed back to the project.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Easy to Scale&lt;/b&gt; - The system is built on a number of asynchronous queues, and the processes to perform that work can run on any number of machines. Increasing your capacity is now trivial, simply start up more machines and with new workers.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Language Agnostic&lt;/b&gt; - While the first versions are in Perl and Java, it is easy to mix in other languages. For example, if a certain component was slow, we could rewrite it in C for better performance. The APIs to index and search can also be wrapped for any language since it will mostly just involved wrapping the Gearman client API. I&amp;#8217;m thinking of hacking up a PHP API.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, how does Narada work under the hood?&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.oddments.org/pics/gearman_url_demo.png"&gt;&lt;img src="http://www.oddments.org/pics/gearman_url_demo.png" /&gt;&lt;br /&gt;Click here for the full-size image&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The blue boxes represent your front-end application that use Narada, using the Gearman client API. The yellow boxes represent Gearman workers that perform one of the tasks in the chain. The orange boxes represent the storage mechanisms such as Drizzle, MySQL, Sphinx index, or memcached.&lt;/p&gt;
&lt;p&gt;When a URL is submitted, it will first be queued in a Drizzle table for later processing. A Gearman job is started during the table INSERT to notify a Fetch Worker that a new URL is ready. Once a free Fetch Worker is available, it downloads the page and looks for more URLs to index. This is where recursion limits and filters are implemented. Next, it takes the resulting document and pushes it into memcached and notifies the Document Worker a new document is ready to be stored and indexed. The Document Worker then stores this inside of another Drizzle table and will start the Sphinx indexer if it hasn&amp;#8217;t been run in a while. We don&amp;#8217;t want to index on every URL since this would be wasteful and expensive. At this point the document is stored, indexed, and memcached is primed with the content.&lt;/p&gt;
&lt;p&gt;When a search request comes in, the client will dispatch a search job to the Search Worker. This worker is responsible for performing the Sphinx search and gathering the necessary information from memcached or Drizzle so the client can return some meaningful results. In the future we will most likely be sharding the data and indexes, so the Search Worker will also be responsible for aggregating multiple shard searches into one set for the caller.&lt;/p&gt;
&lt;p&gt;The code is still rough around the edges, but we&amp;#8217;ve set it up on a couple clusters so far and it is working quite well. We&amp;#8217;ll be actively working on it and refining the install process so it is easier to get it up and running.&lt;/p&gt;</description>
	<pubDate>Thu, 28 May 2009 00:55:58 +0000</pubDate>
</item>
<item>
	<title>Eric Day: Cache Line Sizes and Concurrency</title>
	<guid>http://www.oddments.org/?p=64</guid>
	<link>http://www.oddments.org/?p=64</link>
	<description>&lt;p&gt;We&amp;#8217;ve been looking at high concurrency level issues with Drizzle and MySQL. Jay pointed me to &lt;a href="http://www.ddj.com/go-parallel/article/showArticle.jhtml?articleID=217500206"&gt;this article&lt;/a&gt; on the concurrency issues due to shared cache lines and decided to run some of my own tests. The results were dramatic, and anyone who is writing multi-threaded code needs to be aware of current CPU cache line sizes and how to optimize around them.&lt;/p&gt;
&lt;p&gt;I ran my tests on two 16-core Intel machines, one with a 64 byte cache line, and one with 128 byte cache line. First off, how did I find these values?&lt;/p&gt;
&lt;pre&gt;
one:~$ cat /proc/cpuinfo | grep cache_alignment
cache_alignment : 64
...

two:~$ cat /proc/cpuinfo | grep cache_alignment
cache_alignment : 128
...
&lt;/pre&gt;
&lt;p&gt;You will see one line for each CPU. If you are not familiar with /proc/cpuinfo, take a closer look at the full output. It&amp;#8217;s a nice quick reference of other things like L2 cache sizes and CPU speed. As you can see, machine &lt;b&gt;one&lt;/b&gt; has a &lt;b&gt;64 byte&lt;/b&gt; cache size, and machine &lt;b&gt;two&lt;/b&gt; has a &lt;b&gt;128 byte&lt;/b&gt; cache size. Next, I wrote the following C program to test concurrency:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.oddments.org/notes/cache_line.c"&gt;cache_line.c&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This program creates a global array of counter variables and runs a variable number of threads, where each thread increments it&amp;#8217;s own 4-byte counter in the array. It does so at a number of array spacing levels to see the performance when counters fall on the same cache lines. With a spacing of 1 the memory is directly adjacent, and for each spacing level it skips that many counter variables in the global array. For example, if spacing is 4, the threads would use counter[0], counter[4], counter[8], and so on, which uses a chunk of memory every 16 bytes. The cache_line.c program outputs a CSV formatted table that you can use to generate some graphs. The seconds CSV output is the same set of tests without using the global array counters, and instead a local counter on the stack. This is meant to provide a baseline (since those will always be on their own cache line). The results were:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.oddments.org/pics/cache_line_64.png"&gt;&lt;img src="http://www.oddments.org/pics/cache_line_64.png" alt="64 Byte Cache Line" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.oddments.org/pics/cache_line_128.png"&gt;&lt;img src="http://www.oddments.org/pics/cache_line_128.png" alt="128 Byte Cache Line" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So what does this tell us? When spacing is one and all counter memory (16 threads * 4 bytes == 64 bytes) is entirely on one cache line, concurrency is poor. As we add more space between each counter variable, we start to see performance improve (faster runtime). This is because all thread counters are no longer on one cache line. On the 64 byte cache line machine, we see things really level off when spacing is 16. This is because each counter is now on it&amp;#8217;s own cache line. On the 128 byte cache line machine, you can see it takes one more iteration of spacing because the cache line is twice as big.&lt;/p&gt;
&lt;p&gt;So what can we take from this? If you have any arrays or data structures that are accessed and updated independently from different threads, make sure they are on a different cache line. This may mean wasting a little space, but as you can see, the concurrency performance is well worth it.&lt;/p&gt;</description>
	<pubDate>Wed, 27 May 2009 19:20:35 +0000</pubDate>
</item>
<item>
	<title>Official Drizzle Blog: Gsoc kick off</title>
	<guid>http://blog.drizzle.org/?p=11</guid>
	<link>http://blog.drizzle.org/2009/05/26/gsoc-kick-off/</link>
	<description>&lt;p&gt;Last month drizzle community was excited to be joined by 4 students as part of &lt;a href="http://code.google.com/soc/" target="_blank"&gt;Gsoc&lt;/a&gt;. As the summer of code has already kicked off , its time to better know the students and take a look on what they will be working on this summer, with their mentors and drizzle community at large.&lt;/p&gt;
&lt;div id="attachment_20" class="wp-caption alignleft"&gt;&lt;a href="http://blog.drizzle.org/wordpress/wp-content/uploads/2009/05/padraig.jpg"&gt;&lt;img class="size-thumbnail wp-image-20 " src="http://blog.drizzle.org/wordpress/wp-content/uploads/2009/05/padraig-150x150.jpg" alt="padraig" width="135" height="135" /&gt;&lt;/a&gt;&lt;p class="wp-caption-text"&gt;Padraig O'sullivan&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;a title="Padraig's blog" href="http://posulliv.com/" target="_blank"&gt;Padraig O&amp;#8217;Sullivan&lt;/a&gt; (posulliv) is a graduate student in Electrical and Computer Engineering department at university of maryland. Padraig would be working on re-implementing Information_Schema for drizzle, his plans to tackle the problem can be found at the &lt;a href="http://drizzle.org/wiki/GSOC_Information_Schema" target="_blank"&gt;project page&lt;/a&gt; on &lt;a href="http://drizzle.org/wiki" target="_blank"&gt;drizzle wiki&lt;/a&gt;. &lt;a href="http://blog.drizzle.org/feed/www.jpipes.com/index.php" target="_blank"&gt;Jay pipes&lt;/a&gt; would be mentoring padraig during his time as SOC student with drizzle. Padraig is from ireland which explains his love for beer &lt;img src="http://blog.drizzle.org/wordpress/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /&gt; , before coming to US for post grad he was an intern at oracle dublin. Padraig is intrigued by scalable and distributed systems. Other than computers and code padraig likes to play guitar and drink beer. Padraig goes by the nick &amp;#8220;posulliv&amp;#8221; on twitter, IRC and launchpad.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div id="attachment_80" class="wp-caption alignleft"&gt;&lt;a rel="attachment wp-att-80" href="http://blog.drizzle.org/2009/05/26/gsoc-kick-off/biping-meng/"&gt;&lt;img class="size-thumbnail wp-image-80  " src="http://blog.drizzle.org/wordpress/wp-content/uploads/2009/05/biping-meng-150x150.jpg" alt="bipin meng" width="150" height="150" /&gt;&lt;/a&gt;&lt;p class="wp-caption-text"&gt;biping meng (updated)&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Biping Meng (ABi) is a final year computer science student at nanjing university, china. Biping will work on refactoring and streamlining the &lt;a title="wiki page" href="http://drizzle.org/wiki/GSOC_Pool_Threads_Scheduler" target="_blank"&gt;Pool of threads scheduler&lt;/a&gt; with &lt;a href="http://blog.drizzle.org/feed/www.oddments.org/"&gt;Eric day&lt;/a&gt; and Jay Pipes as mentors. Abi is interested in search engine and natural language processing and to that effect he did his internship at &lt;a href="http://www.baidu.com/"&gt;Baidu&lt;/a&gt; which is a popular search engine in china. Biping likes to play table tennis and badminton but mostly likes to code, his team was among top 20  in microsoft&amp;#8217;s imagine cup for developing a RTS game called Isles. He goes by the screenname &lt;strong&gt;llml&lt;/strong&gt; on freenode and can also be found at &lt;a href="https://launchpad.net/~mengbiping" target="_blank"&gt;launchpad&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div id="attachment_22" class="wp-caption alignleft"&gt;&lt;a href="http://blog.drizzle.org/wordpress/wp-content/uploads/2009/05/jiangfeng.jpg"&gt;&lt;img class="size-thumbnail wp-image-22 " src="http://blog.drizzle.org/wordpress/wp-content/uploads/2009/05/jiangfeng-150x150.jpg" alt="jasekidd" width="150" height="150" /&gt;&lt;/a&gt;&lt;p class="wp-caption-text"&gt;jasekidd&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Jiangfeng Peng (Jasekidd) is a computer science student at south china university of technology.  Jasekidd would be researching and identifying points of parallelization in drizzle runtime. Jay pipes and &lt;a href="http://krow.net/" target="_blank"&gt;Brian Aker&lt;/a&gt; would be mentoring Jasekidd during his work as Gsoc student. His major is high performance computing and multi threaded applications, in his spare time jasekidd likes to play badminton and basketball. He goes by the handle of jasepeng in IRC and launchpad. His project plans can be found at &lt;a href="http://drizzle.org/wiki/GSOC_Parallelization_Runtime" target="_blank"&gt;drizzle wiki&lt;/a&gt;.&lt;/p&gt;
&lt;div id="attachment_61" class="wp-caption alignleft"&gt;&lt;a href="http://blog.drizzle.org/wordpress/wp-content/uploads/2009/05/607.jpg"&gt;&lt;img class="size-thumbnail wp-image-61" src="http://blog.drizzle.org/wordpress/wp-content/uploads/2009/05/607-150x150.jpg" alt="No recent pictures" width="150" height="150" /&gt;&lt;/a&gt;&lt;p class="wp-caption-text"&gt;No recent pictures of nathan&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Nathan Williams (nlw) is a final year student at DigiPen institute of technology, his major is real time interactive simulation. Nathan will be working on refactoring and custom List&amp;lt;&amp;gt; implementation with STL&amp;#8217;s list, vector and queue for drizzle under mentorship of &lt;a href="http://e-monty.com/" target="_blank"&gt;Monty taylor&lt;/a&gt;. Nathan comes from computer network and security background, his passtimes are no different than his work time as he whiles away time programming and gazing at maths. He can be found by the screen name nlw both on IRC and freenode. His project progress would be logged at his &lt;a href="http://drizzle.org/wiki/GSOC_List_Replacement" target="_self"&gt;wiki page&lt;/a&gt;. Sadly couldn&amp;#8217;t grab his picture as he doesn&amp;#8217;t have any recent clicks.&lt;/p&gt;
&lt;p&gt;Being the first year in SOC, its pretty exciting that students have taken a liking to work on challenging problems; with a small community and friendly mailing list, I am sure this is going to be one of the most productive SOC year for even times to come. Drizzle being some 1000  revisions old and its problem solving  plans would benefit a lot from SOC and students who have joined in. All the best to students and thanks to all mentors &lt;img src="http://blog.drizzle.org/wordpress/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /&gt; &lt;/p&gt;</description>
	<pubDate>Tue, 26 May 2009 19:39:41 +0000</pubDate>
</item>
<item>
	<title>Eric Day: Gearman and Drizzle at OSCON</title>
	<guid>http://www.oddments.org/?p=63</guid>
	<link>http://www.oddments.org/?p=63</link>
	<description>&lt;p&gt;If you missed &lt;a href="http://www.gearman.org/"&gt;Gearman&lt;/a&gt; or &lt;a href="http://drizzle.org/"&gt;Drizzle&lt;/a&gt; at the MySQL Conference, have no fear, a number of folks will be at OSCON too! There will be a many opportunities to learn more or get involved with the two projects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://en.oreilly.com/oscon2009/public/schedule/detail/8206"&gt;3-Hour Gearman Tutorial&lt;/a&gt; - Learn about the latest developments and participate in hands-on demos to help build your own Gearman-powered applications.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.oreilly.com/oscon2009/public/schedule/detail/8198"&gt;45-Minute Gearman Session&lt;/a&gt; - Get a more concise glimpse about what Gearman is and how to use it.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.oreilly.com/oscon2009/public/schedule/detail/8196"&gt;45-Minute Drizzle Panel&lt;/a&gt; - Get an update and ask questions about the project and community.&lt;/li&gt;&lt;/ul&gt;
&lt;li&gt;Gearman and Drizzle Booths - We&amp;#8217;ll have a booth for each project in the expo hall with various developers helping out. Come visit to either help out or learn some new things! The expo hall is free.&lt;/li&gt;
&lt;li&gt;Gearman and Drizzle BoFs - Not official yet, but there will be at least one BoF for each project throughout the week. This is free as well! Right now there are no specific topics, just general discussion and hacking.&lt;/li&gt;

&lt;p&gt;If your are looking for deals on OSCON passes, there are some discount codes on their &lt;a href="http://twitter.com/oscon"&gt;twitter feed&lt;/a&gt;. Also, it&amp;#8217;s still early registration until June 2nd, so now would be a good time to register. :)&lt;/p&gt;
&lt;p&gt;Hope to see you there!&lt;/p&gt;</description>
	<pubDate>Tue, 26 May 2009 18:08:46 +0000</pubDate>
</item>
<item>
	<title>Eric Day: Drizzle patch for Sphinx 0.9.9-rc2</title>
	<guid>http://www.oddments.org/?p=62</guid>
	<link>http://www.oddments.org/?p=62</link>
	<description>&lt;p&gt;Last week &lt;a href="http://www.oddments.org/?p=59"&gt;I blogged about a patch&lt;/a&gt; for &lt;a href="http://www.sphinxsearch.com/"&gt;Sphinx&lt;/a&gt; 0.9.8.1 that allowed Drizzle to be used as a data source (this works much like the MySQL and PostgreSQL options). This past weekend I made a new patch that would work with the latest version, 0.9.9-rc2. It can be found here:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://oddments.org/notes/sphinx-0.9.9-rc2-drizzle.patch"&gt;sphinx-0.9.9-rc2-drizzle.patch&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The instructions are pretty much the same:&lt;/p&gt;
&lt;pre&gt;
Download sphinx-0.9.9-rc2.tar.gz and sphinx-0.9.9-rc2-drizzle.patch
tar xzf sphinx-0.9.9-rc2.tar.gz
cd sphinx-0.9.9-rc2
patch -p1  ../sphinx-0.9.9-rc2-drizzle.patch
./buildconf.sh
./configure --with-drizzle
make
make install
&lt;/pre&gt;
&lt;p&gt;See my &lt;a href="http://www.oddments.org/?p=59"&gt;previous blog post&lt;/a&gt; for configuration changes to make Sphinx index from Drizzle.&lt;/p&gt;</description>
	<pubDate>Tue, 26 May 2009 04:38:43 +0000</pubDate>
</item>
<item>
	<title>Official Drizzle Blog: Drizzle source tarball 1033 released</title>
	<guid>http://blog.drizzle.org/?p=45</guid>
	<link>http://blog.drizzle.org/2009/05/25/45/</link>
	<description>&lt;p&gt;&lt;a href="https://launchpad.net/drizzle/trunk/aloha" target="_blank"&gt;Drizzle source tarball&lt;/a&gt; based on build 1033 has now been released. We are also now including a change log so you can get a sense of what has gone into each release. For this release we continue to focus on code clean up, build improvements, increased test coverage and performance improvements. This release also now provides support for &lt;a href="http://code.google.com/apis/protocolbuffers/docs/overview.html" target="_blank"&gt;protobuf 2.1&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Tue, 26 May 2009 00:13:13 +0000</pubDate>
</item>
<item>
	<title>Trond Norbye: Manage Gearmand and Drizzle with SMF</title>
	<guid>http://blogs.sun.com/trond/entry/manage_gearmand_and_drizzle_with</guid>
	<link>http://blogs.sun.com/trond/entry/manage_gearmand_and_drizzle_with</link>
	<description>&lt;p&gt;
If you are running Gearman or Drizzle on Solaris, you may want to let SMF start and monitor the services. I just pushed service definitions and and scripts to install them a couple of days ago.
&lt;/p&gt;
&lt;p&gt;
If you look in the &lt;a href="http://bazaar.launchpad.net/%7Egearman-developers/gearmand/trunk/files/head%3A/scripts/"&gt;&lt;code&gt;scripts&lt;/code&gt;&lt;/a&gt; directory in Gearman, you will see a script named &lt;code&gt;smf_install.sh&lt;/code&gt;. If you run this script it will define a user and group named &lt;code&gt;gearmand&lt;/code&gt;, create the Gearman authorizations and profile before a service named gearman is defined. To start the Gearman service all you need to do is to run:
&lt;/p&gt;
&lt;pre&gt;
trond@storm ~&amp;gt; &lt;b&gt;svcadm enable gearman&lt;/b&gt;
&lt;/pre&gt;

&lt;p&gt;
For Drizzle you need to look in the &lt;a href="http://bazaar.launchpad.net/%7Edrizzle-developers/drizzle/development/files/head%3A/support-files/smf/"&gt;&lt;code&gt;support-files/smf&lt;/code&gt;&lt;/a&gt; directory for a script named &lt;code&gt;install.sh&lt;/code&gt;. To start Drizzle all you need to do is to run:
&lt;/p&gt;
&lt;pre&gt;
trond@storm ~&amp;gt; &lt;b&gt;svcadm enable drizzle&lt;/b&gt;
&lt;/pre&gt;</description>
	<pubDate>Mon, 25 May 2009 16:07:06 +0000</pubDate>
</item>
<item>
	<title>Official Drizzle Blog: Contributor Code Walk Through</title>
	<guid>http://blog.drizzle.org/?p=24</guid>
	<link>http://blog.drizzle.org/2009/05/25/contributor-code-walk-through/</link>
	<description>&lt;p&gt;Our esteemed &lt;a href="http://jpipes.com/" target="_blank"&gt;Jay Pipes&lt;/a&gt; will conduct the first &lt;a href="http://launchpad.net/drizzle"&gt;Drizzle&lt;/a&gt; contributor code walk-through and build/install guide on June 4th at 4:00 p.m. PST (7:00 p.m. EST). He will go over the basics of using Bazaar and Launchpad for the contribution process, this will include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How Drizzle&amp;#8217;s source code is organized&lt;/li&gt;
&lt;li&gt;The build, debugging and testing toolset&lt;/li&gt;
&lt;li&gt;Quick How-To for using Launchpad and Bazaar effectively&lt;/li&gt;
&lt;li&gt;Overview of how the source code is structured (different modules, etc)&lt;/li&gt;
&lt;li&gt;Details about some of the larger structures and classes used in Drizzle and how they work together&lt;/li&gt;
&lt;li&gt;Explanation of how to create a skeleton plugin and test cases for your plugin&lt;/li&gt;
&lt;li&gt;Q&amp;#038;A&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Look for the slides up on &lt;a href="http://dimdim.com" target="_blank"&gt;DimDim.com&lt;/a&gt; soon. The presentation will also be recorded for others to view at a later time. Jay will post instructions for DimDim and the presentation as we get closer to the date next week.&lt;/p&gt;</description>
	<pubDate>Mon, 25 May 2009 15:00:09 +0000</pubDate>
</item>
<item>
	<title>Toru Maesaka: Storage Engine Dev Journal #2 : Command Line Options</title>
	<guid>http://torum.net/?p=1841</guid>
	<link>http://torum.net/2009/05/drizzle-plugin-command-line-options/</link>
	<description>&lt;p&gt;If you&amp;#8217;re working on developing a &lt;a href="https://launchpad.net/drizzle"&gt;Drizzle&lt;/a&gt; plugin, you may come across situations where you want to accept user options for it at server startup. For example, if you design your plugin to create files for activity logging, you may want to allow the DBA to specify where to write those files out.&lt;/p&gt;
&lt;p&gt;In my case, I decided to provide a command line option to &lt;a href="https://launchpad.net/blitzdb"&gt;BlitzDB&lt;/a&gt; for row  based query caching. This option is intended for special use-cases where the read/write ratio is 9:1. For those that are interested, row caching is disabled by default because it creates overhead in the engine for read-through logic and cache invalidation _unless_ read requests are significantly higher than update requests.&lt;/p&gt;
&lt;p&gt;There are situations where BlitzDB&amp;#8217;s row cache can be helpful but this is beyond the scope of this entry so I will save it for another day &lt;img src="http://torum.net/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /&gt; &lt;/p&gt;
&lt;h4&gt;Adding startup options to your plugin&lt;/h4&gt;
&lt;p&gt;Drizzle allows you to add command line options to your plugin without editing the server code. But before you start hacking away, there are few not-so-obvious things that you need to understand.&lt;/p&gt;
&lt;p&gt;So, let us first look at the data types that your plugin can accept:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DRIZZLE_SYSVAR_BOOL&lt;/li&gt;
&lt;li&gt;DRIZZLE_SYSVAR_STR&lt;/li&gt;
&lt;li&gt;DRIZZLE_SYSVAR_INT&lt;/li&gt;
&lt;li&gt;DRIZZLE_SYSVAR_UINT&lt;/li&gt;
&lt;li&gt;DRIZZLE_SYSVAR_LONG&lt;/li&gt;
&lt;li&gt;DRIZZLE_SYSVAR_ULONG&lt;/li&gt;
&lt;li&gt;DRIZZLE_SYSVAR_LONGLONG&lt;/li&gt;
&lt;li&gt;DRIZZLE_SYSVAR_ULONGLONG&lt;/li&gt;
&lt;li&gt;DRIZZLE_SYSVAR_ENUM&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As you can see, there is a wide range of types that you can choose from. What you should choose depends on what you want to use the value for.&lt;/p&gt;
&lt;h4&gt;Pick your data type&lt;/h4&gt;
&lt;p&gt;So lets take my row cache option as an example. Caching over 4 billion rows in one physical server is very unlikely and since we&amp;#8217;re not interested in negative numbers, we&amp;#8217;re going to pick:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DRIZZLE_SYSVAR_UINT&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;which we can store the value as uint32_t in the plugin.&lt;/p&gt;
&lt;h4&gt;Declare that your plugin accepts options&lt;/h4&gt;
&lt;p&gt;Every plugin must declare itself as a plugin which looks like this for BlitzDB:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="c"&gt;drizzle_declare_plugin&lt;span&gt;&amp;#40;&lt;/span&gt;blitz&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;
  &lt;span&gt;&amp;quot;BLITZ&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
  &lt;span&gt;&amp;quot;0.3&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
  &lt;span&gt;&amp;quot;Toru Maesaka&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
  &lt;span&gt;&amp;quot;Non-transactional General Purpose Engine&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
  PLUGIN_LICENSE_GPL&lt;span&gt;,&lt;/span&gt;
  blitz_init&lt;span&gt;,&lt;/span&gt;             &lt;span&gt;/*  Plugin Init      */&lt;/span&gt;
  blitz_deinit&lt;span&gt;,&lt;/span&gt;           &lt;span&gt;/*  Plugin Deinit    */&lt;/span&gt;
  &lt;span&gt;NULL&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;                   &lt;span&gt;/*  status variables */&lt;/span&gt;
  blitz_system_variables&lt;span&gt;,&lt;/span&gt; &lt;span&gt;/*  system variables */&lt;/span&gt;
  &lt;span&gt;NULL&lt;/span&gt;                    &lt;span&gt;/*  config options   */&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;
drizzle_declare_plugin_end&lt;span&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here, we&amp;#8217;re interested in the second last argument which is called blitz_system_variables in the above example. Feel free to call this whatever you like for your plugin.&lt;/p&gt;
&lt;p&gt;So what exactly is blitz_system_variables?  Its a null-terminated array of system variables that your plugin accepts. This is what it looks like for BlitzDB:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="c"&gt;&lt;span&gt;static&lt;/span&gt; &lt;span&gt;struct&lt;/span&gt; st_mysql_sys_var &lt;span&gt;*&lt;/span&gt;blitz_system_variables&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt; 
  DRIZZLE_SYSVAR&lt;span&gt;&amp;#40;&lt;/span&gt;row_cache&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
  &lt;span&gt;NULL&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As you can see, BlitzDB only supports one option at the moment so there is only one entry called row_cache.&lt;/p&gt;
&lt;h4&gt;Define your options&lt;/h4&gt;
&lt;p&gt;You must define every option that you&amp;#8217;ve added to the system variable array. We decided to use DRIZZLE_SYSVAR_UINT earlier and called it row_cache so it is defined like this:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="c"&gt;&lt;span&gt;static&lt;/span&gt; DRIZZLE_SYSVAR_UINT &lt;span&gt;&amp;#40;&lt;/span&gt;
  row_cache&lt;span&gt;,&lt;/span&gt; &lt;span&gt;/* option name */&lt;/span&gt;
  blitz_row_cache_size&lt;span&gt;,&lt;/span&gt; &lt;span&gt;/* variable to set the value to */&lt;/span&gt;
  PLUGIN_VAR_READONLY&lt;span&gt;,&lt;/span&gt; &lt;span&gt;/* mode */&lt;/span&gt;
  N_&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;Enable row caching for BlitzDB tables.&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
  &lt;span&gt;NULL&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;       &lt;span&gt;/*  check func    */&lt;/span&gt;
  &lt;span&gt;NULL&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;       &lt;span&gt;/*  update func   */&lt;/span&gt;
  &lt;span&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;          &lt;span&gt;/*  default value */&lt;/span&gt;
  &lt;span&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;          &lt;span&gt;/*  minimum value */&lt;/span&gt;
  UINT32_MAX&lt;span&gt;,&lt;/span&gt; &lt;span&gt;/*  maximum value */&lt;/span&gt;
  &lt;span&gt;0&lt;/span&gt;           &lt;span&gt;/*  block size    */&lt;/span&gt;
&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The comments pretty much explains what the arguments are but for more details, you should take a look at the macros in &lt;strong&gt;drizzled/plugin.h&lt;/strong&gt;. You could also look at what other plugins do by grepping for the system variable type that you&amp;#8217;re interested in.&lt;/p&gt;
&lt;h4&gt;Test your new startup option&lt;/h4&gt;
&lt;p&gt;If all goes well you should be able to compile Drizzle and check whether command line options are visible from the plugin. An option takes the following form:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="null"&gt;--&amp;lt;name_of_plugin&amp;gt;-&amp;lt;option_name&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So, in the row cache example, row cache can be enabled like this:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="null"&gt;/usr/local/sbin/drizzled --blitz-row_cache=10000&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Also note that you can replace the underscore with a hyphen:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="null"&gt;/usr/local/sbin/drizzled --blitz-row-cache=10000&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;That&amp;#8217;s it! it should be relatively easy to add more options once you successfully get your first one done. &lt;/p&gt;</description>
	<pubDate>Fri, 22 May 2009 09:27:10 +0000</pubDate>
</item>
<item>
	<title>MySQL Performance Blog: Open Development vs Making a Big Splash</title>
	<guid>http://www.mysqlperformanceblog.com/?p=695</guid>
	<link>http://www.mysqlperformanceblog.com/2009/05/21/open-development-vs-making-a-big-splash/</link>
	<description>&lt;p&gt;I find it very interesting how Sun does not get the very basic principle of true community Open Source development - you've got to give up on making a big splash. &lt;/p&gt;
&lt;p&gt;Traditional close source company often develop product in the secret and when it comes out as a surprise for computers and making a big splash for the users.   Does it remind you something ? Yes! this is exactly how Innodb Plugin was released last year or MySQL 5.4 performance improvements this year. &lt;/p&gt;
&lt;p&gt;Community did not know about them and did not participate early in this efforts.&lt;/p&gt;
&lt;p&gt;Another big splash which seems to be planned later this year is "Performance Schema" -  which is in development for years &lt;a href="http://www.markleith.co.uk/?p=112"&gt;as this post claims&lt;/a&gt;  but to date there is &lt;a href="http://www.xaprb.com/blog/2009/02/08/thoughts-on-the-new-performance_schema-in-mysql/"&gt;no code for community to play with&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I believe if you want to learn true community respect, you've got to respect (and so involve) community. You should show your early and buggy code and let community play with it and complain.  This is true Open Source development and it takes guts.&lt;/p&gt;
&lt;p&gt;I should praise Drizzle for having code available from very early days. I should praise Monty for having Maria storage engine tree available from its early and buggy days.  I should praise Falcon and PBXT teams which were not shy to show us multiple redesigns they had to go through.  This earns my respect and this is how I think Open Source development should be done. &lt;/p&gt;
&lt;p&gt;At Percona I think we're doing relatively well  - our trees are public and lauchpad and I do not think we had ever a project which was cooking internally for more than a month.  As soon as we got something which was interesting enough to start playing, such as Xtrabackup we got it out, just stating this is very early code. &lt;/p&gt;
&lt;p&gt;Google does not get very many points on this one - I think they are very obsessed with "everything Google does must be great"  policies which prevents them from releasing code before it is complete and properly tested at least internally.   Though I think Google do not position themselves as doing Open Source development but rather being kind enough to publicly share the development which is done internally.  This is fair and I appreciate it.&lt;/p&gt;
&lt;p&gt;So why Sun and Oracle are after big splashes ?  Well I think this is the only way tradition companies know how to market the stuff.  If project starts from single line of code and growths day by day to completion it is very hard to build excitement around it. There is no big news just a slow process. &lt;/p&gt;
&lt;p&gt;I would argue however releasing certain code as Stable/GA should be enough of event for masses - it is not however enough for community which see it just as minor incremental development from Initial Alpha/Beta releases.&lt;/p&gt;
    &lt;hr noshade="noshade" /&gt;
    &lt;p&gt;Entry posted by peter |
      &lt;a href="http://www.mysqlperformanceblog.com/2009/05/21/open-development-vs-making-a-big-splash/#comments"&gt;28 comments&lt;/a&gt;&lt;/p&gt;
    &lt;p&gt;Add to: &lt;a href="http://del.icio.us/post?url=http://www.mysqlperformanceblog.com/2009/05/21/open-development-vs-making-a-big-splash/&amp;amp;title=Open Development vs Making a Big Splash" title="Bookmark this post on del.icio.us"&gt;&lt;img src="http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/delicious.png" alt="delicious" /&gt;&lt;/a&gt; | &lt;a href="http://digg.com/submit?phase=2&amp;amp;url=http://www.mysqlperformanceblog.com/2009/05/21/open-development-vs-making-a-big-splash/&amp;amp;title=Open Development vs Making a Big Splash" title="Digg this post on Digg.com"&gt;&lt;img src="http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/digg.png" alt="digg" /&gt;&lt;/a&gt; | &lt;a href="http://reddit.com/submit?url=http://www.mysqlperformanceblog.com/2009/05/21/open-development-vs-making-a-big-splash/&amp;amp;title=Open Development vs Making a Big Splash" title="Submit this post on reddit.com"&gt;&lt;img src="http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/reddit.png" alt="reddit" /&gt;&lt;/a&gt; | &lt;a href="http://www.netscape.com/submit/?U=http://www.mysqlperformanceblog.com/2009/05/21/open-development-vs-making-a-big-splash/&amp;amp;T=Open Development vs Making a Big Splash" title="Vote for this article on Netscape"&gt;&lt;img src="http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/netscape.gif" alt="netscape" /&gt;&lt;/a&gt; | &lt;a href="http://www.google.com/bookmarks/mark?op=add&amp;amp;bkmk=http://www.mysqlperformanceblog.com/2009/05/21/open-development-vs-making-a-big-splash/&amp;amp;title=Open Development vs Making a Big Splash" title="Add to Google Bookmarks"&gt;&lt;img src="http://www.mysqlperformanceblog.com/wp-content/themes/boxy-but-gold/images/google.png" alt="Google Bookmarks" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 22 May 2009 05:39:33 +0000</pubDate>
</item>
<item>
	<title>Brian Aker: Libmemcached, BZR, Launchpad</title>
	<guid>http://krow.livejournal.com/637455.html</guid>
	<link>http://krow.livejournal.com/637455.html</link>
	<description>Today I moved from using Mercurial to using bzr on Launchpad for &lt;a href="http://launchpad.net/libmemcached"&gt;libmemcached&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Why BZR?&lt;br /&gt;&lt;br /&gt;I use Launchpad for pretty much all of my projects at this point. I have been really happy with it, and I have found that bzr works well for Linux/Windows/Mac. &lt;a href="http://launchpad.net/drizzle"&gt;Drizzle&lt;/a&gt;, &lt;a href="http://launchpad.net/gearmand"&gt;Gearman&lt;/a&gt; and others are already there so this just simplifies my daily workflow.&lt;br /&gt;&lt;br /&gt;This should help with me being able to take patches a bit more quickly (and for that matter do reviews). Having contributors push their patches to their own trees, allows me to easily pull patches and do reviews. With Drizzle we keep a "staging" tree just so that we can regression test any code before it goes to trunk. Since code in Drizzle goes through several people before I see it, we each get to make revisions on it and look for issues like copyright violations/etc. By tracking code by Launchpad account, we always know who code came from.&lt;br /&gt;&lt;br /&gt;For libmemcached I will also be enabling the bug system on Launchpad. While tracking via email has worked, I would like to come up with something a bit more formal.&lt;br /&gt;&lt;br /&gt;I've been using Laundpad for over a year now and I am really happy with it. Career wise I have used several proprietary systems, of which Bitkeeper was the best, and several open source ones, of which Subversion was the worst (it was the only system that ever lost code).&lt;br /&gt;&lt;br /&gt;All of the distributed revision control systems are pretty good now. I've used all of the major ones and have not really had many issues. The reason I go with bzr really has to do with workflow with Launchpad.&lt;br /&gt;&lt;br /&gt;Mercurial is great, and I will continue to use it for a lot of personal projects. It is the only open source distributed revision control system that I find to be easy to host. Its ability to do push/pull from HTTPS is a major asset for me. So for work I do where I need to continue to host the data I will be sticking with it. I completely understand why Google went with it, and I really wish BZR would add this feature.&lt;br /&gt;&lt;br /&gt;Looking back over the last few years it is amazing to see how far the revision source control system have gone. Just a few years ago all of the tools were garbage and it was a nightmare to pick one.&lt;br /&gt;&lt;br /&gt;Thankfully we are well past that.</description>
	<pubDate>Wed, 20 May 2009 18:43:37 +0000</pubDate>
</item>
<item>
	<title>Eric Day: Gearman, Now With Persistent Queues</title>
	<guid>http://www.oddments.org/?p=61</guid>
	<link>http://www.oddments.org/?p=61</link>
	<description>&lt;p&gt;I&amp;#8217;m pleased to announce version 0.6 of the &lt;a href="https://launchpad.net/gearmand/+download"&gt;Gearman C server and library&lt;/a&gt;. The major new feature of this release is a pluggable persistent queue for the job server. It comes bundled with a libdrizzle module (so your queue can live in Drizzle or MySQL), but &lt;a href="http://krow.net/"&gt;Brian&lt;/a&gt; has already written a libmemcached module and there is a flat-file module in the works as well. The persistent queue allows background jobs to be stored via the pluggable module, so if the job server crashes or is shutdown, the queue module can repopulate the job server with any jobs that were not yet complete. This is just the first version of the queue support, so expect more modules and features in the future!&lt;/p&gt;
&lt;p&gt;On a related note, &lt;a href="http://jluedke.com/"&gt;James Luedke&lt;/a&gt; has also released version 0.3 of the &lt;a href="http://pecl.php.net/package/gearman"&gt;Gearman PHP Extension&lt;/a&gt;. This project now lives in the PHP PECL repository (where it should), so be sure to look there for downloads and the latest source.&lt;/p&gt;</description>
	<pubDate>Wed, 20 May 2009 08:52:33 +0000</pubDate>
</item>
<item>
	<title>Brian Aker: Libmemcached Version 0.29 Released</title>
	<guid>http://krow.livejournal.com/637297.html</guid>
	<link>http://krow.livejournal.com/637297.html</link>
	<description>We have released version 0.29 of libmemcached.&lt;br /&gt;&lt;br /&gt;The highlights:&lt;br /&gt;   * Fixed malloc usage to calloc for spots where we need zero filled memory.&lt;br /&gt;   * All code warnings now treated as errors.&lt;br /&gt;   * Fixes for debian packaging.&lt;br /&gt;   * Added new pooling mechanism.&lt;br /&gt;   * MEMCACHED_BEHAVIOR_NO_BLOCK no longer also sets MEMCACHED_BEHAVIOR_BUFFER_REQUESTS.&lt;br /&gt;   * Updated generic rpm.&lt;br /&gt;&lt;br /&gt;The new pooling mechanism is thread safe so if you have been looking for a way to limit your number of memcachd_st structures and you use threads you are now set!&lt;br /&gt;This work was done to improve the connection handling in Drizzle for Memcachd (and it is going into the UDF for MySQL as well).&lt;br /&gt;&lt;br /&gt;You can find out more information here:&lt;br /&gt;&lt;a href="http://tangent.org/552/libmemcached.html"&gt;http://tangent.org/552/libmemcached.html&lt;/a&gt;</description>
	<pubDate>Tue, 19 May 2009 15:54:49 +0000</pubDate>
</item>
<item>
	<title>Eric Day: Gearman UDF now in Drizzle</title>
	<guid>http://www.oddments.org/?p=60</guid>
	<link>http://www.oddments.org/?p=60</link>
	<description>&lt;p&gt;If you&amp;#8217;ve pulled the latest &lt;a href="http://drizzle.org/"&gt;Drizzle&lt;/a&gt; code from lp:drizzle, you may have noticed a new plugin/gearman_udf directory in there. This is a new UDF that acts as a &lt;a href="http://www.gearman.org/"&gt;Gearman&lt;/a&gt; client. This is mostly a port of the &lt;a href="https://launchpad.net/gearman-mysql-udf"&gt;Gearman MySQL UDF&lt;/a&gt; I wrote, but I did it the proper C++ way to fit in better with Drizzle. It also uses the new plugin system Monty Taylor has been working in, which makes it much easier. :)&lt;/p&gt;
&lt;p&gt;To use it, just make sure you have the &lt;a href="https://launchpad.net/gearmand"&gt;Gearman C library&lt;/a&gt; installed and Drizzle will pick it up and build it for you. No extra configuration required!&lt;/p&gt;
&lt;p&gt;The following example assumes you have a Gearman job server and a reverse worker running (see examples/reverse_worker in the C library package).&lt;/p&gt;
&lt;pre&gt;
drizzle&gt; SELECT gman_servers_set("127.0.0.1");
+-------------------------------+
| gman_servers_set("127.0.0.1") |
+-------------------------------+
| 127.0.0.1                     |
+-------------------------------+
1 row in set (0 sec)

drizzle&gt; SELECT gman_do("reverse", table_name) FROM information_schema.tables LIMIT 3;
+---------------------------------------+
| gman_do("reverse", table_name)        |
+---------------------------------------+
| STES_RETCARAHC                        |
| SNOITALLOC                            |
| YTILIBACILPPA_TES_RETCARAHC_NOITALLOC |
+---------------------------------------+
3 rows in set (0 sec)
&lt;/pre&gt;</description>
	<pubDate>Fri, 15 May 2009 19:17:00 +0000</pubDate>
</item>
<item>
	<title>Stewart Smith: Size of Storage Engines</title>
	<guid>http://www.flamingspork.com/blog/?p=1636</guid>
	<link>http://www.flamingspork.com/blog/2009/05/15/size-of-storage-engines/</link>
	<description>&lt;p&gt;For whatever reason, let&amp;#8217;s look at &amp;#8220;Total Physical Source Lines of Code&amp;#8221; from a recent mysql-6.0 tree (and PBXT from PBXT source repo):&lt;/p&gt;
&lt;p&gt;&lt;a href="http://spreadsheets.google.com/pub?key=r_gtZ-mKTsbSlp6anfnACXw&amp;amp;oid=1&amp;amp;output=image"&gt;&lt;img class="alignnone" title="SLOCcount" src="http://spreadsheets.google.com/pub?key=r_gtZ-mKTsbSlp6anfnACXw&amp;amp;oid=1&amp;amp;output=image" alt="" width="450" height="320" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;See the spreadsheet &lt;a href="http://spreadsheets.google.com/pub?key=r_gtZ-mKTsbSlp6anfnACXw"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Raw data:&lt;/p&gt;
&lt;p&gt;Blackhole        336&lt;br /&gt;
CSV             1143&lt;br /&gt;
Archive         2960&lt;br /&gt;
MyISAM         34019&lt;br /&gt;
PBXT           41732&lt;br /&gt;
Maria          69019&lt;br /&gt;
InnoDB         82557&lt;br /&gt;
Falcon         91158&lt;br /&gt;
NDB           365272&lt;/p&gt;
&lt;p&gt;NDB has a 100,000 line test suite.&lt;/p&gt;
&lt;p&gt;PBXT supports MySQL and Drizzle.&lt;/p&gt;
&lt;p&gt;Conclusions to draw? Err&amp;#8230; none really.&lt;/p&gt;</description>
	<pubDate>Fri, 15 May 2009 05:33:00 +0000</pubDate>
</item>
<item>
	<title>Eric Day: Sphinx Now Indexing from Drizzle</title>
	<guid>http://www.oddments.org/?p=59</guid>
	<link>http://www.oddments.org/?p=59</link>
	<description>&lt;p&gt;In preparation for an upcoming demo, we decided to use &lt;a href="http://www.sphinxsearch.com/"&gt;Sphinx&lt;/a&gt; for the full text search. We want to do this with &lt;a href="http://drizzle.org/"&gt;Drizzle&lt;/a&gt; but hit an obvious problem - Sphinx does not know how to speak to Drizzle to grab documents for indexing. At least that was the case until last night when I created a patch to do so using the new &lt;a href="https://launchpad.net/libdrizzle"&gt;libdrizzle&lt;/a&gt; library.&lt;/p&gt;
&lt;p&gt;You can download the patch here: &lt;a href="http://oddments.org/notes/sphinx-0.9.8.1-drizzle.patch"&gt;sphinx-0.9.8.1-drizzle.patch&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m releasing this patch BSD, so do with it what you want. I&amp;#8217;m hoping Andrew (the Sphinx author) will include this in the main package in an upcoming release. :)&lt;/p&gt;
&lt;p&gt;So for now, to get things working, we first need to patch the sphinx-0.9.8.1 source and build/install:&lt;/p&gt;
&lt;pre&gt;
Download sphinx-0.9.8.1.tar.gz and sphinx-0.9.8.1-drizzle.patch
tar xzf sphinx-0.9.8.1.tar.gz
cd sphinx-0.9.8.1
patch -p1  ../sphinx-0.9.8.1-drizzle.patch
sh bootstrap
./configure --with-drizzle
make
make install
&lt;/pre&gt;
&lt;p&gt;To show this in action, start up drizzled (see the &lt;a href="http://drizzle.org/wiki/"&gt;Drizzle wiki&lt;/a&gt; for details), and create a database named &amp;#8216;test&amp;#8217;. Then load the sample data included with Sphinx (assuming /usr/local for install):&lt;/p&gt;
&lt;pre&gt;
drizzle  /usr/local/etc/example.sql
&lt;/pre&gt;
&lt;p&gt;Next we need to configure Sphinx to pull documents from Drizzle in the sphinx.conf. To do this, copy the sphinx.conf.dist to sphinx.conf and modify it:&lt;/p&gt;
&lt;pre&gt;
cp /usr/local/etc/sphinx.conf.dist /usr/local/etc/sphinx.conf
vi /usr/local/etc/sphinx.conf
diff /usr/local/etc/sphinx.conf.dist /usr/local/etc/sphinx.conf
17c17
       type                                    = mysql
---
&gt;       type                                    = drizzle
28c28
       sql_port                                = 3306  # optional, default is 3306
---
&gt; #     sql_port                                = 3306  # optional, default is 3306
&lt;/pre&gt;
&lt;p&gt;We switch the source type to drizzle and comment out the port so it uses the default Drizzle port (4427). Now with the DB loaded with sample documents and Sphinx configured, let&amp;#8217;s test it:&lt;/p&gt;
&lt;pre&gt;
&gt; indexer test1
Sphinx 0.9.8.1-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff

using config file '/usr/local/etc/sphinx.conf'...
indexing index 'test1'...
collected 4 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 4 docs, 193 bytes
total 0.010 sec, 19300.00 bytes/sec, 400.00 docs/sec

&gt; search -i test1 document
Sphinx 0.9.8.1-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff

using config file '/usr/local/etc/sphinx.conf'...
index 'test1': query 'document ': returned 2 matches of 2 total in 0.000 sec

displaying matches:
1. document=1, weight=1, group_id=1, date_added=Thu May 14 13:20:35 2009
2. document=2, weight=1, group_id=1, date_added=Thu May 14 13:20:35 2009

words:
1. 'document': 2 documents, 2 hits
&lt;/pre&gt;
&lt;p&gt;We still need to get the Sphinx search engine ported to Drizzle, but now we can at least index from Drizzle and use one of the Sphinx APIs to search from our applications. With the returned document IDs we can then ask Drizzle (or memcached if we cache them there) for the URLs, documents, or any other data. Let me know if you have any problems getting it running, the fastest way to reach me is &amp;#8216;eday&amp;#8217; on irc.freenode.net (/msg or /join #drizzle).&lt;/p&gt;</description>
	<pubDate>Thu, 14 May 2009 22:28:46 +0000</pubDate>
</item>
<item>
	<title>Michael Shadle: Porting WordPress to Drizzle - Will I Succeed?</title>
	<guid>http://michaelshadle.com/?p=167</guid>
	<link>http://michaelshadle.com/2009/05/14/porting-wordpress-to-drizzle-will-i-succeed/</link>
	<description>&lt;p&gt;Since I can't write C to save my life, I'm attempting to help out in other ways. This has been in the form of donating machine time, helping with the wiki, blog and being a general smartass on #drizzle.&lt;/p&gt;
&lt;p&gt;However, where I can provide some help is trying to showcase and see how apps may need to change to work with Drizzle as opposed to MySQL.&lt;/p&gt;
&lt;p&gt;I will admit, this may go nowhere as I am consistently swamped with work &lt;strike&gt;and a busy social life&lt;/strike&gt;, but it might be something fun to mess around with to get used to working with Drizzle and possibly come up with something to give back to the community.&lt;/p&gt;
&lt;p&gt;I don't expect a huge amount of changes. I think some column types might need to change and definately the DB class (I will be using the native drizzle-php-ext module, even though I believe the mysql/mysqli/etc. modules may work transparently already) - so we shall see.&lt;/p&gt;
&lt;p&gt;So wish me luck!&lt;/p&gt;</description>
	<pubDate>Thu, 14 May 2009 08:38:41 +0000</pubDate>
</item>

</channel>
</rss>
