diff --git a/session/session.go b/session/session.go index 4494fa984648c..e53c3fe5b4e38 100644 --- a/session/session.go +++ b/session/session.go @@ -3015,7 +3015,7 @@ func (s *session) GetTxnWriteThroughputSLI() *sli.TxnWriteThroughputSLI { return &s.txn.writeSLI } -var _ telemetry.TemporaryTableFeatureChecker = &session{} +var _ telemetry.TemporaryOrCacheTableFeatureChecker = &session{} // TemporaryTableExists is used by the telemetry package to avoid circle dependency. func (s *session) TemporaryTableExists() bool { @@ -3030,6 +3030,19 @@ func (s *session) TemporaryTableExists() bool { return false } +// CachedTableExists is used by the telemetry package to avoid circle dependency. +func (s *session) CachedTableExists() bool { + is := domain.GetDomain(s).InfoSchema() + for _, dbInfo := range is.AllSchemas() { + for _, tbInfo := range is.SchemaTables(dbInfo.Name) { + if tbInfo.Meta().TableCacheStatusType != model.TableCacheStatusDisable { + return true + } + } + } + return false +} + // GetInfoSchema returns snapshotInfoSchema if snapshot schema is set. // Transaction infoschema is returned if inside an explicit txn. // Otherwise the latest infoschema is returned. diff --git a/telemetry/data_feature_usage.go b/telemetry/data_feature_usage.go index 0459fb9104849..cf32510097423 100644 --- a/telemetry/data_feature_usage.go +++ b/telemetry/data_feature_usage.go @@ -36,6 +36,7 @@ type featureUsage struct { ClusterIndex *ClusterIndexUsage `json:"clusterIndex"` TemporaryTable bool `json:"temporaryTable"` CTE *m.CTEUsageCounter `json:"cte"` + CachedTable bool `json:"cachedTable"` } func getFeatureUsage(ctx sessionctx.Context) (*featureUsage, error) { @@ -49,11 +50,13 @@ func getFeatureUsage(ctx sessionctx.Context) (*featureUsage, error) { txnUsage := getTxnUsageInfo(ctx) // Avoid the circle dependency. - temporaryTable := ctx.(TemporaryTableFeatureChecker).TemporaryTableExists() + temporaryTable := ctx.(TemporaryOrCacheTableFeatureChecker).TemporaryTableExists() cteUsage := getCTEUsageInfo() - return &featureUsage{txnUsage, clusterIdxUsage, temporaryTable, cteUsage}, nil + cachedTable := ctx.(TemporaryOrCacheTableFeatureChecker).CachedTableExists() + + return &featureUsage{txnUsage, clusterIdxUsage, temporaryTable, cteUsage, cachedTable}, nil } // ClusterIndexUsage records the usage info of all the tables, no more than 10k tables @@ -138,10 +141,11 @@ func getClusterIndexUsageInfo(ctx sessionctx.Context) (cu *ClusterIndexUsage, er return &usage, nil } -// TemporaryTableFeatureChecker is defined to avoid package circle dependency. +// TemporaryOrCacheTableFeatureChecker is defined to avoid package circle dependency. // The session struct implements this interface. -type TemporaryTableFeatureChecker interface { +type TemporaryOrCacheTableFeatureChecker interface { TemporaryTableExists() bool + CachedTableExists() bool } // TxnUsage records the usage info of transaction related features, including diff --git a/telemetry/data_feature_usage_test.go b/telemetry/data_feature_usage_test.go index 932a85127f4bd..8f5536416811c 100644 --- a/telemetry/data_feature_usage_test.go +++ b/telemetry/data_feature_usage_test.go @@ -87,3 +87,27 @@ func TestTemporaryTable(t *testing.T) { require.NoError(t, err) require.True(t, usage.TemporaryTable) } + +func TestCachedTable(t *testing.T) { + t.Parallel() + + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + usage, err := telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.False(t, usage.CachedTable) + tk.MustExec("drop table if exists tele_cache_t") + tk.MustExec("create table tele_cache_t (id int)") + tk.MustExec("alter table tele_cache_t cache") + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.True(t, usage.CachedTable) + tk.MustExec("alter table tele_cache_t nocache") + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.False(t, usage.CachedTable) +} diff --git a/telemetry/main_test.go b/telemetry/main_test.go index f498d16a2d564..3ab35518fd644 100644 --- a/telemetry/main_test.go +++ b/telemetry/main_test.go @@ -32,6 +32,7 @@ func TestMain(m *testing.M) { opts := []goleak.Option{ goleak.IgnoreTopFunction("go.etcd.io/etcd/pkg/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + goleak.IgnoreTopFunction("github.com/pingcap/tidb/table/tables.mockRemoteService"), } goleak.VerifyTestMain(m, opts...)