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

Why does Go allow me to call methods that are not implemented?
http connections stuck in close_wait state
Golang equivalent of npm install -g
glob.func in pprof heap profiles
golang time.Now().Unix() discrepancy between documentation and implementation?
How to get rid of Spaces between logs when using 'logrus' package
Golang - Duration for individual operation
Discrepancies between Go Playground and Go on my machine?
Closing response.Body in Go [duplicate]
Golang struct member storing time not holding value
Quick Go project build with Docker without checking in vendor libraries
Is it possible to define a variable which type is depends on input in Golang
How to get attribute from a interfce instance from struct in Go
How to create a custom hashcode to determine if data has mutated
How to install binaries of dependencies?
golang pass in args (a slice of strings) as “args … interface{}”

Categories

HOME
android
phantom-dsl
jpa
paraview
dns
formal-languages
hessian
fftw
nuget-package
code-coverage
crystal-lang
boto3
nfs
lanczos
flume
32bit-64bit
jxl
stellar.js
pybossa
bitnami
modbus-tcp
red5
jersey-1.0
mapstruct
sencha-touch
pimcore
pylons
angularjs-components
flooding
datastax-enterprise-graph
tpm
errbot
dotspatial
scatter3d
r-grid
catch-unit-test
autolisp
android-gridview
gojs
activexobject
openwhisk
indy10
modalviewcontroller
browser-extension
roblox
sql-server-ce
google-earth-engine
release
password-protection
railstutorial.org
c9.io
odoo-website
attributeerror
chronicle-map
contract
signal-strength
facebook-social-plugins
libgphoto2
serde
reportservice2010
rserve
magic-draw
wpas
arules
pdf-conversion
javafx-css
adafruit
spring-cloud-feign
flex4.6
macaulay2
simevents
mediametadataretriever
boost-serialization
false-sharing
phpgrid
asyncdisplaykit
relativelayout
dynamics-nav-2016
morton-number
binomial-theorem
evolus-pencil
dulwich
alloy-ui
telepat
kubuntu
openbabel
addressing-mode
encryption-asymmetric
ora-00904
parallel-testing
ios8-extension
dsym
menubar
bin
observium
route-provider
intersect
xcode3.2
iboutlet
faye
box2d-iphone
role
saxparseexception
fsevents
mysql-error-1205
exponentiation
svk
zend-rest
zen
tabpanel
qtabbar
wordprocessingml
todos
xslcompiledtransform
pbcopy

Resources

Encrypt Message



code
soft
python
ios
c
html
jquery
cloud
mobile