<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Jun 12, 2014 at 10:46 AM, Joe Armstrong <span dir="ltr"><<a href="mailto:erlang@gmail.com" target="_blank">erlang@gmail.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hello<div><br></div><div>I want some opinions on how to implement a blob store.</div>

<div><br></div><div>I want a simple key-value store. </div><div><br></div><div><br></div><div>To fix our ideas </div><div>
<br></div><div>  - The values are variable size binaries (max 56 KB) </div><div>  - The keys are SHA1 hashes of the values</div><div>  - I want to store max 1M blobs</div><div>  - Efficiency is not a concern (though it would be a deciding factor given two</div>


<div>    equally beautiful solutions)</div><div><br></div><div>The *simplest* way I can think of is to use the file store</div><div>a blob with (hex) hash "a2e34a32..." gets stored in 2-level directory structure</div>


<div>in a file called a2/e3/a2e34a32</div><div><br></div><div>Even this might have problems - for example is file:write_file/2 atomic?</div><div>What happens if two process try to write the same file at the same time with the same</div>


<div>content? (and I know "at the same time" is meaningless, but it's shorter to say than</div><div>' if one processes has made a write_file request and a second process  makes a write_file</div><div>request before the first request issued by the first process has completed ...)</div>

</div></blockquote><div><br><br></div><div>not sure to see the problem here, if you use an hash then you can check if you're already writing it or not on the file system by testing if it's exist on it. <br><br></div>

<div>The problem is to make sure that the write won't have any read at the same time that could happen on the filesystem which imply to upload the file to a temporary file and rename it at the end. Or such things.<br>

 <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">
<div><br></div><div>The next simplest way I can think of is to make a single huge blob store file</div><div>(max 56GB) and use an ets table to map hashes to addresses in the file -</div><div>if this is a good idea or not would depend upon how well the host OS handles sparse files</div>


<div>and so on.<br> </div></div></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><br></div><div>The third alternative would be to use a raw disk partition(very non portable etc.)</div>

<div><br></div><div>The fourth alternative would be to use a library like bitcask</div></div></blockquote><div><br></div><div>or any other key/value api, which was is doing leofs if i remember well. you can store {keys, offset start, size} / chunks in the k/v to point on large file. You will probably need to split the file.<br>

<br> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>
<br></div><div>The fifth alternative would be use use some other library.</div></div></blockquote><div><br></div><div>we are releasing coffer next week which is providing such features:<br><br> <a href="http://refuge.io/learnmore/platform.html#blob-server">http://refuge.io/learnmore/platform.html#blob-server</a><br>

<br></div><div>The blob server can fullly be used as a library. It abstract blobs upload to different storages services or the filesystem. <br><br></div><div>Current code online is not the one that will be released but can be useful.<br>

</div><div><br></div><div>Hope it helps,<br><br></div><div>- benoit <br></div></div><br></div></div>