github.com/matrixorigin/matrixone@v0.7.0/pkg/vm/engine/tae/tables/txnentries/mergeblockscmd.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 txnentries
    16  
    17  import (
    18  	"bytes"
    19  	"encoding/binary"
    20  	"fmt"
    21  	"io"
    22  
    23  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/common"
    24  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/iface/txnif"
    25  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/txn/txnbase"
    26  )
    27  
    28  type mergeBlocksCmd struct {
    29  	txnbase.BaseCmd
    30  	tid         uint64
    31  	droppedSegs []*common.ID
    32  	createdSegs []*common.ID
    33  	droppedBlks []*common.ID
    34  	createdBlks []*common.ID
    35  	mapping     []uint32
    36  	fromAddr    []uint32
    37  	toAddr      []uint32
    38  	txn         txnif.AsyncTxn
    39  	id          uint32
    40  }
    41  
    42  func newMergeBlocksCmd(
    43  	tid uint64,
    44  	droppedSegs, createdSegs, droppedBlks, createdBlks []*common.ID,
    45  	mapping, fromAddr, toAddr []uint32,
    46  	txn txnif.AsyncTxn,
    47  	id uint32) *mergeBlocksCmd {
    48  	return &mergeBlocksCmd{
    49  		tid:         tid,
    50  		droppedSegs: droppedSegs,
    51  		createdSegs: createdSegs,
    52  		droppedBlks: droppedBlks,
    53  		createdBlks: createdBlks,
    54  		mapping:     mapping,
    55  		fromAddr:    fromAddr,
    56  		toAddr:      toAddr,
    57  		txn:         txn,
    58  		id:          id,
    59  	}
    60  }
    61  
    62  func WriteSegID(w io.Writer, id *common.ID) (n int64, err error) {
    63  	if err = binary.Write(w, binary.BigEndian, id.TableID); err != nil {
    64  		return
    65  	}
    66  	if err = binary.Write(w, binary.BigEndian, id.SegmentID); err != nil {
    67  		return
    68  	}
    69  	n = 8 + 8
    70  	return
    71  }
    72  
    73  func ReadSegID(r io.Reader, id *common.ID) (n int64, err error) {
    74  	if err = binary.Read(r, binary.BigEndian, &id.TableID); err != nil {
    75  		return
    76  	}
    77  	if err = binary.Read(r, binary.BigEndian, &id.SegmentID); err != nil {
    78  		return
    79  	}
    80  	n = 8 + 8
    81  	return
    82  }
    83  
    84  func WriteBlkID(w io.Writer, id *common.ID) (n int64, err error) {
    85  	if err = binary.Write(w, binary.BigEndian, id.TableID); err != nil {
    86  		return
    87  	}
    88  	if err = binary.Write(w, binary.BigEndian, id.SegmentID); err != nil {
    89  		return
    90  	}
    91  	if err = binary.Write(w, binary.BigEndian, id.BlockID); err != nil {
    92  		return
    93  	}
    94  	n = 8 + 8 + 8
    95  	return
    96  }
    97  
    98  func ReadBlkID(r io.Reader, id *common.ID) (n int64, err error) {
    99  	if err = binary.Read(r, binary.BigEndian, &id.TableID); err != nil {
   100  		return
   101  	}
   102  	if err = binary.Read(r, binary.BigEndian, &id.SegmentID); err != nil {
   103  		return
   104  	}
   105  	if err = binary.Read(r, binary.BigEndian, &id.BlockID); err != nil {
   106  		return
   107  	}
   108  	n = 8 + 8 + 8
   109  	return
   110  }
   111  
   112  func WriteUint32Array(w io.Writer, array []uint32) (n int64, err error) {
   113  	length := uint32(len(array))
   114  	if err = binary.Write(w, binary.BigEndian, length); err != nil {
   115  		return
   116  	}
   117  	n = 4
   118  	for _, i := range array {
   119  		if err = binary.Write(w, binary.BigEndian, i); err != nil {
   120  			return
   121  		}
   122  		n += 4
   123  	}
   124  	return
   125  }
   126  
   127  func ReadUint32Array(r io.Reader) (array []uint32, n int64, err error) {
   128  	length := uint32(0)
   129  	if err = binary.Read(r, binary.BigEndian, &length); err != nil {
   130  		return
   131  	}
   132  	n = 4
   133  	array = make([]uint32, length)
   134  	for i := 0; i < int(length); i++ {
   135  		if err = binary.Read(r, binary.BigEndian, &array[i]); err != nil {
   136  			return
   137  		}
   138  		n += 4
   139  	}
   140  	return
   141  }
   142  
   143  func (cmd *mergeBlocksCmd) GetType() int16 { return CmdMergeBlocks }
   144  func (cmd *mergeBlocksCmd) WriteTo(w io.Writer) (n int64, err error) {
   145  	if err = binary.Write(w, binary.BigEndian, CmdMergeBlocks); err != nil {
   146  		return
   147  	}
   148  
   149  	if err = binary.Write(w, binary.BigEndian, cmd.id); err != nil {
   150  		return
   151  	}
   152  
   153  	droppedSegsLength := uint32(len(cmd.droppedSegs))
   154  	if err = binary.Write(w, binary.BigEndian, droppedSegsLength); err != nil {
   155  		return
   156  	}
   157  	n = 2 + 4 + 4
   158  	var sn int64
   159  	for _, seg := range cmd.droppedSegs {
   160  		if sn, err = WriteSegID(w, seg); err != nil {
   161  			return
   162  		}
   163  		n += sn
   164  	}
   165  
   166  	createdSegsLength := uint32(len(cmd.createdSegs))
   167  	if err = binary.Write(w, binary.BigEndian, createdSegsLength); err != nil {
   168  		return
   169  	}
   170  	n += 4
   171  	for _, seg := range cmd.createdSegs {
   172  		if sn, err = WriteSegID(w, seg); err != nil {
   173  			return
   174  		}
   175  		n += sn
   176  	}
   177  
   178  	droppedBlksLength := uint32(len(cmd.droppedBlks))
   179  	if err = binary.Write(w, binary.BigEndian, droppedBlksLength); err != nil {
   180  		return
   181  	}
   182  	n += 4
   183  	for _, blk := range cmd.droppedBlks {
   184  		if sn, err = WriteBlkID(w, blk); err != nil {
   185  			return
   186  		}
   187  		n += sn
   188  	}
   189  
   190  	createdBlksLength := uint32(len(cmd.createdBlks))
   191  	if err = binary.Write(w, binary.BigEndian, createdBlksLength); err != nil {
   192  		return
   193  	}
   194  	n += 4
   195  	for _, blk := range cmd.createdBlks {
   196  		if sn, err = WriteBlkID(w, blk); err != nil {
   197  			return
   198  		}
   199  		n += sn
   200  	}
   201  
   202  	if sn, err = WriteUint32Array(w, cmd.toAddr); err != nil {
   203  		return
   204  	}
   205  	n += sn
   206  	if sn, err = WriteUint32Array(w, cmd.fromAddr); err != nil {
   207  		return
   208  	}
   209  	n += sn
   210  	return
   211  }
   212  func (cmd *mergeBlocksCmd) ReadFrom(r io.Reader) (n int64, err error) {
   213  	if err = binary.Read(r, binary.BigEndian, &cmd.id); err != nil {
   214  		return
   215  	}
   216  	n = 4
   217  	dropSegmentLength := uint32(0)
   218  	if err = binary.Read(r, binary.BigEndian, &dropSegmentLength); err != nil {
   219  		return
   220  	}
   221  	var sn int64
   222  	n += 4
   223  	cmd.droppedSegs = make([]*common.ID, dropSegmentLength)
   224  	for i := 0; i < int(dropSegmentLength); i++ {
   225  		id := &common.ID{}
   226  		if sn, err = ReadSegID(r, id); err != nil {
   227  			return
   228  		}
   229  		n += sn
   230  		cmd.droppedSegs[i] = id
   231  	}
   232  
   233  	createSegmentLength := uint32(0)
   234  	if err = binary.Read(r, binary.BigEndian, &createSegmentLength); err != nil {
   235  		return
   236  	}
   237  	n += 4
   238  	cmd.createdSegs = make([]*common.ID, createSegmentLength)
   239  	for i := 0; i < int(createSegmentLength); i++ {
   240  		id := &common.ID{}
   241  		if sn, err = ReadSegID(r, id); err != nil {
   242  			return
   243  		}
   244  		cmd.createdSegs[i] = id
   245  		n += sn
   246  	}
   247  
   248  	dropBlkLength := uint32(0)
   249  	if err = binary.Read(r, binary.BigEndian, &dropBlkLength); err != nil {
   250  		return
   251  	}
   252  	n += 4
   253  	cmd.droppedBlks = make([]*common.ID, dropBlkLength)
   254  	for i := 0; i < int(dropBlkLength); i++ {
   255  		id := &common.ID{}
   256  		if sn, err = ReadBlkID(r, id); err != nil {
   257  			return
   258  		}
   259  		cmd.droppedBlks[i] = id
   260  		n += sn
   261  	}
   262  	createBlkLength := uint32(0)
   263  	if err = binary.Read(r, binary.BigEndian, &createBlkLength); err != nil {
   264  		return
   265  	}
   266  	n += 4
   267  	cmd.createdBlks = make([]*common.ID, createBlkLength)
   268  	for i := 0; i < int(createBlkLength); i++ {
   269  		id := &common.ID{}
   270  		if sn, err = ReadBlkID(r, id); err != nil {
   271  			return
   272  		}
   273  		cmd.createdBlks[i] = id
   274  		n += sn
   275  	}
   276  
   277  	if cmd.toAddr, sn, err = ReadUint32Array(r); err != nil {
   278  		return
   279  	}
   280  	n += sn
   281  	if cmd.fromAddr, sn, err = ReadUint32Array(r); err != nil {
   282  		return
   283  	}
   284  	n += sn
   285  	return
   286  }
   287  func (cmd *mergeBlocksCmd) Marshal() (buf []byte, err error) {
   288  	var bbuf bytes.Buffer
   289  	if _, err = cmd.WriteTo(&bbuf); err != nil {
   290  		return
   291  	}
   292  	buf = bbuf.Bytes()
   293  	return
   294  }
   295  func (cmd *mergeBlocksCmd) Unmarshal(buf []byte) (err error) {
   296  	bbuf := bytes.NewBuffer(buf)
   297  	_, err = cmd.ReadFrom(bbuf)
   298  	return
   299  }
   300  
   301  func (cmd *mergeBlocksCmd) Desc() string {
   302  	s := "CmdName=MERGE;From=["
   303  	for _, blk := range cmd.droppedBlks {
   304  		s = fmt.Sprintf("%s %d", s, blk.BlockID)
   305  	}
   306  	s = fmt.Sprintf("%s ];To=[", s)
   307  	for _, blk := range cmd.createdBlks {
   308  		s = fmt.Sprintf("%s %d", s, blk.BlockID)
   309  	}
   310  	s = fmt.Sprintf("%s ]", s)
   311  	return s
   312  }
   313  
   314  func (cmd *mergeBlocksCmd) String() string {
   315  	s := "CmdName=MERGE;From=["
   316  	for _, blk := range cmd.droppedBlks {
   317  		s = fmt.Sprintf("%s %d", s, blk.BlockID)
   318  	}
   319  	s = fmt.Sprintf("%s ];To=[", s)
   320  	for _, blk := range cmd.createdBlks {
   321  		s = fmt.Sprintf("%s %d", s, blk.BlockID)
   322  	}
   323  	s = fmt.Sprintf("%s ]", s)
   324  	return s
   325  }
   326  func (cmd *mergeBlocksCmd) VerboseString() string {
   327  	s := "CmdName=MERGE;From=["
   328  	for _, blk := range cmd.droppedBlks {
   329  		s = fmt.Sprintf("%s %s", s, blk.BlockString())
   330  	}
   331  	s = fmt.Sprintf("%s ];To=[", s)
   332  	for _, blk := range cmd.createdBlks {
   333  		s = fmt.Sprintf("%s %s", s, blk.BlockString())
   334  	}
   335  	s = fmt.Sprintf("%s ];FromFormat=%v;ToFormat=%v", s, cmd.fromAddr, cmd.toAddr)
   336  	return s
   337  }
   338  func (cmd *mergeBlocksCmd) ApplyCommit()                  {}
   339  func (cmd *mergeBlocksCmd) ApplyRollback()                {}
   340  func (cmd *mergeBlocksCmd) SetReplayTxn(_ txnif.AsyncTxn) {}