func (db *DB) ensureRoomForWrite() error {
	var err error
	db.Lock()
	defer db.Unlock()
	if db.mt.MemSize() < db.opt.MaxTableSize {
		return nil
	}

	y.AssertTrue(db.mt != nil) // A nil mt indicates that DB is being closed.
	select {
	case db.flushChan <- flushTask{mt: db.mt, vptr: db.vhead}:
		db.elog.Printf("Flushing value log to disk if async mode.")
		// Ensure value log is synced to disk so this memtable's contents wouldn't be lost.
		err = db.vlog.sync(db.vhead.Fid)
		if err != nil {
			return err
		}

		db.elog.Printf("Flushing memtable, mt.size=%d size of flushChan: %d\n",
			db.mt.MemSize(), len(db.flushChan))
		// We manage to push this task. Let's modify imm.
		db.imm = append(db.imm, db.mt)
		db.mt = skl.NewSkiplist(arenaSize(db.opt))
		// New memtable is empty. We certainly have room.
		return nil
	default:
		// We need to do this to unlock and allow the flusher to modify imm.
		return errNoRoom
	}
}
func (db *DB) ensureRoomForWrite() error {
	var err error
	db.Lock()
	defer db.Unlock()
	if db.mt.MemSize() < db.opt.MaxTableSize {
		return nil
	}

	y.AssertTrue(db.mt != nil) 
	select {
	case db.flushChan <- flushTask{mt: db.mt, vptr: db.vhead}:
		db.elog.Printf("Flushing value log to disk if async mode.")
		
		err = db.vlog.sync(db.vhead.Fid)
		if err != nil {
			return err
		}

		db.elog.Printf("Flushing memtable, mt.size=%d size of flushChan: %d\n",
			db.mt.MemSize(), len(db.flushChan))
		
		db.imm = append(db.imm, db.mt)
		db.mt = skl.NewSkiplist(arenaSize(db.opt))
		
		return nil
	default:
		
		return errNoRoom
	}
}
func ( db * DB ) ensureRoomForWrite ( ) error { var err error db . Lock ( ) defer db . Unlock ( ) if db . mt . MemSize ( ) < db . opt . MaxTableSize { return nil } y . AssertTrue ( db . mt != nil ) // A nil mt indicates that DB is being closed. select { case db . flushChan <- flushTask { mt : db . mt , vptr : db . vhead } : db . elog . Printf ( " " ) // Ensure value log is synced to disk so this memtable's contents wouldn't be lost. err = db . vlog . sync ( db . vhead . Fid ) if err != nil { return err } db . elog . Printf ( " \n " , db . mt . MemSize ( ) , len ( db . flushChan ) ) // We manage to push this task. Let's modify imm. db . imm = append ( db . imm , db . mt ) db . mt = skl . NewSkiplist ( arenaSize ( db . opt ) ) // New memtable is empty. We certainly have room. return nil default : // We need to do this to unlock and allow the flusher to modify imm. return errNoRoom } }
// ensureRoomForWrite is always called serially.
ensureRoomForWrite is always called serially .