go


Make a blocking/consistent/predictable reply/request on ScyllaDB via GoCQL


Sometimes when running a command it shows a timeout (gocql: no response received from cassandra within timeout period), for example:
package main
import "fmt"
import "github.com/gocql/gocql"
import "time"
import "log"
func main() {
clust := gocql.NewCluster(`172.17.0.2`) // docker#localhost
clust.Keyspace = `test4`
clust.RetryPolicy = &gocql.SimpleRetryPolicy{NumRetries: 3}
db, err := clust.CreateSession()
defer db.Close()
if err != nil {
log.Fatal(err)
return
}
fmt.Println(`test4: scylladb`)
if err := db.Query(`DROP TABLE test4`).Exec(); err != nil {
log.Println(err)
}
if err := db.Query(`CREATE TABLE test4 (bucket text, k text, v TEXT, PRIMARY KEY(bucket,k))`).Exec(); err != nil {
log.Fatal(err)
return
}
const max = 999
const jump = 40
t := time.Now()
for x := 1; x <= max; x++ {
err = db.Query(fmt.Sprintf(`INSERT INTO test4(bucket,k,v)VALUES('foo','%05d','%05d')`, x, x)).Exec()
if err != nil {
log.Fatal(err)
return
}
if x % 200 == 0 {
fmt.Print(`.`)
}
}
dur := time.Now().Sub(t)
fmt.Printf("INSERT: %v (%.2f ms/op)\n", dur, float64(dur.Nanoseconds()) / 1000000 / max)
t = time.Now()
for x := 1; x <= max; x++ {
err = db.Query(fmt.Sprintf(`UPDATE test4 SET v = '%06d' WHERE bucket = 'foo' AND k = '%05d'`, x, x)).Exec()
if err != nil {
log.Fatal(err)
return
}
if x % 200 == 0 {
fmt.Print(`.`)
}
}
dur = time.Now().Sub(t)
fmt.Printf("UPDATE: %v (%.2f ms/op)\n", dur, float64(dur.Nanoseconds()) / 1000000 / max)
t = time.Now()
ops := int64(0)
for y := 2; y < jump; y++ {
for x := max - 1; x > 0; x -= y {
ops++
iter := db.Query(fmt.Sprintf(`SELECT k, v FROM test4 WHERE bucket = 'foo' AND k >= '%05d' ORDER BY k ASC LIMIT %d`, x, y * y)).Iter()
for {
m := map[string]interface{}{}
if !iter.MapScan(m) {
break
}
}
iter.Close()
if ops % 500 == 0 {
fmt.Print(`.`)
}
}
for x := 1; x < max; x += y {
ops++
iter := db.Query(fmt.Sprintf(`SELECT k, v FROM test4 WHERE bucket = 'foo' AND k <= '%05d' ORDER BY k DESC LIMIT %d`, x, y * y)).Iter()
for {
m := map[string]interface{}{}
if !iter.MapScan(m) {
break
}
}
iter.Close()
if ops % 500 == 0 {
fmt.Print(`.`)
}
}
}
dur = time.Now().Sub(t)
fmt.Printf("SELECT: %v (%.2f ms/op)\n", dur, float64(dur.Nanoseconds()) / 1000000 / float64(ops))
}
It shows inconsistent output:
$ go run scylla.go
test4: scylladb
2017/05/16 12:09:05 gocql: no response received from cassandra within timeout period
2017/05/16 12:09:05 gocql: no response received from cassandra within timeout period
exit status 1
$ go run scylla.go
test4: scylladb
....INSERT: 188.277521ms (0.19 ms/op)
....UPDATE: 150.403282ms (0.15 ms/op)
.............SELECT: 5.357779756s (0.82 ms/op)
$ go run scylla.go
test4: scylladb
2017/05/16 12:09:50 gocql: no response received from cassandra within timeout period
....INSERT: 142.91132ms (0.14 ms/op)
....UPDATE: 144.272872ms (0.14 ms/op)
.............SELECT: 5.268130283s (0.81 ms/op)
$ go run scylla.go
test4: scylladb
2017/05/16 12:10:00 gocql: no response received from cassandra within timeout period
2017/05/16 12:10:00 gocql: no response received from cassandra within timeout period
exit status 1
$ go run scylla.go
test4: scylladb
....INSERT: 184.402052ms (0.18 ms/op)
....UPDATE: 158.200184ms (0.16 ms/op)
.............SELECT: 5.345212835s (0.82 ms/op)
How to make it consistent? I need to be sure if a command completed successfully.. Or should I loop the DROP TABLE/CREATE TABLE command manually?

Related Links

Casting a int to a pointer?
Open PE files with timeout in golang
VSCode/GoLint: Error for glide/vendor packages
Cant find package from $GOROOT and $GOPATH
Structuring local imports without github in golang
How to make executable open in a browser in Golang? [duplicate]
gRPC - GoLang - Stackdriver tracer
Passing arguments from GOLANG to CROSSTAB WHERE CLAUSE of Postgresql
Hyperledger Fabric 1.0 marbles demo, Error calling orderer 'localhost:7050': broadcast response is not success
Copy exec.Command output to file as the buffer receives data
Does Context.Done() unblock when context variable goes out of scope in golang?
Error parsing time in Go with variable number of microseconds
'Cannot create temporary ouput file' while running tests
Go: Bank Transfer Simulation using Goroutines
continue executing loop when exception happens
Subtypes Supertypes in go

Categories

HOME
oracle12c
delphi-7
ng-idle
wakanda
google-spreadsheet
angular2-material
ms-access-2016
carousel
interpolation
barcode
jquery-ui-sortable
owin
endeca
distribution
emoji
event-sourcing
package.json
google-data-studio
shortest-path
surveymonkey
stackexchange
nstimer
tizen-tv
twiml
sqsh
autodesk-designautomation
panoramas
kudu
powershell-ise
paragraph
left-join
sql-server-2000
glib
spring-security4
jett
dynamic-jasper
servicestack-text
reason
salesforce-communities
android-augmented-reality
z-notation
tasm
chronicle-map
ssrs-2014
apache-spark-dataset
facebook-social-plugins
servermanager
geotiff
activeperl
manova
reshape
trigger.io
cmp
cd-burning
branch-prediction
rocks
ziparchive
signalr.client
wso2developerstudio
html-to-pdf
cortex-m
aspen
highland.js
xvim
intel-c++
google-books
video-player
eoferror
rdflib
cwrsync
apache-spark-1.3
angular-gettext
addressing-mode
universal-image-loader
named-parameters
mintty
parallel-testing
wxformbuilder
dot42
menubar
rfc5322
android-usb
scrypt
cmmi
facebook-timeline
cardreader
virtual-pc
joomla3.1
stress
apache-commons-dbutils
xcelsius
uipagecontrol
massive
http-daemon
globals
dot-emacs
binomial-heap
wordprocessingml
sun
xpsdocument
product-management
appliance
wspbuilder

Resources

Encrypt Message



code
soft
python
ios
c
html
jquery
cloud
mobile