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) {}