github.com/matrixorigin/matrixone@v0.7.0/pkg/vm/engine/tae/tables/updates/delete.go (about) 1 // Copyright 2021 Matrix Origin 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package updates 16 17 import ( 18 "encoding/binary" 19 "fmt" 20 "io" 21 22 "github.com/matrixorigin/matrixone/pkg/container/types" 23 24 "github.com/RoaringBitmap/roaring" 25 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/common" 26 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/iface/handle" 27 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/iface/txnif" 28 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/txn/txnbase" 29 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/wal" 30 ) 31 32 type NodeType int8 33 34 const ( 35 NT_Normal NodeType = iota 36 NT_Merge 37 ) 38 39 func compareDeleteNode(va, vb txnif.MVCCNode) int { 40 a := va.(*DeleteNode) 41 b := vb.(*DeleteNode) 42 return a.TxnMVCCNode.Compare2(b.TxnMVCCNode) 43 } 44 45 type DeleteNode struct { 46 *common.GenericDLNode[txnif.MVCCNode] 47 *txnbase.TxnMVCCNode 48 chain *DeleteChain 49 logIndexes []*wal.Index 50 mask *roaring.Bitmap 51 nt NodeType 52 id *common.ID 53 dt handle.DeleteType 54 viewNodes map[uint32]*common.GenericDLNode[txnif.MVCCNode] 55 } 56 57 func NewMergedNode(commitTs types.TS) *DeleteNode { 58 n := &DeleteNode{ 59 TxnMVCCNode: txnbase.NewTxnMVCCNodeWithTS(commitTs), 60 mask: roaring.New(), 61 nt: NT_Merge, 62 logIndexes: make([]*wal.Index, 0), 63 viewNodes: make(map[uint32]*common.GenericDLNode[txnif.MVCCNode]), 64 } 65 return n 66 } 67 func NewEmptyDeleteNode() txnif.MVCCNode { 68 n := &DeleteNode{ 69 TxnMVCCNode: txnbase.NewTxnMVCCNodeWithTxn(nil), 70 mask: roaring.New(), 71 nt: NT_Normal, 72 viewNodes: make(map[uint32]*common.GenericDLNode[txnif.MVCCNode]), 73 } 74 return n 75 } 76 func NewDeleteNode(txn txnif.AsyncTxn, dt handle.DeleteType) *DeleteNode { 77 n := &DeleteNode{ 78 TxnMVCCNode: txnbase.NewTxnMVCCNodeWithTxn(txn), 79 mask: roaring.New(), 80 nt: NT_Normal, 81 dt: dt, 82 viewNodes: make(map[uint32]*common.GenericDLNode[txnif.MVCCNode]), 83 } 84 if n.dt == handle.DT_MergeCompact { 85 _, err := n.TxnMVCCNode.PrepareCommit() 86 if err != nil { 87 panic(err) 88 } 89 } 90 return n 91 } 92 93 func (node *DeleteNode) CloneAll() txnif.MVCCNode { panic("todo") } 94 func (node *DeleteNode) CloneData() txnif.MVCCNode { panic("todo") } 95 func (node *DeleteNode) Update(txnif.MVCCNode) { panic("todo") } 96 func (node *DeleteNode) GetPrepareTS() types.TS { 97 return node.TxnMVCCNode.GetPrepare() 98 } 99 100 func (node *DeleteNode) GetID() *common.ID { 101 return node.id 102 } 103 func (node *DeleteNode) AddLogIndexesLocked(indexes []*wal.Index) { 104 node.logIndexes = append(node.logIndexes, indexes...) 105 } 106 107 func (node *DeleteNode) SetDeletes(mask *roaring.Bitmap) { 108 node.mask = mask 109 } 110 111 func (node *DeleteNode) AddLogIndexLocked(index *wal.Index) { 112 node.logIndexes = append(node.logIndexes, index) 113 } 114 115 func (node *DeleteNode) IsMerged() bool { return node.nt == NT_Merge } 116 func (node *DeleteNode) AttachTo(chain *DeleteChain) { 117 node.chain = chain 118 node.GenericDLNode = chain.Insert(node) 119 } 120 121 func (node *DeleteNode) GetChain() txnif.DeleteChain { return node.chain } 122 func (node *DeleteNode) GetDeleteMaskLocked() *roaring.Bitmap { return node.mask } 123 124 func (node *DeleteNode) HasOverlapLocked(start, end uint32) bool { 125 if node.mask == nil || node.mask.IsEmpty() { 126 return false 127 } 128 var yes bool 129 if start == end { 130 yes = node.mask.Contains(start) 131 } else { 132 x2 := roaring.New() 133 x2.AddRange(uint64(start), uint64(end+1)) 134 yes = node.mask.Intersects(x2) 135 } 136 return yes 137 } 138 139 func (node *DeleteNode) MergeLocked(o *DeleteNode, collectIndex bool) { 140 if node.mask == nil { 141 node.mask = roaring.New() 142 } 143 node.mask.Or(o.mask) 144 if collectIndex { 145 if o.GetLogIndex() != nil { 146 node.AddLogIndexLocked(o.GetLogIndex()) 147 } 148 if o.logIndexes != nil { 149 node.AddLogIndexesLocked(o.logIndexes) 150 } 151 } 152 } 153 func (node *DeleteNode) GetCommitTSLocked() types.TS { return node.TxnMVCCNode.GetEnd() } 154 func (node *DeleteNode) GetStartTS() types.TS { return node.TxnMVCCNode.GetStart() } 155 156 func (node *DeleteNode) IsDeletedLocked(row uint32) bool { 157 return node.mask.Contains(row) 158 } 159 160 func (node *DeleteNode) RangeDeleteLocked(start, end uint32) { 161 // logutil.Debugf("RangeDelete BLK-%d Start=%d End=%d", 162 // node.chain.mvcc.meta.ID, 163 // start, 164 // end) 165 node.mask.AddRange(uint64(start), uint64(end+1)) 166 for i := start; i < end+1; i++ { 167 node.chain.InsertInDeleteView(i, node) 168 } 169 } 170 func (node *DeleteNode) DeletedRows() (rows []uint32) { 171 if node.mask == nil { 172 return 173 } 174 rows = node.mask.ToArray() 175 return 176 } 177 func (node *DeleteNode) GetCardinalityLocked() uint32 { return uint32(node.mask.GetCardinality()) } 178 179 func (node *DeleteNode) PrepareCommit() (err error) { 180 node.chain.mvcc.Lock() 181 defer node.chain.mvcc.Unlock() 182 _, err = node.TxnMVCCNode.PrepareCommit() 183 if err != nil { 184 return 185 } 186 node.chain.UpdateLocked(node) 187 return 188 } 189 190 func (node *DeleteNode) ApplyCommit(index *wal.Index) (err error) { 191 node.chain.mvcc.Lock() 192 defer node.chain.mvcc.Unlock() 193 _, err = node.TxnMVCCNode.ApplyCommit(index) 194 if err != nil { 195 return 196 } 197 node.chain.AddDeleteCnt(uint32(node.mask.GetCardinality())) 198 node.chain.mvcc.IncChangeNodeCnt() 199 return node.OnApply() 200 } 201 202 func (node *DeleteNode) ApplyRollback(index *wal.Index) (err error) { 203 node.chain.mvcc.Lock() 204 defer node.chain.mvcc.Unlock() 205 _, err = node.TxnMVCCNode.ApplyRollback(index) 206 return 207 } 208 209 func (node *DeleteNode) GeneralString() string { 210 return fmt.Sprintf("%s;Cnt=%d", node.TxnMVCCNode.String(), node.mask.GetCardinality()) 211 } 212 213 func (node *DeleteNode) GeneralDesc() string { 214 return fmt.Sprintf("%s;Cnt=%d", node.TxnMVCCNode.String(), node.mask.GetCardinality()) 215 } 216 217 func (node *DeleteNode) GeneralVerboseString() string { 218 return fmt.Sprintf("%s;Cnt=%d;Deletes=%v", node.TxnMVCCNode.String(), node.mask.GetCardinality(), node.mask) 219 } 220 221 func (node *DeleteNode) StringLocked() string { 222 ntype := "TXN" 223 if node.nt == NT_Merge { 224 ntype = "MERGE" 225 } 226 commitState := "C" 227 if node.GetEnd() == txnif.UncommitTS { 228 commitState = "UC" 229 } 230 s := fmt.Sprintf("[%s:%s][%d:%s]%s", ntype, commitState, node.mask.GetCardinality(), node.mask.String(), node.TxnMVCCNode.String()) 231 return s 232 } 233 234 func (node *DeleteNode) WriteTo(w io.Writer) (n int64, err error) { 235 cn, err := w.Write(txnbase.MarshalID(node.chain.mvcc.GetID())) 236 if err != nil { 237 return 238 } 239 n += int64(cn) 240 buf, err := node.mask.ToBytes() 241 if err != nil { 242 return 243 } 244 if err = binary.Write(w, binary.BigEndian, uint32(len(buf))); err != nil { 245 return 246 } 247 sn := int(0) 248 if sn, err = w.Write(buf); err != nil { 249 return 250 } 251 n += int64(sn) + 4 252 var sn2 int64 253 if sn2, err = node.TxnMVCCNode.WriteTo(w); err != nil { 254 return 255 } 256 n += sn2 257 return 258 } 259 260 func (node *DeleteNode) ReadFrom(r io.Reader) (n int64, err error) { 261 var sn int 262 buf := make([]byte, txnbase.IDSize) 263 if sn, err = r.Read(buf); err != nil { 264 return 265 } 266 n = int64(sn) 267 node.id = txnbase.UnmarshalID(buf) 268 cnt := uint32(0) 269 if err = binary.Read(r, binary.BigEndian, &cnt); err != nil { 270 return 271 } 272 n += 4 273 if cnt == 0 { 274 return 275 } 276 buf = make([]byte, cnt) 277 if _, err = r.Read(buf); err != nil { 278 return 279 } 280 n += int64(cnt) 281 node.mask = roaring.New() 282 err = node.mask.UnmarshalBinary(buf) 283 if err != nil { 284 return 285 } 286 var sn2 int64 287 if sn2, err = node.TxnMVCCNode.ReadFrom(r); err != nil { 288 return 289 } 290 n += sn2 291 return 292 } 293 func (node *DeleteNode) SetLogIndex(idx *wal.Index) { 294 node.TxnMVCCNode.SetLogIndex(idx) 295 } 296 func (node *DeleteNode) MakeCommand(id uint32) (cmd txnif.TxnCmd, err error) { 297 cmd = NewDeleteCmd(id, node) 298 return 299 } 300 301 func (node *DeleteNode) Set1PC() { node.TxnMVCCNode.Set1PC() } 302 func (node *DeleteNode) Is1PC() bool { return node.TxnMVCCNode.Is1PC() } 303 func (node *DeleteNode) PrepareRollback() (err error) { 304 node.chain.mvcc.Lock() 305 defer node.chain.mvcc.Unlock() 306 node.chain.RemoveNodeLocked(node) 307 node.chain.DeleteInDeleteView(node) 308 node.TxnMVCCNode.PrepareRollback() 309 return 310 } 311 312 func (node *DeleteNode) OnApply() (err error) { 313 if node.dt == handle.DT_Normal { 314 listener := node.chain.mvcc.GetDeletesListener() 315 if listener == nil { 316 return 317 } 318 err = listener(node.mask.GetCardinality(), node.mask.Iterator(), node.GetCommitTSLocked()) 319 } 320 return 321 } 322 323 func (node *DeleteNode) GetRowMaskRefLocked() *roaring.Bitmap { 324 return node.mask 325 }