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

Run middleware after Gorilla mux handling
How to read different values in golang [on hold]
Govendor tool takes a lot of time to fetch a single dependency
Scanln in Golang doesn't accept whitespace
Dynamic FlatBuffers delimiter
Golang setup in vim
Golang web server not serving static files
Same method on different types and return different type value in Go
Slow build time [on hold]
How to understand the “Incorrect synchronization” samples in Go Memory Model
go error on doing HTTP requests
Testing Go http.Request.FormFile?
Different execution under Windows and Linux with Go
deadlock with double channel
How to make Go append work inside a range loop
Allow to run from Sunday to Friday?

Categories

HOME
devise
pclxl
gradient
access
bitbucket-api
web-hosting
visual-studio-emulator
data-visualization
crystal-reports-2013
character
bing-maps
sendgrid-api-v3
fabric.io
drop-down-menu
dkim
angular-dart
gource
selectize.js
symbol
do-while
gruntfile
event-sourcing
aws-sdk
selinux
windows-xp
simpleitk
spring-async
jquery-callback
moses
google-cloud-print
interbase
bulletphysics
appirater
handler
winpe
aws-codecommit
dst
gojs
twos-complement
activexobject
hibernate-search
modalviewcontroller
reverse
slacktextviewcontroller
watchman
dm-script
typesafe-config
comparison-operators
glm-math
oracle-service-bus
congestion-control
file-sharing
strftime
monkey-testing
servermanager
mesosphere
httrack
dotnet-httpclient
spring-integration-sftp
identification
universal-analytics
rxtx
restore
gets
cronexpression
flex-monkey
latin
signalr.client
windows-azure-queues
synonym
stream-processing
deep
cda
invoke-sqlcmd
httpruntime.cache
concept-insights
asyncdisplaykit
sciruby
canalyzer
iced-coffeescript
finalbuilder
vacuum
haskell-warp
baasbox
kubuntu
mass-assignment
infosphere-spl
variadic-templates
dbaccess
formview
jjaql
dct
fpdi
cfcache
gae-quotas
qscrollarea
getopt
gd-graph
mysql-error-1044
breakout
mysql-error-2013
idn
qi4j
catransform3d
cloudfiles
openfaces
scrollbars
cuda.net
escrow
mathematical-typesetting
pnrp
idatareader

Resources

Encrypt Message



code
soft
python
ios
c
html
jquery
cloud
mobile