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  }