Unified · Split
| @@ -1011,14 +1011,23 @@ func (l *Log) IsEmpty() (bool, error) { · 1010 unmodified lines | ||
| 1011 | 1011 | // Clear empties the log, removing all entries and resetting |
| 1012 | 1012 | // the index back to its default value |
| 1013 | 1013 | func (l *Log) Clear() error { |
| 1014 | + l.mu.Lock() | |
| 1015 | + defer l.mu.Unlock() | |
| 1016 | + | |
| 1017 | + // Clean up segment files | |
| 1014 | 1018 | for _, segment := range l.segments { |
| 1015 | 1019 | if err := os.Remove(segment.path); err != nil { |
| 1016 | 1020 | return err |
| 1017 | 1021 | } |
| 1018 | 1022 | } |
| 1023 | + | |
| 1024 | + // Clear most state | |
| 1025 | + l.segments = []*segment{} | |
| 1019 | 1026 | l.sfile = nil |
| 1020 | − l.firstIndex = 0 | |
| 1027 | + l.firstIndex = 1 | |
| 1021 | 1028 | l.lastIndex = 0 |
| 1022 | 1029 | l.clearCache() |
| 1023 | − return nil | |
| 1030 | + | |
| 1031 | + // Load the log as if it were new again | |
| 1032 | + return l.load() | |
| 1024 | 1033 | } |
| @@ -924,6 +924,47 @@ func TestSimpleTruncateBack(t *testing.T) { · 923 unmodified lines | ||
| 924 | 924 | |
| 925 | 925 | } |
| 926 | 926 | |
| 927 | +func TestClear(t *testing.T) { | |
| 928 | + os.RemoveAll("testlog") | |
| 929 | + | |
| 930 | + l, err := Open("testlog", &Options{ | |
| 931 | + NoSync: true, | |
| 932 | + }) | |
| 933 | + if err != nil { | |
| 934 | + t.Fatal(err) | |
| 935 | + } | |
| 936 | + defer l.Close() | |
| 937 | + | |
| 938 | + // Write some entries | |
| 939 | + for i := 1; i < 50; i++ { | |
| 940 | + err := l.Write(uint64(i), []byte(dataStr(uint64(i)))) | |
| 941 | + if err != nil { | |
| 942 | + t.Fatal(err) | |
| 943 | + } | |
| 944 | + } | |
| 945 | + | |
| 946 | + // Clear the log | |
| 947 | + if err := l.Clear(); err != nil { | |
| 948 | + t.Fatal(err) | |
| 949 | + } | |
| 950 | + | |
| 951 | + // Validate some log information | |
| 952 | + if i, err := l.FirstIndex(); err != nil || i != 0 { | |
| 953 | + t.Fatal(fmt.Errorf("expected first index %d but got %d (error: %w)", 0, i, err)) | |
| 954 | + } | |
| 955 | + if i, err := l.LastIndex(); err != nil || i != 0 { | |
| 956 | + t.Fatal(fmt.Errorf("expected last index %d but got %d (error: %w)", 0, i, err)) | |
| 957 | + } | |
| 958 | + | |
| 959 | + // Ensure we can continue to write after a clear | |
| 960 | + for i := 1; i < 50; i++ { | |
| 961 | + err := l.Write(uint64(i), []byte(dataStr(uint64(i)))) | |
| 962 | + if err != nil { | |
| 963 | + t.Fatal(err) | |
| 964 | + } | |
| 965 | + } | |
| 966 | +} | |
| 967 | + | |
| 927 | 968 | func TestConcurrency(t *testing.T) { |
| 928 | 969 | os.RemoveAll("testlog") |
| 929 | 970 | |