<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Letsgetdugg&#187; administration</title>
	<atom:link href="http://letsgetdugg.com/category/administration/feed/" rel="self" type="application/rss+xml" />
	<link>http://letsgetdugg.com</link>
	<description>Random tech jargon</description>
	<lastBuildDate>Tue, 31 Aug 2010 22:18:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>MySQL ZFS Snapshot Backups</title>
		<link>http://letsgetdugg.com/2010/08/31/mysql-zfs-snapshot-backups/</link>
		<comments>http://letsgetdugg.com/2010/08/31/mysql-zfs-snapshot-backups/#comments</comments>
		<pubDate>Tue, 31 Aug 2010 22:08:43 +0000</pubDate>
		<dc:creator>victori</dc:creator>
				<category><![CDATA[administration]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[zfs]]></category>

		<guid isPermaLink="false">http://letsgetdugg.com/?p=767</guid>
		<description><![CDATA[This is a followup on my previous post concerning how to correctly snapshot databases on ZFS. Snapshotting MySQL any other way will just lead to corrupt database states, essentially making your backups useless. Here is my script that I use to snapshot our MySQL database. It uses my zBackup.rb script for the automated backup rotation. [...]]]></description>
			<content:encoded><![CDATA[<p>This is a followup on my previous <a href="http://letsgetdugg.com/2010/06/23/postgresql-zfs-snapshot-backups/">post concerning how to correctly snapshot databases on ZFS</a>. Snapshotting MySQL any other way will just lead to corrupt database states, essentially making your backups useless. </p>
<p>Here is my script that I use to snapshot our MySQL database. It uses my <a href="http://letsgetdugg.com/2010/03/30/automated-zfs-snapshots/">zBackup.rb script</a> for the automated backup rotation. </p>
<div class="codesnip-container" >#!/bin/sh</p>
<p>mysql -h fab2 -u usr -ppass -e &#8216;flush tables;flush tables with read lock;&#8217;</p>
<p>/usr/bin/ruby /opt/zbackup.rb rpool/mydata 7</p>
<p>mysql -h fab2 -u usr -ppass -e &#8216;unlock tables;&#8217;</p></div>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F08%2F31%2Fmysql-zfs-snapshot-backups%2F&amp;title=MySQL%20ZFS%20Snapshot%20Backups&amp;bodytext=This%20is%20a%20followup%20on%20my%20previous%20post%20concerning%20how%20to%20correctly%20snapshot%20databases%20on%20ZFS.%20Snapshotting%20MySQL%20any%20other%20way%20will%20just%20lead%20to%20corrupt%20database%20states%2C%20essentially%20making%20your%20backups%20useless.%20%0A%0AHere%20is%20my%20script%20that%20I%20use%20to%20snaps" title="Digg"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fletsgetdugg.com%2F2010%2F08%2F31%2Fmysql-zfs-snapshot-backups%2F" title="Sphinn"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F08%2F31%2Fmysql-zfs-snapshot-backups%2F&amp;title=MySQL%20ZFS%20Snapshot%20Backups&amp;notes=This%20is%20a%20followup%20on%20my%20previous%20post%20concerning%20how%20to%20correctly%20snapshot%20databases%20on%20ZFS.%20Snapshotting%20MySQL%20any%20other%20way%20will%20just%20lead%20to%20corrupt%20database%20states%2C%20essentially%20making%20your%20backups%20useless.%20%0A%0AHere%20is%20my%20script%20that%20I%20use%20to%20snaps" title="del.icio.us"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fletsgetdugg.com%2F2010%2F08%2F31%2Fmysql-zfs-snapshot-backups%2F&amp;t=MySQL%20ZFS%20Snapshot%20Backups" title="Facebook"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F08%2F31%2Fmysql-zfs-snapshot-backups%2F&amp;title=MySQL%20ZFS%20Snapshot%20Backups" title="Mixx"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fletsgetdugg.com%2F2010%2F08%2F31%2Fmysql-zfs-snapshot-backups%2F&amp;title=MySQL%20ZFS%20Snapshot%20Backups&amp;annotation=This%20is%20a%20followup%20on%20my%20previous%20post%20concerning%20how%20to%20correctly%20snapshot%20databases%20on%20ZFS.%20Snapshotting%20MySQL%20any%20other%20way%20will%20just%20lead%20to%20corrupt%20database%20states%2C%20essentially%20making%20your%20backups%20useless.%20%0A%0AHere%20is%20my%20script%20that%20I%20use%20to%20snaps" title="Google Bookmarks"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.designfloat.com/submit.php?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F08%2F31%2Fmysql-zfs-snapshot-backups%2F&amp;title=MySQL%20ZFS%20Snapshot%20Backups" title="Design Float"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/designfloat.png" title="Design Float" alt="Design Float" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F08%2F31%2Fmysql-zfs-snapshot-backups%2F&amp;title=MySQL%20ZFS%20Snapshot%20Backups" title="DZone"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/dzone.png" title="DZone" alt="DZone" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://reddit.com/submit?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F08%2F31%2Fmysql-zfs-snapshot-backups%2F&amp;title=MySQL%20ZFS%20Snapshot%20Backups" title="Reddit"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://slashdot.org/bookmark.pl?title=MySQL%20ZFS%20Snapshot%20Backups&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F08%2F31%2Fmysql-zfs-snapshot-backups%2F" title="Slashdot"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/slashdot.png" title="Slashdot" alt="Slashdot" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="" title="TwitThis"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/" title="TwitThis" alt="TwitThis" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://letsgetdugg.com/2010/08/31/mysql-zfs-snapshot-backups/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MacOS X ZFS Samba Transfer Fix</title>
		<link>http://letsgetdugg.com/2010/07/18/macos-x-zfs-samba-transfer-fix/</link>
		<comments>http://letsgetdugg.com/2010/07/18/macos-x-zfs-samba-transfer-fix/#comments</comments>
		<pubDate>Sun, 18 Jul 2010 16:19:01 +0000</pubDate>
		<dc:creator>victori</dc:creator>
				<category><![CDATA[administration]]></category>
		<category><![CDATA[main]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[fix]]></category>
		<category><![CDATA[zfs]]></category>

		<guid isPermaLink="false">http://letsgetdugg.com/?p=737</guid>
		<description><![CDATA[I have a very non-standard storage setup at home. The setup is made up of a 3x500G raidz array on ZFS hosted by OSX. For the longest time I could not get files to copy over samba on ZFS. The files would stream just fine but not copy over, they would abort at the 99% [...]]]></description>
			<content:encoded><![CDATA[<p>I have a very non-standard storage setup at home. The setup is made up of a 3x500G raidz array on ZFS hosted by OSX. For the longest time I could not get files to copy over samba on ZFS. The files would stream just fine but not copy over, they would abort at the 99% transfer point. Well, I have finally found the fix for it; turn off extended attributes!</p>
<p>smb.conf</p>
<div class="codesnip-container" >#vfs objects = notify_kqueue,darwinacl,darwin_streams<br />
    vfs objects = notify_kqueue,darwinacl</p>
<p>    ; The darwin_streams module gives us named streams support.<br />
    stream support = no<br />
    ea support = no</p>
<p>    ; Enable locking coherency with AFP.<br />
    darwin_streams:brlm = no</p></div>
<p>As Charles Heston would say, You can have my ZFS when you pry it from my cold dead hands. </p>
<p>viva ZFS on OSX!</p>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F07%2F18%2Fmacos-x-zfs-samba-transfer-fix%2F&amp;title=MacOS%20X%20ZFS%20Samba%20Transfer%20Fix&amp;bodytext=I%20have%20a%20very%20non-standard%20storage%20setup%20at%20home.%20The%20setup%20is%20made%20up%20of%20a%203x500G%20raidz%20array%20on%20ZFS%20hosted%20by%20OSX.%20For%20the%20longest%20time%20I%20could%20not%20get%20files%20to%20copy%20over%20samba%20on%20ZFS.%20The%20files%20would%20stream%20just%20fine%20but%20not%20copy%20over%2C%20they%20would%20" title="Digg"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fletsgetdugg.com%2F2010%2F07%2F18%2Fmacos-x-zfs-samba-transfer-fix%2F" title="Sphinn"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F07%2F18%2Fmacos-x-zfs-samba-transfer-fix%2F&amp;title=MacOS%20X%20ZFS%20Samba%20Transfer%20Fix&amp;notes=I%20have%20a%20very%20non-standard%20storage%20setup%20at%20home.%20The%20setup%20is%20made%20up%20of%20a%203x500G%20raidz%20array%20on%20ZFS%20hosted%20by%20OSX.%20For%20the%20longest%20time%20I%20could%20not%20get%20files%20to%20copy%20over%20samba%20on%20ZFS.%20The%20files%20would%20stream%20just%20fine%20but%20not%20copy%20over%2C%20they%20would%20" title="del.icio.us"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fletsgetdugg.com%2F2010%2F07%2F18%2Fmacos-x-zfs-samba-transfer-fix%2F&amp;t=MacOS%20X%20ZFS%20Samba%20Transfer%20Fix" title="Facebook"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F07%2F18%2Fmacos-x-zfs-samba-transfer-fix%2F&amp;title=MacOS%20X%20ZFS%20Samba%20Transfer%20Fix" title="Mixx"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fletsgetdugg.com%2F2010%2F07%2F18%2Fmacos-x-zfs-samba-transfer-fix%2F&amp;title=MacOS%20X%20ZFS%20Samba%20Transfer%20Fix&amp;annotation=I%20have%20a%20very%20non-standard%20storage%20setup%20at%20home.%20The%20setup%20is%20made%20up%20of%20a%203x500G%20raidz%20array%20on%20ZFS%20hosted%20by%20OSX.%20For%20the%20longest%20time%20I%20could%20not%20get%20files%20to%20copy%20over%20samba%20on%20ZFS.%20The%20files%20would%20stream%20just%20fine%20but%20not%20copy%20over%2C%20they%20would%20" title="Google Bookmarks"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.designfloat.com/submit.php?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F07%2F18%2Fmacos-x-zfs-samba-transfer-fix%2F&amp;title=MacOS%20X%20ZFS%20Samba%20Transfer%20Fix" title="Design Float"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/designfloat.png" title="Design Float" alt="Design Float" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F07%2F18%2Fmacos-x-zfs-samba-transfer-fix%2F&amp;title=MacOS%20X%20ZFS%20Samba%20Transfer%20Fix" title="DZone"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/dzone.png" title="DZone" alt="DZone" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://reddit.com/submit?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F07%2F18%2Fmacos-x-zfs-samba-transfer-fix%2F&amp;title=MacOS%20X%20ZFS%20Samba%20Transfer%20Fix" title="Reddit"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://slashdot.org/bookmark.pl?title=MacOS%20X%20ZFS%20Samba%20Transfer%20Fix&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F07%2F18%2Fmacos-x-zfs-samba-transfer-fix%2F" title="Slashdot"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/slashdot.png" title="Slashdot" alt="Slashdot" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="" title="TwitThis"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/" title="TwitThis" alt="TwitThis" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://letsgetdugg.com/2010/07/18/macos-x-zfs-samba-transfer-fix/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CouchDB on ZFS</title>
		<link>http://letsgetdugg.com/2010/06/25/couchdb-on-zfs/</link>
		<comments>http://letsgetdugg.com/2010/06/25/couchdb-on-zfs/#comments</comments>
		<pubDate>Sat, 26 Jun 2010 06:29:22 +0000</pubDate>
		<dc:creator>victori</dc:creator>
				<category><![CDATA[administration]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[couchdb]]></category>
		<category><![CDATA[databases]]></category>
		<category><![CDATA[zfs]]></category>

		<guid isPermaLink="false">http://letsgetdugg.com/?p=694</guid>
		<description><![CDATA[CouchDB was made for next generation filesystems such as ZFS and BTRFS. First off, unlike PostgreSQL or MySQL, CouchDB can be snapshot while in production without any flushing or locking trickery since it uses an append only B-Tree storage approach. That alone makes it a compelling database choice on ZFS/BTRFS. Second, CouchDB works hand-in-hand with [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://couchdb.apache.org/">CouchDB</a> was <em>made</em> for next generation filesystems such as <a href="http://en.wikipedia.org/wiki/ZFS">ZFS</a> and <a href="http://en.wikipedia.org/wiki/Btrfs">BTRFS</a>. First off, unlike <a href="http://www.postgresql.org/">PostgreSQL</a> or <a href="http://www.mysql.com/">MySQL</a>, CouchDB can be snapshot while in production without any flushing or locking trickery since it uses an append only B-Tree storage approach. That alone makes it a compelling database choice on ZFS/BTRFS. </p>
<p>Second, CouchDB works hand-in-hand with ZFS&#8217;s block level compression. ZFS can compress blocks of data as they are being written out to the disk. However, it only does it for new blocks and not retroactively. Now, the awesome part, CouchDB on compaction writes out a brand new database file which can utilize the new gzip compression settings on ZFS. This means you can try out different gzip compression settings just by compacting your CouchDB. </p>
<p>Some tips on running CouchDB on ZFS:</p>
<p>1. Use automated snapshots to prevent $admin error, it is painless with ZFS and CouchDB loves being snapshot <img src='http://letsgetdugg.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>You can give my little <a href="http://letsgetdugg.com/2010/03/30/automated-zfs-snapshots/">ruby script a try for daily snapshots</a>; I use it both on Mac OSX and Solaris for automated ZFS snapshot goodness.</p>
<div class="codesnip-container" >zfs snapshot rpool/couchdb@mysnapshot-tuesday</div>
<p>2. Try out various gzip compression schemes on your CouchDB workload, re-compact the database to use the new gzip compression settings. I personally use the gzip-4 compression for our workload which strikes the perfect balance between space and cpu utilization. </p>
<div class="codesnip-container" >zfs set compression=gzip-4 rpool/couchdb</div>
<p>3. Set the ZFS dataset to 4k block record size and turn off atime. Yes the B-Tree append only approach is elastic on writes but you can have near perfect tiny writes with a small 4k block record size. </p>
<div class="codesnip-container" >zfs set recordsize=4k rpool/couchdb<br />
zfs set atime=off rpool/couchdb</div>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F25%2Fcouchdb-on-zfs%2F&amp;title=CouchDB%20on%20ZFS&amp;bodytext=CouchDB%20was%20made%20for%20next%20generation%20filesystems%20such%20as%20ZFS%20and%20BTRFS.%20First%20off%2C%20unlike%20PostgreSQL%20or%20MySQL%2C%20CouchDB%20can%20be%20snapshot%20while%20in%20production%20without%20any%20flushing%20or%20locking%20trickery%20since%20it%20uses%20an%20append%20only%20B-Tree%20storage%20approach.%20" title="Digg"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F25%2Fcouchdb-on-zfs%2F" title="Sphinn"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F25%2Fcouchdb-on-zfs%2F&amp;title=CouchDB%20on%20ZFS&amp;notes=CouchDB%20was%20made%20for%20next%20generation%20filesystems%20such%20as%20ZFS%20and%20BTRFS.%20First%20off%2C%20unlike%20PostgreSQL%20or%20MySQL%2C%20CouchDB%20can%20be%20snapshot%20while%20in%20production%20without%20any%20flushing%20or%20locking%20trickery%20since%20it%20uses%20an%20append%20only%20B-Tree%20storage%20approach.%20" title="del.icio.us"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F25%2Fcouchdb-on-zfs%2F&amp;t=CouchDB%20on%20ZFS" title="Facebook"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F25%2Fcouchdb-on-zfs%2F&amp;title=CouchDB%20on%20ZFS" title="Mixx"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F25%2Fcouchdb-on-zfs%2F&amp;title=CouchDB%20on%20ZFS&amp;annotation=CouchDB%20was%20made%20for%20next%20generation%20filesystems%20such%20as%20ZFS%20and%20BTRFS.%20First%20off%2C%20unlike%20PostgreSQL%20or%20MySQL%2C%20CouchDB%20can%20be%20snapshot%20while%20in%20production%20without%20any%20flushing%20or%20locking%20trickery%20since%20it%20uses%20an%20append%20only%20B-Tree%20storage%20approach.%20" title="Google Bookmarks"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.designfloat.com/submit.php?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F25%2Fcouchdb-on-zfs%2F&amp;title=CouchDB%20on%20ZFS" title="Design Float"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/designfloat.png" title="Design Float" alt="Design Float" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F25%2Fcouchdb-on-zfs%2F&amp;title=CouchDB%20on%20ZFS" title="DZone"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/dzone.png" title="DZone" alt="DZone" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://reddit.com/submit?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F25%2Fcouchdb-on-zfs%2F&amp;title=CouchDB%20on%20ZFS" title="Reddit"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://slashdot.org/bookmark.pl?title=CouchDB%20on%20ZFS&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F25%2Fcouchdb-on-zfs%2F" title="Slashdot"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/slashdot.png" title="Slashdot" alt="Slashdot" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="" title="TwitThis"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/" title="TwitThis" alt="TwitThis" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://letsgetdugg.com/2010/06/25/couchdb-on-zfs/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>PostgreSQL ZFS Snapshot Backups</title>
		<link>http://letsgetdugg.com/2010/06/23/postgresql-zfs-snapshot-backups/</link>
		<comments>http://letsgetdugg.com/2010/06/23/postgresql-zfs-snapshot-backups/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 19:31:15 +0000</pubDate>
		<dc:creator>victori</dc:creator>
				<category><![CDATA[administration]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[zfs]]></category>

		<guid isPermaLink="false">http://letsgetdugg.com/?p=676</guid>
		<description><![CDATA[I recently had a WD Raptor drive die in a server that hosted our PostgreSQL database. I had a ZFS snapshot strategy setup that sent over ZFS snapshots of the live database to a ZFS mirror for backup purposes. Looked good in theory right? Except, I forgot to do one critical thing, test my backups. [...]]]></description>
			<content:encoded><![CDATA[<p>I recently had a WD Raptor drive die in a server that hosted our <a href="http://www.postgresql.org/">PostgreSQL</a> database. I had a ZFS snapshot strategy setup that sent over ZFS snapshots of the live database to a ZFS mirror for backup purposes. Looked good in theory right? Except, I forgot to do one critical thing, test my backups. Long story short, I had a bunch of snapshots that were useless. Luckily I had offsite nightly PostgreSQL dumps that I did test which were used to seed my development database. So in the end I avoided catastrophic data failure.</p>
<p>With that lesson in mind, I reconfigured our backup system to do it correctly after re-reading the PostgreSQL documentation.</p>
<p><strong>Prerequisite:</strong> You must have WAL archiving on and have the archive directory under your database directory. For example if your database is under <em>/rpool/pgdata/db1</em> configure your archive directory under <em>/rpool/pgdata/db1/archives</em></p>
<p>Completely optional but I highly suggest you automate your backups; My <a href="http://letsgetdugg.com/2010/03/30/automated-zfs-snapshots/">zbackup ruby script is pretty simple to setup.</a></p>
<p>This is how my /rpool/pgdata/db1 Looks like:</p>
<pre>
victori@opensolaris:/# ls /rpool/data/db1
archives      pg_clog	     pg_multixact  pg_twophase	    postmaster.log
backup_label  pg_hba.conf    pg_stat_tmp   PG_VERSION	    postmaster.opts
base	      pg_ident.conf  pg_subtrans   pg_xlog	    postmaster.pid
global	      pg_log	     pg_tblspc	   postgresql.conf
</pre>
<p>Source for my pgsnap.sh script.</p>
<div class="codesnip-container" >#!/bin/sh</p>
<p>PGPASSWORD=&#8221;mypass&#8221; psql -h fab2 postgres -U myuser -c &#8220;select pg_start_backup(&#8216;nightly&#8217;,true);&#8221;</p>
<p>/usr/bin/ruby /opt/zbackup.rb rpool/pgdata 7</p>
<p>PGPASSWORD=&#8221;mypass&#8221; psql -h fab2 postgres -U myuser -c &#8220;select pg_stop_backup();&#8221;</p>
<p>rm /rpool/pgdata/db1/archives/*</p></div>
<p>The process is quite simple. You issue a command to initiate the backup process so PostgreSQL goes into &#8220;backup mode.&#8221; Second, you do the ZFS snapshot, in this case I am using my <a href="http://letsgetdugg.com/2010/03/30/automated-zfs-snapshots/">zbackup ruby script</a>. Third, you issue another SQL command to PostgrSQL to get out of backup mode. Lastly, since you have the database snapshot you can safely delete your previous WAL archives. </p>
<p>Now, this is all nice and dandy but you should *TEST* your backups, before assuming your backup strategy actually worked. </p>
<div class="codesnip-container" >zfs clone rpool/pgdata@2010-6-17 rpool/pgtest<br />
postgres &#8211;singleuser mydb -D /rpool/pgtest/db1</div>
<p>Basically you clone the snapshot and test it by running it under PostgreSQL in single user mode. Once in singleuser mode, test out your backup to make sure it is readable, you can issue a SQL queries to confirm that all is fine with the backup. </p>
<p>ZFS you rock my world <img src='http://letsgetdugg.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F23%2Fpostgresql-zfs-snapshot-backups%2F&amp;title=PostgreSQL%20ZFS%20Snapshot%20Backups&amp;bodytext=I%20recently%20had%20a%20WD%20Raptor%20drive%20die%20in%20a%20server%20that%20hosted%20our%20PostgreSQL%20database.%20I%20had%20a%20ZFS%20snapshot%20strategy%20setup%20that%20sent%20over%20ZFS%20snapshots%20of%20the%20live%20database%20to%20a%20ZFS%20mirror%20for%20backup%20purposes.%20Looked%20good%20in%20theory%20right%3F%20Except%2C%20I%20fo" title="Digg"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F23%2Fpostgresql-zfs-snapshot-backups%2F" title="Sphinn"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F23%2Fpostgresql-zfs-snapshot-backups%2F&amp;title=PostgreSQL%20ZFS%20Snapshot%20Backups&amp;notes=I%20recently%20had%20a%20WD%20Raptor%20drive%20die%20in%20a%20server%20that%20hosted%20our%20PostgreSQL%20database.%20I%20had%20a%20ZFS%20snapshot%20strategy%20setup%20that%20sent%20over%20ZFS%20snapshots%20of%20the%20live%20database%20to%20a%20ZFS%20mirror%20for%20backup%20purposes.%20Looked%20good%20in%20theory%20right%3F%20Except%2C%20I%20fo" title="del.icio.us"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F23%2Fpostgresql-zfs-snapshot-backups%2F&amp;t=PostgreSQL%20ZFS%20Snapshot%20Backups" title="Facebook"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F23%2Fpostgresql-zfs-snapshot-backups%2F&amp;title=PostgreSQL%20ZFS%20Snapshot%20Backups" title="Mixx"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F23%2Fpostgresql-zfs-snapshot-backups%2F&amp;title=PostgreSQL%20ZFS%20Snapshot%20Backups&amp;annotation=I%20recently%20had%20a%20WD%20Raptor%20drive%20die%20in%20a%20server%20that%20hosted%20our%20PostgreSQL%20database.%20I%20had%20a%20ZFS%20snapshot%20strategy%20setup%20that%20sent%20over%20ZFS%20snapshots%20of%20the%20live%20database%20to%20a%20ZFS%20mirror%20for%20backup%20purposes.%20Looked%20good%20in%20theory%20right%3F%20Except%2C%20I%20fo" title="Google Bookmarks"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.designfloat.com/submit.php?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F23%2Fpostgresql-zfs-snapshot-backups%2F&amp;title=PostgreSQL%20ZFS%20Snapshot%20Backups" title="Design Float"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/designfloat.png" title="Design Float" alt="Design Float" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F23%2Fpostgresql-zfs-snapshot-backups%2F&amp;title=PostgreSQL%20ZFS%20Snapshot%20Backups" title="DZone"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/dzone.png" title="DZone" alt="DZone" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://reddit.com/submit?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F23%2Fpostgresql-zfs-snapshot-backups%2F&amp;title=PostgreSQL%20ZFS%20Snapshot%20Backups" title="Reddit"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://slashdot.org/bookmark.pl?title=PostgreSQL%20ZFS%20Snapshot%20Backups&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F06%2F23%2Fpostgresql-zfs-snapshot-backups%2F" title="Slashdot"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/slashdot.png" title="Slashdot" alt="Slashdot" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="" title="TwitThis"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/" title="TwitThis" alt="TwitThis" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://letsgetdugg.com/2010/06/23/postgresql-zfs-snapshot-backups/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Automated ZFS Snapshots</title>
		<link>http://letsgetdugg.com/2010/03/30/automated-zfs-snapshots/</link>
		<comments>http://letsgetdugg.com/2010/03/30/automated-zfs-snapshots/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 00:04:33 +0000</pubDate>
		<dc:creator>victori</dc:creator>
				<category><![CDATA[administration]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[zfs]]></category>

		<guid isPermaLink="false">http://letsgetdugg.com/?p=653</guid>
		<description><![CDATA[I needed something like zfs-auto-snapshot written by Tim Foster but portable so it works on all systems that support ZFS. I reviewed a few scripts on github and was unhappy with what was out there so I decided to write my own. With zbackup.rb you can define what to snapshot and how many rotation days [...]]]></description>
			<content:encoded><![CDATA[<p>I needed something like <a href="http://blogs.sun.com/timf/entry/zfs_automatic_snapshots_0_12">zfs-auto-snapshot</a> written by Tim Foster but portable so it works on all systems that support ZFS. I reviewed a few scripts on github and was unhappy with what was out there so I decided to write my own.</p>
<p>With zbackup.rb you can define what to snapshot and how many rotation days you want to go back. </p>
<p>So say you want a month of snapshots:</p>
<div class="codesnip-container" >/usr/bin/zbackup.rb iraidz/zWork 30</div>
<p>Simple, no? <img src='http://letsgetdugg.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<div class="codesnip-container" >
<div class="ruby codesnip" style="font-family:monospace;"><span class="co1">#!/usr/bin/env ruby</span></p>
<p><span class="co1"># Create snapshots for a 7 day rotation.</span><br />
<span class="co1"># ./zbackup.rb iraidz/zWork 7</span><br />
<span class="co1">#</span><br />
<span class="co1"># Add to crontab</span><br />
<span class="co1"># crontab -e</span><br />
<span class="co1"># 0 2 * * * /usr/bin/zbackup.rb iraidz/zWork 7</span></p>
<p>pool = ARGV<span class="br0">&#91;</span>0<span class="br0">&#93;</span><br />
days_back = ARGV<span class="br0">&#91;</span>1<span class="br0">&#93;</span>.<span class="me1">to_i</span></p>
<p><span class="kw1">if</span> pool.<span class="kw2">nil</span>? <span class="kw1">or</span> pool.<span class="me1">empty</span>?<br />
&nbsp; <span class="kw3">puts</span> <span class="st0">&quot;<span class="es0">\n</span>Define the pool you want to snapshot:&quot;</span><br />
&nbsp; <span class="kw3">puts</span> <span class="st0">&quot;<span class="es0">\t</span>ex: zbackup.rb iraidz/zWork 7<span class="es0">\n</span><span class="es0">\n</span>&quot;</span><br />
&nbsp; <span class="kw3">exit</span> 0<br />
<span class="kw1">end</span></p>
<p><span class="kw1">if</span> days_back.<span class="kw2">nil</span>? <span class="kw1">or</span> days_back <span class="sy0">&lt;</span> 1 <br />
&nbsp; <span class="kw3">puts</span> <span class="st0">&quot;<span class="es0">\n</span>Define how many days for your rotation:&quot;</span><br />
&nbsp; <span class="kw3">puts</span> <span class="st0">&quot;<span class="es0">\t</span>ex: zbackup.rb iraidz/zWork 7<span class="es0">\n</span><span class="es0">\n</span>&quot;</span><br />
&nbsp; <span class="kw3">exit</span> 0<br />
<span class="kw1">end</span></p>
<p><span class="co1"># response from zfs list</span><br />
curr_snaps = <span class="st0">`zfs list -t snapshot -o name`</span><br />
<span class="co1"># days back limit variable</span><br />
date_back = <span class="kw4">Time</span>.<span class="me1">now</span> <span class="sy0">-</span> <span class="br0">&#40;</span>86400<span class="sy0">*</span>days_back<span class="br0">&#41;</span></p>
<p>curr_snaps.<span class="kw3">split</span><span class="br0">&#40;</span><span class="sy0">/</span>\n<span class="sy0">/</span><span class="br0">&#41;</span>.<span class="me1">each</span> <span class="kw1">do</span> <span class="sy0">|</span>pline<span class="sy0">|</span><br />
&nbsp; <span class="kw1">if</span> m = pline.<span class="me1">match</span><span class="br0">&#40;</span><span class="sy0">/</span><span class="co1">#{pool}\@([0-9]+)\-([0-9]+)\-([0-9]+)/)</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> date_back <span class="sy0">&gt;</span>= <span class="kw4">Time</span>.<span class="me1">local</span><span class="br0">&#40;</span>m<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>,m<span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span>,m<span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="st0">`zfs destroy #{pline}`</span><br />
&nbsp; &nbsp; <span class="kw1">end</span><br />
&nbsp; <span class="kw1">end</span><br />
<span class="kw1">end</span></p>
<p><span class="co1"># take snapshot for this run if needed.</span><br />
month = <span class="kw4">Time</span>.<span class="me1">now</span>.<span class="me1">month</span><br />
day = <span class="kw4">Time</span>.<span class="me1">now</span>.<span class="me1">day</span><br />
year = <span class="kw4">Time</span>.<span class="me1">now</span>.<span class="me1">year</span><br />
<span class="kw1">if</span> curr_snaps !~ <span class="sy0">/</span><span class="co1">#{pool}\@#{year}\-#{month}\-#{day}/</span><br />
&nbsp; <span class="st0">`zfs snapshot -r #{pool}@#{year}-#{month}-#{day}`</span><br />
<span class="kw1">end</span></div>
</div>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F03%2F30%2Fautomated-zfs-snapshots%2F&amp;title=Automated%20ZFS%20Snapshots&amp;bodytext=I%20needed%20something%20like%20zfs-auto-snapshot%20written%20by%20Tim%20Foster%20but%20portable%20so%20it%20works%20on%20all%20systems%20that%20support%20ZFS.%20I%20reviewed%20a%20few%20scripts%20on%20github%20and%20was%20unhappy%20with%20what%20was%20out%20there%20so%20I%20decided%20to%20write%20my%20own.%0A%0AWith%20zbackup.rb%20you%20ca" title="Digg"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fletsgetdugg.com%2F2010%2F03%2F30%2Fautomated-zfs-snapshots%2F" title="Sphinn"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F03%2F30%2Fautomated-zfs-snapshots%2F&amp;title=Automated%20ZFS%20Snapshots&amp;notes=I%20needed%20something%20like%20zfs-auto-snapshot%20written%20by%20Tim%20Foster%20but%20portable%20so%20it%20works%20on%20all%20systems%20that%20support%20ZFS.%20I%20reviewed%20a%20few%20scripts%20on%20github%20and%20was%20unhappy%20with%20what%20was%20out%20there%20so%20I%20decided%20to%20write%20my%20own.%0A%0AWith%20zbackup.rb%20you%20ca" title="del.icio.us"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fletsgetdugg.com%2F2010%2F03%2F30%2Fautomated-zfs-snapshots%2F&amp;t=Automated%20ZFS%20Snapshots" title="Facebook"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F03%2F30%2Fautomated-zfs-snapshots%2F&amp;title=Automated%20ZFS%20Snapshots" title="Mixx"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fletsgetdugg.com%2F2010%2F03%2F30%2Fautomated-zfs-snapshots%2F&amp;title=Automated%20ZFS%20Snapshots&amp;annotation=I%20needed%20something%20like%20zfs-auto-snapshot%20written%20by%20Tim%20Foster%20but%20portable%20so%20it%20works%20on%20all%20systems%20that%20support%20ZFS.%20I%20reviewed%20a%20few%20scripts%20on%20github%20and%20was%20unhappy%20with%20what%20was%20out%20there%20so%20I%20decided%20to%20write%20my%20own.%0A%0AWith%20zbackup.rb%20you%20ca" title="Google Bookmarks"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.designfloat.com/submit.php?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F03%2F30%2Fautomated-zfs-snapshots%2F&amp;title=Automated%20ZFS%20Snapshots" title="Design Float"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/designfloat.png" title="Design Float" alt="Design Float" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F03%2F30%2Fautomated-zfs-snapshots%2F&amp;title=Automated%20ZFS%20Snapshots" title="DZone"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/dzone.png" title="DZone" alt="DZone" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://reddit.com/submit?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F03%2F30%2Fautomated-zfs-snapshots%2F&amp;title=Automated%20ZFS%20Snapshots" title="Reddit"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://slashdot.org/bookmark.pl?title=Automated%20ZFS%20Snapshots&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F03%2F30%2Fautomated-zfs-snapshots%2F" title="Slashdot"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/slashdot.png" title="Slashdot" alt="Slashdot" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="" title="TwitThis"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/" title="TwitThis" alt="TwitThis" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://letsgetdugg.com/2010/03/30/automated-zfs-snapshots/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Clustering Wicket for fun and profit!</title>
		<link>http://letsgetdugg.com/2010/02/07/clustering-wicket-for-fun-and-profit/</link>
		<comments>http://letsgetdugg.com/2010/02/07/clustering-wicket-for-fun-and-profit/#comments</comments>
		<pubDate>Sun, 07 Feb 2010 17:55:09 +0000</pubDate>
		<dc:creator>victori</dc:creator>
				<category><![CDATA[administration]]></category>
		<category><![CDATA[main]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[clustering]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[wicket]]></category>

		<guid isPermaLink="false">http://letsgetdugg.com/?p=615</guid>
		<description><![CDATA[I hate expired sessions, death to all expired sessions. Traditionally a Java servlet container has a fixed session time, a flood of traffic can potentially cause JVM OOM errors if the session time is set too high. I wanted a smart session container that can hold onto sessions for as long as possible and expire [...]]]></description>
			<content:encoded><![CDATA[<p>I hate expired sessions, death to all expired sessions. Traditionally a Java servlet container has a fixed session time, a flood of traffic can potentially cause <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/OutOfMemoryError.html">JVM OOM errors</a> if the session time is set too high. I wanted a smart session container that can hold onto sessions for as long as possible and expire sessions only when it is absolutely necessary; A <a href="http://memcached.org/">Memcached</a> store would be perfect for this. </p>
<p>There for I recently open sourced the <a href="http://github.com/victori/jetty-session-cache">jetty-session-store</a> to solve this problem. With the jetty-session-store you can save your session state to Ehcache, <a href="http://memcached.org/">Memcached</a> or the database. State should not be bound to a single JVM, Viva Shared Session Stores! </p>
<p>So now that jetty-session-store is out in the wild you can technically cluster Wicket using just the <a href="http://wicket.sourceforge.net/apidocs/wicket/protocol/http/HttpSessionStore.html">HttpSessionStore</a>. However, it isn’t very efficient with the way Memcached allocates data in fixed sized cache buckets.</p>
<p>1. Wicket sessions under the HttpSessionStore can get quite large, well over 1Mb in size. A Wicket session not only stores the session state but also the previous serialized pages the user has visited. </p>
<p>2. Serializing and de-serializing a large data structure can get expensive. The HttpSessionStore retains an <a href="http://wicket.apache.org/docs/1.4/org/apache/wicket/AccessStackPageMap.html">AccessStackPageMap</a>, which is a list data structure consisting of multiple <a href="http://cwiki.apache.org/WICKET/page-maps.html">page map revisions</a>. </p>
<p>So instead of saving one large AccessStackPageMap, I wrote a <a href="http://wicket.apache.org/docs/wicket-1.3.2/wicket/apidocs/org/apache/wicket/protocol/http/SecondLevelCacheSessionStore.html">SecondLevelCacheSessionStore</a> that saves a page map revision per cache entry. This leads to much better cache utilization and a whole lot less serialization on the wire. Not to mention this avoids the whole 1Mb Memcached size limit.</p>
<p>Before you go willy nilly with clustering, read the <a href="http://cwiki.apache.org/WICKET/render-strategies.html">Wicket render strategies page</a>. <b>Wicket requires session affinity for buffered responses with the default rendering strategy.</b></p>
<h3>Clustering Wicket has never been easier.</h3>
<p>Here is an example on how to offload page maps to a hybrid EhCache/Memcached cache. Memcached for long term shared storage while EhCache for short-lived fast cache look ups. </p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">public</span> <span class="kw1">class</span> WebApp <span class="kw1">extends</span> WebApplication <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; @Override<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">protected</span> ISessionStore newSessionStore<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// localhost:11211 &#8212; memcached server</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// &quot;fabpagestore&quot; &#8212; unique appender to avoid key clashes.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// 300 &#8212; 5 minute TTL for local ehcache.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">new</span> SecondLevelCacheSessionStore<span class="br0">&#40;</span><span class="kw1">this</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">new</span> CachePageStore<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aarrays+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Arrays</span></a>.<span class="me1">asList</span><span class="br0">&#40;</span><span class="st0">&quot;localhost:11211&quot;</span><span class="br0">&#41;</span>,<span class="st0">&quot;fabpagestore&quot;</span>,300<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>Here is an example on how to offload page maps to the database. </p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">public</span> <span class="kw1">class</span> WebApp <span class="kw1">extends</span> WebApplication <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; @Override<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">protected</span> ISessionStore newSessionStore<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// &quot;fabpagestore&quot; &#8212; unique appender to avoid key clashes.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">new</span> SecondLevelCacheSessionStore<span class="br0">&#40;</span><span class="kw1">this</span>,<span class="kw1">new</span> CachePageStore<span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">new</span> DBCache<span class="br0">&#40;</span><span class="st0">&quot;jdbc:mysql://foo/mydb&quot;</span>, <span class="st0">&quot;myname&quot;</span>, <span class="st0">&quot;mypass&quot;</span>, <span class="st0">&quot;com.driver.Name&quot;</span>, <span class="st0">&quot;fabpagestore&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>Here is my CachePageStore;</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">package</span> <span class="co2">com.base.pagestore</span><span class="sy0">;</span></p>
<p><span class="kw1">import</span> <span class="co2">com.base.cache.AsyncMemcache</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">com.base.cache.ICache</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.apache.wicket.Page</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.apache.wicket.protocol.http.SecondLevelCacheSessionStore.IClusteredPageStore</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.apache.wicket.protocol.http.pagestore.AbstractPageStore</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.slf4j.Logger</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.slf4j.LoggerFactory</span><span class="sy0">;</span></p>
<p><span class="kw1">import</span> <span class="co2">java.util.List</span><span class="sy0">;</span></p>
<p><span class="kw1">public</span> <span class="kw1">class</span> CachePageStore <span class="kw1">extends</span> AbstractPageStore <span class="kw1">implements</span> IClusteredPageStore <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> ICache cache<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> Logger logger <span class="sy0">=</span> LoggerFactory.<span class="me1">getLogger</span><span class="br0">&#40;</span>CachePageStore.<span class="kw1">class</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">public</span> CachePageStore<span class="br0">&#40;</span><span class="kw1">final</span> List<span class="sy0">&lt;</span>String<span class="sy0">&gt;</span> servers, <span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> poolName, <span class="kw1">final</span> <span class="kw4">int</span> ttl<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span><span class="br0">&#40;</span>servers, poolName, <span class="kw2">true</span>, ttl<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">public</span> CachePageStore<span class="br0">&#40;</span><span class="kw1">final</span> List<span class="sy0">&lt;</span>String<span class="sy0">&gt;</span> servers, <span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> poolName, <span class="kw4">boolean</span> async, <span class="kw1">final</span> <span class="kw4">int</span> ttl<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span><span class="br0">&#40;</span><span class="kw1">new</span> AsyncMemcache<span class="br0">&#40;</span>servers, poolName, async, ttl<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">public</span> CachePageStore<span class="br0">&#40;</span><span class="kw1">final</span> ICache cache<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">cache</span> <span class="sy0">=</span> cache<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co1">// If pageVersion -1 must return highest page version.</span><br />
&nbsp; &nbsp; <span class="kw1">protected</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> getKey<span class="br0">&#40;</span><span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessId, <span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> pageMapName, <span class="kw1">final</span> <span class="kw4">int</span> pageId, <span class="kw1">final</span> <span class="kw4">int</span> pageVersion<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> pageVer <span class="sy0">=</span> <span class="br0">&#40;</span>pageVersion <span class="sy0">==</span> <span class="sy0">-</span>1<span class="br0">&#41;</span> <span class="sy0">?</span> 0 <span class="sy0">:</span> pageVersion<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>pageVersion <span class="sy0">==</span> <span class="sy0">-</span>1<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> meta <span class="sy0">=</span> getMeta<span class="br0">&#40;</span>sessId, pageMapName, pageId<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pageVer <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Integer</span></a>.<span class="me1">valueOf</span><span class="br0">&#40;</span>meta<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> sessId <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> pageMapName <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> pageId <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> pageVer<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co1">// If pageVersion -1 must return highest page version.</span><br />
&nbsp; &nbsp; <span class="co1">// If ajaxVersion -1 must return highest version.</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> getKey<span class="br0">&#40;</span><span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessId, <span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> pageMapName, <span class="kw1">final</span> <span class="kw4">int</span> pageId, <span class="kw1">final</span> <span class="kw4">int</span> pageVersion, <span class="kw1">final</span> <span class="kw4">int</span> ajaxVersion<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Default it to 0 initially</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> ajaxVer <span class="sy0">=</span> <span class="br0">&#40;</span>ajaxVersion <span class="sy0">==</span> <span class="sy0">-</span>1<span class="br0">&#41;</span> <span class="sy0">?</span> 0 <span class="sy0">:</span> ajaxVersion<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> pageVer <span class="sy0">=</span> <span class="br0">&#40;</span>pageVersion <span class="sy0">==</span> <span class="sy0">-</span>1<span class="br0">&#41;</span> <span class="sy0">?</span> 0 <span class="sy0">:</span> pageVersion<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>pageVersion <span class="sy0">==</span> <span class="sy0">-</span>1 <span class="sy0">||</span> ajaxVersion <span class="sy0">==</span> <span class="sy0">-</span>1<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> meta <span class="sy0">=</span> getMeta<span class="br0">&#40;</span>sessId, pageMapName, pageId<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>pageVersion <span class="sy0">==</span> <span class="sy0">-</span>1<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pageVer <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Integer</span></a>.<span class="me1">valueOf</span><span class="br0">&#40;</span>meta<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>ajaxVersion <span class="sy0">==</span> <span class="sy0">-</span>1<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ajaxVer <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Integer</span></a>.<span class="me1">valueOf</span><span class="br0">&#40;</span>meta<span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> sessId <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> pageMapName <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> pageId <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> pageVer <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> ajaxVer<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">protected</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> storeKey<span class="br0">&#40;</span><span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessionId, <span class="kw1">final</span> Page page<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> sessionId <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> page.<span class="me1">getPageMapName</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> page.<span class="me1">getId</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> page.<span class="me1">getCurrentVersionNumber</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> page.<span class="me1">getAjaxVersionNumber</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">protected</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> getBaseKey<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessionId, Page page<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> sessionId <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> page.<span class="me1">getPageMapName</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> page.<span class="me1">getId</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">protected</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> getMetaKey<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessionId, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> pageMap, <span class="kw4">int</span> id<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> getBaseKey<span class="br0">&#40;</span>sessionId,pageMap,id<span class="br0">&#41;</span><span class="sy0">+</span><span class="st0">&quot;_meta&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">protected</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> getMetaKey<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessionId, Page page<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> getBaseKey<span class="br0">&#40;</span>sessionId,page<span class="br0">&#41;</span><span class="sy0">+</span><span class="st0">&quot;_meta&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">protected</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> getBaseKey<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessionId, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> pageMap, <span class="kw4">int</span> id<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>id <span class="sy0">==</span> <span class="sy0">-</span>1<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> sessionId <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> pageMap<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> sessionId <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> pageMap <span class="sy0">+</span> <span class="st0">&quot;:&quot;</span> <span class="sy0">+</span> id<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">boolean</span> containsPage<span class="br0">&#40;</span><span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessionId, <span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> pageMapName, <span class="kw1">final</span> <span class="kw4">int</span> pageId, <span class="kw1">final</span> <span class="kw4">int</span> pageVersion<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> key <span class="sy0">=</span> getKey<span class="br0">&#40;</span>sessionId, pageMapName, pageId, pageVersion, <span class="sy0">-</span>1<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>logger.<span class="me1">isDebugEnabled</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;CheckExists: &quot;</span> <span class="sy0">+</span> key<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> cache.<span class="me1">keyExists</span><span class="br0">&#40;</span>key<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> destroy<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">public</span> <span class="sy0">&lt;</span>T<span class="sy0">&gt;</span> Page getPage<span class="br0">&#40;</span><span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessionId, <span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> pagemap, <span class="kw1">final</span> <span class="kw4">int</span> id, <span class="kw1">final</span> <span class="kw4">int</span> versionNumber, <span class="kw1">final</span> <span class="kw4">int</span> ajaxVersionNumber<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> key <span class="sy0">=</span> getKey<span class="br0">&#40;</span>sessionId, pagemap, id, versionNumber, ajaxVersionNumber<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>logger.<span class="me1">isDebugEnabled</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;GetPage: &quot;</span> <span class="sy0">+</span> key<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span>Page<span class="br0">&#41;</span> cache.<span class="me1">get</span><span class="br0">&#40;</span>key<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> pageAccessed<span class="br0">&#40;</span><span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessionId, <span class="kw1">final</span> Page page<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co1">// If ID == -1 remove the entire pagemap; getBaseKey() takes care of this.</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> removePage<span class="br0">&#40;</span><span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessionId, <span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> pagemap, <span class="kw1">final</span> <span class="kw4">int</span> id<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> key <span class="sy0">=</span> getBaseKey<span class="br0">&#40;</span>sessionId, pagemap, id<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>logger.<span class="me1">isDebugEnabled</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;RemovePage: &quot;</span> <span class="sy0">+</span> key<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; cache.<span class="me1">remove</span><span class="br0">&#40;</span>getMetaKey<span class="br0">&#40;</span>sessionId, pagemap, id<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> k <span class="sy0">:</span> cache.<span class="me1">getKeys</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>k.<span class="me1">startsWith</span><span class="br0">&#40;</span>key<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cache.<span class="me1">remove</span><span class="br0">&#40;</span>k<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">protected</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> getMeta<span class="br0">&#40;</span><span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessionId, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> pageMap, <span class="kw4">int</span> pageId<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> metaKey <span class="sy0">=</span> getMetaKey<span class="br0">&#40;</span>sessionId,pageMap,pageId<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aobject+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Object</span></a> ret <span class="sy0">=</span> cache.<span class="me1">get</span><span class="br0">&#40;</span>metaKey<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>logger.<span class="me1">isDebugEnabled</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;GetMeta: &quot;</span> <span class="sy0">+</span> metaKey<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>ret <span class="sy0">==</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#123;</span><span class="st0">&quot;0&quot;</span>,<span class="st0">&quot;0&quot;</span><span class="br0">&#125;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a>.<span class="me1">valueOf</span><span class="br0">&#40;</span>ret<span class="br0">&#41;</span>.<span class="me1">split</span><span class="br0">&#40;</span><span class="st0">&quot;:&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">protected</span> <span class="kw4">void</span> storeMeta<span class="br0">&#40;</span><span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessionId, <span class="kw1">final</span> Page page<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> metaKey <span class="sy0">=</span> getMetaKey<span class="br0">&#40;</span>sessionId, page<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aobject+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Object</span></a> ret <span class="sy0">=</span> cache.<span class="me1">get</span><span class="br0">&#40;</span>metaKey<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>logger.<span class="me1">isDebugEnabled</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;StoreMeta: &quot;</span> <span class="sy0">+</span> metaKey<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>ret <span class="sy0">==</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cache.<span class="me1">put</span><span class="br0">&#40;</span>metaKey,page.<span class="me1">getCurrentVersionNumber</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="st0">&quot;:&quot;</span><span class="sy0">+</span>page.<span class="me1">getAjaxVersionNumber</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> vals <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a>.<span class="me1">valueOf</span><span class="br0">&#40;</span>ret<span class="br0">&#41;</span>.<span class="me1">split</span><span class="br0">&#40;</span><span class="st0">&quot;:&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> currPage <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Integer</span></a>.<span class="me1">valueOf</span><span class="br0">&#40;</span>vals<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> currAjax <span class="sy0">=</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Ainteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Integer</span></a>.<span class="me1">valueOf</span><span class="br0">&#40;</span>vals<span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>page.<span class="me1">getCurrentVersionNumber</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">&gt;</span> currPage<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currPage <span class="sy0">=</span> page.<span class="me1">getCurrentVersionNumber</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>page.<span class="me1">getAjaxVersionNumber</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">&gt;</span> currAjax<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currAjax <span class="sy0">=</span> page.<span class="me1">getAjaxVersionNumber</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cache.<span class="me1">put</span><span class="br0">&#40;</span>metaKey,currPage<span class="sy0">+</span><span class="st0">&quot;:&quot;</span><span class="sy0">+</span>currAjax<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> storePage<span class="br0">&#40;</span><span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessionId, <span class="kw1">final</span> Page page<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sKey <span class="sy0">=</span> storeKey<span class="br0">&#40;</span>sessionId, page<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>logger.<span class="me1">isDebugEnabled</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;StorePage: &quot;</span> <span class="sy0">+</span> sKey<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; cache.<span class="me1">put</span><span class="br0">&#40;</span>sKey, page<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; storeMeta<span class="br0">&#40;</span>sessionId,page<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> unbind<span class="br0">&#40;</span><span class="kw1">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> sessionId<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>logger.<span class="me1">isDebugEnabled</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;Unbind: &quot;</span> <span class="sy0">+</span> sessionId<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> key <span class="sy0">:</span> cache.<span class="me1">getKeys</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>key.<span class="me1">startsWith</span><span class="br0">&#40;</span>sessionId<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cache.<span class="me1">remove</span><span class="br0">&#40;</span>key<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p><span class="br0">&#125;</span></div>
</div>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F02%2F07%2Fclustering-wicket-for-fun-and-profit%2F&amp;title=Clustering%20Wicket%20for%20fun%20and%20profit%21&amp;bodytext=I%20hate%20expired%20sessions%2C%20death%20to%20all%20expired%20sessions.%20Traditionally%20a%20Java%20servlet%20container%20has%20a%20fixed%20session%20time%2C%20a%20flood%20of%20traffic%20can%20potentially%20cause%20JVM%20OOM%20errors%20if%20the%20session%20time%20is%20set%20too%20high.%20I%20wanted%20a%20smart%20session%20container%20t" title="Digg"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fletsgetdugg.com%2F2010%2F02%2F07%2Fclustering-wicket-for-fun-and-profit%2F" title="Sphinn"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F02%2F07%2Fclustering-wicket-for-fun-and-profit%2F&amp;title=Clustering%20Wicket%20for%20fun%20and%20profit%21&amp;notes=I%20hate%20expired%20sessions%2C%20death%20to%20all%20expired%20sessions.%20Traditionally%20a%20Java%20servlet%20container%20has%20a%20fixed%20session%20time%2C%20a%20flood%20of%20traffic%20can%20potentially%20cause%20JVM%20OOM%20errors%20if%20the%20session%20time%20is%20set%20too%20high.%20I%20wanted%20a%20smart%20session%20container%20t" title="del.icio.us"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fletsgetdugg.com%2F2010%2F02%2F07%2Fclustering-wicket-for-fun-and-profit%2F&amp;t=Clustering%20Wicket%20for%20fun%20and%20profit%21" title="Facebook"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F02%2F07%2Fclustering-wicket-for-fun-and-profit%2F&amp;title=Clustering%20Wicket%20for%20fun%20and%20profit%21" title="Mixx"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fletsgetdugg.com%2F2010%2F02%2F07%2Fclustering-wicket-for-fun-and-profit%2F&amp;title=Clustering%20Wicket%20for%20fun%20and%20profit%21&amp;annotation=I%20hate%20expired%20sessions%2C%20death%20to%20all%20expired%20sessions.%20Traditionally%20a%20Java%20servlet%20container%20has%20a%20fixed%20session%20time%2C%20a%20flood%20of%20traffic%20can%20potentially%20cause%20JVM%20OOM%20errors%20if%20the%20session%20time%20is%20set%20too%20high.%20I%20wanted%20a%20smart%20session%20container%20t" title="Google Bookmarks"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.designfloat.com/submit.php?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F02%2F07%2Fclustering-wicket-for-fun-and-profit%2F&amp;title=Clustering%20Wicket%20for%20fun%20and%20profit%21" title="Design Float"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/designfloat.png" title="Design Float" alt="Design Float" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F02%2F07%2Fclustering-wicket-for-fun-and-profit%2F&amp;title=Clustering%20Wicket%20for%20fun%20and%20profit%21" title="DZone"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/dzone.png" title="DZone" alt="DZone" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://reddit.com/submit?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F02%2F07%2Fclustering-wicket-for-fun-and-profit%2F&amp;title=Clustering%20Wicket%20for%20fun%20and%20profit%21" title="Reddit"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://slashdot.org/bookmark.pl?title=Clustering%20Wicket%20for%20fun%20and%20profit%21&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F02%2F07%2Fclustering-wicket-for-fun-and-profit%2F" title="Slashdot"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/slashdot.png" title="Slashdot" alt="Slashdot" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="" title="TwitThis"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/" title="TwitThis" alt="TwitThis" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://letsgetdugg.com/2010/02/07/clustering-wicket-for-fun-and-profit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HAProxy 1.4dev6 broken on Solaris</title>
		<link>http://letsgetdugg.com/2010/01/20/haproxy-broken-on-solaris/</link>
		<comments>http://letsgetdugg.com/2010/01/20/haproxy-broken-on-solaris/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 19:45:16 +0000</pubDate>
		<dc:creator>victori</dc:creator>
				<category><![CDATA[administration]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[solaris]]></category>

		<guid isPermaLink="false">http://letsgetdugg.com/?p=567</guid>
		<description><![CDATA[Update: I feel like a jackass now, I thought I was running this against the stable haproxy build, but in reality this was against haproxy-1.4dev6. DOH! Well on the bright-side, I am helping out the author fix a potentially critical bug. Here is the truss and tcp dump if anyone cares. Well yet another Solaris [...]]]></description>
			<content:encoded><![CDATA[<p><b>Update:</b> I feel like a jackass now, I thought I was running this against the stable haproxy build, but in reality this was against haproxy-1.4dev6. DOH! Well on the bright-side, I am helping out the author fix a potentially critical bug. Here is the <a href="http://temp.fabulously40.com/~victori/haproxydebug.tbz2">truss and tcp dump</a> if anyone cares. </p>
<p>Well yet another Solaris specific bug/issue to report. HAProxy resets long running connections. Meaning users on slow bandwidth connections are affected by this. I have sent tcpdumps and logs to the author of HAProxy, hopefully this bug/issue would be resolved. I am writing this as a precautionary warning to other Solaris admins out there. </p>
<p>Here the way to trigger this, see if your service is affected by this.</p>
<div class="codesnip-container" >wget  &#8211;limit-rate=2k http://somesite.com/onebigfile.txt</div>
<p>Result:</p>
<div class="codesnip-container" >syris:~ victori$ wget  &#8211;limit-rate=20k http://somesite.com/onebigfile.txt<br />
&#8211;2010-01-20 11:19:29&#8211;  http://somesite.com/onebigfile.txt<br />
Resolving somesite.com (somesite.com)&#8230; 72.11.142.91<br />
Connecting to somesite.com (somesite.com)|72.11.142.91|:84&#8230; connected.<br />
HTTP request sent, awaiting response&#8230; 200 OK<br />
Length: 3806025 (3.6M)<br />
Saving to: “onebigfile.txt”</p>
<p> 7% [====>                                                                            ] 269,008     20.1K/s   in 13s     </p>
<p>2010-01-20 11:19:42 (20.1 KB/s) &#8211; Read error at byte 269008/3806025 (Connection reset by peer). Retrying.</p>
<p>&#8211;2010-01-20 11:19:43&#8211;  (try: 2)  http://somesite.com/onebigfile.txt<br />
Connecting to somesite.com (somesite.com)|72.11.142.91|:84&#8230; connected.<br />
HTTP request sent, awaiting response&#8230; 200 OK<br />
Length: 3806025 (3.6M)<br />
Saving to: “onebigfile.txt”</p>
<p> 4% [==>                                                                              ] 186,016     20.0K/s  eta</p></div>
<p>/Raging, why are there so many Solaris TCP issues? First Varnish? now HAProxy? ARGHHHHH!@#!@</p>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F20%2Fhaproxy-broken-on-solaris%2F&amp;title=HAProxy%201.4dev6%20broken%20on%20Solaris&amp;bodytext=Update%3A%20I%20feel%20like%20a%20jackass%20now%2C%20I%20thought%20I%20was%20running%20this%20against%20the%20stable%20haproxy%20build%2C%20but%20in%20reality%20this%20was%20against%20haproxy-1.4dev6.%20DOH%21%20Well%20on%20the%20bright-side%2C%20I%20am%20helping%20out%20the%20author%20fix%20a%20potentially%20critical%20bug.%20Here%20is%20the%20t" title="Digg"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F20%2Fhaproxy-broken-on-solaris%2F" title="Sphinn"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F20%2Fhaproxy-broken-on-solaris%2F&amp;title=HAProxy%201.4dev6%20broken%20on%20Solaris&amp;notes=Update%3A%20I%20feel%20like%20a%20jackass%20now%2C%20I%20thought%20I%20was%20running%20this%20against%20the%20stable%20haproxy%20build%2C%20but%20in%20reality%20this%20was%20against%20haproxy-1.4dev6.%20DOH%21%20Well%20on%20the%20bright-side%2C%20I%20am%20helping%20out%20the%20author%20fix%20a%20potentially%20critical%20bug.%20Here%20is%20the%20t" title="del.icio.us"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F20%2Fhaproxy-broken-on-solaris%2F&amp;t=HAProxy%201.4dev6%20broken%20on%20Solaris" title="Facebook"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F20%2Fhaproxy-broken-on-solaris%2F&amp;title=HAProxy%201.4dev6%20broken%20on%20Solaris" title="Mixx"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F20%2Fhaproxy-broken-on-solaris%2F&amp;title=HAProxy%201.4dev6%20broken%20on%20Solaris&amp;annotation=Update%3A%20I%20feel%20like%20a%20jackass%20now%2C%20I%20thought%20I%20was%20running%20this%20against%20the%20stable%20haproxy%20build%2C%20but%20in%20reality%20this%20was%20against%20haproxy-1.4dev6.%20DOH%21%20Well%20on%20the%20bright-side%2C%20I%20am%20helping%20out%20the%20author%20fix%20a%20potentially%20critical%20bug.%20Here%20is%20the%20t" title="Google Bookmarks"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.designfloat.com/submit.php?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F20%2Fhaproxy-broken-on-solaris%2F&amp;title=HAProxy%201.4dev6%20broken%20on%20Solaris" title="Design Float"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/designfloat.png" title="Design Float" alt="Design Float" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F20%2Fhaproxy-broken-on-solaris%2F&amp;title=HAProxy%201.4dev6%20broken%20on%20Solaris" title="DZone"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/dzone.png" title="DZone" alt="DZone" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://reddit.com/submit?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F20%2Fhaproxy-broken-on-solaris%2F&amp;title=HAProxy%201.4dev6%20broken%20on%20Solaris" title="Reddit"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://slashdot.org/bookmark.pl?title=HAProxy%201.4dev6%20broken%20on%20Solaris&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F20%2Fhaproxy-broken-on-solaris%2F" title="Slashdot"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/slashdot.png" title="Slashdot" alt="Slashdot" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="" title="TwitThis"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/" title="TwitThis" alt="TwitThis" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://letsgetdugg.com/2010/01/20/haproxy-broken-on-solaris/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Speedy PostgreSQL Parallel Compression Dumps</title>
		<link>http://letsgetdugg.com/2010/01/18/speedy-postgresql-parallel-compression-dumps/</link>
		<comments>http://letsgetdugg.com/2010/01/18/speedy-postgresql-parallel-compression-dumps/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 20:31:30 +0000</pubDate>
		<dc:creator>victori</dc:creator>
				<category><![CDATA[administration]]></category>
		<category><![CDATA[main]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[databases]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://letsgetdugg.com/?p=557</guid>
		<description><![CDATA[I used to backup our database using the following statement; pg_dump -h fab2 -Fc -Z9 somedb > somedb.db Once our dataset grew into the gigabytes, it took a very long time to do database dumps. Today, I stumbled upon yet another awesome blog post done by Ted Dzibua mentioning two useful parallel compression utilities. So [...]]]></description>
			<content:encoded><![CDATA[<p>I used to backup our database using the following statement;</p>
<div class="codesnip-container" >pg_dump -h fab2 -Fc -Z9 somedb > somedb.db</div>
<p>Once our dataset grew into the gigabytes, it took a very long time to do database dumps. Today, I stumbled upon yet another awesome blog post done by <a href="http://teddziuba.com/2010/01/options-for-parallel-compressi.html">Ted Dzibua</a> mentioning two useful parallel compression utilities. So why not try parallel compression with <a href="http://www.postgresql.org/">PostgreSQL</a> dumps?</p>
<p><a href="http://compression.ca/pbzip2/">pbzip2</a> &#8211; Parallel BZIP2: Parallel implementation of BZIP2. BZIP2 is well known for being balls slow, so speed it up using multiple CPUs.</p>
<p><a href="http://www.zlib.net/pigz/">pigz</a> &#8211; Parallel GZIP: Parallel implementation of GZIP written by Mark Adler.</p>
<p>Time to try this out with our PostgreSQL dump, here are the result times.</p>
<p>• This was done on a quad core xeon 2.66ghz machine. </p>
<div class="codesnip-container" ># time pg_dump -U secret -h fab2 somedb | pigz -c > somedb.gz</p>
<p>real	2m7.332s<br />
user	1m16.414s<br />
sys	0m8.233s</p>
<p># time pg_dump -U secret -h fab2 somedb | pbzip2 -c > somedb.bz2</p>
<p>real	4m14.253s<br />
user	10m35.879s<br />
sys	0m10.904s</p></div>
<p>The original database was 1.6gigs. The compressed files came out to&#8230;.</p>
<div class="codesnip-container" ># du -hs somedb.*<br />
 147M	somedb.bz2<br />
 194M	somedb.gz</div>
<p>And just to make this post complete, to pipe the SQL dump back into PostgreSQL </p>
<div class="codesnip-container" ># dropdb somedb<br />
# createdb somedb<br />
# gzip -d -c somedb.gz | psql somedb</div>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F18%2Fspeedy-postgresql-parallel-compression-dumps%2F&amp;title=Speedy%20PostgreSQL%20Parallel%20Compression%20Dumps&amp;bodytext=I%20used%20to%20backup%20our%20database%20using%20the%20following%20statement%3B%0A%0A%0A%0A%09pg_dump%20-h%20fab2%20-Fc%20-Z9%20somedb%20%3E%20somedb.db%0A%0A%0A%0AOnce%20our%20dataset%20grew%20into%20the%20gigabytes%2C%20it%20took%20a%20very%20long%20time%20to%20do%20database%20dumps.%20Today%2C%20I%20stumbled%20upon%20yet%20another%20awesome%20blog%20po" title="Digg"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F18%2Fspeedy-postgresql-parallel-compression-dumps%2F" title="Sphinn"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F18%2Fspeedy-postgresql-parallel-compression-dumps%2F&amp;title=Speedy%20PostgreSQL%20Parallel%20Compression%20Dumps&amp;notes=I%20used%20to%20backup%20our%20database%20using%20the%20following%20statement%3B%0A%0A%0A%0A%09pg_dump%20-h%20fab2%20-Fc%20-Z9%20somedb%20%3E%20somedb.db%0A%0A%0A%0AOnce%20our%20dataset%20grew%20into%20the%20gigabytes%2C%20it%20took%20a%20very%20long%20time%20to%20do%20database%20dumps.%20Today%2C%20I%20stumbled%20upon%20yet%20another%20awesome%20blog%20po" title="del.icio.us"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F18%2Fspeedy-postgresql-parallel-compression-dumps%2F&amp;t=Speedy%20PostgreSQL%20Parallel%20Compression%20Dumps" title="Facebook"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F18%2Fspeedy-postgresql-parallel-compression-dumps%2F&amp;title=Speedy%20PostgreSQL%20Parallel%20Compression%20Dumps" title="Mixx"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F18%2Fspeedy-postgresql-parallel-compression-dumps%2F&amp;title=Speedy%20PostgreSQL%20Parallel%20Compression%20Dumps&amp;annotation=I%20used%20to%20backup%20our%20database%20using%20the%20following%20statement%3B%0A%0A%0A%0A%09pg_dump%20-h%20fab2%20-Fc%20-Z9%20somedb%20%3E%20somedb.db%0A%0A%0A%0AOnce%20our%20dataset%20grew%20into%20the%20gigabytes%2C%20it%20took%20a%20very%20long%20time%20to%20do%20database%20dumps.%20Today%2C%20I%20stumbled%20upon%20yet%20another%20awesome%20blog%20po" title="Google Bookmarks"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.designfloat.com/submit.php?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F18%2Fspeedy-postgresql-parallel-compression-dumps%2F&amp;title=Speedy%20PostgreSQL%20Parallel%20Compression%20Dumps" title="Design Float"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/designfloat.png" title="Design Float" alt="Design Float" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F18%2Fspeedy-postgresql-parallel-compression-dumps%2F&amp;title=Speedy%20PostgreSQL%20Parallel%20Compression%20Dumps" title="DZone"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/dzone.png" title="DZone" alt="DZone" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://reddit.com/submit?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F18%2Fspeedy-postgresql-parallel-compression-dumps%2F&amp;title=Speedy%20PostgreSQL%20Parallel%20Compression%20Dumps" title="Reddit"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://slashdot.org/bookmark.pl?title=Speedy%20PostgreSQL%20Parallel%20Compression%20Dumps&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F18%2Fspeedy-postgresql-parallel-compression-dumps%2F" title="Slashdot"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/slashdot.png" title="Slashdot" alt="Slashdot" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="" title="TwitThis"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/" title="TwitThis" alt="TwitThis" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://letsgetdugg.com/2010/01/18/speedy-postgresql-parallel-compression-dumps/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Relax, Satan is on your side.</title>
		<link>http://letsgetdugg.com/2010/01/05/relax-satan-is-on-your-side/</link>
		<comments>http://letsgetdugg.com/2010/01/05/relax-satan-is-on-your-side/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 22:17:20 +0000</pubDate>
		<dc:creator>victori</dc:creator>
				<category><![CDATA[administration]]></category>
		<category><![CDATA[main]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[satan]]></category>

		<guid isPermaLink="false">http://letsgetdugg.com/?p=540</guid>
		<description><![CDATA[I just pushed up a new version of Satan to GitHub. For the uniformed uninformed Satan is my process reaper for run away unix processes. Satan was designed to work with Solaris&#8217; SMF self-healing properties. Basically, Satan kills while SMF revives. The new version that was pushed up contains HTTP health checks, so Satan now [...]]]></description>
			<content:encoded><![CDATA[<p>I just pushed up a new version of <a href="http://github.com/victori/satan">Satan to GitHub</a>. For the <s>uniformed</s> uninformed Satan is my process reaper for run away unix processes. Satan was designed to work with Solaris&#8217; <a href="http://www.sun.com/bigadmin/features/articles/smf_example.jsp">SMF self-healing properties</a>. Basically, Satan kills while SMF revives. The new version that was pushed up contains HTTP health checks, so Satan now has the ability to kill processes that are not responding back with a HTTP/200 response code. </p>
<p>The motivation behind HTTP health checks was because once a month or so at <a href="http://fabulously40.com/">Fabulously40</a> our <a href="http://activemq.apache.org/">ActiveMQ</a> would break down while still accepting connections, the only way to figure out if it was <em>zombified</em> was to check the HTTP administrator interface. If the ActiveMQ instance was actually knelled over, the administrator interface would come back with a HTTP/500 response code, hence the birth of HTTP health checks. </p>
<p>Here is our Satan configuration file that we use at Fabulously40. </p>
<p>The &#8220;args&#8221; property might be a bit confusing, it is a snippet of text that Satan looks for in the arguments passed to your application to identify the running process. So for example, if you start your ActiveMQ instance with the following arguments; &#8220;java -jar activemq.jar -Dactivemq=8161 -XXXXX&#8221; Placing &#8220;8161&#8243; in args property would be a good unique identifier for Satan to pick up on.</p>
<pre>
<div class="codesnip-container" >Satan.watch do |s|
  s.name = "jvm instances"                # name of job
  s.user = "webservd"                     # under what user
  s.group = "webservd"                    # under what group
  s.deamon = "java"                       # deamon binary name to grep for
  s.args = nil                            # globally look for specific arguments, optional
  s.debug = true                          # if to write out debug information
  s.safe_mode = false                     # If in safe mode, satan will not kill ;-(
  s.interval = 10.seconds                 # interval to run at to collect statistics
  s.sleep_after_kill = 1.minute           # sleep after killing, satan is tired!
  s.contact = "victori@fabulously40.com"  # admin contact, optional if you want email alerts

  s.kill_if do |process|
    process.condition(:cpu) do |cpu|      # on cpu condition
      cpu.name  = "50% CPU limit"         # name for job
      cpu.args  = "jetty"                 # make sure this is a jetty process, optional
      cpu.above = 48.percent              # if above certain percentage
      cpu.times = 5                       # how many times we can hit this condition before killing
    end

    process.condition(:memory) do |memory|  # on memory condition
      memory.name  = "850MB limit"          # name for job
      memory.args  = "jetty"                # make sure this is a jetty process, optional
      memory.above = 850.megabytes          # limit for memory use
      memory.times = 5                      # how many times we can hit this condition before killing
    end

    # ActiveMQ tends to die on us under heavy load so we need the power of satan!
    process.condition(:http) do |http|                        # on http condition
      http.name   = "HTTP ActiveMQ Check"                     # name for job
      http.args   = "8161"                                    # look for specific app arguments
                                                              # to associate app to URI
      http.uri    = "http://localhost:8161/admin/queues.jsp"  # the URI
      http.times  = 5                                         # how many times before kill
    end
  end
end</div>
</pre>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F05%2Frelax-satan-is-on-your-side%2F&amp;title=Relax%2C%20Satan%20is%20on%20your%20side.&amp;bodytext=I%20just%20pushed%20up%20a%20new%20version%20of%20Satan%20to%20GitHub.%20For%20the%20uniformed%20uninformed%20Satan%20is%20my%20process%20reaper%20for%20run%20away%20unix%20processes.%20Satan%20was%20designed%20to%20work%20with%20Solaris%27%20SMF%20self-healing%20properties.%20Basically%2C%20Satan%20kills%20while%20SMF%20revives.%20Th" title="Digg"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F05%2Frelax-satan-is-on-your-side%2F" title="Sphinn"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F05%2Frelax-satan-is-on-your-side%2F&amp;title=Relax%2C%20Satan%20is%20on%20your%20side.&amp;notes=I%20just%20pushed%20up%20a%20new%20version%20of%20Satan%20to%20GitHub.%20For%20the%20uniformed%20uninformed%20Satan%20is%20my%20process%20reaper%20for%20run%20away%20unix%20processes.%20Satan%20was%20designed%20to%20work%20with%20Solaris%27%20SMF%20self-healing%20properties.%20Basically%2C%20Satan%20kills%20while%20SMF%20revives.%20Th" title="del.icio.us"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F05%2Frelax-satan-is-on-your-side%2F&amp;t=Relax%2C%20Satan%20is%20on%20your%20side." title="Facebook"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F05%2Frelax-satan-is-on-your-side%2F&amp;title=Relax%2C%20Satan%20is%20on%20your%20side." title="Mixx"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F05%2Frelax-satan-is-on-your-side%2F&amp;title=Relax%2C%20Satan%20is%20on%20your%20side.&amp;annotation=I%20just%20pushed%20up%20a%20new%20version%20of%20Satan%20to%20GitHub.%20For%20the%20uniformed%20uninformed%20Satan%20is%20my%20process%20reaper%20for%20run%20away%20unix%20processes.%20Satan%20was%20designed%20to%20work%20with%20Solaris%27%20SMF%20self-healing%20properties.%20Basically%2C%20Satan%20kills%20while%20SMF%20revives.%20Th" title="Google Bookmarks"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.designfloat.com/submit.php?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F05%2Frelax-satan-is-on-your-side%2F&amp;title=Relax%2C%20Satan%20is%20on%20your%20side." title="Design Float"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/designfloat.png" title="Design Float" alt="Design Float" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F05%2Frelax-satan-is-on-your-side%2F&amp;title=Relax%2C%20Satan%20is%20on%20your%20side." title="DZone"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/dzone.png" title="DZone" alt="DZone" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://reddit.com/submit?url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F05%2Frelax-satan-is-on-your-side%2F&amp;title=Relax%2C%20Satan%20is%20on%20your%20side." title="Reddit"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://slashdot.org/bookmark.pl?title=Relax%2C%20Satan%20is%20on%20your%20side.&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2010%2F01%2F05%2Frelax-satan-is-on-your-side%2F" title="Slashdot"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/slashdot.png" title="Slashdot" alt="Slashdot" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="" title="TwitThis"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/" title="TwitThis" alt="TwitThis" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://letsgetdugg.com/2010/01/05/relax-satan-is-on-your-side/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Why deadlines go to hell</title>
		<link>http://letsgetdugg.com/2009/12/16/why-deadlines-go-to-hell/</link>
		<comments>http://letsgetdugg.com/2009/12/16/why-deadlines-go-to-hell/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 21:55:27 +0000</pubDate>
		<dc:creator>victori</dc:creator>
				<category><![CDATA[administration]]></category>
		<category><![CDATA[main]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[productivity]]></category>

		<guid isPermaLink="false">http://letsgetdugg.com/?p=527</guid>
		<description><![CDATA[Ted Dziuba beautifully articulated why deadlines go to crap and seemingly straight forward tasks go out the window. You sir have done a public service for us all, thank you. What I hate is fording endless rivers of horseshit that are in the way of seemingly simple tasks. And I hate it even more when [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://teddziuba.com/2009/12/how-i-spot-valuable-engineers.html">Ted Dziuba</a> beautifully articulated why deadlines go to crap and seemingly straight forward tasks go out the window. You sir have done a public service for us all, thank you.</p>
<pre>
<div class="codesnip-container" >What I hate is fording endless rivers of horseshit that are in the way
of seemingly simple tasks. And I hate it even more when I have to explain
to a non-programmer what I am doing, "building LXML against a different
version of libiconv because I think it might be the source of a crash". 

"But all I asked you to do was parse some documents."

Good times.</div>
</pre>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F16%2Fwhy-deadlines-go-to-hell%2F&amp;title=Why%20deadlines%20go%20to%20hell&amp;bodytext=Ted%20Dziuba%20beautifully%20articulated%20why%20deadlines%20go%20to%20crap%20and%20seemingly%20straight%20forward%20tasks%20go%20out%20the%20window.%20You%20sir%20have%20done%20a%20public%20service%20for%20us%20all%2C%20thank%20you.%0A%0A%0A%0AWhat%20I%20hate%20is%20fording%20endless%20rivers%20of%20horseshit%20that%20are%20in%20the%20way%20%0Ao" title="Digg"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://sphinn.com/index.php?c=post&amp;m=submit&amp;link=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F16%2Fwhy-deadlines-go-to-hell%2F" title="Sphinn"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/sphinn.png" title="Sphinn" alt="Sphinn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F16%2Fwhy-deadlines-go-to-hell%2F&amp;title=Why%20deadlines%20go%20to%20hell&amp;notes=Ted%20Dziuba%20beautifully%20articulated%20why%20deadlines%20go%20to%20crap%20and%20seemingly%20straight%20forward%20tasks%20go%20out%20the%20window.%20You%20sir%20have%20done%20a%20public%20service%20for%20us%20all%2C%20thank%20you.%0A%0A%0A%0AWhat%20I%20hate%20is%20fording%20endless%20rivers%20of%20horseshit%20that%20are%20in%20the%20way%20%0Ao" title="del.icio.us"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F16%2Fwhy-deadlines-go-to-hell%2F&amp;t=Why%20deadlines%20go%20to%20hell" title="Facebook"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.mixx.com/submit?page_url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F16%2Fwhy-deadlines-go-to-hell%2F&amp;title=Why%20deadlines%20go%20to%20hell" title="Mixx"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/mixx.png" title="Mixx" alt="Mixx" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F16%2Fwhy-deadlines-go-to-hell%2F&amp;title=Why%20deadlines%20go%20to%20hell&amp;annotation=Ted%20Dziuba%20beautifully%20articulated%20why%20deadlines%20go%20to%20crap%20and%20seemingly%20straight%20forward%20tasks%20go%20out%20the%20window.%20You%20sir%20have%20done%20a%20public%20service%20for%20us%20all%2C%20thank%20you.%0A%0A%0A%0AWhat%20I%20hate%20is%20fording%20endless%20rivers%20of%20horseshit%20that%20are%20in%20the%20way%20%0Ao" title="Google Bookmarks"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.designfloat.com/submit.php?url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F16%2Fwhy-deadlines-go-to-hell%2F&amp;title=Why%20deadlines%20go%20to%20hell" title="Design Float"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/designfloat.png" title="Design Float" alt="Design Float" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.dzone.com/links/add.html?url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F16%2Fwhy-deadlines-go-to-hell%2F&amp;title=Why%20deadlines%20go%20to%20hell" title="DZone"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/dzone.png" title="DZone" alt="DZone" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://reddit.com/submit?url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F16%2Fwhy-deadlines-go-to-hell%2F&amp;title=Why%20deadlines%20go%20to%20hell" title="Reddit"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/reddit.png" title="Reddit" alt="Reddit" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://slashdot.org/bookmark.pl?title=Why%20deadlines%20go%20to%20hell&amp;url=http%3A%2F%2Fletsgetdugg.com%2F2009%2F12%2F16%2Fwhy-deadlines-go-to-hell%2F" title="Slashdot"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/slashdot.png" title="Slashdot" alt="Slashdot" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="" title="TwitThis"><img src="http://letsgetdugg.com/wp-content/plugins/sociable/images/" title="TwitThis" alt="TwitThis" class="sociable-hovers" /></a>


<br/><br/>]]></content:encoded>
			<wfw:commentRss>http://letsgetdugg.com/2009/12/16/why-deadlines-go-to-hell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
