|
9 | 9 | "os"
|
10 | 10 | "path/filepath"
|
11 | 11 | "sort"
|
| 12 | + "strings" |
12 | 13 | "testing"
|
13 | 14 |
|
14 | 15 | "github.com/stretchr/testify/require"
|
@@ -1866,6 +1867,98 @@ func TestTSMReader_References(t *testing.T) {
|
1866 | 1867 | }
|
1867 | 1868 | }
|
1868 | 1869 |
|
| 1870 | +func TestBatchKeyIterator_Errors(t *testing.T) { |
| 1871 | + const MaxErrors = 10 |
| 1872 | + |
| 1873 | + dir, name := createTestTSM(t) |
| 1874 | + defer os.RemoveAll(dir) |
| 1875 | + fr, err := os.Open(name) |
| 1876 | + if err != nil { |
| 1877 | + t.Fatalf("unexpected error opening file %s: %v", name, err) |
| 1878 | + } |
| 1879 | + r, err := NewTSMReader(fr) |
| 1880 | + if err != nil { |
| 1881 | + // Only have a deferred close if we could not create the TSMReader |
| 1882 | + defer func() { |
| 1883 | + if e := fr.Close(); e != nil { |
| 1884 | + t.Fatalf("unexpected error closing %s: %v", name, e) |
| 1885 | + } |
| 1886 | + }() |
| 1887 | + |
| 1888 | + t.Fatalf("unexpected error creating TSMReader for %s: %v", name, err) |
| 1889 | + } |
| 1890 | + defer func() { |
| 1891 | + if e := r.Close(); e != nil { |
| 1892 | + t.Fatalf("error closing TSMReader for %s: %v", name, e) |
| 1893 | + } |
| 1894 | + }() |
| 1895 | + interrupts := make(chan struct{}) |
| 1896 | + var iter KeyIterator |
| 1897 | + if iter, err = NewTSMBatchKeyIterator(3, false, MaxErrors, interrupts, []string{name}, r); err != nil { |
| 1898 | + t.Fatalf("unexpected error creating tsmBatchKeyIterator: %v", err) |
| 1899 | + } |
| 1900 | + var i int |
| 1901 | + for i = 0; i < MaxErrors*2; i++ { |
| 1902 | + saved := iter.(*tsmBatchKeyIterator).AppendError(fmt.Errorf("fake error: %d", i)) |
| 1903 | + if i < MaxErrors && !saved { |
| 1904 | + t.Fatalf("error unexpectedly not saved: %d", i) |
| 1905 | + } |
| 1906 | + if i >= MaxErrors && saved { |
| 1907 | + t.Fatalf("error unexpectedly saved: %d", i) |
| 1908 | + } |
| 1909 | + } |
| 1910 | + errs := iter.Err() |
| 1911 | + if errCnt := len(errs.(TSMErrors)); errCnt != (MaxErrors + 1) { |
| 1912 | + t.Fatalf("saved wrong number of errors: expected %d, got %d", MaxErrors, errCnt) |
| 1913 | + } |
| 1914 | + expected := fmt.Sprintf("additional errors dropped: %d", i-MaxErrors) |
| 1915 | + if strings.Compare(errs.(TSMErrors)[MaxErrors].Error(), expected) != 0 { |
| 1916 | + t.Fatalf("expected: '%s', got: '%s", expected, errs.(TSMErrors)[MaxErrors].Error()) |
| 1917 | + } |
| 1918 | +} |
| 1919 | + |
| 1920 | +func createTestTSM(t *testing.T) (dir string, name string) { |
| 1921 | + dir = MustTempDir() |
| 1922 | + f := mustTempFile(dir) |
| 1923 | + name = f.Name() |
| 1924 | + w, err := NewTSMWriter(f) |
| 1925 | + if err != nil { |
| 1926 | + f.Close() |
| 1927 | + t.Fatalf("unexpected error creating writer for %s: %v", name, err) |
| 1928 | + } |
| 1929 | + defer func() { |
| 1930 | + if e := w.Close(); e != nil { |
| 1931 | + t.Fatalf("write TSM close of %s: %v", name, err) |
| 1932 | + } |
| 1933 | + }() |
| 1934 | + |
| 1935 | + var data = map[string][]Value{ |
| 1936 | + "float": []Value{NewValue(1, 1.0)}, |
| 1937 | + "int": []Value{NewValue(1, int64(1))}, |
| 1938 | + "uint": []Value{NewValue(1, ^uint64(0))}, |
| 1939 | + "bool": []Value{NewValue(1, true)}, |
| 1940 | + "string": []Value{NewValue(1, "foo")}, |
| 1941 | + } |
| 1942 | + |
| 1943 | + keys := make([]string, 0, len(data)) |
| 1944 | + for k := range data { |
| 1945 | + keys = append(keys, k) |
| 1946 | + } |
| 1947 | + sort.Strings(keys) |
| 1948 | + |
| 1949 | + for _, k := range keys { |
| 1950 | + if err := w.Write([]byte(k), data[k]); err != nil { |
| 1951 | + t.Fatalf("write TSM value: %v", err) |
| 1952 | + } |
| 1953 | + } |
| 1954 | + |
| 1955 | + if err := w.WriteIndex(); err != nil { |
| 1956 | + t.Fatalf("write TSM index: %v", err) |
| 1957 | + } |
| 1958 | + |
| 1959 | + return dir, name |
| 1960 | +} |
| 1961 | + |
1869 | 1962 | func BenchmarkIndirectIndex_UnmarshalBinary(b *testing.B) {
|
1870 | 1963 | index := NewIndexWriter()
|
1871 | 1964 | for i := 0; i < 100000; i++ {
|
|
0 commit comments