func testHandler(req *http.Request, t *testing.T) { response := httptest.NewRecorder() TxLogger.Send("test msg") txlogzHandler(response, req) if !strings.Contains(response.Body.String(), "error") { t.Fatalf("should show an error page since transaction log format is invalid.") } txConn := &TxConnection{ TransactionID: 123456, StartTime: time.Now(), Queries: []string{"select * from test"}, Conclusion: "unknown", LogToFile: sync2.AtomicInt32(0), } txConn.EndTime = txConn.StartTime response = httptest.NewRecorder() TxLogger.Send(txConn) txlogzHandler(response, req) txConn.EndTime = txConn.StartTime.Add(time.Duration(2) * time.Second) response = httptest.NewRecorder() TxLogger.Send(txConn) txlogzHandler(response, req) txConn.EndTime = txConn.StartTime.Add(time.Duration(500) * time.Millisecond) response = httptest.NewRecorder() TxLogger.Send(txConn) txlogzHandler(response, req) }
func TestFileInfo(t *testing.T) { fname := path.Join(os.TempDir(), "binlog_streamer.test") writer, err := os.Create(fname) if err != nil { t.Fatal(err) } defer os.Remove(fname) var file fileInfo err = file.Init(fname, 0) if err != nil { t.Fatal(err) } ch := make(chan []byte, 10) var running = sync2.AtomicInt32(1) go func() { for { file.WaitForChange(&running) b := make([]byte, 128) n, err := file.handle.Read(b) if err != nil { ch <- []byte(err.Error()) } file.Set(file.pos + int64(n)) ch <- b[:n] } }() want := "Message1" writer.WriteString(want) writer.Sync() got := string(<-ch) if want != got { t.Errorf("want %v, got %v", want, got) } want = "Message2" writer.WriteString(want) writer.Sync() got = string(<-ch) if want != got { t.Errorf("want %v, got %v", want, got) } time.Sleep(200 * time.Millisecond) want = "Message3" writer.WriteString(want) writer.Sync() got = string(<-ch) if want != got { t.Errorf("want %v, got %v", want, got) } want = "EOF" running.Set(-1) got = string(<-ch) if want != got { t.Errorf("want %v, got %v", want, got) } }
func NewQueryEngine(config Config) *QueryEngine { qe := &QueryEngine{} qe.cachePool = NewCachePool(config.RowCache, time.Duration(config.QueryTimeout*1e9), time.Duration(config.IdleTimeout*1e9)) qe.schemaInfo = NewSchemaInfo(config.QueryCacheSize, time.Duration(config.SchemaReloadTime*1e9), time.Duration(config.IdleTimeout*1e9)) qe.connPool = NewConnectionPool(config.PoolSize, time.Duration(config.IdleTimeout*1e9)) qe.streamConnPool = NewConnectionPool(config.StreamPoolSize, time.Duration(config.IdleTimeout*1e9)) qe.reservedPool = NewReservedPool() qe.txPool = NewConnectionPool(config.TransactionCap, time.Duration(config.IdleTimeout*1e9)) // connections in pool has to be > transactionCap qe.activeTxPool = NewActiveTxPool(time.Duration(config.TransactionTimeout * 1e9)) qe.activePool = NewActivePool(time.Duration(config.QueryTimeout*1e9), time.Duration(config.IdleTimeout*1e9)) qe.consolidator = NewConsolidator() qe.maxResultSize = sync2.AtomicInt32(config.MaxResultSize) qe.streamBufferSize = sync2.AtomicInt32(config.StreamBufferSize) queryStats = stats.NewTimings("Queries") stats.NewRates("QPS", queryStats, 15, 60e9) waitStats = stats.NewTimings("Waits") killStats = stats.NewCounters("Kills") errorStats = stats.NewCounters("Errors") resultStats = stats.NewHistogram("Results", resultBuckets) return qe }