// Create new memdb and froze the old one; need external synchronization. // newMem only called synchronously by the writer. func (d *DB) newMem() (mem *memdb.DB, err error) { s := d.s num := s.allocFileNum() file := s.getJournalFile(num) w, err := file.Create() if err != nil { s.reuseFileNum(num) return } d.memMu.Lock() if d.journal == nil { d.journal = journal.NewWriter(w) } else { d.journal.Reset(w) d.journalWriter.Close() d.frozenJournalFile = d.journalFile } d.journalWriter = w d.journalFile = file d.frozenMem = d.mem d.mem = memdb.New(s.cmp, toPercent(d.s.o.GetWriteBuffer(), kWriteBufferPercent)) mem = d.mem // The seq only incremented by the writer. d.frozenSeq = d.seq d.memMu.Unlock() return }
// Create new memdb and froze the old one; need external synchronization. // newMem only called synchronously by the writer. func (db *DB) newMem(n int) (mem *memDB, err error) { fd := storage.FileDesc{Type: storage.TypeJournal, Num: db.s.allocFileNum()} w, err := db.s.stor.Create(fd) if err != nil { db.s.reuseFileNum(fd.Num) return } db.memMu.Lock() defer db.memMu.Unlock() if db.frozenMem != nil { panic("still has frozen mem") } if db.journal == nil { db.journal = journal.NewWriter(w) } else { db.journal.Reset(w) db.journalWriter.Close() db.frozenJournalFd = db.journalFd } db.journalWriter = w db.journalFd = fd db.frozenMem = db.mem mem = db.mpoolGet(n) mem.incref() // for self mem.incref() // for caller db.mem = mem // The seq only incremented by the writer. And whoever called newMem // should hold write lock, so no need additional synchronization here. db.frozenSeq = db.seq return }
// Create new memdb and froze the old one; need external synchronization. // newMem only called synchronously by the writer. func (db *DB) newMem(n int) (mem *memdb.DB, err error) { num := db.s.allocFileNum() file := db.s.getJournalFile(num) w, err := file.Create() if err != nil { db.s.reuseFileNum(num) return } db.memMu.Lock() defer db.memMu.Unlock() if db.journal == nil { db.journal = journal.NewWriter(w) } else { db.journal.Reset(w) db.journalWriter.Close() db.frozenJournalFile = db.journalFile } db.journalWriter = w db.journalFile = file db.frozenMem = db.mem db.mem = memdb.New(db.s.icmp, maxInt(db.s.o.GetWriteBuffer(), n)) mem = db.mem // The seq only incremented by the writer. And whoever called newMem // should hold write lock, so no need additional synchronization here. db.frozenSeq = db.seq return }
// Create a new manifest file; need external synchronization. func (s *session) newManifest(rec *sessionRecord, v *version) (err error) { num := s.allocFileNum() file := s.stor.GetFile(num, storage.TypeManifest) writer, err := file.Create() if err != nil { return } jw := journal.NewWriter(writer) if v == nil { v = s.version() defer v.release() } if rec == nil { rec = &sessionRecord{} } s.fillRecord(rec, true) v.fillRecord(rec) defer func() { if err == nil { s.recordCommited(rec) if s.manifest != nil { s.manifest.Close() } if s.manifestWriter != nil { s.manifestWriter.Close() } if s.manifestFile != nil { s.manifestFile.Remove() } s.manifestFile = file s.manifestWriter = writer s.manifest = jw } else { writer.Close() file.Remove() s.reuseFileNum(num) } }() w, err := jw.Next() if err != nil { return } err = rec.encode(w) if err != nil { return } err = jw.Flush() if err != nil { return } err = s.stor.SetManifest(file) return }
func newJournalWriter(file storage.File) (p *journalWriter, err error) { w := new(journalWriter) w.file = file w.writer, err = file.Create() if err != nil { return } w.journal = journal.NewWriter(w.writer) return w, nil }
// Create a new manifest file; need external synchronization. func (s *session) newManifest(rec *sessionRecord, v *version) (err error) { fd := storage.FileDesc{storage.TypeManifest, s.allocFileNum()} writer, err := s.stor.Create(fd) if err != nil { return } jw := journal.NewWriter(writer) if v == nil { v = s.version() defer v.release() } if rec == nil { rec = &sessionRecord{} } s.fillRecord(rec, true) v.fillRecord(rec) defer func() { if err == nil { s.recordCommited(rec) if s.manifest != nil { s.manifest.Close() } if s.manifestWriter != nil { s.manifestWriter.Close() } if !s.manifestFd.Nil() { s.stor.Remove(s.manifestFd) } s.manifestFd = fd s.manifestWriter = writer s.manifest = jw } else { writer.Close() s.stor.Remove(fd) s.reuseFileNum(fd.Num) } }() w, err := jw.Next() if err != nil { return } err = rec.encode(w) if err != nil { return } err = jw.Flush() if err != nil { return } err = s.stor.SetMeta(fd) return }
// Create new memdb and froze the old one; need external synchronization. // newMem only called synchronously by the writer. func (db *DB) newMem(n int) (mem *memDB, err error) { num := db.s.allocFileNum() file := db.s.getJournalFile(num) w, err := file.Create() if err != nil { db.s.reuseFileNum(num) return } db.memMu.Lock() defer db.memMu.Unlock() if db.frozenMem != nil { panic("still has frozen mem") } if db.journal == nil { db.journal = journal.NewWriter(w) } else { db.journal.Reset(w) db.journalWriter.Close() db.frozenJournalFile = db.journalFile } db.journalWriter = w db.journalFile = file db.frozenMem = db.mem mem, ok := db.memPool.Get().(*memDB) if ok && mem.db.Capacity() >= n { mem.db.Reset() mem.incref() } else { mem = &memDB{ pool: db.memPool, db: memdb.New(db.s.icmp, maxInt(db.s.o.GetWriteBuffer(), n)), ref: 1, } } mem.incref() db.mem = mem // The seq only incremented by the writer. And whoever called newMem // should hold write lock, so no need additional synchronization here. db.frozenSeq = db.seq return }
// Create new memdb and froze the old one; need external synchronization. // newMem only called synchronously by the writer. func (db *DB) newMem(n int) (mem *memDB, err error) { fd := storage.FileDesc{Type: storage.TypeJournal, Num: db.s.allocFileNum()} w, err := db.s.stor.Create(fd) if err != nil { db.s.reuseFileNum(fd.Num) return } db.memMu.Lock() defer db.memMu.Unlock() if db.frozenMem != nil { panic("still has frozen mem") } if db.journal == nil { db.journal = journal.NewWriter(w) } else { db.journal.Reset(w) db.journalWriter.Close() db.frozenJournalFd = db.journalFd } db.journalWriter = w db.journalFd = fd db.frozenMem = db.mem mdb := db.mpoolGet() if mdb == nil || mdb.Capacity() < n { mdb = memdb.New(db.s.icmp, maxInt(db.s.o.GetWriteBuffer(), n)) } mem = &memDB{ db: db, DB: mdb, ref: 2, } db.mem = mem // The seq only incremented by the writer. And whoever called newMem // should hold write lock, so no need additional synchronization here. db.frozenSeq = db.seq return }