diff --git a/Makefile b/Makefile index 3c7a57eb7c072afb398f2179e9f50954eed724e6..f65ed5660e4f5ae0d617e705ce463bb6b1e15c3a 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ GOBIN = $(CURDIR)/build/bin GOBUILD = env GO111MODULE=on go build -trimpath -GOTEST = go test ./... -p 1 +GOTEST = go test ./... -p 1 --tags 'mdbx' LATEST_COMMIT ?= $(shell git log -n 1 origin/master --pretty=format:"%H") ifeq ($(LATEST_COMMIT),) @@ -31,19 +31,19 @@ docker-compose: docker-compose up geth: - $(GOBUILD) -o $(GOBIN)/tg -ldflags "-X main.gitCommit=${GIT_COMMIT}" ./cmd/tg + $(GOBUILD) -o $(GOBIN)/tg -tags "mdbx" -ldflags "-X main.gitCommit=${GIT_COMMIT}" ./cmd/tg @echo "Done building." @echo "Run \"$(GOBIN)/tg\" to launch turbo-geth." tg: @echo "Building mdbx" cd ethdb/mdbx/dist/ && make clean && make libmdbx.a && cat config.h - $(GOBUILD) -o $(GOBIN)/tg -ldflags "-X main.gitCommit=${GIT_COMMIT}" ./cmd/tg + $(GOBUILD) -o $(GOBIN)/tg -tags "mdbx" -ldflags "-X main.gitCommit=${GIT_COMMIT}" ./cmd/tg @echo "Done building." @echo "Run \"$(GOBIN)/tg\" to launch turbo-geth." hack: - $(GOBUILD) -o $(GOBIN)/hack ./cmd/hack + $(GOBUILD) -o $(GOBIN)/hack -tags "mdbx" ./cmd/hack @echo "Done building." @echo "Run \"$(GOBIN)/hack\" to launch hack." @@ -102,8 +102,8 @@ headers: @echo "Run \"$(GOBIN)/integration\" to run headers download PoC." db-tools: - $(GOBUILD) -o $(GOBIN)/lmdb_stat github.com/ledgerwatch/lmdb-go/cmd/lmdb_stat - $(GOBUILD) -o $(GOBIN)/lmdb_copy github.com/ledgerwatch/lmdb-go/cmd/lmdb_copy + $(GOBUILD) -o $(GOBIN)/lmdb_stat -tags "mdbx" github.com/ledgerwatch/lmdb-go/cmd/lmdb_stat + $(GOBUILD) -o $(GOBIN)/lmdb_copy -tags "mdbx" github.com/ledgerwatch/lmdb-go/cmd/lmdb_copy cd ethdb/mdbx/dist/ && make tools cp ethdb/mdbx/dist/mdbx_stat $(GOBIN) @@ -125,7 +125,7 @@ test-lmdb: semantics/z3/build/libz3.a TEST_DB=lmdb $(GOTEST) test-mdbx: semantics/z3/build/libz3.a ethdb/mdbx/dist/libmdbx.a - TEST_DB=mdbx $(GOTEST) + TEST_DB=mdbx $(GOTEST_MDBX) lint: lintci @@ -133,19 +133,23 @@ lintci: semantics/z3/build/libz3.a ethdb/mdbx/dist/libmdbx.a @echo "--> Running linter for code diff versus commit $(LATEST_COMMIT)" @./build/bin/golangci-lint run \ --new-from-rev=$(LATEST_COMMIT) \ + --build-tags="mdbx" \ --config ./.golangci/step1.yml \ --exclude "which can be annoying to use" @./build/bin/golangci-lint run \ --new-from-rev=$(LATEST_COMMIT) \ + --build-tags="mdbx" \ --config ./.golangci/step2.yml @./build/bin/golangci-lint run \ --new-from-rev=$(LATEST_COMMIT) \ + --build-tags="mdbx" \ --config ./.golangci/step3.yml @./build/bin/golangci-lint run \ --new-from-rev=$(LATEST_COMMIT) \ + --build-tags="mdbx" \ --config ./.golangci/step4.yml lintci-deps: diff --git a/README.md b/README.md index 3e589b07cee69603b807f73aaed69c45a61afe2e..c9360c3ddc5ef596bd62d2a55e32fc0fb15032b5 100644 --- a/README.md +++ b/README.md @@ -251,42 +251,3 @@ it impacts performance - one of main TG optimisations: "reduce Disk random acces "Blocks Execution stage" still does much random reads - this is reason why it's slowest stage. We do not recommend run multiple genesis syncs on same Disk. If genesis sync passed, then it's fine to run multiple TG on same Disk. - -## 2. `go run` doesn't work `no such file or directory: <>./ethdb/mdbx/dist/libmdbx.a` - -If you are trying to run our binaries with `go run` you might end up with an issue like that - -``` -> go run ./cmd/integration print_stages --chaindata /Volumes/OWC1/ddd-dev/tg/chaindata -go: downloading github.com/spf13/cobra v1.1.1 -# github.com/ethereum/evmc/v7/bindings/go/evmc -host.c:33:20: warning: unused function 'go_exported_functions_type_checks' [-Wunused-function] -# github.com/ledgerwatch/turbo-geth/ethdb/mdbx -clang: error: no such file or directory: '<..>/turbo-geth/ethdb/mdbx/dist/libmdbx.a' -``` - -To fix that, do `make all` and after that `go run` should work successfully. - -``` -> make all -<...> - -> go run ./cmd/integration print_stages --chaindata /Volumes/OWC_DISK_3/ddd-dev/tg/chaindata -# github.com/ethereum/evmc/v7/bindings/go/evmc -host.c:33:20: warning: unused function 'go_exported_functions_type_checks' [-Wunused-function] -Headers 11104855 -BlockHashes 11104855 -Bodies 11098821 -Senders 11098816 -Execution 11098816 -IntermediateHashes 11098816 -HashState 11098816 -AccountHistoryIndex 11098816 -StorageHistoryIndex 11098816 -LogIndex 11098816 -CallTraces 0 -TxLookup 11098816 -TxPool 11098816 -Finish 11098816 -INFO [10-28|09:29:17.907] database closed (LMDB) lmdb=chaindata -``` diff --git a/ethdb/kv_lmdb.go b/ethdb/kv_lmdb.go index 436b87dbf2dc405cb8cdc0ab4349babdd1472241..068a8dbc8b72eb62c156fa218dfc44820e0f9995 100644 --- a/ethdb/kv_lmdb.go +++ b/ethdb/kv_lmdb.go @@ -18,6 +18,8 @@ import ( "github.com/prometheus/tsdb/fileutil" ) +var _ DbCopier = &LmdbKV{} + const ( NonExistingDBI dbutils.DBI = 999_999_999 ) @@ -276,6 +278,10 @@ type LmdbKV struct { func NewLMDB() LmdbOpts { return LmdbOpts{bucketsCfg: DefaultBucketConfigs} } +func (db *LmdbKV) NewDbWithTheSameParameters() *ObjectDatabase { + opts := db.opts + return NewObjectDatabase(NewLMDB().Set(opts).MustOpen()) +} // Close closes db // All transactions must be closed before closing the database. diff --git a/ethdb/kv_mdbx.go b/ethdb/kv_mdbx.go index b98b724d63b5de957728e37025db210e69697279..dd0df46ee880678692c1c3301ef00543284dc9a8 100644 --- a/ethdb/kv_mdbx.go +++ b/ethdb/kv_mdbx.go @@ -1,3 +1,5 @@ +//+build mdbx + package ethdb import ( @@ -17,6 +19,8 @@ import ( "github.com/ledgerwatch/turbo-geth/log" ) +var _ DbCopier = &MdbxKV{} + type MdbxOpts struct { inMem bool exclusive bool @@ -261,6 +265,11 @@ func (db *MdbxKV) Close() { } +func (db *MdbxKV) NewDbWithTheSameParameters() *ObjectDatabase { + opts := db.opts + return NewObjectDatabase(NewMDBX().Set(opts).MustOpen()) +} + func (db *MdbxKV) DiskSize(_ context.Context) (uint64, error) { stats, err := db.env.Stat() if err != nil { diff --git a/ethdb/mdbx/mdbx.go b/ethdb/mdbx/mdbx.go index 1a78b8c59be92f0b59bab1be8b1e7988f3f4665b..b805de93da6db950a5ceecb0eaa2caf9539b53fc 100644 --- a/ethdb/mdbx/mdbx.go +++ b/ethdb/mdbx/mdbx.go @@ -1,3 +1,5 @@ +// +build mdbx + /* Package lmdb provides bindings to the lmdb C API. The package bindings are fairly low level and are designed to provide a minimal interface that prevents diff --git a/ethdb/object_db.go b/ethdb/object_db.go index 3084e6231243a6790c5dd83c2414f979b07d7a18..0961031319461ffcce738178ee65bb55214ef5c3 100644 --- a/ethdb/object_db.go +++ b/ethdb/object_db.go @@ -39,6 +39,10 @@ var ( dbPutTimer = metrics.NewRegisteredTimer("db/put", nil) ) +type DbCopier interface { + NewDbWithTheSameParameters() *ObjectDatabase +} + // ObjectDatabase - is an object-style interface of DB accessing type ObjectDatabase struct { kv KV @@ -321,13 +325,11 @@ func (db *ObjectDatabase) SetKV(kv KV) { func (db *ObjectDatabase) MemCopy() *ObjectDatabase { var mem *ObjectDatabase // Open the db and recover any potential corruptions - switch db.kv.(type) { - case *LmdbKV: - opts := db.kv.(*LmdbKV).opts - mem = NewObjectDatabase(NewLMDB().Set(opts).MustOpen()) - case *MdbxKV: - opts := db.kv.(*MdbxKV).opts - mem = NewObjectDatabase(NewMDBX().Set(opts).MustOpen()) + switch t := db.kv.(type) { + case DbCopier: + mem = t.NewDbWithTheSameParameters() + default: + panic(fmt.Sprintf("MemCopy is not implemented for type %T", t)) } if err := db.kv.View(context.Background(), func(readTx Tx) error { diff --git a/ethdb/object_db_nomdbx.go b/ethdb/object_db_nomdbx.go new file mode 100644 index 0000000000000000000000000000000000000000..62b6ad1a3852deb14695c6fc1ce3c37f7c8550a3 --- /dev/null +++ b/ethdb/object_db_nomdbx.go @@ -0,0 +1,7 @@ +//+build !mdbx + +package ethdb + +func NewMDBX() LmdbOpts { + panic("to use MDBX, compile with -tags 'mdbx'") +}