// Ensure the engine can rewrite blocks that contain the new point range. func TestEngine_WriteIndex_Insert(t *testing.T) { e := OpenDefaultEngine() defer e.Close() // Write initial points to index. if err := e.WriteIndex(map[string][][]byte{ "cpu": [][]byte{ bz1.MarshalEntry(10, []byte{0x10}), bz1.MarshalEntry(20, []byte{0x20}), bz1.MarshalEntry(30, []byte{0x30}), }, }); err != nil { t.Fatal(err) } // Write overlapping points to index. if err := e.WriteIndex(map[string][][]byte{ "cpu": [][]byte{ bz1.MarshalEntry(9, []byte{0x09}), bz1.MarshalEntry(10, []byte{0xFF}), bz1.MarshalEntry(25, []byte{0x25}), bz1.MarshalEntry(31, []byte{0x31}), }, }); err != nil { t.Fatal(err) } // Write overlapping points to index again. if err := e.WriteIndex(map[string][][]byte{ "cpu": [][]byte{ bz1.MarshalEntry(31, []byte{0xFF}), }, }); err != nil { t.Fatal(err) } // Start transaction. tx := e.MustBegin(false) defer tx.Rollback() // Iterate over "cpu" series. c := tx.Cursor("cpu") if k, v := c.Seek(u64tob(0)); btou64(k) != 9 || !bytes.Equal(v, []byte{0x09}) { t.Fatalf("unexpected key/value: %x / %x", k, v) } else if k, v = c.Next(); btou64(k) != 10 || !bytes.Equal(v, []byte{0xFF}) { t.Fatalf("unexpected key/value: %x / %x", k, v) } else if k, v = c.Next(); btou64(k) != 20 || !bytes.Equal(v, []byte{0x20}) { t.Fatalf("unexpected key/value: %x / %x", k, v) } else if k, v = c.Next(); btou64(k) != 25 || !bytes.Equal(v, []byte{0x25}) { t.Fatalf("unexpected key/value: %x / %x", k, v) } else if k, v = c.Next(); btou64(k) != 30 || !bytes.Equal(v, []byte{0x30}) { t.Fatalf("unexpected key/value: %x / %x", k, v) } else if k, v = c.Next(); btou64(k) != 31 || !bytes.Equal(v, []byte{0xFF}) { t.Fatalf("unexpected key/value: %x / %x", k, v) } }
// Ensure the engine can write points to the index. func TestEngine_WriteIndex_Append(t *testing.T) { e := OpenDefaultEngine() defer e.Close() // Append points to index. if err := e.WriteIndex(map[string][][]byte{ "cpu": [][]byte{ bz1.MarshalEntry(1, []byte{0x10}), bz1.MarshalEntry(2, []byte{0x20}), }, "mem": [][]byte{ bz1.MarshalEntry(0, []byte{0x30}), }, }); err != nil { t.Fatal(err) } // Start transaction. tx := e.MustBegin(false) defer tx.Rollback() // Iterate over "cpu" series. c := tx.Cursor("cpu") if k, v := c.Seek(u64tob(0)); !reflect.DeepEqual(k, []byte{0, 0, 0, 0, 0, 0, 0, 1}) || !reflect.DeepEqual(v, []byte{0x10}) { t.Fatalf("unexpected key/value: %x / %x", k, v) } else if k, v = c.Next(); !reflect.DeepEqual(k, []byte{0, 0, 0, 0, 0, 0, 0, 2}) || !reflect.DeepEqual(v, []byte{0x20}) { t.Fatalf("unexpected key/value: %x / %x", k, v) } else if k, _ = c.Next(); k != nil { t.Fatalf("unexpected key/value: %x / %x", k, v) } // Iterate over "mem" series. c = tx.Cursor("mem") if k, v := c.Seek(u64tob(0)); !reflect.DeepEqual(k, []byte{0, 0, 0, 0, 0, 0, 0, 0}) || !reflect.DeepEqual(v, []byte{0x30}) { t.Fatalf("unexpected key/value: %x / %x", k, v) } else if k, _ = c.Next(); k != nil { t.Fatalf("unexpected key/value: %x / %x", k, v) } }
func GeneratePoints(rand *rand.Rand, size, seriesN int, timestampFn func(int) time.Time) Points { // Generate series with a random number of points in each. m := make(Points) for i := 0; i < seriesN; i++ { key := strconv.Itoa(i) // Generate points for the series. for j, pointN := 0, rand.Intn(size); j < pointN; j++ { timestamp := timestampFn(j) data, ok := quick.Value(reflect.TypeOf([]byte(nil)), rand) if !ok { panic("cannot generate data") } m[key] = append(m[key], bz1.MarshalEntry(timestamp.UnixNano(), data.Interface().([]byte))) } } return m }
func (Points) Generate(rand *rand.Rand, size int) reflect.Value { // Generate series with a random number of points in each. m := make(map[string][][]byte) for i, seriesN := 0, rand.Intn(size); i < seriesN; i++ { key := strconv.Itoa(rand.Intn(20)) // Generate points for the series. for j, pointN := 0, rand.Intn(size); j < pointN; j++ { timestamp := time.Unix(0, 0).Add(time.Duration(rand.Intn(100))) data, ok := quick.Value(reflect.TypeOf([]byte(nil)), rand) if !ok { panic("cannot generate data") } m[key] = append(m[key], bz1.MarshalEntry(timestamp.UnixNano(), data.Interface().([]byte))) } } return reflect.ValueOf(Points(m)) }