github.com/vescale/zgraph@v0.0.0-20230410094002-959c02d50f95/storage/resolver/resolver.go (about) 1 // Copyright 2022 zGraph Authors. All rights reserved. 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 resolver 16 17 import ( 18 "context" 19 "sync/atomic" 20 21 "github.com/cockroachdb/pebble" 22 "github.com/vescale/zgraph/internal/logutil" 23 ) 24 25 type resolver struct { 26 db *pebble.DB 27 ch chan Task 28 closed atomic.Bool 29 } 30 31 func newResolver(db *pebble.DB) *resolver { 32 return &resolver{ 33 db: db, 34 ch: make(chan Task, 512), 35 } 36 } 37 38 func (r *resolver) run(ctx context.Context) { 39 for { 40 select { 41 case task, ok := <-r.ch: 42 if !ok { 43 return 44 } 45 c := len(r.ch) 46 tasks := make([]Task, 0, c+1) 47 tasks = append(tasks, task) 48 if c > 0 { 49 for i := 0; i < c; i++ { 50 tasks = append(tasks, <-r.ch) 51 } 52 } 53 r.resolve(tasks) 54 55 case <-ctx.Done(): 56 return 57 } 58 } 59 } 60 61 func (r *resolver) resolve(tasks []Task) { 62 batch := r.db.NewBatch() 63 for _, task := range tasks { 64 var err error 65 if task.CommitVer > 0 { 66 err = Resolve(r.db, batch, task.Key, task.StartVer, task.CommitVer) 67 } else { 68 err = Rollback(r.db, batch, task.Key, task.StartVer) 69 } 70 if err != nil { 71 logutil.Errorf("Resolve key failed, key:%v, startVer:%d, commitVer:%d, caused by:%+v", 72 task.Key, task.StartVer, task.CommitVer, err) 73 } 74 if task.Notifier != nil { 75 task.Notifier.Notify(err) 76 } 77 } 78 err := batch.Commit(nil) 79 if err != nil { 80 logutil.Errorf("Commit batch failed: %+v", err) 81 } 82 } 83 84 func (r *resolver) push(tasks ...Task) { 85 for _, t := range tasks { 86 r.ch <- t 87 } 88 } 89 90 func (r *resolver) close() { 91 if r.closed.Swap(true) { 92 return 93 } 94 close(r.ch) 95 }