diff --git a/Dockerfile b/Dockerfile index 836d638..9c3b873 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,6 +3,12 @@ FROM golang:1.18-alpine as builder ADD . /koinos-block-store WORKDIR /koinos-block-store +RUN apk update && \ + apk add \ + gcc \ + musl-dev \ + linux-headers + RUN go get ./... && \ go build -o koinos_block_store cmd/koinos-block-store/main.go diff --git a/cmd/koinos-block-store/main.go b/cmd/koinos-block-store/main.go index 1a46ff6..9a667ef 100644 --- a/cmd/koinos-block-store/main.go +++ b/cmd/koinos-block-store/main.go @@ -1,11 +1,13 @@ package main import ( + "context" "encoding/hex" "fmt" "os" "os/signal" "path" + "runtime" "syscall" "github.com/dgraph-io/badger/v3" @@ -28,6 +30,7 @@ const ( instanceIDOption = "instance-id" logLevelOption = "log-level" resetOption = "reset" + jobsOption = "jobs" ) const ( @@ -46,36 +49,54 @@ const ( ) func main() { - var baseDir = flag.StringP(basedirOption, "d", basedirDefault, "the base directory") - var amqp = flag.StringP(amqpOption, "a", "", "AMQP server URL") - var reset = flag.BoolP(resetOption, "r", resetDefault, "reset the database") + jobsDefault := runtime.NumCPU() + + baseDirPtr := flag.StringP(basedirOption, "d", basedirDefault, "Koinos base directory") + amqp := flag.StringP(amqpOption, "a", "", "AMQP server URL") + reset := flag.BoolP(resetOption, "r", resetDefault, "Reset the database") instanceID := flag.StringP(instanceIDOption, "i", instanceIDDefault, "The instance ID to identify this service") logLevel := flag.StringP(logLevelOption, "v", logLevelDefault, "The log filtering level (debug, info, warn, error)") + jobs := flag.IntP(jobsOption, "j", jobsDefault, "Number of RPC jobs to run") flag.Parse() - *baseDir = util.InitBaseDir(*baseDir) + baseDir, err := util.InitBaseDir(*baseDirPtr) + if err != nil { + fmt.Printf("Could not initialize base directory '%v'\n", baseDir) + os.Exit(1) + } - yamlConfig := util.InitYamlConfig(*baseDir) + yamlConfig := util.InitYamlConfig(baseDir) *amqp = util.GetStringOption(amqpOption, amqpDefault, *amqp, yamlConfig.BlockStore, yamlConfig.Global) *logLevel = util.GetStringOption(logLevelOption, logLevelDefault, *logLevel, yamlConfig.BlockStore, yamlConfig.Global) *instanceID = util.GetStringOption(instanceIDOption, util.GenerateBase58ID(5), *instanceID, yamlConfig.BlockStore, yamlConfig.Global) *reset = util.GetBoolOption(resetOption, resetDefault, *reset, yamlConfig.BlockStore, yamlConfig.Global) + *jobs = util.GetIntOption(jobsOption, jobsDefault, *jobs, yamlConfig.BlockStore, yamlConfig.Global) appID := fmt.Sprintf("%s.%s", appName, *instanceID) // Initialize logger - logFilename := path.Join(util.GetAppDir(*baseDir, appName), logDir, "block_store.log") - err := log.InitLogger(*logLevel, false, logFilename, appID) + logFilename := path.Join(util.GetAppDir(baseDir, appName), logDir, "block_store.log") + err = log.InitLogger(*logLevel, false, logFilename, appID) if err != nil { fmt.Printf("Invalid log-level: %s. Please choose one of: debug, info, warn, error", *logLevel) os.Exit(1) } + if *jobs < 1 { + log.Errorf("Option '%v' must be greater than 0 (was %v)", jobsOption, *jobs) + os.Exit(1) + } + // Costruct the db directory and ensure it exists - dbDir := path.Join(util.GetAppDir((*baseDir), appName), "db") - util.EnsureDir(dbDir) + dbDir := path.Join(util.GetAppDir((baseDir), appName), "db") + err = util.EnsureDir(dbDir) + if err != nil { + log.Errorf("Could not create database folder %v", dbDir) + os.Exit(1) + } + log.Infof("Opening database at %s", dbDir) var opts = badger.DefaultOptions(dbDir) @@ -97,9 +118,7 @@ func main() { } } - defer backend.Close() - - requestHandler := koinosmq.NewRequestHandler(*amqp) + requestHandler := koinosmq.NewRequestHandler(*amqp, uint(*jobs)) handler := bstore.RequestHandler{Backend: backend} @@ -167,11 +186,14 @@ func main() { } }) - requestHandler.Start() + ctx, ctxCancel := context.WithCancel(context.Background()) + requestHandler.Start(ctx) // Wait for a SIGINT or SIGTERM signal ch := make(chan os.Signal, 1) signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM) <-ch log.Info("Shutting down node...") + ctxCancel() + backend.Close() } diff --git a/go.mod b/go.mod index 505408f..dfc8794 100644 --- a/go.mod +++ b/go.mod @@ -6,10 +6,10 @@ require ( github.com/dgraph-io/badger v1.6.2 github.com/dgraph-io/badger/v3 v3.2103.2 github.com/koinos/koinos-log-golang v0.0.0-20210621202301-3310a8e5866b - github.com/koinos/koinos-mq-golang v0.0.0-20220824200525-0230763309f3 + github.com/koinos/koinos-mq-golang v0.0.0-20220906183403-59a5f98d6aab github.com/koinos/koinos-proto-golang v0.3.1-0.20220802205931-319ee3a6b490 - github.com/koinos/koinos-util-golang v0.0.0-20211019222021-3b7f67a3119d - github.com/multiformats/go-multihash v0.0.16 + github.com/koinos/koinos-util-golang v0.0.0-20220831225923-5ba6e0d4e7b9 + github.com/multiformats/go-multihash v0.1.0 github.com/spf13/pflag v1.0.3 go.uber.org/zap v1.17.0 google.golang.org/protobuf v1.27.1 diff --git a/go.sum b/go.sum index d6d0d1b..0a15cc3 100644 --- a/go.sum +++ b/go.sum @@ -62,6 +62,7 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= +github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= @@ -122,6 +123,7 @@ github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7j github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ethereum/go-ethereum v1.10.8 h1:0UP5WUR8hh46ffbjJV7PK499+uGEyasRIfffS0vy06o= github.com/ethereum/go-ethereum v1.10.8/go.mod h1:pJNuIUYfX5+JKzSD/BTdNsvJSZ1TJqmz0dVyXMAbf6M= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= @@ -253,6 +255,8 @@ github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDK github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.0.4 h1:g0I61F2K2DjRHz1cnxlkNSBIaePVoJIjjnHui8QHbiw= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/koinos/koinos-log-golang v0.0.0-20210413225320-69e5d4a4c6c2/go.mod h1:q2b3FfAP6tWYt5Kl13hM6Du3kxGXAr0HnC4gJja4G6U= @@ -262,6 +266,18 @@ github.com/koinos/koinos-mq-golang v0.0.0-20211026183607-441fb7106dd3 h1:vr3BM+X github.com/koinos/koinos-mq-golang v0.0.0-20211026183607-441fb7106dd3/go.mod h1:EFk+fuUL5ezbaWsGJ2U0KlzbgkflwRv96az8dEVe16I= github.com/koinos/koinos-mq-golang v0.0.0-20220824200525-0230763309f3 h1:Ii0VZ29D7IL6DRuw/ySvj4KwLLD/pzRmgUUa9XpKJy0= github.com/koinos/koinos-mq-golang v0.0.0-20220824200525-0230763309f3/go.mod h1:EFk+fuUL5ezbaWsGJ2U0KlzbgkflwRv96az8dEVe16I= +github.com/koinos/koinos-mq-golang v0.0.0-20220830164448-bba18599c018 h1:NmPS7s+jFw5bGZrMcH4Hc2k9GoaqTFmKI6JH+YRltsk= +github.com/koinos/koinos-mq-golang v0.0.0-20220830164448-bba18599c018/go.mod h1:EFk+fuUL5ezbaWsGJ2U0KlzbgkflwRv96az8dEVe16I= +github.com/koinos/koinos-mq-golang v0.0.0-20220830221500-c6890e12f9f0 h1:S1yPEj4Zv/uNPLRDPQJN0AAOqMaT9LljP1wqTa2EfsI= +github.com/koinos/koinos-mq-golang v0.0.0-20220830221500-c6890e12f9f0/go.mod h1:EFk+fuUL5ezbaWsGJ2U0KlzbgkflwRv96az8dEVe16I= +github.com/koinos/koinos-mq-golang v0.0.0-20220830223502-a7e8feb2955b h1:vsyukRmMPU879krPQteh1xBQc7rOkw7ZFLSsOSHCoqU= +github.com/koinos/koinos-mq-golang v0.0.0-20220830223502-a7e8feb2955b/go.mod h1:EFk+fuUL5ezbaWsGJ2U0KlzbgkflwRv96az8dEVe16I= +github.com/koinos/koinos-mq-golang v0.0.0-20220830225000-227631db90f5 h1:OiaIKsRPSGj7cY9MhDhDMwnf5tNbSmbYD03kxXV2j/M= +github.com/koinos/koinos-mq-golang v0.0.0-20220830225000-227631db90f5/go.mod h1:EFk+fuUL5ezbaWsGJ2U0KlzbgkflwRv96az8dEVe16I= +github.com/koinos/koinos-mq-golang v0.0.0-20220902182300-4b1c1c31e493 h1:nN/5VWvN8rccbG6uJzasiD1FQ0bkPN6LT0FR++PwcwM= +github.com/koinos/koinos-mq-golang v0.0.0-20220902182300-4b1c1c31e493/go.mod h1:EFk+fuUL5ezbaWsGJ2U0KlzbgkflwRv96az8dEVe16I= +github.com/koinos/koinos-mq-golang v0.0.0-20220906183403-59a5f98d6aab h1:CAmBc4qpeIB+GoRURF/WBUYLstUmvg+MVVMvxRill4U= +github.com/koinos/koinos-mq-golang v0.0.0-20220906183403-59a5f98d6aab/go.mod h1:EFk+fuUL5ezbaWsGJ2U0KlzbgkflwRv96az8dEVe16I= github.com/koinos/koinos-proto-golang v0.0.0-20210817202730-232f9d89dd0b/go.mod h1:X0JDk9LJhh3zXCTtKc0OLL9zUGbVk1HIGPKi/WLpFuE= github.com/koinos/koinos-proto-golang v0.2.1-0.20220203004644-1d7ca7362b45 h1:9zEZq0YOBR9UuHRLOBiOHGojTsLr/ZLjZq39BJUzqzw= github.com/koinos/koinos-proto-golang v0.2.1-0.20220203004644-1d7ca7362b45/go.mod h1:ZonOOdmZcuEbRdOqqdfYRA2I4szYHy5aKzUveMWXBog= @@ -269,10 +285,15 @@ github.com/koinos/koinos-proto-golang v0.2.1-0.20220224180227-6fbc5fe4a89a h1:3H github.com/koinos/koinos-proto-golang v0.2.1-0.20220224180227-6fbc5fe4a89a/go.mod h1:ZonOOdmZcuEbRdOqqdfYRA2I4szYHy5aKzUveMWXBog= github.com/koinos/koinos-proto-golang v0.2.1-0.20220301021801-03b3d905260d h1:ATQlbm+WXmeju484GXYEgjJOcfPz8c6YErpW8LwgS+U= github.com/koinos/koinos-proto-golang v0.2.1-0.20220301021801-03b3d905260d/go.mod h1:ZonOOdmZcuEbRdOqqdfYRA2I4szYHy5aKzUveMWXBog= +github.com/koinos/koinos-proto-golang v0.3.1-0.20220708180354-16481ac5469c/go.mod h1:ZonOOdmZcuEbRdOqqdfYRA2I4szYHy5aKzUveMWXBog= github.com/koinos/koinos-proto-golang v0.3.1-0.20220802205931-319ee3a6b490 h1:rs9mgcd3pvVviWDUey8kcpHPcUaWzbZfn/rK8TN3VZc= github.com/koinos/koinos-proto-golang v0.3.1-0.20220802205931-319ee3a6b490/go.mod h1:ZonOOdmZcuEbRdOqqdfYRA2I4szYHy5aKzUveMWXBog= github.com/koinos/koinos-util-golang v0.0.0-20211019222021-3b7f67a3119d h1:fyqSn5gSG74YtQwOX0rB71dagpmDZX4bFeBBmYmkJHg= github.com/koinos/koinos-util-golang v0.0.0-20211019222021-3b7f67a3119d/go.mod h1:3NWXUf07ZUBOBYzU7r+aG34kA2bI0Y/kLXaZyF1Y7q4= +github.com/koinos/koinos-util-golang v0.0.0-20220830161833-76700a84be69 h1:ub2YMFWL1JZr4iXvIbC/grIqRHRqNoMEa1zQHThNwRE= +github.com/koinos/koinos-util-golang v0.0.0-20220830161833-76700a84be69/go.mod h1:5Va8lbIAGD886tlNL1AT5LB3ND7uvmivKODQ2p90fqI= +github.com/koinos/koinos-util-golang v0.0.0-20220831225923-5ba6e0d4e7b9 h1:z53D8ApsfM85lpC7HBoQudL++KVRse2FP6RrE6A1ExA= +github.com/koinos/koinos-util-golang v0.0.0-20220831225923-5ba6e0d4e7b9/go.mod h1:5Va8lbIAGD886tlNL1AT5LB3ND7uvmivKODQ2p90fqI= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -318,6 +339,8 @@ github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjW github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/multiformats/go-multihash v0.0.16 h1:D2qsyy1WVculJbGv69pWmQ36ehxFoA5NiIUr1OEs6qI= github.com/multiformats/go-multihash v0.0.16/go.mod h1:zhfEIgVnB/rPMfxgFw15ZmGoNaKyNUIE4IWHG/kC+Ag= +github.com/multiformats/go-multihash v0.1.0 h1:CgAgwqk3//SVEw3T+6DqI4mWMyRuDwZtOWcJT0q9+EA= +github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -331,6 +354,7 @@ github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -370,6 +394,8 @@ github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfP github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= +github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= @@ -410,6 +436,8 @@ github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+ github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/ybbus/jsonrpc/v2 v2.1.6/go.mod h1:rIuG1+ORoiqocf9xs/v+ecaAVeo3zcZHQgInyKFMeg0= +github.com/ybbus/jsonrpc/v3 v3.1.1/go.mod h1:NJ8vURh8jndl+F1dVplHr538HNnwnV89sEhcDsZL/bw= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -680,5 +708,7 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +lukechampine.com/blake3 v1.1.6 h1:H3cROdztr7RCfoaTpGZFQsrqvweFLrqS73j7L7cmR5c= +lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/internal/bstore/reqhandler.go b/internal/bstore/reqhandler.go index 60b6aad..e2e9e67 100644 --- a/internal/bstore/reqhandler.go +++ b/internal/bstore/reqhandler.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "math/bits" + "sync" log "github.com/koinos/koinos-log-golang" "github.com/koinos/koinos-proto-golang/koinos" @@ -20,6 +21,8 @@ const ( // RequestHandler contains a backend object and handles requests type RequestHandler struct { Backend BlockStoreBackend + + lock sync.RWMutex } // ReservedReqError is an error type that is thrown when a reserved request is passed to the request handler @@ -510,6 +513,9 @@ func (handler *RequestHandler) HandleRequest(req *block_store.BlockStoreRequest) switch v := req.Request.(type) { case *block_store.BlockStoreRequest_GetBlocksById: var result *block_store.GetBlocksByIdResponse + handler.lock.RLock() + defer handler.lock.RUnlock() + result, err = handler.GetBlocksByID(v.GetBlocksById) if err == nil { respVal := block_store.BlockStoreResponse_GetBlocksById{GetBlocksById: result} @@ -517,6 +523,9 @@ func (handler *RequestHandler) HandleRequest(req *block_store.BlockStoreRequest) } case *block_store.BlockStoreRequest_GetBlocksByHeight: var result *block_store.GetBlocksByHeightResponse + handler.lock.RLock() + defer handler.lock.RUnlock() + result, err = handler.GetBlocksByHeight(v.GetBlocksByHeight) if err == nil { respVal := block_store.BlockStoreResponse_GetBlocksByHeight{GetBlocksByHeight: result} @@ -524,6 +533,9 @@ func (handler *RequestHandler) HandleRequest(req *block_store.BlockStoreRequest) } case *block_store.BlockStoreRequest_AddBlock: var result *block_store.AddBlockResponse + handler.lock.Lock() + defer handler.lock.Unlock() + result, err = handler.AddBlock(v.AddBlock) if err == nil { respVal := block_store.BlockStoreResponse_AddBlock{AddBlock: result} @@ -531,6 +543,9 @@ func (handler *RequestHandler) HandleRequest(req *block_store.BlockStoreRequest) } case *block_store.BlockStoreRequest_GetHighestBlock: var result *block_store.GetHighestBlockResponse + handler.lock.RLock() + defer handler.lock.RUnlock() + result, err = handler.GetHighestBlock(v.GetHighestBlock) if err == nil { respVal := block_store.BlockStoreResponse_GetHighestBlock{GetHighestBlock: result} diff --git a/internal/bstore/reqhandler_test.go b/internal/bstore/reqhandler_test.go index 0cd1160..ecfab95 100644 --- a/internal/bstore/reqhandler_test.go +++ b/internal/bstore/reqhandler_test.go @@ -167,7 +167,7 @@ func BuildTestTree(t *testing.T, handler *RequestHandler, bt *BlockTree) { func addBlocksTestImpl(t *testing.T, backendType int, addZeroBlock bool) { b := NewBackend(backendType) - handler := RequestHandler{b} + handler := RequestHandler{Backend: b} // A compact notation of the tree of forks we want to create for the test // @@ -431,7 +431,7 @@ func testGetBlocksByIDImpl(t *testing.T, returnBlock bool, returnReceipt bool) { } b := NewMapBackend() - handler := RequestHandler{b} + handler := RequestHandler{Backend: b} mbt := NewMockBlockTree(tree) for _, mb := range mbt.ByNum { mb.Receipt = []byte(fmt.Sprintf("Receipt for block %d", mb.Num)) @@ -622,7 +622,7 @@ func TestGetHighestBlock(t *testing.T) { topology := koinos.BlockTopology{Id: blockID, Previous: previousID, Height: height} b := NewBackend(bType) - handler := RequestHandler{b} + handler := RequestHandler{Backend: b} iReq := block_store.GetHighestBlockRequest{} ghbReq := block_store.BlockStoreRequest_GetHighestBlock{GetHighestBlock: &iReq}