level_handler.go
func (s *levelHandler) replaceTables(toDel, toAdd []*table.Table) error {
	// Need to re-search the range of tables in this level to be replaced as other goroutines might
	// be changing it as well.  (They can't touch our tables, but if they add/remove other tables,
	// the indices get shifted around.)
	s.Lock() // We s.Unlock() below.

	toDelMap := make(map[uint64]struct{})
	for _, t := range toDel {
		toDelMap[t.ID()] = struct{}{}
	}
	var newTables []*table.Table
	for _, t := range s.tables {
		_, found := toDelMap[t.ID()]
		if !found {
			newTables = append(newTables, t)
			continue
		}
		s.totalSize -= t.Size()
	}

	// Increase totalSize first.
	for _, t := range toAdd {
		s.totalSize += t.Size()
		t.IncrRef()
		newTables = append(newTables, t)
	}

	// Assign tables.
	s.tables = newTables
	sort.Slice(s.tables, func(i, j int) bool {
		return y.CompareKeys(s.tables[i].Smallest(), s.tables[j].Smallest()) < 0
	})
	s.Unlock() // s.Unlock before we DecrRef tables -- that can be slow.
	return decrRefs(toDel)
}
func (s *levelHandler) replaceTables(toDel, toAdd []*table.Table) error {
	// Need to re-search the range of tables in this level to be replaced as other goroutines might
	// be changing it as well.  (They can't touch our tables, but if they add/remove other tables,
	// the indices get shifted around.)
	s.Lock() // We s.Unlock() below.

	toDelMap := make(map[uint64]struct{})
	for _, t := range toDel {
		toDelMap[t.ID()] = struct{}{}
	}
	var newTables []*table.Table
	for _, t := range s.tables {
		_, found := toDelMap[t.ID()]
		if !found {
			newTables = append(newTables, t)
			continue
		}
		s.totalSize -= t.Size()
	}

	// Increase totalSize first.
	for _, t := range toAdd {
		s.totalSize += t.Size()
		t.IncrRef()
		newTables = append(newTables, t)
	}

	// Assign tables.
	s.tables = newTables
	sort.Slice(s.tables, func(i, j int) bool {
		return y.CompareKeys(s.tables[i].Smallest(), s.tables[j].Smallest()) < 0
	})
	s.Unlock() // s.Unlock before we DecrRef tables -- that can be slow.
	return decrRefs(toDel)
}
func ( s * levelHandler ) replaceTables ( toDel , toAdd [ ] * table . Table ) error { // Need to re-search the range of tables in this level to be replaced as other goroutines might // be changing it as well.  (They can't touch our tables, but if they add/remove other tables, // the indices get shifted around.) s . Lock ( ) // We s.Unlock() below. toDelMap := make ( map [ uint64 ] struct { } ) for _ , t := range toDel { toDelMap [ t . ID ( ) ] = struct { } { } } var newTables [ ] * table . Table for _ , t := range s . tables { _ , found := toDelMap [ t . ID ( ) ] if ! found { newTables = append ( newTables , t ) continue } s . totalSize -= t . Size ( ) } // Increase totalSize first. for _ , t := range toAdd { s . totalSize += t . Size ( ) t . IncrRef ( ) newTables = append ( newTables , t ) } // Assign tables. s . tables = newTables sort . Slice ( s . tables , func ( i , j int ) bool { return y . CompareKeys ( s . tables [ i ] . Smallest ( ) , s . tables [ j ] . Smallest ( ) ) < 0 } ) s . Unlock ( ) // s.Unlock before we DecrRef tables -- that can be slow. return decrRefs ( toDel ) }
// replaceTables will replace tables[left:right] with newTables. Note this EXCLUDES tables[right].
// You must call decr() to delete the old tables _after_ writing the update to the manifest.
replaceTables will replace tables [ left : right ] with newTables . Note this EXCLUDES tables [ right ] . You must call decr () to delete the old tables _after_ writing the update to the manifest .