storage.go 2.35 KB
Newer Older
Łukasz Magiera's avatar
Łukasz Magiera committed
1 2 3
package node

import (
tavit ohanian's avatar
tavit ohanian committed
4 5 6
	"gitlab.dms3.io/dms3/go-datastore"
	blockstore "gitlab.dms3.io/dms3/go-dms3-blockstore"
	config "gitlab.dms3.io/dms3/go-dms3-config"
Łukasz Magiera's avatar
Łukasz Magiera committed
7 8
	"go.uber.org/fx"

tavit ohanian's avatar
tavit ohanian committed
9 10 11 12 13
	"gitlab.dms3.io/dms3/go-dms3/core/node/helpers"
	"gitlab.dms3.io/dms3/go-dms3/repo"
	"gitlab.dms3.io/dms3/go-dms3/thirdparty/cidv0v1"
	"gitlab.dms3.io/dms3/go-dms3/thirdparty/verifbs"
	"gitlab.dms3.io/dms3/go-filestore"
Łukasz Magiera's avatar
Łukasz Magiera committed
14 15
)

16
// RepoConfig loads configuration from the repo
Łukasz Magiera's avatar
Łukasz Magiera committed
17 18 19 20
func RepoConfig(repo repo.Repo) (*config.Config, error) {
	return repo.Config()
}

21 22
// Datastore provides the datastore
func Datastore(repo repo.Repo) datastore.Datastore {
Łukasz Magiera's avatar
Łukasz Magiera committed
23 24 25
	return repo.Datastore()
}

26
// BaseBlocks is the lower level blockstore without GC or Filestore layers
Łukasz Magiera's avatar
Łukasz Magiera committed
27 28
type BaseBlocks blockstore.Blockstore

29
// BaseBlockstoreCtor creates cached blockstore backed by the provided datastore
30 31
func BaseBlockstoreCtor(cacheOpts blockstore.CacheOpts, nilRepo bool, hashOnRead bool) func(mctx helpers.MetricsCtx, repo repo.Repo, lc fx.Lifecycle) (bs BaseBlocks, err error) {
	return func(mctx helpers.MetricsCtx, repo repo.Repo, lc fx.Lifecycle) (bs BaseBlocks, err error) {
32
		// hash security
Steven Allen's avatar
Steven Allen committed
33
		bs = blockstore.NewBlockstore(repo.Datastore())
34
		bs = &verifbs.VerifBS{Blockstore: bs}
Łukasz Magiera's avatar
Łukasz Magiera committed
35

36
		if !nilRepo {
37
			bs, err = blockstore.CachedBlockstore(helpers.LifecycleCtx(mctx, lc), bs, cacheOpts)
38 39 40 41
			if err != nil {
				return nil, err
			}
		}
Łukasz Magiera's avatar
Łukasz Magiera committed
42

43 44
		bs = blockstore.NewIdStore(bs)
		bs = cidv0v1.NewBlockstore(bs)
Łukasz Magiera's avatar
Łukasz Magiera committed
45

46
		if hashOnRead { // TODO: review: this is how it was done originally, is there a reason we can't just pass this directly?
47 48 49 50 51
			bs.HashOnRead(true)
		}

		return
	}
Łukasz Magiera's avatar
Łukasz Magiera committed
52 53
}

54
// GcBlockstoreCtor wraps the base blockstore with GC and Filestore layers
55
func GcBlockstoreCtor(bb BaseBlocks) (gclocker blockstore.GCLocker, gcbs blockstore.GCBlockstore, bs blockstore.Blockstore) {
Łukasz Magiera's avatar
Łukasz Magiera committed
56 57 58
	gclocker = blockstore.NewGCLocker()
	gcbs = blockstore.NewGCBlockstore(bb, gclocker)

59 60 61 62 63 64
	bs = gcbs
	return
}

// GcBlockstoreCtor wraps GcBlockstore and adds Filestore support
func FilestoreBlockstoreCtor(repo repo.Repo, bb BaseBlocks) (gclocker blockstore.GCLocker, gcbs blockstore.GCBlockstore, bs blockstore.Blockstore, fstore *filestore.Filestore) {
Steven Allen's avatar
Steven Allen committed
65
	gclocker = blockstore.NewGCLocker()
66 67 68 69 70 71

	// hash security
	fstore = filestore.NewFilestore(bb, repo.FileManager())
	gcbs = blockstore.NewGCBlockstore(fstore, gclocker)
	gcbs = &verifbs.VerifBSGC{GCBlockstore: gcbs}

Łukasz Magiera's avatar
Łukasz Magiera committed
72 73 74
	bs = gcbs
	return
}