Slide 1

Slide 1 text

FrontendFS Creating a userspace filesystem in node.js Clay Smith, New Relic

Slide 2

Slide 2 text

A file system (or filesystem) is a way of storing all data on a data storage device. BUILDING A FILESYSTEM IN NODE.JS Simple English Wikipedia

Slide 3

Slide 3 text

BUILDING A FILESYSTEM IN NODE.JS Kernel Virtual  File  System EXT3 Hardware NFS userspace kernel a  process https://en.wikipedia.org/wiki/Protection_ring   (thanks  @maykaynwd!)

Slide 4

Slide 4 text

BUILDING A FILESYSTEM IN NODE.JS Kernel Virtual  File  System EXT3 Hardware NFS FUSE userspace kernel a  process fuse  client

Slide 5

Slide 5 text

BUILDING A FILESYSTEM IN NODE.JS Kernel Virtual  File  System EXT3 Hardware NFS a  process FUSE fuse  client userspace kernel libfuse

Slide 6

Slide 6 text

BUILDING A FILESYSTEM IN NODE.JS fuse  client.js good news: node is great at I/O

Slide 7

Slide 7 text

BUILDING A FILESYSTEM IN NODE.JS How to write a (virtual) filesystem in node.js CC  A  SA  https://www.flickr.com/photos/ewedistrict/25323526

Slide 8

Slide 8 text

BUILDING A FILESYSTEM IN NODE.JS • Use the fuse-bindings github project • https://github.com/mafintosh/fuse-bindings • Implement required filesystem operations • Run your node.js code and mount on an existing directory. • Success?!?!

Slide 9

Slide 9 text

BUILDING A FILESYSTEM IN NODE.JS read(filePath, fd, buf, len, pos, cb) { } write(filePath, fd, buf, len, pos, cb) { } create(filePath, mode, cb) { } open(filePath, flags, cb) { } readdir(filePath, cb) { } Good  list  for  reference:  https://www.cs.hmc.edu/~geoff/classes/hmc.cs135.201001/homework/fuse/fuse_doc.html#function-­‐ purposes   getattr(filePath, cb) { }

Slide 10

Slide 10 text

BUILDING A FILESYSTEM IN NODE.JS getattr(/) getattr(/cat.jpg) create(/cat.jpg, 33188) getattr(/cat.jpg) write(/cat.jpg, 0, len: 65536, buf.length: 65536, pos: 0 write(/cat.jpg, 0, len: 65536, buf.length: 65536, pos: 65536) // ... getattr(/cat.jpg) release(/cat.jpg, 0) Example: What does a file copy look like?

Slide 11

Slide 11 text

BUILDING A FILESYSTEM IN NODE.JS In-memory virtual filesystem backed by JS array (yikes)

Slide 12

Slide 12 text

BUILDING A FILESYSTEM IN NODE.JS var files = [ { name: 'readme.md', data: new Buffer('# test file\n'), } ]; A 'file' is just an item in this array: Buffer()-backed

Slide 13

Slide 13 text

BUILDING A FILESYSTEM IN NODE.JS readdir() { // ... for (var i = 0; i < files.length; i++) { var buffer = files[i].data; var hash = hasha(buffer).substring(0, 12); files[i].name = `${hash}-${files[i].name}`; files[i].hasFingerprint = true; } } Let's rename the filename to be a hash!

Slide 14

Slide 14 text

BUILDING A FILESYSTEM IN NODE.JS releaseFile(filePath, fd) { // Buffer is a WritableStream() var buffer = this.files[fileIndex].data.getContents(); zlib.gzip(buffer, function(error, result) { // create file if compression succeeded. }); } Like gzip?

Slide 15

Slide 15 text

BUILDING A FILESYSTEM IN NODE.JS Performance profiling CC  A  SA  www.flickr.com/photos/libertinus/9231731038  

Slide 16

Slide 16 text

Benchmarking disk or file system IO performance can be tricky at best. BUILDING A FILESYSTEM IN NODE.JS James Coyle

Slide 17

Slide 17 text

BUILDING A FILESYSTEM IN NODE.JS dd: "The Easy Route" •time sh -c "dd if=/dev/zero of=./in- memory/tst.tmp bs=4k count=1000 && sync" •409600 bytes written 1000 times... •Result: 3 mb/s (node, FuSE fs)

Slide 18

Slide 18 text

BUILDING A FILESYSTEM IN NODE.JS tl;dr - use for fun dev tools, exporting APIs, system learnings

Slide 19

Slide 19 text

BUILDING A FILESYSTEM IN NODE.JS see also... • https://github.com/Munter/fusile • ^ the "real" frontendFS • https://www.npmjs.com/package/mount-url • github.com/mafintosh/torrent-mount

Slide 20

Slide 20 text

BUILDING A FILESYSTEM IN NODE.JS thanks! @smithclay require('afterparty') - tomorrow at New Relic PDX. https://bit.ly/nodeparty