From 0c1d8e04089de11c3829312864c2e9313dc37ba1 Mon Sep 17 00:00:00 2001 From: Naman Jain Date: Thu, 4 Mar 2021 16:24:09 +0530 Subject: [PATCH] fix(txn): remove redundant keys/preds while merging txn context (#142) TxnContext.Keys is used as a map. This PR removes the redundant keys while merging the transaction context. --- acl_test.go | 15 +++++++-------- txn.go | 24 ++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/acl_test.go b/acl_test.go index 37f4afd..73f6742 100644 --- a/acl_test.go +++ b/acl_test.go @@ -29,14 +29,13 @@ import ( ) var ( - grootpassword = "password" - username = "alice" - userpassword = "alicepassword" - readpred = "predicate_to_read" - writepred = "predicate_to_write" - modifypred = "predicate_to_modify" - unusedgroup = "unused" - devgroup = "dev" + username = "alice" + userpassword = "alicepassword" + readpred = "predicate_to_read" + writepred = "predicate_to_write" + modifypred = "predicate_to_modify" + unusedgroup = "unused" + devgroup = "dev" dgraphAddress = "127.0.0.1:9180" adminUrl = "http://127.0.0.1:8180/admin" diff --git a/txn.go b/txn.go index 82655b5..84c997c 100644 --- a/txn.go +++ b/txn.go @@ -48,6 +48,9 @@ var ( type Txn struct { context *api.TxnContext + keys map[string]struct{} + preds map[string]struct{} + finished bool mutated bool readOnly bool @@ -63,6 +66,8 @@ func (d *Dgraph) NewTxn() *Txn { dg: d, dc: d.anyClient(), context: &api.TxnContext{}, + keys: make(map[string]struct{}), + preds: make(map[string]struct{}), } } @@ -266,8 +271,13 @@ func (txn *Txn) mergeContext(src *api.TxnContext) error { if txn.context.StartTs != src.StartTs { return errors.New("StartTs mismatch") } - txn.context.Keys = append(txn.context.Keys, src.Keys...) - txn.context.Preds = append(txn.context.Preds, src.Preds...) + + for _, key := range src.Keys { + txn.keys[key] = struct{}{} + } + for _, pred := range src.Keys { + txn.preds[pred] = struct{}{} + } return nil } @@ -280,6 +290,16 @@ func (txn *Txn) commitOrAbort(ctx context.Context) error { return nil } + txn.context.Keys = make([]string, 0, len(txn.keys)) + for key := range txn.keys { + txn.context.Keys = append(txn.context.Keys, key) + } + + txn.context.Preds = make([]string, 0, len(txn.preds)) + for pred := range txn.preds { + txn.context.Preds = append(txn.context.Preds, pred) + } + ctx = txn.dg.getContext(ctx) _, err := txn.dc.CommitOrAbort(ctx, txn.context)