Merge pull request #739 from pingcap/disksing/minimal-interfaces
kv, table: use minimal kv interfaces
This commit is contained in:
@ -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)
|
||||
}
|
||||
|
||||
12
kv/kv.go
12
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)
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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")
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -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^*&%^"))
|
||||
|
||||
Reference in New Issue
Block a user