<?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>Allen Day's Blog &#187; Scalability</title>
	<atom:link href="http://www.spicylogic.com/allenday/blog/category/computing/scalability/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.spicylogic.com/allenday/blog</link>
	<description>♥data♥</description>
	<lastBuildDate>Mon, 21 Jun 2010 23:28:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>8 Keys to Effective Crowdsourcing</title>
		<link>http://www.spicylogic.com/allenday/blog/2010/01/30/8-keys-to-effective-crowdsourcing/</link>
		<comments>http://www.spicylogic.com/allenday/blog/2010/01/30/8-keys-to-effective-crowdsourcing/#comments</comments>
		<pubDate>Sat, 30 Jan 2010 13:27:06 +0000</pubDate>
		<dc:creator>allenday</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[Crowdsourcing]]></category>
		<category><![CDATA[Random musings]]></category>
		<category><![CDATA[Scalability]]></category>

		<guid isPermaLink="false">http://www.spicylogic.com/allenday/blog/?p=114</guid>
		<description><![CDATA[The key to effective crowdsourcing is effective communication.  You communicate with your crowdsourced workers so that you can train them.  Training has a measurable cost, and you want to minimize this cost to make most effective use of your time and your budget.
Consider the situation when you&#8217;re in a professional position, or the flipside and [...]]]></description>
			<content:encoded><![CDATA[<p><strong>The key to effective crowdsourcing is effective communication</strong>.  You communicate with your crowdsourced workers so that you can train them.  Training has a measurable cost, and you want to minimize this cost to make most effective use of your time and your budget.</p>
<p>Consider the situation when you&#8217;re in a professional position, or the flipside and you&#8217;re training someone to take on a new role.  Assuming you are/have the &#8220;right&#8221; person with regard to relevant skills to perform the requisite tasks, why is training required?  <strong>Knowledge transfer needs to occur</strong>.  The same is also true for crowdsourced workers.  So how can we effectively transfer knowledge to workers who may only be spending a <em>few seconds</em> on your task?</p>
<p><strong>Key 1: Be consistent.</strong></p>
<p>Use similar phrasings and images for all of your task descriptions.  This allows workers to come up to speed in a minimum amount of time.  Imagine how hard it would be to read your email if each message opened in a differently styled window.  Similar phrasings/images are just one example of how to employ&#8230;</p>
<p><strong>Key 2: Use variables.</strong></p>
<p><a href="http://smartsheet.com">Smartsheet.com</a> got this right.  Have a look at these 2 tasks submitted from Smartsheet to <a href="http://mturk.com">Amazon&#8217;s Mechanical Turk</a>:<br />
<a href="http://img34.imageshack.us/g/picture7au.png/"><img class="alignnone" src="http://img64.imageshack.us/img64/1047/picture8fa.png" alt="" width="400" /></a></p>
<p>Look closely at what&#8217;s going on here.  The two tasks&#8217; input <em>variables</em> (<strong>Blog Name</strong> and <strong>Blog URL</strong>) are identical, only their values change.  Note also that there are 2114 tasks just like this available.  Workers like to have lots of very similar tasks because&#8230;</p>
<p><strong>Key 3: Batch tasks.</strong></p>
<p>Crowdsourced workers like batches of similar tasks because it presents an opportunity for them to set up a workflow, or even write a small computer program to do the tasks for them, for you.  The cost of learning how to do a task is amortized over the entire batch, letting them make more efficient use of time (and letting you make more efficient use of your budget).</p>
<p><strong>Key 4: Be visual.</strong></p>
<p>The adage &#8220;a picture is worth one thousand words&#8221; couldn&#8217;t be more fitting to communicating with crowdsourced workers.  Images are very information dense, are more friendly to scanning, and are able to more quickly communicate non-linear process structure when compared to text.  The most effective visual tool I have found thus far is to&#8230;</p>
<p><strong>Key 5: Use flow charts.</strong></p>
<p>Consider learning to use <a href="http://en.wikipedia.org/wiki/Flowchart">flow charts</a>, and also to <a href="http://www.breezetree.com/images/flow-chart-symbols.png">extend your visual vocabulary</a>.  I&#8217;m an avid user of <a href="http://en.wikipedia.org/wiki/Omnigraffle">OmniGraffle</a> for creating diagrams for crowdsourcing (as well as for myself).  I&#8217;ll be presenting some flow charts in the future.  You will find that by presenting your task graphically and in a formal way as a flow chart (as opposed to simply giving graphical examples), users will do more work for the same price because you&#8217;ve made it easier for them.  The flow chart also forces you be clear about what you want, which brings us to&#8230;</p>
<p><strong>Key 6: Know what you want.  Be unambiguous.</strong></p>
<p>Know what you expect the worker to do for you.  Make each task so simple that it&#8217;s virtually impossible for a worker to do it incorrectly.  Break up complex tasks into their most elementary pieces.  Ideally one task = one decision.  Make each task closed-ended.  Do not leave any room for ambiguity.</p>
<p>Designing tasks in this way requires more effort on your part, but will result in less money spent and higher-quality results.</p>
<p><strong>Key 7: Improve through iteration.</strong></p>
<p>Being unambiguous on the first try is nigh on impossible.  It&#8217;s for the same reason that you &#8220;bounce&#8221; ideas off of your peers/friends &#8212; to see how your approach to an idea or task might be sub-optimal or misunderstood.</p>
<p>Iteratively remove ambiguity.  Submit a sampling tasks out of a larger batch with a test task description.  See where the crowdsourced workers make mistakes.  Re-examine your task description to a) find the misunderstanding, and b) disambiguate it.</p>
<p><strong>Key 8. Build validators into your tasks.</strong></p>
<p>Make sure the worker&#8217;s work is validated before it gets to you.  This could mean having workers check each others&#8217; work, and can even involve some fancy statistics.  It could also mean writing a bit of javascript or some other backend systems to validate worker inputs (e.g. you ask for a minimum 300-word document.  count the words with javascript before they submit).  This is getting a bit more advanced, but opens more opportunity for more complex tasks by delegating part of the work to the computer.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spicylogic.com/allenday/blog/2010/01/30/8-keys-to-effective-crowdsourcing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Synthetic GFF Dataset for Genome Browser Benchmark</title>
		<link>http://www.spicylogic.com/allenday/blog/2009/04/07/synthetic-gff-dataset-for-genome-browser-benchmark/</link>
		<comments>http://www.spicylogic.com/allenday/blog/2009/04/07/synthetic-gff-dataset-for-genome-browser-benchmark/#comments</comments>
		<pubDate>Tue, 07 Apr 2009 08:01:52 +0000</pubDate>
		<dc:creator>allenday</dc:creator>
				<category><![CDATA[Genomics]]></category>
		<category><![CDATA[Informatics]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Scalability]]></category>
		<category><![CDATA[Science]]></category>

		<guid isPermaLink="false">http://www.spicylogic.com/allenday/blog/2009/04/07/synthetic-gff-dataset-for-genome-browser-benchmark/</guid>
		<description><![CDATA[I deployed a Gbrowse/Chado installation last week at Dow Agrosciences.  It got me thinking about how slow and basic the searches are with the Bio::DB::Das::Chado* adaptor, and wouldn&#8217;t it be nice to use SOLR here?
I made up a test dataset of gene/mRNA/exon 3-tiered feature groups by permuting some gene model data from the knownGene annotation [...]]]></description>
			<content:encoded><![CDATA[<p>I deployed a Gbrowse/Chado installation last week at <a href="http://www.dowagro.com/">Dow Agrosciences</a>.  It got me thinking about how slow and basic the searches are with the Bio::DB::Das::Chado* adaptor, and wouldn&#8217;t it be nice to use <a href="http://lucene.apache.org/solr/">SOLR</a> here?</p>
<p>I made up a test dataset of gene/mRNA/exon 3-tiered feature groups by permuting some gene model data from the <a href="http://hgdownload.cse.ucsc.edu/goldenPath/hg18/database/">knownGene annotation set</a> of the Hg18 build of the human genome.  You can grab the data set and script used to generate it <a href="http://www.spicylogic.com/allenday/images/knownGene/">here</a>.  There are several files mRNA.E<strong>N</strong>.txt.gz that contain gzipped gene models, where <strong>N</strong>=3..7 indicates there are 10^<strong>N</strong> models in the file, uniformly distributed across a 500-megabase reference sequence.</p>
<p>I&#8217;m planning to load these data into a couple of different systems and then compare performance on some of the typical Bio::DB::GFF API calls.  I can personally test on:</p>
<ul>
<li>Chado</li>
<li>The default Bio::DB::GFF schema (does it have a name?)</li>
<li>The SOLR backend I&#8217;m about to implement</li>
</ul>
<p>I know there are other feature DBs out there.  It would be good to include them as well in a later pass or to have someone else contribute the data once I get the benchmarking script written.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spicylogic.com/allenday/blog/2009/04/07/synthetic-gff-dataset-for-genome-browser-benchmark/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Is Amazon CloudFront right for me?</title>
		<link>http://www.spicylogic.com/allenday/blog/2008/11/18/is-amazon-cloudfront-right-for-me/</link>
		<comments>http://www.spicylogic.com/allenday/blog/2008/11/18/is-amazon-cloudfront-right-for-me/#comments</comments>
		<pubDate>Tue, 18 Nov 2008 20:21:17 +0000</pubDate>
		<dc:creator>allenday</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Computing]]></category>
		<category><![CDATA[Scalability]]></category>

		<guid isPermaLink="false">http://www.spicylogic.com/allenday/blog/2008/11/18/is-amazon-cloudfront-right-for-me/</guid>
		<description><![CDATA[Here&#8217;s what the pricing looks like.  Learn more about Amazon CloudFront at http://aws.amazon.com/cloudfront. 

United States Edge Locations
Data Transfer
$0.170 per GB &#8211; first 10 TB / month data transfer out
$0.120 per GB &#8211; next 40 TB / month data transfer out
$0.100 per GB &#8211; next 100 TB / month data transfer out
$0.090 per GB &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s what the pricing looks like.  Learn more about Amazon CloudFront at <a href="http://aws.amazon.com/cloudfront">http://aws.amazon.com/cloudfront</a>. </p>
<blockquote>
<h3>United States Edge Locations</h3>
<p><b>Data Transfer</b></p>
<p>$0.170 per GB &#8211; first 10 TB / month data transfer out<br />
$0.120 per GB &#8211; next 40 TB / month data transfer out<br />
$0.100 per GB &#8211; next 100 TB / month data transfer out<br />
$0.090 per GB &#8211; data transfer out / month over 150 TB</p>
<p><b>Requests</b><br />
$0.010 per 10,000 GET requests
</p></blockquote>
<p>I evaluated AWS for hosting a while back and concluded that the bandwidth and storage costs were just too expensive if you have even a modest amount of storage traffic needs.  Here&#8217;s the breakdown:</p>
<p>A dedicated 100Mbit line can xfer 30TB/month.  Costs $1000/mo, or $10/Mbit/mo.  Source: <a href="http://calpop.com">CalPOP</a>.  (I host here).</p>
<p>From AWS @ $0.120/GB that&#8217;s $3600/mo.  If you&#8217;re pushing sizable volumes of bits, it seems like it will only make sense to do this under 2 scenarios:</p>
<ol>
<li>you can benefit from having a >100Mbit/s cap b/c you have *very* spiky traffic.  you xfer well over 400Mbit/s for a few hours/day (and 0Mbit/s the rest), and</li>
<li>you need lower latency than a 1-2 datacenter network can give you</li>
</ol>
<p>I suspect most for most of their target clients it&#8217;s [2], or clients that are really in it for the whole S3/EC2/SQS/EBS bundle.  Being able to rent cores at $0.10/hour can be really attractive for some types of services.</p>
<p>So no, it&#8217;s not right for me.  YMMV.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spicylogic.com/allenday/blog/2008/11/18/is-amazon-cloudfront-right-for-me/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quality Control and Monitoring at Last.FM</title>
		<link>http://www.spicylogic.com/allenday/blog/2008/09/03/quality-control-and-monitoring-at-lastfm/</link>
		<comments>http://www.spicylogic.com/allenday/blog/2008/09/03/quality-control-and-monitoring-at-lastfm/#comments</comments>
		<pubDate>Wed, 03 Sep 2008 21:39:18 +0000</pubDate>
		<dc:creator>allenday</dc:creator>
				<category><![CDATA[Distributed Systems]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Scalability]]></category>

		<guid isPermaLink="false">http://www.spicylogic.com/allenday/blog/2008/09/03/quality-control-and-monitoring-at-lastfm/</guid>
		<description><![CDATA[I found the Last.fm blog today.  They&#8217;re having a lot of fun with QC tools.  Worth a read!
]]></description>
			<content:encoded><![CDATA[<p>I found the Last.fm blog today.  They&#8217;re having a lot of fun with <a href="http://blog.last.fm/2008/08/01/quality-control">QC tools</a>.  Worth a read!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spicylogic.com/allenday/blog/2008/09/03/quality-control-and-monitoring-at-lastfm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>More thoughts on EC2 / EBS / Hadoop</title>
		<link>http://www.spicylogic.com/allenday/blog/2008/08/26/more-thoughts-on-ec2-ebs-hadoop/</link>
		<comments>http://www.spicylogic.com/allenday/blog/2008/08/26/more-thoughts-on-ec2-ebs-hadoop/#comments</comments>
		<pubDate>Tue, 26 Aug 2008 20:32:29 +0000</pubDate>
		<dc:creator>allenday</dc:creator>
				<category><![CDATA[Distributed Systems]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Scalability]]></category>

		<guid isPermaLink="false">http://www.spicylogic.com/allenday/blog/2008/08/26/more-thoughts-on-ec2-ebs-hadoop/</guid>
		<description><![CDATA[I&#8217;m still getting up to speed on running Hadoop on EC2.  Found this AWS post today describing how to easily port data into a hadoop cluster from S3, as well as easily create new Hadoop slaves using the AMI system images, start up clusters, and tear down clusters.
I made some comments yesterday about wanting [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m still getting up to speed on running Hadoop on EC2.  Found this AWS post today describing how to <a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=873">easily port data into a hadoop cluster from S3</a>, as well as easily create new Hadoop slaves using the AMI system images, start up clusters, and tear down clusters.</p>
<p>I made some <a href="http://www.spicylogic.com/allenday/blog/2008/08/25/ec2-ebs-hadoop-at-biggerboat/">comments yesterday</a> about wanting to be able to scale the Hadoop cluster down as well as up, in particular being able to disable cores, which are the really expensive part of running a cluster on AWS.</p>
<p>Now we need to look into the AWS scripts and AMI images that are available to see how feasible it is to just maintain more data volumes than images.  What I&#8217;m (roughly) thinking is that we might set up M data volumes for the DFS, but might want to run 1 &lt;= N &lt;= data/task nodes.  In the case that N &lt; M, you just load some of the N nodes with more than 1 EBS volume.</p>
<p>Also need to look into how HDFS deals with adding new volumes, i.e. will it just start replicating data onto nodes as they are added into the system?  Is there a way to hot-add rather than restarting the data master?  Hot-adding EBS volumes onto existing data nodes?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spicylogic.com/allenday/blog/2008/08/26/more-thoughts-on-ec2-ebs-hadoop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>EC2 + EBS + Hadoop at BiggerBoat</title>
		<link>http://www.spicylogic.com/allenday/blog/2008/08/25/ec2-ebs-hadoop-at-biggerboat/</link>
		<comments>http://www.spicylogic.com/allenday/blog/2008/08/25/ec2-ebs-hadoop-at-biggerboat/#comments</comments>
		<pubDate>Tue, 26 Aug 2008 02:29:49 +0000</pubDate>
		<dc:creator>allenday</dc:creator>
				<category><![CDATA[Distributed Systems]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Scalability]]></category>

		<guid isPermaLink="false">http://www.spicylogic.com/allenday/blog/2008/08/25/ec2hadoop-at-biggerboat/</guid>
		<description><![CDATA[Rodger and I at BiggerBoat got Hadoop and HBase up and running on Amazon EC2 today.  We initially set up a cluster of 1 master and 10 slaves.  After a quick calculation of how much this costs to keep running 24/7, we started trying to figure out how to scale the thing DOWN [...]]]></description>
			<content:encoded><![CDATA[<p>Rodger and I at <a href="http://biggerboat.com">BiggerBoat</a> got Hadoop and HBase up and running on Amazon EC2 today.  We initially set up a cluster of 1 master and 10 slaves.  After a quick calculation of how much this costs to keep running 24/7, we started trying to figure out how to scale the thing DOWN as well as UP, and to be able to do so dynamically.  Seems like the tricky piece is the Hadoop storage, not so much the compute power available.  Amazon just launched their <a href="http://www.amazon.com/b/ref=sc_fe_c_0_201590011_1?ie=UTF8&#038;node=689343011&#038;no=201590011">Elastic Block Store</a> a few days ago, so we&#8217;re seeing how that fits in.  Seems like the EBS I/O is pretty good given our Bonnie++ tests.</p>
<p>Tom White has some <a href="http://www.lexemetech.com/2008/08/elastic-hadoop-clusters-with-amazons.html">architecture scenarios</a> for building this kind of stuff.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spicylogic.com/allenday/blog/2008/08/25/ec2-ebs-hadoop-at-biggerboat/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hadoop / SGE Grid Engine Convergence</title>
		<link>http://www.spicylogic.com/allenday/blog/2008/08/08/hadoop-sge-grid-engine-convergence/</link>
		<comments>http://www.spicylogic.com/allenday/blog/2008/08/08/hadoop-sge-grid-engine-convergence/#comments</comments>
		<pubDate>Fri, 08 Aug 2008 23:24:29 +0000</pubDate>
		<dc:creator>allenday</dc:creator>
				<category><![CDATA[Distributed Systems]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Scalability]]></category>
		<category><![CDATA[Science]]></category>

		<guid isPermaLink="false">http://www.spicylogic.com/allenday/blog/2008/08/08/hadoop-sge-grid-engine-convergence/</guid>
		<description><![CDATA[I&#8217;m an old hand with SGE and a more user of Hadoop / Pig.  Good to see that there is interest in making these technologies interoperate.
]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m an old hand with SGE and a more user of Hadoop / Pig.  Good to see that there is <a href="http://www.joeandmotorboat.com/2008/05/23/more-hadoop-grid-engine-goodness/">interest in making these technologies interoperate</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spicylogic.com/allenday/blog/2008/08/08/hadoop-sge-grid-engine-convergence/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MogileFS + FUSE + Bigfile support</title>
		<link>http://www.spicylogic.com/allenday/blog/2008/07/14/mogilefs-fuse-bigfile-support/</link>
		<comments>http://www.spicylogic.com/allenday/blog/2008/07/14/mogilefs-fuse-bigfile-support/#comments</comments>
		<pubDate>Mon, 14 Jul 2008 10:31:52 +0000</pubDate>
		<dc:creator>allenday</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[Distributed Systems]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Scalability]]></category>

		<guid isPermaLink="false">http://www.spicylogic.com/allenday/blog/?p=41</guid>
		<description><![CDATA[Jordan and I have been migrating all the TinyTube data over to a MogileFS storage system.
Seems to be a very easy-to-use solution for scalable storage of lots of little files.  Basically just works out of the box, including the alpha-quality mount-filepaths FUSE adapter available for MogileFS in the SixApart SVN.
I have two problems with [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://jordan.spicylogic.com/blog/">Jordan</a> and I have been migrating all the <a href="http://tinytube.net/">TinyTube</a> data over to a <a href="http://www.danga.com/mogilefs">MogileFS</a> storage system.</p>
<p>Seems to be a very easy-to-use solution for scalable storage of lots of little files.  Basically just works out of the box, including the alpha-quality <code>mount-filepaths</code> <a href="http://fuse.sourceforge.net/">FUSE</a> adapter available for MogileFS in the <a href="http://code.sixapart.com/trac/mogilefs/browser/trunk/fuse">SixApart SVN</a>.</p>
<p>I have two problems with <code>mount-filepaths</code> though:</p>
<ol>
<li>Doesn&#8217;t recognize data loaded outside FUSE.  It assumes I want to see/read files that were loaded via its mapping of FUSE directory/file names to MogileFS keys, and it doesn&#8217;t show other keys at all.  I have lots of preloaded data, so this is a dealbreaker.</li>
<li>Doesn&#8217;t support large files.  MogileFS has a 64MB limit per file, and if you want to load a bigger file, it splits it into chunks.  This FUSE adapter is not aware of how to deal with big files.</li>
</ol>
<p>So I did some heavy modification of the script.  Here&#8217;s my version.  No directory support, but it lets me read my big files by the original key (i.e. a stat on &#8220;bigfile1.mpg&#8221; may trigger a stat on &#8220;_big_info:bigfile1.mpg&#8221;), and any other file I&#8217;ve loaded outside of FUSE (e.g. with <code>mogtool</code>).</p>
<p>You can name it as <code>myfuse.pl</code> and then, assuming the script is in the current directory, use it to mount a filesystem like so: <code>mkdir ./myfuse; perl ./myfuse.pl ./myfuse</code>.</p>
<p>Maybe I&#8217;ll get around to re-formatting this as a patch for SixApart &#8212; but probably not.</p>

<div class="wp_syntax"><div class="code"><pre class="perl"><span style="color: #808080; font-style: italic;">#!/usr/bin/perl</span>
<span style="color: #000000; font-weight: bold;">use</span> strict;
<span style="color: #000000; font-weight: bold;">use</span> warnings;
<span style="color: #000000; font-weight: bold;">use</span> threads;
<span style="color: #000000; font-weight: bold;">use</span> threads::<span style="color: #006600;">shared</span>;
<span style="color: #000000; font-weight: bold;">use</span> Fuse;
<span style="color: #000000; font-weight: bold;">use</span> LWP::<span style="color: #006600;">UserAgent</span>;
<span style="color: #000000; font-weight: bold;">use</span> LWP::<span style="color: #006600;">Simple</span>;
<span style="color: #000000; font-weight: bold;">use</span> List::<span style="color: #006600;">MoreUtils</span> <span style="color: #000066;">qw</span><span style="color: #66cc66;">&#40;</span>uniq<span style="color: #66cc66;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">use</span> MogileFS::<span style="color: #006600;">Client</span>;
<span style="color: #000000; font-weight: bold;">use</span> Path::<span style="color: #006600;">Class</span>;
<span style="color: #000000; font-weight: bold;">use</span> POSIX <span style="color: #000066;">qw</span><span style="color: #66cc66;">&#40;</span>ENOENT EISDIR EINVAL<span style="color: #66cc66;">&#41;</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$DEBUG</span> = <span style="color: #cc66cc;">0</span>;
<span style="color: #b1b100;">our</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">%FILE_CACHE</span>, <span style="color: #0000ff;">$CACHE_SIZE</span>, <span style="color: #0000ff;">$CACHE_AGE</span><span style="color: #66cc66;">&#41;</span> = <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'/'</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">&#123;</span>size =<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">0</span>, age =<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #808080; font-style: italic;"># create client object w/ server-configured namespace and IPs of trackers</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$ua</span> = LWP::<span style="color: #006600;">UserAgent</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">new</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$class</span> = <span style="color: #ff0000;">'default'</span>;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$mogilefs</span> = MogileFS::<span style="color: #006600;">Client</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">new</span><span style="color: #66cc66;">&#40;</span>
  domain =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">'ifap'</span>,
  hosts  =<span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">&#91;</span> <span style="color: #ff0000;">'10.10.0.100:6001'</span>, <span style="color: #ff0000;">'10.10.0.101:6001'</span> <span style="color: #66cc66;">&#93;</span>,
<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$mountpoint</span><span style="color: #66cc66;">&#41;</span> = <span style="color: #ff0000;">&quot;&quot;</span>;
<span style="color: #0000ff;">$mountpoint</span> = <span style="color: #000066;">shift</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">@ARGV</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">@ARGV</span>;
Fuse::<span style="color: #006600;">main</span><span style="color: #66cc66;">&#40;</span>
    debug      =<span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$DEBUG</span>,
    mountpoint =<span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$mountpoint</span>,
    threaded   =<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">1</span>,
&nbsp;
    getattr    =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">&quot;main::e_getattr&quot;</span>,
    getdir     =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">&quot;main::e_getdir&quot;</span>,
    mknod      =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">&quot;main::e_mknod&quot;</span>,
    <span style="color: #000066;">open</span>       =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">&quot;main::e_open&quot;</span>,
    <span style="color: #000066;">read</span>       =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">&quot;main::e_read&quot;</span>,
    <span style="color: #000066;">rename</span>     =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">&quot;main::e_rename&quot;</span>,
    statfs     =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">&quot;main::e_statfs&quot;</span>,
    <span style="color: #000066;">unlink</span>     =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">&quot;main::e_unlink&quot;</span>,
    <span style="color: #000066;">write</span>      =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">&quot;main::e_write&quot;</span>,
<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> e_getattr <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$filename</span> = <span style="color: #000066;">shift</span>;
    <span style="color: #0000ff;">$filename</span> =~ <span style="color: #000066;">s</span><span style="color: #808080; font-style: italic;">#^.*/##;</span>
    <span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;main::e_getattr $filename<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
&nbsp;
    <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$size</span>, <span style="color: #0000ff;">$modes</span> <span style="color: #66cc66;">&#41;</span>;
    <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$dev</span>, <span style="color: #0000ff;">$ino</span>, <span style="color: #0000ff;">$rdev</span>, <span style="color: #0000ff;">$blocks</span>, <span style="color: #0000ff;">$gid</span>, <span style="color: #0000ff;">$uid</span>, <span style="color: #0000ff;">$nlink</span>, <span style="color: #0000ff;">$blksize</span> <span style="color: #66cc66;">&#41;</span>
        = <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">1024</span> <span style="color: #66cc66;">&#41;</span>;
    <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$atime</span>, <span style="color: #0000ff;">$ctime</span>, <span style="color: #0000ff;">$mtime</span> <span style="color: #66cc66;">&#41;</span> = <span style="color: #66cc66;">&#40;</span> <span style="color: #000066;">time</span>, <span style="color: #000066;">time</span>, <span style="color: #000066;">time</span> <span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$filename</span> <span style="color: #66cc66;">!</span>~ <span style="color: #000066;">m</span><span style="color: #66cc66;">&#123;</span>\.<span style="color: #66cc66;">&#125;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #808080; font-style: italic;">#        warn &quot;directory!&quot;;</span>
        <span style="color: #0000ff;">$size</span>  = <span style="color: #cc66cc;">0</span>;
        <span style="color: #0000ff;">$modes</span> = <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">0040</span> <span style="color: #66cc66;">&lt;&lt;</span> <span style="color: #cc66cc;">9</span> <span style="color: #66cc66;">&#41;</span> + <span style="color: #cc66cc;">0755</span>;
    <span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #808080; font-style: italic;">#        warn &quot;file!&quot;;</span>
        <span style="color: #0000ff;">$size</span>  = <span style="color: #cc66cc;">123</span>;
        <span style="color: #0000ff;">$modes</span> = <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">0100</span> <span style="color: #66cc66;">&lt;&lt;</span> <span style="color: #cc66cc;">9</span> <span style="color: #66cc66;">&#41;</span> + <span style="color: #cc66cc;">0644</span>;
&nbsp;
        <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@paths</span> = <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">get_paths</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$filename</span>, <span style="color: #66cc66;">&#123;</span> noverify =<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#125;</span> <span style="color: #66cc66;">&#41;</span>;
        <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$content_type</span>, <span style="color: #0000ff;">$document_length</span>, <span style="color: #0000ff;">$modified_time</span>, <span style="color: #0000ff;">$expires</span>, <span style="color: #0000ff;">$server</span> <span style="color: #66cc66;">&#41;</span>;
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #000066;">scalar</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">@paths</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$content_type</span>, <span style="color: #0000ff;">$document_length</span>, <span style="color: #0000ff;">$modified_time</span>, <span style="color: #0000ff;">$expires</span>, <span style="color: #0000ff;">$server</span> <span style="color: #66cc66;">&#41;</span> = head<span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$paths</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#41;</span>;
            <span style="color: #0000ff;">$size</span> = <span style="color: #0000ff;">$document_length</span>;
            <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$atime</span>, <span style="color: #0000ff;">$ctime</span>, <span style="color: #0000ff;">$mtime</span> <span style="color: #66cc66;">&#41;</span> = <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$modified_time</span><span style="color: #66cc66;">&#41;</span> x <span style="color: #cc66cc;">3</span>;
        <span style="color: #66cc66;">&#125;</span>
        <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #0000ff;">@paths</span> = <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">get_paths</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'_big_info:'</span> . <span style="color: #0000ff;">$filename</span>, <span style="color: #66cc66;">&#123;</span> noverify =<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#125;</span> <span style="color: #66cc66;">&#41;</span>;
            <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #000066;">scalar</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">@paths</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$data</span> = <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">get_file_data</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'_big_info:'</span> . <span style="color: #0000ff;">$filename</span> <span style="color: #66cc66;">&#41;</span>;
                <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$_des</span>, <span style="color: #0000ff;">$_type</span>, <span style="color: #0000ff;">$_compress</span>, <span style="color: #0000ff;">$_filename</span>, <span style="color: #0000ff;">$_chunks</span>, <span style="color: #0000ff;">$_size</span>, <span style="color: #000066;">undef</span>, <span style="color: #0000ff;">@_parts</span> <span style="color: #66cc66;">&#41;</span> = <span style="color: #000066;">split</span> <span style="color: #66cc66;">/</span>\n<span style="color: #66cc66;">/</span>, <span style="color: #0000ff;">$$data</span>;
                <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$size</span> <span style="color: #66cc66;">&#41;</span> = <span style="color: #0000ff;">$_size</span> =~ <span style="color: #000066;">m</span><span style="color: #808080; font-style: italic;">#^size (\d+)$#;</span>
                OUTER: <span style="color: #b1b100;">foreach</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$_part</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">@_parts</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                    <span style="color: #0000ff;">$_part</span> =~ <span style="color: #000066;">m</span><span style="color: #808080; font-style: italic;">#paths: (.+?)$#;</span>
                    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@_paths</span> = <span style="color: #000066;">split</span> <span style="color: #ff0000;">', '</span>, <span style="color: #0000ff;">$_part</span>;
                    <span style="color: #b1b100;">foreach</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$_path</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">@_paths</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                        <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$content_type</span>, <span style="color: #0000ff;">$document_length</span>, <span style="color: #0000ff;">$modified_time</span>, <span style="color: #0000ff;">$expires</span>, <span style="color: #0000ff;">$server</span> <span style="color: #66cc66;">&#41;</span> = head<span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$paths</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#41;</span>;
                        <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$atime</span>, <span style="color: #0000ff;">$ctime</span>, <span style="color: #0000ff;">$mtime</span> <span style="color: #66cc66;">&#41;</span> = <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$modified_time</span><span style="color: #66cc66;">&#41;</span> x <span style="color: #cc66cc;">3</span>;
                        <span style="color: #b1b100;">last</span> OUTER <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$server</span>;
                    <span style="color: #66cc66;">&#125;</span>
                <span style="color: #66cc66;">&#125;</span>
            <span style="color: #66cc66;">&#125;</span>
        <span style="color: #66cc66;">&#125;</span>
        <span style="color: #000066;">return</span> -ENOENT<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">unless</span> <span style="color: #0000ff;">@paths</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #000066;">warn</span><span style="color: #66cc66;">&#40;</span>
        <span style="color: #000066;">join</span><span style="color: #66cc66;">&#40;</span>
            <span style="color: #ff0000;">&quot;,&quot;</span>,
            <span style="color: #66cc66;">&#40;</span>   <span style="color: #0000ff;">$dev</span>,   <span style="color: #0000ff;">$ino</span>,     <span style="color: #0000ff;">$modes</span>, <span style="color: #0000ff;">$nlink</span>, <span style="color: #0000ff;">$uid</span>,
                <span style="color: #0000ff;">$gid</span>,   <span style="color: #0000ff;">$rdev</span>,    <span style="color: #0000ff;">$size</span>,  <span style="color: #0000ff;">$atime</span>, <span style="color: #0000ff;">$mtime</span>,
                <span style="color: #0000ff;">$ctime</span>, <span style="color: #0000ff;">$blksize</span>, <span style="color: #0000ff;">$blocks</span>
            <span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#41;</span>,
        <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
    <span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
&nbsp;
    <span style="color: #000066;">return</span> <span style="color: #66cc66;">&#40;</span>
        <span style="color: #0000ff;">$dev</span>,  <span style="color: #0000ff;">$ino</span>,   <span style="color: #0000ff;">$modes</span>, <span style="color: #0000ff;">$nlink</span>, <span style="color: #0000ff;">$uid</span>,     <span style="color: #0000ff;">$gid</span>, <span style="color: #0000ff;">$rdev</span>,
        <span style="color: #0000ff;">$size</span>, <span style="color: #0000ff;">$atime</span>, <span style="color: #0000ff;">$mtime</span>, <span style="color: #0000ff;">$ctime</span>, <span style="color: #0000ff;">$blksize</span>, <span style="color: #0000ff;">$blocks</span>
    <span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> e_getdir <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$prefix</span> = <span style="color: #000066;">shift</span>;
    <span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;main::e_getdir $prefix<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@filenames</span>;
    <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">foreach_key</span><span style="color: #66cc66;">&#40;</span>
<span style="color: #808080; font-style: italic;">#        prefix =&gt; $prefix,</span>
        <span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #66cc66;">&#123;</span>
          <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$filename</span> = <span style="color: #000066;">shift</span>;
          <span style="color: #000066;">push</span> <span style="color: #0000ff;">@filenames</span>, <span style="color: #0000ff;">$filename</span>;
          <span style="color: #000066;">push</span> <span style="color: #0000ff;">@filenames</span>, file<span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$filename</span> <span style="color: #66cc66;">&#41;</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">parent</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #0000ff;">@filenames</span> = uniq <span style="color: #0000ff;">@filenames</span>;
    <span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;returning: @filenames<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
    <span style="color: #000066;">return</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">@filenames</span>, <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> e_mknod <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$filename</span> = <span style="color: #000066;">shift</span>;
    <span style="color: #0000ff;">$filename</span> =~ <span style="color: #000066;">s</span><span style="color: #808080; font-style: italic;">#.*/##;</span>
&nbsp;
    <span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;main::e_mknod $filename<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
&nbsp;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$fh</span> = <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">new_file</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$filename</span>, <span style="color: #000066;">undef</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$fh</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #000066;">print</span> <span style="color: #0000ff;">$fh</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>;
&nbsp;
        <span style="color: #b1b100;">unless</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$fh</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">close</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$code</span>, <span style="color: #0000ff;">$str</span><span style="color: #66cc66;">&#41;</span> = <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">errcode</span> <span style="color: #66cc66;">||</span> <span style="color: #cc66cc;">-1</span>, <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">errstr</span> <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span>;
            <span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;Error creating file:$code: $str&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
            $<span style="color: #66cc66;">!</span> = <span style="color: #0000ff;">$str</span>;
            $? = <span style="color: #0000ff;">$code</span>;
            <span style="color: #000066;">return</span> <span style="color: #cc66cc;">-1</span>;
        <span style="color: #66cc66;">&#125;</span>
        <span style="color: #000066;">return</span> <span style="color: #cc66cc;">0</span>;
    <span style="color: #66cc66;">&#125;</span>
    <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #000066;">return</span> <span style="color: #cc66cc;">-1</span>;
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> e_open <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$filename</span> = <span style="color: #000066;">shift</span>;
    <span style="color: #0000ff;">$filename</span> =~ <span style="color: #000066;">s</span><span style="color: #808080; font-style: italic;">#.*/##;</span>
    <span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;main::e_open $filename<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
&nbsp;
    <span style="color: #000066;">return</span> -EISDIR<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">unless</span> <span style="color: #0000ff;">$filename</span> =~ <span style="color: #000066;">m</span><span style="color: #66cc66;">&#123;</span>\.<span style="color: #66cc66;">&#125;</span>;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@paths</span> = <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">get_paths</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$filename</span>, <span style="color: #66cc66;">&#123;</span> noverify =<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#125;</span> <span style="color: #66cc66;">&#41;</span>;
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">!</span> <span style="color: #000066;">scalar</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">@paths</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #0000ff;">@paths</span> = <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">get_paths</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'_big_info:'</span> . <span style="color: #0000ff;">$filename</span>, <span style="color: #66cc66;">&#123;</span> noverify =<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#125;</span> <span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
    <span style="color: #000066;">return</span> -ENOENT<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">unless</span> <span style="color: #0000ff;">@paths</span>;
    <span style="color: #000066;">return</span> <span style="color: #cc66cc;">0</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> e_read <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$filename</span>, <span style="color: #0000ff;">$length</span>, <span style="color: #0000ff;">$offset</span> <span style="color: #66cc66;">&#41;</span> = <span style="color: #0000ff;">@_</span>;
    <span style="color: #0000ff;">$filename</span> =~ <span style="color: #000066;">s</span><span style="color: #808080; font-style: italic;">#.*/##;</span>
    <span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;main::e_read $filename $length $offset<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
&nbsp;
    <span style="color: #000066;">return</span> -EISDIR<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$filename</span> =~ <span style="color: #000066;">m</span><span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">/</span>$<span style="color: #66cc66;">&#125;</span>;
&nbsp;
&nbsp;
&nbsp;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$maxoff</span> = <span style="color: #0000ff;">$offset</span> + <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$length</span> - <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;requested offset=$offset length=$length bytes=$maxoff&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@paths</span> = <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">get_paths</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$filename</span>, <span style="color: #66cc66;">&#123;</span> noverify =<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#125;</span> <span style="color: #66cc66;">&#41;</span>;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$size</span>;
    <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$content_type</span>, <span style="color: #0000ff;">$document_length</span>, <span style="color: #0000ff;">$modified_time</span>, <span style="color: #0000ff;">$expires</span>, <span style="color: #0000ff;">$server</span> <span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #000066;">scalar</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">@paths</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
<span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;it's a small file&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
        <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$content_type</span>, <span style="color: #0000ff;">$document_length</span>, <span style="color: #0000ff;">$modified_time</span>, <span style="color: #0000ff;">$expires</span>, <span style="color: #0000ff;">$server</span> <span style="color: #66cc66;">&#41;</span> = head<span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$paths</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#41;</span>;
        <span style="color: #0000ff;">$size</span> = <span style="color: #0000ff;">$document_length</span>;
        <span style="color: #000066;">return</span> <span style="color: #cc66cc;">0</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$offset</span> == <span style="color: #0000ff;">$document_length</span>;
&nbsp;
        <span style="color: #0000ff;">$maxoff</span> = <span style="color: #0000ff;">$document_length</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$maxoff</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$document_length</span>;
        <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$range</span> = <span style="color: #0000ff;">$offset</span> . <span style="color: #ff0000;">&quot;-&quot;</span> . <span style="color: #0000ff;">$maxoff</span>;
        <span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;  Range: bytes=$range<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
        <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$response</span> = <span style="color: #0000ff;">$ua</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">get</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$paths</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span>, <span style="color: #ff0000;">&quot;Range&quot;</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">&quot;bytes=$range&quot;</span> <span style="color: #66cc66;">&#41;</span>;
        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$response</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">is_success</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #000066;">return</span> <span style="color: #0000ff;">$response</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">content</span>;
        <span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #000066;">warn</span> <span style="color: #0000ff;">$response</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">as_string</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
    <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #0000ff;">@paths</span> = <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">get_paths</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'_big_info:'</span> . <span style="color: #0000ff;">$filename</span>, <span style="color: #66cc66;">&#123;</span> noverify =<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#125;</span> <span style="color: #66cc66;">&#41;</span>;
        <span style="color: #000066;">return</span> -ENOENT<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">unless</span> <span style="color: #0000ff;">@paths</span>;
<span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;it's a big file&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
&nbsp;
        <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$data</span> = <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">get_file_data</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'_big_info:'</span> . <span style="color: #0000ff;">$filename</span> <span style="color: #66cc66;">&#41;</span>;
        <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$_des</span>, <span style="color: #0000ff;">$_type</span>, <span style="color: #0000ff;">$_compress</span>, <span style="color: #0000ff;">$_filename</span>, <span style="color: #0000ff;">$_chunks</span>, <span style="color: #0000ff;">$_size</span>, <span style="color: #000066;">undef</span>, <span style="color: #0000ff;">@_parts</span> <span style="color: #66cc66;">&#41;</span> = <span style="color: #000066;">split</span> <span style="color: #66cc66;">/</span>\n<span style="color: #66cc66;">/</span>, <span style="color: #0000ff;">$$data</span>;
        <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$size</span> <span style="color: #66cc66;">&#41;</span> = <span style="color: #0000ff;">$_size</span> =~ <span style="color: #000066;">m</span><span style="color: #808080; font-style: italic;">#^size (\d+)$#;</span>
        <span style="color: #000066;">return</span> <span style="color: #cc66cc;">0</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$offset</span> == <span style="color: #0000ff;">$size</span>;
&nbsp;
        <span style="color: #0000ff;">$maxoff</span> = <span style="color: #0000ff;">$size</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$maxoff</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$size</span>;
&nbsp;
        <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$part_min</span> = <span style="color: #cc66cc;">-1</span>;
        <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$part_max</span> = <span style="color: #cc66cc;">-1</span>;
<span style="color: #808080; font-style: italic;">#part 2 bytes=23080964 md5=af45f7ac80ca34328db3c90de1db1ab0 paths: http://10.10.0.100:7500/dev8/0/000/119/0000119969.fid, http://10.10.0.101:7500/dev2/0/000/119/0000119969.fid</span>
&nbsp;
        <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$buf</span> = <span style="color: #ff0000;">''</span>;
        <span style="color: #b1b100;">foreach</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$_part</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">@_parts</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$_bytes</span>, <span style="color: #0000ff;">$_paths</span> <span style="color: #66cc66;">&#41;</span> = <span style="color: #0000ff;">$_part</span> =~ <span style="color: #000066;">m</span><span style="color: #808080; font-style: italic;">#bytes=(\d+) .+? paths: (.+?)$#;</span>
&nbsp;
            <span style="color: #0000ff;">$part_min</span> = <span style="color: #0000ff;">$part_max</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">0</span> ? <span style="color: #0000ff;">$part_max</span> + <span style="color: #cc66cc;">1</span> : <span style="color: #cc66cc;">0</span>;
            <span style="color: #0000ff;">$part_max</span> += <span style="color: #0000ff;">$_bytes</span>;
&nbsp;
&nbsp;
<span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;examining part $part_min -&gt; $part_max&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
&nbsp;
            <span style="color: #808080; font-style: italic;">#chunk too early</span>
            <span style="color: #b1b100;">next</span> <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$part_max</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #0000ff;">$offset</span> <span style="color: #66cc66;">&#41;</span>;
            <span style="color: #808080; font-style: italic;">#chunk too late;</span>
            <span style="color: #b1b100;">next</span> <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$part_min</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$maxoff</span> <span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;using part $part_min -&gt; $part_max&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
&nbsp;
            <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@_paths</span> = <span style="color: #000066;">split</span> <span style="color: #ff0000;">', '</span>, <span style="color: #0000ff;">$_paths</span>;
            <span style="color: #b1b100;">foreach</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$_path</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">@_paths</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
<span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;offset=$offset part_min=$part_min maxoff=$maxoff part_max=$part_max&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
                <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$range</span> = <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$offset</span>-<span style="color: #0000ff;">$part_min</span><span style="color: #66cc66;">&#41;</span> . <span style="color: #ff0000;">&quot;-&quot;</span> . <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$maxoff</span>-<span style="color: #0000ff;">$part_min</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;getting Range: bytes=$range&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
                <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$response</span> = <span style="color: #0000ff;">$ua</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">get</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$_path</span>, <span style="color: #ff0000;">&quot;Range&quot;</span> =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">&quot;bytes=$range&quot;</span> <span style="color: #66cc66;">&#41;</span>;
                <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$response</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">is_success</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                    <span style="color: #0000ff;">$buf</span> .= <span style="color: #0000ff;">$response</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">content</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;data length=&quot;</span>.<span style="color: #000066;">length</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$buf</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
                    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #000066;">length</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$buf</span> <span style="color: #66cc66;">&#41;</span> == <span style="color: #0000ff;">$length</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
<span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;got all the data (1)!&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
                        <span style="color: #000066;">return</span> <span style="color: #0000ff;">$buf</span>;
                    <span style="color: #66cc66;">&#125;</span>
                    <span style="color: #b1b100;">elsif</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$offset</span> + <span style="color: #000066;">length</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$buf</span> <span style="color: #66cc66;">&#41;</span> == <span style="color: #0000ff;">$maxoff</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
<span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;got all the data (2)!&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
                        <span style="color: #000066;">return</span> <span style="color: #0000ff;">$buf</span>;
                    <span style="color: #66cc66;">&#125;</span>
                    <span style="color: #0000ff;">$offset</span> += <span style="color: #000066;">length</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$buf</span> <span style="color: #66cc66;">&#41;</span>;
                    <span style="color: #b1b100;">last</span>;
                <span style="color: #66cc66;">&#125;</span>
            <span style="color: #66cc66;">&#125;</span>
        <span style="color: #66cc66;">&#125;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #000066;">length</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$buf</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">!</span>= <span style="color: #0000ff;">$length</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #000066;">return</span> -ENOENT<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #66cc66;">&#125;</span>
        <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #000066;">return</span> <span style="color: #0000ff;">$buf</span>;
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> e_rename <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$old</span>, <span style="color: #0000ff;">$new</span> <span style="color: #66cc66;">&#41;</span> = <span style="color: #0000ff;">@_</span>;
    <span style="color: #0000ff;">$old</span> =~ <span style="color: #000066;">s</span><span style="color: #808080; font-style: italic;">#.*/##;</span>
    <span style="color: #0000ff;">$new</span> =~ <span style="color: #000066;">s</span><span style="color: #808080; font-style: italic;">#.*/##;</span>
&nbsp;
    <span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;main::e_rename: $old -&gt; $new&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
&nbsp;
    <span style="color: #808080; font-style: italic;"># Rename this file</span>
    <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">rename</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$old</span>, <span style="color: #0000ff;">$new</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #000066;">return</span> <span style="color: #cc66cc;">0</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> e_statfs <span style="color: #66cc66;">&#123;</span> <span style="color: #000066;">return</span> <span style="color: #cc66cc;">255</span>, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> e_unlink <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$filename</span> = <span style="color: #000066;">shift</span>;
    <span style="color: #0000ff;">$filename</span> =~ <span style="color: #000066;">s</span><span style="color: #808080; font-style: italic;">#.*/##;</span>
&nbsp;
    <span style="color: #000066;">warn</span> <span style="color: #ff0000;">&quot;main::e_unlink: $filename&quot;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
&nbsp;
    <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">delete</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$filename</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #000066;">return</span> <span style="color: #cc66cc;">0</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> e_write <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$filename</span>, <span style="color: #0000ff;">$buf</span>, <span style="color: #0000ff;">$offset</span> <span style="color: #66cc66;">&#41;</span> = <span style="color: #0000ff;">@_</span>;
    <span style="color: #0000ff;">$filename</span> =~ <span style="color: #000066;">s</span><span style="color: #808080; font-style: italic;">#.*/##;</span>
&nbsp;
    <span style="color: #000066;">warn</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;main::e_write: $filename pos=$offset len=&quot;</span>.<span style="color: #000066;">length</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$buf</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span>;
&nbsp;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$finfo</span> = get_file_info<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$filename</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #000066;">return</span> -ENOENT<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">unless</span> <span style="color: #0000ff;">$finfo</span>;
&nbsp;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$cont</span> = get_file_data<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$filename</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #000066;">substr</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$$cont</span>, <span style="color: #0000ff;">$offset</span>, <span style="color: #000066;">length</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$buf</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #0000ff;">$buf</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">store_content</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$filename</span>, <span style="color: #000066;">undef</span>, <span style="color: #0000ff;">$cont</span><span style="color: #66cc66;">&#41;</span>;
    rm_file_cache<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$filename</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #000066;">return</span> <span style="color: #000066;">length</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$buf</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#################################################</span>
<span style="color: #000000; font-weight: bold;">sub</span> logmsg <span style="color: #66cc66;">&#123;</span> <span style="color: #000066;">warn</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">join</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>,<span style="color: #0000ff;">@_</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$DEBUG</span> <span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> get_file_data <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$file</span><span style="color: #66cc66;">&#41;</span> = <span style="color: #0000ff;">@_</span>;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$entry</span> = <span style="color: #0000ff;">$FILE_CACHE</span><span style="color: #66cc66;">&#123;</span><span style="color: #0000ff;">$file</span><span style="color: #66cc66;">&#125;</span>;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$meta</span>  = <span style="color: #0000ff;">$FILE_CACHE</span><span style="color: #66cc66;">&#123;</span><span style="color: #ff0000;">'/'</span><span style="color: #66cc66;">&#125;</span>;
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$entry</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #808080; font-style: italic;"># See if this data is too old</span>
        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">time</span> - <span style="color: #0000ff;">$entry</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#123;</span>created<span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #0000ff;">$CACHE_AGE</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            logmsg<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span>, <span style="color: #ff0000;">&quot;-- get_file_data: hit&quot;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
            <span style="color: #808080; font-style: italic;"># If its still valid, return it</span>
            <span style="color: #000066;">return</span> <span style="color: #0000ff;">$entry</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#123;</span>data<span style="color: #66cc66;">&#125;</span>;
        <span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
            logmsg<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span>, <span style="color: #ff0000;">&quot;-- get_file_data: miss - expired&quot;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
            rm_file_cache<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$file</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$cont</span> = <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">get_file_data</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$file</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$size</span> = <span style="color: #000066;">length</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$$cont</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$meta</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#123;</span>size<span style="color: #66cc66;">&#125;</span> + <span style="color: #0000ff;">$size</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$CACHE_SIZE</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #808080; font-style: italic;"># If adding this would go beyond our max cache size, delete things until</span>
        <span style="color: #808080; font-style: italic;"># we can fit it</span>
        <span style="color: #b1b100;">foreach</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$f</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">sort</span> <span style="color: #66cc66;">&#123;</span><span style="color: #0000ff;">$a</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#123;</span>age<span style="color: #66cc66;">&#125;</span> <span style="color: #66cc66;">&lt;</span>=<span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$b</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#123;</span>age<span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#125;</span> <span style="color: #000066;">keys</span> <span style="color: #0000ff;">%FILE_CACHE</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #b1b100;">next</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$f</span> eq <span style="color: #ff0000;">'/'</span>;
&nbsp;
            <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$rm_size</span> = rm_file_cache<span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$f</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
            logmsg<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span>, <span style="color: #ff0000;">&quot;-- get_file_data: purging - $rm_size bytes&quot;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
            <span style="color: #b1b100;">last</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$meta</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#123;</span>size<span style="color: #66cc66;">&#125;</span> + <span style="color: #0000ff;">$size</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #0000ff;">$CACHE_SIZE</span>;
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    logmsg<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span>, <span style="color: #ff0000;">&quot;-- get_file_data: added - $size bytes&quot;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #808080; font-style: italic;"># Create a new entry</span>
    <span style="color: #0000ff;">$FILE_CACHE</span><span style="color: #66cc66;">&#123;</span><span style="color: #0000ff;">$file</span><span style="color: #66cc66;">&#125;</span> = <span style="color: #66cc66;">&#123;</span>created =<span style="color: #66cc66;">&gt;</span> <span style="color: #000066;">time</span>,
                          size    =<span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$size</span>,
                          data    =<span style="color: #66cc66;">&gt;</span> <span style="color: #0000ff;">$cont</span><span style="color: #66cc66;">&#125;</span>;
    <span style="color: #0000ff;">$meta</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#123;</span>size<span style="color: #66cc66;">&#125;</span> += <span style="color: #0000ff;">$size</span>;
&nbsp;
    <span style="color: #000066;">return</span> <span style="color: #0000ff;">$cont</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> get_file_info <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$path</span><span style="color: #66cc66;">&#41;</span> = <span style="color: #0000ff;">@_</span>;
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$path</span> eq <span style="color: #ff0000;">'/'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #000066;">return</span> <span style="color: #66cc66;">&#123;</span>name         =<span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">'/'</span>,
                is_directory =<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#125;</span>;
    <span style="color: #66cc66;">&#125;</span>
    <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
      <span style="color: #b1b100;">foreach</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$f</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$mogilefs</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #006600;">list_keys</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0000ff;">$path</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #000066;">return</span> <span style="color: #0000ff;">$f</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$f</span> eq <span style="color: #0000ff;">$path</span>;
      <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
    <span style="color: #000066;">return</span> <span style="color: #000066;">undef</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> rm_file_cache <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$file</span><span style="color: #66cc66;">&#41;</span> = <span style="color: #0000ff;">@_</span>;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$entry</span> = <span style="color: #000066;">delete</span> <span style="color: #0000ff;">$FILE_CACHE</span><span style="color: #66cc66;">&#123;</span><span style="color: #0000ff;">$file</span><span style="color: #66cc66;">&#125;</span>;
    <span style="color: #000066;">return</span> <span style="color: #b1b100;">unless</span> <span style="color: #0000ff;">$entry</span>;
&nbsp;
    <span style="color: #808080; font-style: italic;"># Decrement how large our cache size is</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$size</span> = <span style="color: #0000ff;">$entry</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#123;</span>size<span style="color: #66cc66;">&#125;</span>;
    <span style="color: #0000ff;">$FILE_CACHE</span><span style="color: #66cc66;">&#123;</span><span style="color: #ff0000;">'/'</span><span style="color: #66cc66;">&#125;</span>-<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#123;</span>size<span style="color: #66cc66;">&#125;</span> -= <span style="color: #0000ff;">$size</span>;
&nbsp;
    <span style="color: #000066;">return</span> <span style="color: #0000ff;">$size</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">__DATA__</span>
<span style="color: #808080; font-style: italic;">#des no description</span>
<span style="color: #808080; font-style: italic;">#type file</span>
<span style="color: #808080; font-style: italic;">#compressed 0</span>
<span style="color: #808080; font-style: italic;">#filename somefile.mpeg</span>
<span style="color: #808080; font-style: italic;">#chunks 2</span>
<span style="color: #808080; font-style: italic;">#size 90189828</span>
<span style="color: #808080; font-style: italic;">#</span>
<span style="color: #808080; font-style: italic;">#part 1 bytes=67108864 md5=8066369552b71fd49cfbe9ccdce74051 paths: http://10.10.0.100:7500/dev6/0/000/119/0000119968.fid, http://10.10.0.101:7500/dev2/0/000/119/0000119968.fid</span>
<span style="color: #808080; font-style: italic;">#part 2 bytes=23080964 md5=af45f7ac80ca34328db3c90de1db1ab0 paths: http://10.10.0.100:7500/dev8/0/000/119/0000119969.fid, http://10.10.0.101:7500/dev2/0/000/119/0000119969.fid</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.spicylogic.com/allenday/blog/2008/07/14/mogilefs-fuse-bigfile-support/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
