| 910 | } |
| 911 | |
| 912 | func (s *levelsController) runCompactDef(l int, cd compactDef) (err error) { |
| 913 | timeStart := time.Now() |
| 914 | |
| 915 | thisLevel := cd.thisLevel |
| 916 | nextLevel := cd.nextLevel |
| 917 | |
| 918 | // Table should never be moved directly between levels, always be rewritten to allow discarding |
| 919 | // invalid versions. |
| 920 | |
| 921 | newTables, decr, err := s.compactBuildTables(l, cd) |
| 922 | if err != nil { |
| 923 | return err |
| 924 | } |
| 925 | defer func() { |
| 926 | // Only assign to err, if it's not already nil. |
| 927 | if decErr := decr(); err == nil { |
| 928 | err = decErr |
| 929 | } |
| 930 | }() |
| 931 | changeSet := buildChangeSet(&cd, newTables) |
| 932 | |
| 933 | // We write to the manifest _before_ we delete files (and after we created files) |
| 934 | if err := s.kv.manifest.addChanges(changeSet.Changes); err != nil { |
| 935 | return err |
| 936 | } |
| 937 | |
| 938 | // See comment earlier in this function about the ordering of these ops, and the order in which |
| 939 | // we access levels when reading. |
| 940 | if err := nextLevel.replaceTables(cd.bot, newTables); err != nil { |
| 941 | return err |
| 942 | } |
| 943 | if err := thisLevel.deleteTables(cd.top); err != nil { |
| 944 | return err |
| 945 | } |
| 946 | |
| 947 | // Note: For level 0, while doCompact is running, it is possible that new tables are added. |
| 948 | // However, the tables are added only to the end, so it is ok to just delete the first table. |
| 949 | |
| 950 | s.kv.opt.Infof("LOG Compact %d->%d, del %d tables, add %d tables, took %v\n", |
| 951 | thisLevel.level, nextLevel.level, len(cd.top)+len(cd.bot), |
| 952 | len(newTables), time.Since(timeStart)) |
| 953 | return nil |
| 954 | } |
| 955 | |
| 956 | var errFillTables = errors.New("Unable to fill tables") |
| 957 | |