From a90413a656e974a82a005c9df3f4491f58ad524e Mon Sep 17 00:00:00 2001 From: disksing Date: Mon, 14 Dec 2015 17:06:24 +0800 Subject: [PATCH] kv, table: use minimal kv interfaces --- kv/index_iter.go | 12 ++++++------ kv/kv.go | 12 ++++++------ stmt/stmts/truncate.go | 7 ++++++- table/table.go | 2 +- table/tables/tables.go | 6 +++--- table/tables/tables_test.go | 2 +- util/prefix_helper.go | 16 +++++----------- util/prefix_helper_test.go | 6 ++++-- 8 files changed, 32 insertions(+), 31 deletions(-) diff --git a/kv/index_iter.go b/kv/index_iter.go index f839e1bd18..32a92dc094 100644 --- a/kv/index_iter.go +++ b/kv/index_iter.go @@ -173,12 +173,12 @@ func (c *kvIndex) Create(rm RetrieverMutator, indexedValues []interface{}, h int } // Delete removes the entry for handle h and indexdValues from KV index. -func (c *kvIndex) Delete(rm RetrieverMutator, indexedValues []interface{}, h int64) error { +func (c *kvIndex) Delete(m Mutator, indexedValues []interface{}, h int64) error { key, _, err := c.GenIndexKey(indexedValues, h) if err != nil { return errors.Trace(err) } - err = rm.Delete(key) + err = m.Delete(key) return errors.Trace(err) } @@ -209,12 +209,12 @@ func (c *kvIndex) Drop(rm RetrieverMutator) error { } // Seek searches KV index for the entry with indexedValues. -func (c *kvIndex) Seek(rm RetrieverMutator, indexedValues []interface{}) (iter IndexIterator, hit bool, err error) { +func (c *kvIndex) Seek(r Retriever, indexedValues []interface{}) (iter IndexIterator, hit bool, err error) { key, _, err := c.GenIndexKey(indexedValues, 0) if err != nil { return nil, false, errors.Trace(err) } - it, err := rm.Seek(key) + it, err := r.Seek(key) if err != nil { return nil, false, errors.Trace(err) } @@ -227,9 +227,9 @@ func (c *kvIndex) Seek(rm RetrieverMutator, indexedValues []interface{}) (iter I } // SeekFirst returns an iterator which points to the first entry of the KV index. -func (c *kvIndex) SeekFirst(rm RetrieverMutator) (iter IndexIterator, err error) { +func (c *kvIndex) SeekFirst(r Retriever) (iter IndexIterator, err error) { prefix := []byte(c.prefix) - it, err := rm.Seek(prefix) + it, err := r.Seek(prefix) if err != nil { return nil, errors.Trace(err) } diff --git a/kv/kv.go b/kv/kv.go index f6aeaa1da4..fc918338cb 100644 --- a/kv/kv.go +++ b/kv/kv.go @@ -252,17 +252,17 @@ type IndexIterator interface { // Index is the interface for index data on KV store. type Index interface { // Create supports insert into statement. - Create(rw RetrieverMutator, indexedValues []interface{}, h int64) error + Create(rm RetrieverMutator, indexedValues []interface{}, h int64) error // Delete supports delete from statement. - Delete(rw RetrieverMutator, indexedValues []interface{}, h int64) error + Delete(m Mutator, indexedValues []interface{}, h int64) error // Drop supports drop table, drop index statements. - Drop(rw RetrieverMutator) error + Drop(rm RetrieverMutator) error // Exist supports check index exists or not. - Exist(rw RetrieverMutator, indexedValues []interface{}, h int64) (bool, int64, error) + Exist(rm RetrieverMutator, indexedValues []interface{}, h int64) (bool, int64, error) // GenIndexKey generates an index key. GenIndexKey(indexedValues []interface{}, h int64) (key []byte, distinct bool, err error) // Seek supports where clause. - Seek(rw RetrieverMutator, indexedValues []interface{}) (iter IndexIterator, hit bool, err error) + Seek(r Retriever, indexedValues []interface{}) (iter IndexIterator, hit bool, err error) // SeekFirst supports aggregate min and ascend order by. - SeekFirst(rw RetrieverMutator) (iter IndexIterator, err error) + SeekFirst(r Retriever) (iter IndexIterator, err error) } diff --git a/stmt/stmts/truncate.go b/stmt/stmts/truncate.go index 53da478e5a..1bd1465aa5 100644 --- a/stmt/stmts/truncate.go +++ b/stmt/stmts/truncate.go @@ -18,6 +18,7 @@ package stmts import ( + "github.com/juju/errors" "github.com/pingcap/tidb/context" "github.com/pingcap/tidb/rset" "github.com/pingcap/tidb/stmt" @@ -61,5 +62,9 @@ func (s *TruncateTableStmt) Exec(ctx context.Context) (rset.Recordset, error) { if err != nil { return nil, err } - return nil, t.Truncate(ctx) + txn, err := ctx.GetTxn(false) + if err != nil { + return nil, errors.Trace(err) + } + return nil, t.Truncate(txn) } diff --git a/table/table.go b/table/table.go index cad81f48a8..e09925dae2 100644 --- a/table/table.go +++ b/table/table.go @@ -76,7 +76,7 @@ type Table interface { RecordKey(h int64, col *column.Col) []byte // Truncate truncates the table. - Truncate(ctx context.Context) (err error) + Truncate(rm kv.RetrieverMutator) (err error) // AddRecord inserts a row into the table. Is h is 0, it will alloc an unique id inside. AddRecord(ctx context.Context, r []interface{}, h int64) (recordID int64, err error) diff --git a/table/tables/tables.go b/table/tables/tables.go index 878ba54d65..920636a845 100644 --- a/table/tables/tables.go +++ b/table/tables/tables.go @@ -282,12 +282,12 @@ func (t *Table) FindIndexByColName(name string) *column.IndexedCol { } // Truncate implements table.Table Truncate interface. -func (t *Table) Truncate(ctx context.Context) error { - err := util.DelKeyWithPrefix(ctx, t.KeyPrefix()) +func (t *Table) Truncate(rm kv.RetrieverMutator) error { + err := util.DelKeyWithPrefix(rm, t.KeyPrefix()) if err != nil { return errors.Trace(err) } - return util.DelKeyWithPrefix(ctx, t.IndexPrefix()) + return util.DelKeyWithPrefix(rm, t.IndexPrefix()) } // UpdateRecord implements table.Table UpdateRecord interface. diff --git a/table/tables/tables_test.go b/table/tables/tables_test.go index 2a00816c6b..1a11633637 100644 --- a/table/tables/tables_test.go +++ b/table/tables/tables_test.go @@ -106,7 +106,7 @@ func (ts *testSuite) TestBasic(c *C) { c.Assert(err, IsNil) c.Assert(indexCnt(), Greater, 0) // Make sure index data is also removed after tb.Truncate(). - c.Assert(tb.Truncate(ctx), IsNil) + c.Assert(tb.Truncate(txn), IsNil) c.Assert(indexCnt(), Equals, 0) _, err = ts.se.Execute("drop table test.t") diff --git a/util/prefix_helper.go b/util/prefix_helper.go index f9f45eb8ee..0393f5ec4b 100644 --- a/util/prefix_helper.go +++ b/util/prefix_helper.go @@ -22,13 +22,12 @@ import ( "strings" "github.com/juju/errors" - "github.com/pingcap/tidb/context" "github.com/pingcap/tidb/kv" ) // ScanMetaWithPrefix scans metadata with the prefix. -func ScanMetaWithPrefix(txn kv.Transaction, prefix string, filter func([]byte, []byte) bool) error { - iter, err := txn.Seek([]byte(prefix)) +func ScanMetaWithPrefix(retriever kv.Retriever, prefix string, filter func([]byte, []byte) bool) error { + iter, err := retriever.Seek([]byte(prefix)) if err != nil { return errors.Trace(err) } @@ -56,14 +55,9 @@ func ScanMetaWithPrefix(txn kv.Transaction, prefix string, filter func([]byte, [ } // DelKeyWithPrefix deletes keys with prefix. -func DelKeyWithPrefix(ctx context.Context, prefix string) error { - txn, err := ctx.GetTxn(false) - if err != nil { - return errors.Trace(err) - } - +func DelKeyWithPrefix(rm kv.RetrieverMutator, prefix string) error { var keys []string - iter, err := txn.Seek([]byte(prefix)) + iter, err := rm.Seek([]byte(prefix)) if err != nil { return errors.Trace(err) } @@ -86,7 +80,7 @@ func DelKeyWithPrefix(ctx context.Context, prefix string) error { } for _, key := range keys { - err := txn.Delete([]byte(key)) + err := rm.Delete([]byte(key)) if err != nil { return errors.Trace(err) } diff --git a/util/prefix_helper_test.go b/util/prefix_helper_test.go index 3008e42650..0421bfbad7 100644 --- a/util/prefix_helper_test.go +++ b/util/prefix_helper_test.go @@ -120,12 +120,14 @@ func (c *MockContext) FinishTxn(rollback bool) error { func (s *testPrefixSuite) TestPrefix(c *C) { ctx := &MockContext{10000000, make(map[fmt.Stringer]interface{}), s.s, nil} ctx.fillTxn() - err := DelKeyWithPrefix(ctx, string(encodeInt(ctx.prefix))) + txn, err := ctx.GetTxn(false) + c.Assert(err, IsNil) + err = DelKeyWithPrefix(txn, string(encodeInt(ctx.prefix))) c.Assert(err, IsNil) err = ctx.FinishTxn(false) c.Assert(err, IsNil) - txn, err := s.s.Begin() + txn, err = s.s.Begin() c.Assert(err, IsNil) str := "key100jfowi878230" err = txn.Set([]byte(str), []byte("val32dfaskli384757^*&%^"))