Skip to content
This repository has been archived by the owner on Aug 11, 2021. It is now read-only.

Commit

Permalink
perf: lazy load format resolvers
Browse files Browse the repository at this point in the history
The require time profile for starting an IPFS daemon (`ipfs daemon`) showed IPLD as a significant contributor to the total time spent requiring modules. This is because the formats are all required ahead of time.

In total, the default IPLD formats take around 200ms of time to require.

This PR adds support for these default modules lazily. You only suffer the require time when you use a particular format. So if you never use git, ethereum or zcash blocks (probably most people right now) they don't contribute to the startup time of your node.

License: MIT
Signed-off-by: Alan Shaw <alan@tableflip.io>
  • Loading branch information
alanshaw authored and vmx committed Sep 11, 2018
1 parent a069a0f commit f4a094a
Showing 1 changed file with 56 additions and 68 deletions.
124 changes: 56 additions & 68 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,6 @@ const series = require('async/series')
const waterfall = require('async/waterfall')
const MemoryStore = require('interface-datastore').MemoryDatastore

const dagPB = require('ipld-dag-pb')
const dagCBOR = require('ipld-dag-cbor')
const ipldGit = require('ipld-git')
const ipldBitcoin = require('ipld-bitcoin')
const ipldEthAccountSnapshot = require('ipld-ethereum').ethAccountSnapshot
const ipldEthBlock = require('ipld-ethereum').ethBlock
const ipldEthBlockList = require('ipld-ethereum').ethBlockList
const ipldEthStateTrie = require('ipld-ethereum').ethStateTrie
const ipldEthStorageTrie = require('ipld-ethereum').ethStorageTrie
const ipldEthTx = require('ipld-ethereum').ethTx
const ipldEthTxTrie = require('ipld-ethereum').ethTxTrie
const ipldRaw = require('ipld-raw')
const ipldZcash = require('ipld-zcash')

function noop () {}

class IPLDResolver {
Expand All @@ -38,7 +24,62 @@ class IPLDResolver {
}

this.bs = blockService
this.resolvers = {}

// Support by default dag-pb, dag-cbor, git, and eth-*
this.resolvers = {
get 'dag-pb' () {
const format = require('ipld-dag-pb')
return { resolver: format.resolver, util: format.util }
},
get 'dag-cbor' () {
const format = require('ipld-dag-cbor')
return { resolver: format.resolver, util: format.util }
},
get 'git-raw' () {
const format = require('ipld-git')
return { resolver: format.resolver, util: format.util }
},
get 'bitcoin-block' () {
const format = require('ipld-bitcoin')
return { resolver: format.resolver, util: format.util }
},
get 'eth-account-snapshot' () {
const format = require('ipld-ethereum').ethAccountSnapshot
return { resolver: format.resolver, util: format.util }
},
get 'eth-block' () {
const format = require('ipld-ethereum').ethBlock
return { resolver: format.resolver, util: format.util }
},
get 'eth-block-list' () {
const format = require('ipld-ethereum').ethBlockList
return { resolver: format.resolver, util: format.util }
},
get 'eth-state-trie' () {
const format = require('ipld-ethereum').ethStateTrie
return { resolver: format.resolver, util: format.util }
},
get 'eth-storage-trie' () {
const format = require('ipld-ethereum').ethStorageTrie
return { resolver: format.resolver, util: format.util }
},
get 'eth-tx' () {
const format = require('ipld-ethereum').ethTx
return { resolver: format.resolver, util: format.util }
},
get 'eth-tx-trie' () {
const format = require('ipld-ethereum').ethTxTrie
return { resolver: format.resolver, util: format.util }
},
get 'raw' () {
const format = require('ipld-raw')
return { resolver: format.resolver, util: format.util }
},
get 'zcash-block' () {
const format = require('ipld-zcash')
return { resolver: format.resolver, util: format.util }
}
}

this.support = {}

Expand All @@ -59,59 +100,6 @@ class IPLDResolver {
delete this.resolvers[multicodec]
}
}

// Support by default dag-pb, dag-cbor, git, and eth-*
this.support.add(dagPB.resolver.multicodec,
dagPB.resolver,
dagPB.util)

this.support.add(dagCBOR.resolver.multicodec,
dagCBOR.resolver,
dagCBOR.util)

this.support.add(ipldGit.resolver.multicodec,
ipldGit.resolver,
ipldGit.util)

this.support.add(ipldBitcoin.resolver.multicodec,
ipldBitcoin.resolver,
ipldBitcoin.util)

this.support.add(ipldEthAccountSnapshot.resolver.multicodec,
ipldEthAccountSnapshot.resolver,
ipldEthAccountSnapshot.util)

this.support.add(ipldEthBlock.resolver.multicodec,
ipldEthBlock.resolver,
ipldEthBlock.util)

this.support.add(ipldEthBlockList.resolver.multicodec,
ipldEthBlockList.resolver,
ipldEthBlockList.util)

this.support.add(ipldEthStateTrie.resolver.multicodec,
ipldEthStateTrie.resolver,
ipldEthStateTrie.util)

this.support.add(ipldEthStorageTrie.resolver.multicodec,
ipldEthStorageTrie.resolver,
ipldEthStorageTrie.util)

this.support.add(ipldEthTx.resolver.multicodec,
ipldEthTx.resolver,
ipldEthTx.util)

this.support.add(ipldEthTxTrie.resolver.multicodec,
ipldEthTxTrie.resolver,
ipldEthTxTrie.util)

this.support.add(ipldRaw.resolver.multicodec,
ipldRaw.resolver,
ipldRaw.util)

this.support.add(ipldZcash.resolver.multicodec,
ipldZcash.resolver,
ipldZcash.util)
}

get (cid, path, options, callback) {
Expand Down

0 comments on commit f4a094a

Please sign in to comment.