mirror of https://github.com/tikv/client-go.git
parent
729d741bfd
commit
843a5378aa
|
|
@ -792,7 +792,7 @@ type memdbNode struct {
|
||||||
right memdbArenaAddr
|
right memdbArenaAddr
|
||||||
vptr memdbArenaAddr
|
vptr memdbArenaAddr
|
||||||
klen uint16
|
klen uint16
|
||||||
flags uint8
|
flags uint16
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *memdbNode) isRed() bool {
|
func (n *memdbNode) isRed() bool {
|
||||||
|
|
@ -814,7 +814,7 @@ func (n *memdbNode) setBlack() {
|
||||||
func (n *memdbNode) getKey() []byte {
|
func (n *memdbNode) getKey() []byte {
|
||||||
var ret []byte
|
var ret []byte
|
||||||
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&ret))
|
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&ret))
|
||||||
hdr.Data = uintptr(unsafe.Pointer(&n.flags)) + 1
|
hdr.Data = uintptr(unsafe.Pointer(&n.flags)) + kv.FlagBytes
|
||||||
hdr.Len = int(n.klen)
|
hdr.Len = int(n.klen)
|
||||||
hdr.Cap = int(n.klen)
|
hdr.Cap = int(n.klen)
|
||||||
return ret
|
return ret
|
||||||
|
|
@ -822,8 +822,8 @@ func (n *memdbNode) getKey() []byte {
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// bit 1 => red, bit 0 => black
|
// bit 1 => red, bit 0 => black
|
||||||
nodeColorBit uint8 = 0x80
|
nodeColorBit uint16 = 0x8000
|
||||||
nodeFlagsMask = ^nodeColorBit
|
nodeFlagsMask = ^nodeColorBit
|
||||||
)
|
)
|
||||||
|
|
||||||
func (n *memdbNode) getKeyFlags() kv.KeyFlags {
|
func (n *memdbNode) getKeyFlags() kv.KeyFlags {
|
||||||
|
|
@ -831,5 +831,5 @@ func (n *memdbNode) getKeyFlags() kv.KeyFlags {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *memdbNode) setKeyFlags(f kv.KeyFlags) {
|
func (n *memdbNode) setKeyFlags(f kv.KeyFlags) {
|
||||||
n.flags = (^nodeFlagsMask & n.flags) | uint8(f)
|
n.flags = (^nodeFlagsMask & n.flags) | uint16(f)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -214,7 +214,7 @@ func (a *nodeAllocator) getNode(addr memdbArenaAddr) *memdbNode {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *nodeAllocator) allocNode(key []byte) (memdbArenaAddr, *memdbNode) {
|
func (a *nodeAllocator) allocNode(key []byte) (memdbArenaAddr, *memdbNode) {
|
||||||
nodeSize := 8*4 + 2 + 1 + len(key)
|
nodeSize := 8*4 + 2 + kv.FlagBytes + len(key)
|
||||||
addr, mem := a.alloc(nodeSize, true)
|
addr, mem := a.alloc(nodeSize, true)
|
||||||
n := (*memdbNode)(unsafe.Pointer(&mem[0]))
|
n := (*memdbNode)(unsafe.Pointer(&mem[0]))
|
||||||
n.vptr = nullAddr
|
n.vptr = nullAddr
|
||||||
|
|
|
||||||
|
|
@ -34,10 +34,13 @@
|
||||||
|
|
||||||
package kv
|
package kv
|
||||||
|
|
||||||
// KeyFlags are metadata associated with key
|
// KeyFlags are metadata associated with key.
|
||||||
type KeyFlags uint8
|
// Notice that the highest bit is used by red black tree, do not set flags on it.
|
||||||
|
type KeyFlags uint16
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
// FlagBytes is the byte size of type KeyFlags
|
||||||
|
FlagBytes = 2
|
||||||
flagPresumeKNE KeyFlags = 1 << iota
|
flagPresumeKNE KeyFlags = 1 << iota
|
||||||
flagKeyLocked
|
flagKeyLocked
|
||||||
flagNeedLocked
|
flagNeedLocked
|
||||||
|
|
@ -45,6 +48,7 @@ const (
|
||||||
flagNeedCheckExists
|
flagNeedCheckExists
|
||||||
flagPrewriteOnly
|
flagPrewriteOnly
|
||||||
flagIgnoredIn2PC
|
flagIgnoredIn2PC
|
||||||
|
flagReadable
|
||||||
|
|
||||||
persistentFlags = flagKeyLocked | flagKeyLockedValExist
|
persistentFlags = flagKeyLocked | flagKeyLockedValExist
|
||||||
)
|
)
|
||||||
|
|
@ -84,6 +88,11 @@ func (f KeyFlags) HasIgnoredIn2PC() bool {
|
||||||
return f&flagIgnoredIn2PC != 0
|
return f&flagIgnoredIn2PC != 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// HasReadable returns whether the in-transaction operations is able to read the key.
|
||||||
|
func (f KeyFlags) HasReadable() bool {
|
||||||
|
return f&flagReadable != 0
|
||||||
|
}
|
||||||
|
|
||||||
// AndPersistent returns the value of current flags&persistentFlags
|
// AndPersistent returns the value of current flags&persistentFlags
|
||||||
func (f KeyFlags) AndPersistent() KeyFlags {
|
func (f KeyFlags) AndPersistent() KeyFlags {
|
||||||
return f & persistentFlags
|
return f & persistentFlags
|
||||||
|
|
@ -115,6 +124,8 @@ func ApplyFlagsOps(origin KeyFlags, ops ...FlagsOp) KeyFlags {
|
||||||
origin |= flagPrewriteOnly
|
origin |= flagPrewriteOnly
|
||||||
case SetIgnoredIn2PC:
|
case SetIgnoredIn2PC:
|
||||||
origin |= flagIgnoredIn2PC
|
origin |= flagIgnoredIn2PC
|
||||||
|
case SetReadable:
|
||||||
|
origin |= flagReadable
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return origin
|
return origin
|
||||||
|
|
@ -147,4 +158,6 @@ const (
|
||||||
SetPrewriteOnly
|
SetPrewriteOnly
|
||||||
// SetIgnoredIn2PC marks the key will be ignored in 2pc.
|
// SetIgnoredIn2PC marks the key will be ignored in 2pc.
|
||||||
SetIgnoredIn2PC
|
SetIgnoredIn2PC
|
||||||
|
// SetReadable marks the key is readable by in-transaction read.
|
||||||
|
SetReadable
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue