Explorar o código

conn: add skip preapre for control queries (#1412)

Control queries only ever do reads on system tables but AWS MCS treats a
prepare as write which it blocks on system tables. We can avoid doing
preapres on selects as long as we get the result metadata.
Chris Bannister %!s(int64=5) %!d(string=hai) anos
pai
achega
cd4b606dd2
Modificáronse 2 ficheiros con 7 adicións e 1 borrados
  1. 3 1
      conn.go
  2. 4 0
      session.go

+ 3 - 1
conn.go

@@ -1086,7 +1086,7 @@ func (c *Conn) executeQuery(ctx context.Context, qry *Query) *Iter {
 		info  *preparedStatment
 	)
 
-	if qry.shouldPrepare() {
+	if !qry.skipPrepare && qry.shouldPrepare() {
 		// Prepare all DML queries. Other queries can not be prepared.
 		var err error
 		info, err = c.prepareStatement(ctx, qry.stmt, qry.trace)
@@ -1361,6 +1361,8 @@ func (c *Conn) executeBatch(ctx context.Context, batch *Batch) *Iter {
 func (c *Conn) query(ctx context.Context, statement string, values ...interface{}) (iter *Iter) {
 	q := c.session.Query(statement, values...).Consistency(One)
 	q.trace = nil
+	q.skipPrepare = true
+	q.disableSkipMetadata = true
 	return c.executeQuery(ctx, q)
 }
 

+ 4 - 0
session.go

@@ -809,6 +809,10 @@ type Query struct {
 
 	// getKeyspace is field so that it can be overriden in tests
 	getKeyspace func() string
+
+	// used by control conn queries to prevent triggering a write to systems
+	// tables in AWS MCS see
+	skipPrepare bool
 }
 
 func (q *Query) defaultsFromSession() {