Browse Source

Add atreugo-mongo; fix mongodb.dockerfile (#4576)

* [ci fw-only Go/atreugo Go/aah Go/beego Go/chi Go/echo Go/go-std Go/iris Go/gin Go/goji GO/fasthttp] Fix max db conns in iris, atreugo, go-std; add atreugo-gojay, atreugo-easyjson, atreugo-sjson

* add atreugo-mongo

* [ci fw-only Go/atreugo] fix mongodb.dockerfile in toolset/databases

* [ci fw-only Go/atreugo] add dev/null in mongodb.dockerfile in toolset/databases

* [ci fw-only Go/atreugo] fix atreugo-mongo fortune request
chunariov 6 years ago
parent
commit
d29375222c

+ 15 - 0
frameworks/Go/atreugo/atreugo-mongo-prefork.dockerfile

@@ -0,0 +1,15 @@
+FROM golang:1.12
+
+WORKDIR /atreugo
+
+COPY ./src /atreugo
+
+RUN go get github.com/valyala/quicktemplate/qtc
+RUN go get -u github.com/mailru/easyjson/...
+RUN go mod download
+
+RUN go generate ./templates
+RUN easyjson -pkg
+RUN go build -ldflags="-s -w" -o app .
+
+CMD ./app -db mongo -db_connection_string "mongodb://tfb-database" -prefork

+ 15 - 0
frameworks/Go/atreugo/atreugo-mongo.dockerfile

@@ -0,0 +1,15 @@
+FROM golang:1.12
+
+WORKDIR /atreugo
+
+COPY ./src /atreugo
+
+RUN go get github.com/valyala/quicktemplate/qtc
+RUN go get -u github.com/mailru/easyjson/...
+RUN go mod download
+
+RUN go generate ./templates
+RUN easyjson -pkg
+RUN go build -ldflags="-s -w" -o app .
+
+CMD ./app -db mongo -db_connection_string "mongodb://tfb-database"

+ 42 - 0
frameworks/Go/atreugo/benchmark_config.json

@@ -208,6 +208,48 @@
       "display_name": "Atreugo",
       "display_name": "Atreugo",
       "notes": "",
       "notes": "",
       "versus": "go"
       "versus": "go"
+    },
+    "mongo": {
+      "db_url": "/db",
+      "query_url": "/queries?queries=",
+      "fortune_url": "/fortune",
+      "update_url": "/update?queries=",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "MongoDB",
+      "framework": "None",
+      "language": "Go",
+      "flavor": "None",
+      "orm": "Raw",
+      "platform": "None",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "Atreugo",
+      "notes": "",
+      "versus": "go"
+    },
+    "mongo-prefork": {
+      "db_url": "/db",
+      "query_url": "/queries?queries=",
+      "fortune_url": "/fortune",
+      "update_url": "/update?queries=",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "MongoDB",
+      "framework": "None",
+      "language": "Go",
+      "flavor": "None",
+      "orm": "Raw",
+      "platform": "None",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "Atreugo",
+      "notes": "",
+      "versus": "go"
     }
     }
   }]
   }]
 }
 }

+ 9 - 0
frameworks/Go/atreugo/src/go.mod

@@ -3,6 +3,8 @@ module atreugo/src
 require (
 require (
 	github.com/cockroachdb/apd v1.1.0 // indirect
 	github.com/cockroachdb/apd v1.1.0 // indirect
 	github.com/francoispqt/gojay v0.0.0-20190317155732-64fc2cdddab0
 	github.com/francoispqt/gojay v0.0.0-20190317155732-64fc2cdddab0
+	github.com/go-stack/stack v1.8.0 // indirect
+	github.com/golang/snappy v0.0.1 // indirect
 	github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 // indirect
 	github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 // indirect
 	github.com/jackc/pgx v3.3.0+incompatible
 	github.com/jackc/pgx v3.3.0+incompatible
 	github.com/kr/pretty v0.1.0 // indirect
 	github.com/kr/pretty v0.1.0 // indirect
@@ -18,5 +20,12 @@ require (
 	github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51 // indirect
 	github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51 // indirect
 	github.com/tidwall/sjson v1.0.4
 	github.com/tidwall/sjson v1.0.4
 	github.com/valyala/quicktemplate v1.0.2
 	github.com/valyala/quicktemplate v1.0.2
+	github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c // indirect
+	github.com/xdg/stringprep v1.0.0 // indirect
+	go.mongodb.org/mongo-driver v1.0.0
+	golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576 // indirect
+	golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 // indirect
+	golang.org/x/text v0.3.0 // indirect
 	gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
 	gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
+	gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce
 )
 )

+ 19 - 0
frameworks/Go/atreugo/src/go.sum

@@ -6,6 +6,10 @@ github.com/fasthttp/router v0.3.3 h1:pbXxvJqqb4PeNIIS//DwOtimK9hYchl33eoVgeIMNM8
 github.com/fasthttp/router v0.3.3/go.mod h1:lCf2TfRIzs3lgcFUGQah09Wu5BiEHcBPl3vm9QiXNTo=
 github.com/fasthttp/router v0.3.3/go.mod h1:lCf2TfRIzs3lgcFUGQah09Wu5BiEHcBPl3vm9QiXNTo=
 github.com/francoispqt/gojay v0.0.0-20190317155732-64fc2cdddab0 h1:RkFZ/6Hc9fBqO3eSAmlLdBfQc4sEHSOg4P/zQRhJQcE=
 github.com/francoispqt/gojay v0.0.0-20190317155732-64fc2cdddab0 h1:RkFZ/6Hc9fBqO3eSAmlLdBfQc4sEHSOg4P/zQRhJQcE=
 github.com/francoispqt/gojay v0.0.0-20190317155732-64fc2cdddab0/go.mod h1:H8Wgri1Asi1VevY3ySdpIK5+KCpqzToVswNq8g2xZj4=
 github.com/francoispqt/gojay v0.0.0-20190317155732-64fc2cdddab0/go.mod h1:H8Wgri1Asi1VevY3ySdpIK5+KCpqzToVswNq8g2xZj4=
+github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
+github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGUK1IDqRa5lAAvEkZG1LKaCRc=
 github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGUK1IDqRa5lAAvEkZG1LKaCRc=
 github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ=
 github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ=
 github.com/jackc/pgx v3.3.0+incompatible h1:Wa90/+qsITBAPkAZjiByeIGHFcj3Ztu+VzrrIpHjL90=
 github.com/jackc/pgx v3.3.0+incompatible h1:Wa90/+qsITBAPkAZjiByeIGHFcj3Ztu+VzrrIpHjL90=
@@ -63,6 +67,21 @@ github.com/valyala/quicktemplate v1.0.2 h1:ZeVRKan1W/25u5f9ilDo5HWtdxD+QxR10WrZw
 github.com/valyala/quicktemplate v1.0.2/go.mod h1:KZAB+RlYlfNtBUGQMzIrnE8uuNgD2SbUn5CpZyod0sk=
 github.com/valyala/quicktemplate v1.0.2/go.mod h1:KZAB+RlYlfNtBUGQMzIrnE8uuNgD2SbUn5CpZyod0sk=
 github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a h1:0R4NLDRDZX6JcmhJgXi5E4b8Wg84ihbmUKp/GvSPEzc=
 github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a h1:0R4NLDRDZX6JcmhJgXi5E4b8Wg84ihbmUKp/GvSPEzc=
 github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
 github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
+github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c h1:u40Z8hqBAAQyv+vATcGgV0YCnDjqSL7/q/JyPhhJSPk=
+github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
+github.com/xdg/stringprep v1.0.0 h1:d9X0esnoa3dFsV0FG35rAT0RIhYFlPq7MiP+DW89La0=
+github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
+go.mongodb.org/mongo-driver v1.0.0 h1:KxPRDyfB2xXnDE2My8acoOWBQkfv3tz0SaWTRZjJR0c=
+go.mongodb.org/mongo-driver v1.0.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
+golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576 h1:aUX/1G2gFSs4AsJJg2cL3HuoRhCSCz733FE5GUSuaT4=
+golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 h1:bjcUS9ztw9kFmmIxJInhon/0Is3p+EHBKNgquIzo1OI=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce h1:xcEWjVhvbDy+nHP67nPDDpbYrY+ILlfndk4bRioVHaU=
+gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=

+ 2 - 2
frameworks/Go/atreugo/src/main.go

@@ -27,8 +27,8 @@ func main() {
 	bindHost := flag.String("bind", ":8080", "set bind host")
 	bindHost := flag.String("bind", ":8080", "set bind host")
 	prefork := flag.Bool("prefork", false, "use prefork")
 	prefork := flag.Bool("prefork", false, "use prefork")
 	child := flag.Bool("child", false, "is child proc")
 	child := flag.Bool("child", false, "is child proc")
-	jsonEncoder := flag.String("json_encoder", "none", "json encoder: none|easyjson|gojay|sjson")
-	dbDriver := flag.String("db", "none", "db connection driver [values: pgx || none]")
+	jsonEncoder := flag.String("json_encoder", "none", "json encoder: none or easyjson or gojay or sjson")
+	dbDriver := flag.String("db", "none", "db connection driver [values: none or pgx or mongo]")
 	dbConnectionString := flag.String("db_connection_string",
 	dbConnectionString := flag.String("db_connection_string",
 		"host=tfb-database user=benchmarkdbuser password=benchmarkdbpass dbname=hello_world sslmode=disable",
 		"host=tfb-database user=benchmarkdbuser password=benchmarkdbpass dbname=hello_world sslmode=disable",
 		"db connection string")
 		"db connection string")

+ 5 - 0
frameworks/Go/atreugo/src/storage/db.go

@@ -37,6 +37,11 @@ func InitDB(dbDriver, dbConnectionString string, maxConnectionCount int) (DB, er
 		if err != nil {
 		if err != nil {
 			return nil, fmt.Errorf("Error opening postgresql database with pgx driver: %s", err)
 			return nil, fmt.Errorf("Error opening postgresql database with pgx driver: %s", err)
 		}
 		}
+	} else if dbDriver == "mongo" {
+		db, err = NewMongoDB(dbConnectionString, maxConnectionCount)
+		if err != nil {
+			return nil, fmt.Errorf("Error opening postgresql database with official mongo driver: %s", err)
+		}
 	} else if dbDriver == "none" {
 	} else if dbDriver == "none" {
 		db = nil
 		db = nil
 	} else {
 	} else {

+ 162 - 0
frameworks/Go/atreugo/src/storage/mongo.go

@@ -0,0 +1,162 @@
+package storage
+
+import (
+	"atreugo/src/templates"
+	"context"
+	"fmt"
+	"log"
+	"math/rand"
+	"time"
+
+	"go.mongodb.org/mongo-driver/mongo"
+	"go.mongodb.org/mongo-driver/mongo/options"
+	"go.mongodb.org/mongo-driver/mongo/readpref"
+	"gopkg.in/mgo.v2/bson"
+)
+
+// Mongo struct
+type Mongo struct {
+	db       *mongo.Client
+	database *mongo.Database
+	// mongodb collections
+	worlds   *mongo.Collection
+	fortunes *mongo.Collection
+}
+
+// Connect create connection and ping db
+func (m *Mongo) Connect(dbConnectionString string, maxConnectionsInPool int) error {
+	var err error
+
+	opts := options.Client()
+	// opts.SetMaxPoolSize(uint16(maxConnectionsInPool))
+	ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
+	defer cancel()
+	m.db, err = mongo.Connect(ctx, opts.ApplyURI(dbConnectionString))
+	if err != nil {
+		return err
+	}
+
+	ctx, cancel = context.WithTimeout(context.Background(), 2*time.Second)
+	defer cancel()
+	err = m.db.Ping(ctx, readpref.Primary())
+	if err != nil {
+		return err
+	}
+
+	m.database = m.db.Database("hello_world")
+	m.worlds = m.database.Collection("world")
+	m.fortunes = m.database.Collection("fortune")
+
+	return nil
+}
+
+// Close connect to db
+func (m *Mongo) Close() {
+	ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
+	defer cancel()
+	m.db.Disconnect(ctx)
+}
+
+// GetOneRandomWorld return one random World struct
+func (m Mongo) GetOneRandomWorld(w *World) error {
+	var err error
+	queryID := rand.Intn(worldsCount) + 1
+
+	filter := bson.M{"_id": queryID}
+	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+	defer cancel()
+
+	if err = m.worlds.FindOne(ctx, filter).Decode(w); err != nil {
+		err = fmt.Errorf("error scanning world row with ID %d: %s", queryID, err)
+	}
+
+	return err
+}
+
+// UpdateWorlds updates some number of worlds entries, passed as arg
+func (m Mongo) UpdateWorlds(selectedWorlds []World) error {
+	for _, selectedWorld := range selectedWorlds {
+		ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+		defer cancel()
+
+		selectedWorld.RandomNumber = rand.Intn(worldsCount) + 1
+		if _, err := m.worlds.UpdateOne(
+			ctx,
+			bson.M{"_id": selectedWorld.ID},
+			bson.M{"$set": bson.M{"randomNumber": selectedWorld.RandomNumber}},
+		); err != nil {
+			log.Fatalf("Error updating world with id: %s", err.Error())
+		}
+	}
+
+	return nil
+}
+
+// GetFortunes selects all fortunes from table
+func (m Mongo) GetFortunes() ([]templates.Fortune, error) {
+	fortunes := make([]templates.Fortune, 0, 16)
+
+	ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
+	defer cancel()
+
+	cur, err := m.fortunes.Find(ctx, bson.M{})
+	if err != nil {
+		return fortunes, err
+	}
+	defer cur.Close(ctx)
+
+	var fortune templates.Fortune
+	for cur.Next(context.Background()) {
+		err = cur.Decode(&fortune)
+		log.Println(fortune)
+		if err != nil {
+			return fortunes, err
+		}
+		fortunes = append(fortunes, fortune)
+	}
+
+	log.Println(fortunes)
+
+	if err := cur.Err(); err != nil {
+		return fortunes, err
+	}
+
+	return fortunes, nil
+}
+
+// GetFortunesPool selects all fortunes from table
+func (m Mongo) GetFortunesPool() ([]templates.Fortune, error) {
+	fortunes := templates.FortunesPool.Get().([]templates.Fortune)
+
+	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
+	defer cancel()
+
+	cur, err := m.fortunes.Find(ctx, bson.M{})
+	if err != nil {
+		return fortunes, err
+	}
+	defer cur.Close(ctx)
+
+	var fortune templates.Fortune
+	for cur.Next(context.Background()) {
+		err = cur.Decode(&fortune)
+		if err != nil {
+			return fortunes, err
+		}
+		fortunes = append(fortunes, fortune)
+	}
+	if err := cur.Err(); err != nil {
+		return fortunes, err
+	}
+
+	return fortunes, nil
+}
+
+// NewMongoDB creates new connection to postgres db with official mongo driver
+func NewMongoDB(dbConnectionString string, maxConnectionsInPool int) (DB, error) {
+	var m Mongo
+	if err := m.Connect(dbConnectionString, maxConnectionsInPool); err != nil {
+		return nil, err
+	}
+	return &m, nil
+}

+ 3 - 1
toolset/databases/mongodb/mongodb.dockerfile

@@ -2,8 +2,10 @@ FROM ubuntu:16.04
 
 
 COPY ./ ./
 COPY ./ ./
 
 
+RUN apt-get -y update > /dev/null
+RUN apt-get -y install apt-transport-https > /dev/null
 RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5
 RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5
-RUN echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.6 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-3.6.list
+RUN echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.6 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-3.6.list
 RUN apt-get -y update > /dev/null
 RUN apt-get -y update > /dev/null
 RUN apt-get -y install mongodb-org > /dev/null
 RUN apt-get -y install mongodb-org > /dev/null