common/journal.go (51 lines of code) (raw):

package utils import ( "bufio" "fmt" "os" "path/filepath" "github.com/alibaba/MongoShake/v2/oplog" ) const ( SampleFrequency = 1000 ) const ( JournalNothingOnDefault = iota JournalSampling JournalAll ) const ( BufferCapacity = 4 * 1024 * 1024 ) var JournalFilePattern = GlobalDiagnosticPath + string(filepath.Separator) + "%s.journal" type Journal struct { writer *bufio.Writer hasher oplog.Hasher } func JournalFileName(identifier string) string { return fmt.Sprintf(JournalFilePattern, identifier) } func NewJournal(name string) *Journal { // dump every oplog detail if need if file, err := os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666); err == nil { w := bufio.NewWriterSize(file, BufferCapacity) return &Journal{writer: w, hasher: &oplog.PrimaryKeyHasher{}} } return nil } func (j *Journal) WriteRecord(oplog *oplog.PartialLog) { // 0 -> no journal // 1 -> sampling // 2 -> journal all switch IncrSentinelOptions.OplogDump { case JournalNothingOnDefault: // default. do nothing case JournalSampling: // object id will be sampled and all DDL oplog if j.hasher.DistributeOplogByMod(oplog, SampleFrequency) != 0 { break } fallthrough case JournalAll: j.journal(oplog) default: } } func (j *Journal) journal(oplog *oplog.PartialLog) { j.writer.WriteString(fmt.Sprintf("%v\n", oplog)) }