func TestChangeIndexAddSet(t *testing.T) { base.EnableLogKey("DIndex+") changeIndex, bucket := testKvChangeIndex("indexBucket") defer changeIndex.Stop() entries := make([]*LogEntry, 1000) for vb := 0; vb < 1000; vb++ { entries[vb] = channelEntry(uint16(vb), 1, fmt.Sprintf("foo%d", vb), "1-a", []string{"ABC"}) } indexPartitions := testPartitionMap() channelStorage := NewChannelStorage(bucket, "", indexPartitions) changeIndex.writer.indexEntries(entries, indexPartitions.VbMap, channelStorage) // wait for add to complete time.Sleep(50 * time.Millisecond) // Verify channel clocks channelClock := base.SequenceClockImpl{} chanClockBytes, _, err := bucket.GetRaw(getChannelClockKey("ABC")) err = channelClock.Unmarshal(chanClockBytes) assertNoError(t, err, "Unmarshal channel clock sequence") starChannelClock := base.SequenceClockImpl{} chanClockBytes, _, err = bucket.GetRaw(getChannelClockKey("*")) err = starChannelClock.Unmarshal(chanClockBytes) for vb := uint16(0); vb < 1000; vb++ { assert.Equals(t, channelClock.GetSequence(vb), uint64(1)) assert.Equals(t, starChannelClock.GetSequence(vb), uint64(1)) } }
func TestChangeIndexAddEntry(t *testing.T) { base.EnableLogKey("DIndex+") changeIndex, bucket := testKvChangeIndex("indexBucket") defer changeIndex.Stop() changeIndex.writer.addToCache(channelEntry(1, 1, "foo1", "1-a", []string{"ABC", "CBS"})) // wait for add time.Sleep(50 * time.Millisecond) // Verify entry var entry LogEntry entryBytes, _, err := bucket.GetRaw("_idx_entry:1:1") assert.True(t, err == nil) json.Unmarshal(entryBytes, &entry) assert.Equals(t, entry.DocID, "foo1") assert.Equals(t, entry.Sequence, uint64(1)) assert.Equals(t, entry.RevID, "1-a") // Verify Channel Index Block partitions, err := changeIndex.getIndexPartitions() assertNoError(t, err, "Get index partitions") block := NewIndexBlock("ABC", 1, 1, partitions) blockBytes, _, err := bucket.GetRaw(getIndexBlockKey("ABC", 0, 0)) bucket.Dump() err = block.Unmarshal(blockBytes) assertNoError(t, err, "Unmarshal block") allEntries := block.GetAllEntries() assert.Equals(t, len(allEntries), 1) // Verify stable sequence stableClock, err := changeIndex.GetStableClock(false) assertNoError(t, err, "Get stable clock") assert.Equals(t, stableClock.GetSequence(1), uint64(1)) assert.Equals(t, stableClock.GetSequence(2), uint64(0)) // Verify channel sequences channelClock := base.SequenceClockImpl{} chanClockBytes, _, err := bucket.GetRaw(getChannelClockKey("ABC")) log.Println("key:", getChannelClockKey("ABC")) log.Println("bytes:", chanClockBytes) err = channelClock.Unmarshal(chanClockBytes) log.Println("chan ABC", channelClock.GetSequence(1)) assertNoError(t, err, "Unmarshal channel clock sequence") assert.Equals(t, channelClock.GetSequence(1), uint64(1)) assert.Equals(t, channelClock.GetSequence(2), uint64(0)) channelClock = base.SequenceClockImpl{} chanClockBytes, _, err = bucket.GetRaw(getChannelClockKey("CBS")) err = channelClock.Unmarshal(chanClockBytes) assertNoError(t, err, "Unmarshal channel clock sequence") assert.Equals(t, channelClock.GetSequence(1), uint64(1)) assert.Equals(t, channelClock.GetSequence(2), uint64(0)) }