index_cache_lifecycle_test.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package storage
  2. import (
  3. "fmt"
  4. "sync"
  5. "testing"
  6. )
  7. func TestIndexedReadWhileSharedGateCommitsInvalidate(t *testing.T) {
  8. _, _, schemas, tables := newTestSession(t)
  9. createTestTable(t, schemas, "t", []Column{{Name: "id", Type: "INTEGER", PrimaryKey: true}, {Name: "v", Type: "INTEGER"}})
  10. if _, err := tables.InsertBulk("t", []Row{{"id": int64(1), "v": int64(1)}, {"id": int64(2), "v": int64(2)}}); err != nil {
  11. t.Fatal(err)
  12. }
  13. if err := schemas.CreateIndex(&Index{Name: "idx", Table: "t", Columns: []IndexColumn{{Name: "v"}}}); err != nil {
  14. t.Fatal(err)
  15. }
  16. if err := tables.BuildIndex("idx", "t", []string{"v"}); err != nil {
  17. t.Fatal(err)
  18. }
  19. errors := make(chan error, 2)
  20. var workers sync.WaitGroup
  21. workers.Add(2)
  22. go func() {
  23. defer workers.Done()
  24. session := NewSession(schemas, tables)
  25. for i := 0; i < 500; i++ {
  26. if err := session.Begin(); err != nil {
  27. errors <- err
  28. return
  29. }
  30. if _, _, err := session.UpdateByPK("t", "2", func(Row) (Row, error) { return Row{"v": int64(2)}, nil }); err != nil {
  31. errors <- err
  32. return
  33. }
  34. if err := session.Commit(); err != nil {
  35. errors <- err
  36. return
  37. }
  38. }
  39. }()
  40. go func() {
  41. defer workers.Done()
  42. for i := 0; i < 500; i++ {
  43. rows, err := tables.SelectByIndex("t", "idx", int64(1))
  44. if err != nil {
  45. errors <- err
  46. return
  47. }
  48. if len(rows) != 1 || rows[0]["id"] != int64(1) {
  49. errors <- fmt.Errorf("unchanged indexed row disappeared: %v", rows)
  50. return
  51. }
  52. }
  53. }()
  54. workers.Wait()
  55. close(errors)
  56. for err := range errors {
  57. t.Error(err)
  58. }
  59. }