diff --git a/cmd/mo-service/config.go b/cmd/mo-service/config.go index 5ff82ce2679c..d0d959c0aea1 100644 --- a/cmd/mo-service/config.go +++ b/cmd/mo-service/config.go @@ -134,6 +134,13 @@ type Config struct { // MetaCache the config for objectio metacache MetaCache objectio.CacheConfig `toml:"metacache"` + + // IsStandalone denotes the matrixone is running in standalone mode + // For the tn does not boost an independent queryservice. + // cn,tn shares the same queryservice in standalone mode. + // Under distributed deploy mode, cn,tn are independent os process. + // they have their own queryservice. + IsStandalone bool } // NewConfig return Config with default values. @@ -263,6 +270,7 @@ func (c *Config) defaultFileServiceDataDir(name string) string { func (c *Config) createFileService( ctx context.Context, + st metadata.ServiceType, defaultName string, perfCounterSet *perfcounter.CounterSet, serviceType metadata.ServiceType, @@ -358,7 +366,7 @@ func (c *Config) createFileService( // set shared fs perf counter as node perf counter if service.Name() == defines.SharedFileServiceName { perfcounter.Named.Store( - perfcounter.NameForNode(nodeUUID), + perfcounter.NameForNode(st.String(), nodeUUID), counterSet, ) } diff --git a/cmd/mo-service/config_test.go b/cmd/mo-service/config_test.go index a0732e75dc9f..e601d6a3efa6 100644 --- a/cmd/mo-service/config_test.go +++ b/cmd/mo-service/config_test.go @@ -16,6 +16,7 @@ package main import ( "context" + "github.com/matrixorigin/matrixone/pkg/pb/metadata" "reflect" "testing" @@ -95,7 +96,7 @@ func TestFileServiceFactory(t *testing.T) { Backend: "DISK-ETL", }) - fs, err := c.createFileService(ctx, "A", globalCounterSet, 0, "") + fs, err := c.createFileService(ctx, metadata.ServiceType_CN, "A", globalCounterSet, 0, "") assert.NoError(t, err) assert.NotNil(t, fs) } diff --git a/cmd/mo-service/launch.go b/cmd/mo-service/launch.go index c763093065ea..a6f52e5a8905 100644 --- a/cmd/mo-service/launch.go +++ b/cmd/mo-service/launch.go @@ -117,6 +117,8 @@ func startTNServiceCluster( for _, file := range files { cfg := NewConfig() + // mo boosting in standalone mode + cfg.IsStandalone = true if err := parseConfigFromFile(file, cfg); err != nil { return err } diff --git a/cmd/mo-service/main.go b/cmd/mo-service/main.go index c43f6e0961b1..e4c9042d790e 100644 --- a/cmd/mo-service/main.go +++ b/cmd/mo-service/main.go @@ -183,7 +183,7 @@ func startService( } } - fs, err := cfg.createFileService(ctx, defines.LocalFileServiceName, globalCounterSet, st, uuid) + fs, err := cfg.createFileService(ctx, st, defines.LocalFileServiceName, globalCounterSet, st, uuid) if err != nil { return err } @@ -282,6 +282,8 @@ func startTNService( ctx = perfcounter.WithCounterSet(ctx, perfCounterSet) cfg.initMetaCache() c := cfg.getTNServiceConfig() + //notify the tn service it is in the standalone cluster + c.InStandalone = cfg.IsStandalone commonConfigKVMap, _ := dumpCommonConfig(*cfg) s, err := tnservice.NewService( perfCounterSet, diff --git a/pkg/clusterservice/cluster.go b/pkg/clusterservice/cluster.go index 859484963302..22cfd21c68ca 100644 --- a/pkg/clusterservice/cluster.go +++ b/pkg/clusterservice/cluster.go @@ -276,6 +276,7 @@ func newTNService(tn logpb.TNStore) metadata.TNService { LogTailServiceAddress: tn.LogtailServerAddress, LockServiceAddress: tn.LockServiceAddress, CtlAddress: tn.CtlAddress, + QueryAddress: tn.QueryAddress, } v.Shards = make([]metadata.TNShard, 0, len(tn.Shards)) for _, s := range tn.Shards { diff --git a/pkg/cnservice/server_query.go b/pkg/cnservice/server_query.go index 4cc020f1925b..52d1aea724d6 100644 --- a/pkg/cnservice/server_query.go +++ b/pkg/cnservice/server_query.go @@ -21,6 +21,7 @@ import ( pblock "github.com/matrixorigin/matrixone/pkg/pb/lock" "github.com/matrixorigin/matrixone/pkg/pb/query" "github.com/matrixorigin/matrixone/pkg/pb/txn" + "github.com/matrixorigin/matrixone/pkg/perfcounter" "github.com/matrixorigin/matrixone/pkg/queryservice" "github.com/matrixorigin/matrixone/pkg/sql/plan/function/ctl" "github.com/matrixorigin/matrixone/pkg/txn/client" @@ -42,6 +43,7 @@ func (s *service) initQueryCommandHandler() { s.queryService.AddHandleFunc(query.CmdMethod_TraceSpan, s.handleTraceSpan, false) s.queryService.AddHandleFunc(query.CmdMethod_GetLockInfo, s.handleGetLockInfo, false) s.queryService.AddHandleFunc(query.CmdMethod_GetTxnInfo, s.handleGetTxnInfo, false) + s.queryService.AddHandleFunc(query.CmdMethod_GetCacheInfo, s.handleGetCacheInfo, false) } func (s *service) handleKillConn(ctx context.Context, req *query.Request, resp *query.Response) error { @@ -198,3 +200,17 @@ func copyTxnInfo(src client.Lock) *query.TxnLockInfo { } return dst } + +func (s *service) handleGetCacheInfo(ctx context.Context, req *query.Request, resp *query.Response) error { + resp.GetCacheInfoResponse = new(query.GetCacheInfoResponse) + + perfcounter.GetCacheStats(func(infos []*query.CacheInfo) { + for _, info := range infos { + if info != nil { + resp.GetCacheInfoResponse.CacheInfoList = append(resp.GetCacheInfoResponse.CacheInfoList, info) + } + } + }) + + return nil +} diff --git a/pkg/cnservice/upgrader/new_add_table.go b/pkg/cnservice/upgrader/new_add_table.go index e0ac3a568c29..ae55c3f35a09 100644 --- a/pkg/cnservice/upgrader/new_add_table.go +++ b/pkg/cnservice/upgrader/new_add_table.go @@ -314,8 +314,25 @@ var MoTransactionsView = &table.Table{ CreateTableSql: "drop view if exists `mo_catalog`.`mo_transactions`;", } -var registeredViews = []*table.Table{processlistView, MoLocksView, MoVariablesView, MoTransactionsView} -var needUpgradeNewView = []*table.Table{PARTITIONSView, STATISTICSView, MoSessionsView, SqlStatementHotspotView, MoLocksView, MoConfigurationsView, MoVariablesView, MoTransactionsView} +var MoCacheView = &table.Table{ + Account: table.AccountAll, + Database: catalog.MO_CATALOG, + Table: "mo_cache", + Columns: []table.Column{ + table.StringColumn("node_type", "the type of the node. cn,tn"), + table.StringColumn("node_id", "the id of node"), + table.StringColumn("type", "the type of fileservice cache. memory, disk_cache"), + table.StringColumn("used", "used bytes of the cache"), + table.StringColumn("free", "free bytes of the cache"), + table.StringColumn("hit_ratio", "the hit ratio of the cache"), + }, + CreateViewSql: "CREATE VIEW IF NOT EXISTS `mo_catalog`.`mo_cache` AS SELECT * FROM mo_cache() AS mo_cache_tmp;", + //actually drop view here + CreateTableSql: "drop view if exists `mo_catalog`.`mo_cache`;", +} + +var registeredViews = []*table.Table{processlistView, MoLocksView, MoVariablesView, MoTransactionsView, MoCacheView} +var needUpgradeNewView = []*table.Table{PARTITIONSView, STATISTICSView, MoSessionsView, SqlStatementHotspotView, MoLocksView, MoConfigurationsView, MoVariablesView, MoTransactionsView, MoCacheView} var InformationSchemaSCHEMATA = &table.Table{ Account: table.AccountAll, diff --git a/pkg/frontend/authenticate.go b/pkg/frontend/authenticate.go index 4dc4e2cf3c52..7568e17ccd4a 100644 --- a/pkg/frontend/authenticate.go +++ b/pkg/frontend/authenticate.go @@ -824,6 +824,7 @@ var ( "mo_locks": 0, "mo_variables": 0, "mo_transactions": 0, + "mo_cache": 0, } configInitVariables = map[string]int8{ "save_query_result": 0, @@ -855,6 +856,7 @@ var ( "mo_locks": 0, "mo_variables": 0, "mo_transactions": 0, + "mo_cache": 0, } createDbInformationSchemaSql = "create database information_schema;" createAutoTableSql = fmt.Sprintf(`create table if not exists %s ( @@ -1034,6 +1036,7 @@ var ( `CREATE VIEW IF NOT EXISTS mo_locks AS SELECT * FROM mo_locks() AS mo_locks_tmp;`, `CREATE VIEW IF NOT EXISTS mo_variables AS SELECT * FROM mo_catalog.mo_mysql_compatibility_mode;`, `CREATE VIEW IF NOT EXISTS mo_transactions AS SELECT * FROM mo_transactions() AS mo_transactions_tmp;`, + `CREATE VIEW IF NOT EXISTS mo_cache AS SELECT * FROM mo_cache() AS mo_cache_tmp;`, } //drop tables for the tenant @@ -1052,6 +1055,7 @@ var ( `drop view if exists mo_catalog.mo_locks;`, `drop view if exists mo_catalog.mo_variables;`, `drop view if exists mo_catalog.mo_transactions;`, + `drop view if exists mo_catalog.mo_cache;`, } dropMoPubsSql = `drop table if exists mo_catalog.mo_pubs;` dropAutoIcrColSql = fmt.Sprintf("drop table if exists mo_catalog.`%s`;", catalog.MOAutoIncrTable) diff --git a/pkg/hakeeper/rsm.go b/pkg/hakeeper/rsm.go index b64636d404ce..f494bc7d9c69 100644 --- a/pkg/hakeeper/rsm.go +++ b/pkg/hakeeper/rsm.go @@ -721,6 +721,7 @@ func (s *stateMachine) handleClusterDetailsQuery(cfg Config) *pb.ClusterDetails LockServiceAddress: info.LockServiceAddress, CtlAddress: info.CtlAddress, ConfigData: info.ConfigData, + QueryAddress: info.QueryAddress, } cd.TNStores = append(cd.TNStores, n) } diff --git a/pkg/pb/logservice/logservice.go b/pkg/pb/logservice/logservice.go index 2c4cbcea9720..a0842782aec6 100644 --- a/pkg/pb/logservice/logservice.go +++ b/pkg/pb/logservice/logservice.go @@ -169,6 +169,7 @@ func (s *TNState) Update(hb TNStoreHeartbeat, tick uint64) { if hb.ConfigData != nil { storeInfo.ConfigData = hb.ConfigData } + storeInfo.QueryAddress = hb.QueryAddress s.Stores[hb.UUID] = storeInfo } diff --git a/pkg/pb/logservice/logservice.pb.go b/pkg/pb/logservice/logservice.pb.go index 6a5f59f78abd..0df4df562a51 100644 --- a/pkg/pb/logservice/logservice.pb.go +++ b/pkg/pb/logservice/logservice.pb.go @@ -582,12 +582,14 @@ type TNStore struct { // Server address for logtail push model LogtailServerAddress string `protobuf:"bytes,6,opt,name=LogtailServerAddress,proto3" json:"LogtailServerAddress,omitempty"` // LockServiceAddress lock service address for lock table allocator - LockServiceAddress string `protobuf:"bytes,7,opt,name=LockServiceAddress,proto3" json:"LockServiceAddress,omitempty"` - CtlAddress string `protobuf:"bytes,8,opt,name=CtlAddress,proto3" json:"CtlAddress,omitempty"` - ConfigData *ConfigData `protobuf:"bytes,9,opt,name=ConfigData,proto3" json:"ConfigData,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + LockServiceAddress string `protobuf:"bytes,7,opt,name=LockServiceAddress,proto3" json:"LockServiceAddress,omitempty"` + CtlAddress string `protobuf:"bytes,8,opt,name=CtlAddress,proto3" json:"CtlAddress,omitempty"` + ConfigData *ConfigData `protobuf:"bytes,9,opt,name=ConfigData,proto3" json:"ConfigData,omitempty"` + // QueryAddress is the address of the queryservice on tn + QueryAddress string `protobuf:"bytes,10,opt,name=QueryAddress,proto3" json:"QueryAddress,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *TNStore) Reset() { *m = TNStore{} } @@ -686,6 +688,13 @@ func (m *TNStore) GetConfigData() *ConfigData { return nil } +func (m *TNStore) GetQueryAddress() string { + if m != nil { + return m.QueryAddress + } + return "" +} + type LogStore struct { UUID string `protobuf:"bytes,1,opt,name=UUID,proto3" json:"UUID,omitempty"` ServiceAddress string `protobuf:"bytes,2,opt,name=ServiceAddress,proto3" json:"ServiceAddress,omitempty"` @@ -1278,12 +1287,14 @@ type TNStoreHeartbeat struct { // Server address for logtail push model LogtailServerAddress string `protobuf:"bytes,5,opt,name=LogtailServerAddress,proto3" json:"LogtailServerAddress,omitempty"` // LockServiceAddress lock service address for lock table allocator - LockServiceAddress string `protobuf:"bytes,6,opt,name=LockServiceAddress,proto3" json:"LockServiceAddress,omitempty"` - CtlAddress string `protobuf:"bytes,7,opt,name=CtlAddress,proto3" json:"CtlAddress,omitempty"` - ConfigData *ConfigData `protobuf:"bytes,8,opt,name=ConfigData,proto3" json:"ConfigData,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + LockServiceAddress string `protobuf:"bytes,6,opt,name=LockServiceAddress,proto3" json:"LockServiceAddress,omitempty"` + CtlAddress string `protobuf:"bytes,7,opt,name=CtlAddress,proto3" json:"CtlAddress,omitempty"` + ConfigData *ConfigData `protobuf:"bytes,8,opt,name=ConfigData,proto3" json:"ConfigData,omitempty"` + // QueryAddress is the address of queryservice on tn + QueryAddress string `protobuf:"bytes,9,opt,name=QueryAddress,proto3" json:"QueryAddress,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *TNStoreHeartbeat) Reset() { *m = TNStoreHeartbeat{} } @@ -1375,6 +1386,13 @@ func (m *TNStoreHeartbeat) GetConfigData() *ConfigData { return nil } +func (m *TNStoreHeartbeat) GetQueryAddress() string { + if m != nil { + return m.QueryAddress + } + return "" +} + type RSMState struct { Tso uint64 `protobuf:"varint,1,opt,name=Tso,proto3" json:"Tso,omitempty"` Index uint64 `protobuf:"varint,2,opt,name=Index,proto3" json:"Index,omitempty"` @@ -3147,12 +3165,14 @@ type TNStoreInfo struct { // Server address for logtail push model LogtailServerAddress string `protobuf:"bytes,5,opt,name=LogtailServerAddress,proto3" json:"LogtailServerAddress,omitempty"` // LockServiceAddress lock service address for lock table allocator - LockServiceAddress string `protobuf:"bytes,6,opt,name=LockServiceAddress,proto3" json:"LockServiceAddress,omitempty"` - CtlAddress string `protobuf:"bytes,7,opt,name=CtlAddress,proto3" json:"CtlAddress,omitempty"` - ConfigData *ConfigData `protobuf:"bytes,8,opt,name=ConfigData,proto3" json:"ConfigData,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + LockServiceAddress string `protobuf:"bytes,6,opt,name=LockServiceAddress,proto3" json:"LockServiceAddress,omitempty"` + CtlAddress string `protobuf:"bytes,7,opt,name=CtlAddress,proto3" json:"CtlAddress,omitempty"` + ConfigData *ConfigData `protobuf:"bytes,8,opt,name=ConfigData,proto3" json:"ConfigData,omitempty"` + // QueryAddress is the address of queryservice on tn + QueryAddress string `protobuf:"bytes,9,opt,name=QueryAddress,proto3" json:"QueryAddress,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *TNStoreInfo) Reset() { *m = TNStoreInfo{} } @@ -3244,6 +3264,13 @@ func (m *TNStoreInfo) GetConfigData() *ConfigData { return nil } +func (m *TNStoreInfo) GetQueryAddress() string { + if m != nil { + return m.QueryAddress + } + return "" +} + // TNState contains all TN details known to the HAKeeper. type TNState struct { // Stores is keyed by TN store UUID. @@ -4538,236 +4565,236 @@ func init() { func init() { proto.RegisterFile("logservice.proto", fileDescriptor_fd1040c5381ab5a7) } var fileDescriptor_fd1040c5381ab5a7 = []byte{ - // 3653 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3b, 0xcf, 0x6f, 0x1b, 0xc7, - 0xb9, 0x5a, 0x92, 0x12, 0xc9, 0x8f, 0xa2, 0xbc, 0x1a, 0xc9, 0x36, 0xa3, 0xf8, 0xc9, 0x7a, 0x1b, - 0xbf, 0x3c, 0x5b, 0x49, 0x68, 0x3c, 0x19, 0x09, 0x92, 0xf7, 0x14, 0xfb, 0x51, 0x24, 0x6d, 0xd1, - 0xa2, 0x29, 0x65, 0xb8, 0x4e, 0xde, 0x0b, 0x10, 0xe8, 0xad, 0xc4, 0xb1, 0xc4, 0x27, 0x8a, 0xcb, - 0xee, 0x2e, 0x1d, 0xbb, 0xc7, 0xa2, 0x28, 0xd0, 0xf6, 0xd6, 0x53, 0x50, 0x14, 0x2d, 0x7a, 0xed, - 0xa5, 0x39, 0xf4, 0x50, 0x14, 0x28, 0x7a, 0xcd, 0x31, 0x7f, 0x41, 0x90, 0xe4, 0xd8, 0x16, 0x28, - 0x7a, 0x29, 0x5a, 0x14, 0x45, 0x8b, 0xf9, 0xb5, 0x3b, 0xc3, 0x5d, 0x52, 0x92, 0xe3, 0x24, 0x45, - 0x9b, 0x93, 0x38, 0xdf, 0xaf, 0x9d, 0xf9, 0xe6, 0xfb, 0x39, 0x33, 0x02, 0xb3, 0xe7, 0x1e, 0xf8, - 0xc4, 0x7b, 0xd8, 0xdd, 0x27, 0xe5, 0x81, 0xe7, 0x06, 0x2e, 0x82, 0x08, 0xb2, 0xf4, 0xd2, 0x41, - 0x37, 0x38, 0x1c, 0xee, 0x95, 0xf7, 0xdd, 0xe3, 0xeb, 0x07, 0xee, 0x81, 0x7b, 0x9d, 0x91, 0xec, - 0x0d, 0x1f, 0xb0, 0x11, 0x1b, 0xb0, 0x5f, 0x9c, 0x75, 0x69, 0xee, 0x98, 0x04, 0x4e, 0xc7, 0x09, - 0x1c, 0x3e, 0xb6, 0x7e, 0x91, 0x81, 0x6c, 0xb5, 0xd5, 0x0e, 0x5c, 0x8f, 0x20, 0x04, 0x99, 0xfb, - 0xf7, 0x1b, 0xb5, 0x92, 0xb1, 0x62, 0x5c, 0xcd, 0x63, 0xf6, 0x1b, 0x3d, 0x0f, 0x73, 0x6d, 0xfe, - 0xa5, 0x4a, 0xa7, 0xe3, 0x11, 0xdf, 0x2f, 0xa5, 0x18, 0x76, 0x04, 0x8a, 0x96, 0x01, 0xda, 0x6f, - 0x34, 0x25, 0x4d, 0x9a, 0xd1, 0x28, 0x10, 0x54, 0x06, 0xd4, 0x74, 0xf7, 0x8f, 0x46, 0x64, 0x65, - 0x18, 0x5d, 0x02, 0x86, 0xca, 0xab, 0x06, 0x3d, 0x49, 0x37, 0xcd, 0xe5, 0x45, 0x10, 0x74, 0x05, - 0x32, 0xd8, 0xed, 0x91, 0xd2, 0xcc, 0x8a, 0x71, 0x75, 0x6e, 0xcd, 0x2c, 0x87, 0xcb, 0xaa, 0xb6, - 0x28, 0x1c, 0x33, 0x2c, 0x5d, 0x91, 0xdd, 0xdd, 0x3f, 0x2a, 0x65, 0x57, 0x8c, 0xab, 0x19, 0xcc, - 0x7e, 0xa3, 0x17, 0x60, 0xba, 0x1d, 0x38, 0x01, 0x29, 0xe5, 0x18, 0xeb, 0xf9, 0xb2, 0xa2, 0xde, - 0x96, 0xdb, 0x21, 0x0c, 0x89, 0x39, 0x0d, 0x7a, 0x1d, 0x66, 0x9a, 0xce, 0x1e, 0xe9, 0xf9, 0xa5, - 0xfc, 0x4a, 0xfa, 0x6a, 0x61, 0xed, 0xb2, 0x4a, 0x2d, 0xf4, 0x56, 0xe6, 0x14, 0xf5, 0x7e, 0xe0, - 0x3d, 0xde, 0xc8, 0x7c, 0xf0, 0xd1, 0xe5, 0x29, 0x2c, 0x98, 0xd0, 0x7f, 0x40, 0xfe, 0x2d, 0xd7, - 0x3b, 0xe2, 0xdf, 0x03, 0xf6, 0xbd, 0x85, 0x68, 0xaa, 0x21, 0x0a, 0x47, 0x54, 0xc8, 0x82, 0xd9, - 0x37, 0x86, 0xc4, 0x7b, 0x2c, 0x97, 0x5e, 0x60, 0x4b, 0xd7, 0x60, 0xe8, 0x15, 0x80, 0xaa, 0xdb, - 0x7f, 0xd0, 0x3d, 0xa8, 0x39, 0x81, 0x53, 0x9a, 0x5d, 0x31, 0xae, 0x16, 0xd6, 0x2e, 0x68, 0x33, - 0x0b, 0xb1, 0x58, 0xa1, 0x5c, 0x6a, 0x41, 0x41, 0x99, 0x2b, 0x32, 0x21, 0x7d, 0x44, 0x1e, 0x8b, - 0xed, 0xa6, 0x3f, 0xd1, 0x35, 0x98, 0x7e, 0xe8, 0xf4, 0x86, 0x84, 0x6d, 0x72, 0x41, 0x9d, 0x2b, - 0xe3, 0x6b, 0x76, 0xfd, 0x00, 0x73, 0x8a, 0xff, 0x4c, 0xbd, 0x6a, 0x58, 0x7f, 0x4a, 0x41, 0xd6, - 0x7e, 0x0a, 0xc6, 0x23, 0xb7, 0x29, 0x9d, 0xb4, 0x4d, 0x99, 0x53, 0x6c, 0xd3, 0xcb, 0x30, 0xd3, - 0x3e, 0x74, 0xbc, 0x0e, 0xb5, 0x14, 0xba, 0x4d, 0x17, 0x55, 0x6a, 0xbb, 0xc5, 0x70, 0x8d, 0xfe, - 0x03, 0x57, 0x6e, 0x0f, 0x27, 0x46, 0x6b, 0xb0, 0xd8, 0x74, 0x0f, 0x02, 0xa7, 0xdb, 0xa3, 0x13, - 0x22, 0x9e, 0x9c, 0xe5, 0x0c, 0x9b, 0x65, 0x22, 0x6e, 0x8c, 0x21, 0x67, 0x4f, 0x69, 0xc8, 0xb9, - 0x98, 0x21, 0xeb, 0x7b, 0x99, 0x3f, 0xed, 0x5e, 0x5a, 0x7f, 0x31, 0x20, 0xd7, 0x74, 0x0f, 0xfe, - 0x0e, 0x94, 0xbf, 0x0e, 0x39, 0x4c, 0x06, 0xbd, 0xee, 0xbe, 0x23, 0xd5, 0xbf, 0xa4, 0xd2, 0x37, - 0xdd, 0x03, 0x81, 0x56, 0x76, 0x20, 0xe4, 0x18, 0x59, 0xff, 0xcc, 0xa9, 0xd7, 0xff, 0x3b, 0x03, - 0x66, 0xe9, 0xfa, 0xe5, 0xd6, 0xa2, 0x12, 0x64, 0xf9, 0x80, 0xab, 0x21, 0x83, 0xe5, 0x10, 0x6d, - 0x28, 0x13, 0x4c, 0xb1, 0x09, 0x3e, 0x3f, 0x32, 0xc1, 0x50, 0x4a, 0x59, 0x12, 0x32, 0x0f, 0x51, - 0xa6, 0xb9, 0x08, 0xd3, 0xf5, 0x81, 0xbb, 0x7f, 0x28, 0xd4, 0xc4, 0x07, 0x68, 0x09, 0x72, 0x4d, - 0xe2, 0x74, 0x88, 0xd7, 0xa8, 0x31, 0x55, 0x65, 0x70, 0x38, 0x66, 0x7a, 0x25, 0xde, 0x31, 0x8b, - 0x5d, 0x54, 0xaf, 0xc4, 0x3b, 0x5e, 0xfa, 0x2f, 0x28, 0x6a, 0x1f, 0x50, 0x5d, 0x30, 0xc3, 0x5d, - 0x70, 0x51, 0x75, 0xc1, 0xbc, 0xea, 0x6d, 0x0f, 0x61, 0x4e, 0xd7, 0x25, 0xba, 0xad, 0xab, 0x80, - 0x89, 0x29, 0xac, 0x95, 0xc6, 0x2d, 0x6e, 0x23, 0x47, 0x75, 0xff, 0xe1, 0x47, 0x97, 0x0d, 0xac, - 0xab, 0xee, 0x12, 0xe4, 0xa5, 0xd8, 0x1a, 0xfb, 0x6e, 0x06, 0x47, 0x00, 0xeb, 0xe3, 0x34, 0x98, - 0x22, 0xd4, 0x6d, 0x12, 0xc7, 0x0b, 0xf6, 0x88, 0x13, 0xfc, 0x03, 0xe6, 0x8a, 0x32, 0x20, 0xdb, - 0xf1, 0xa5, 0xec, 0xaa, 0x47, 0x9c, 0x80, 0x74, 0x98, 0x63, 0xe7, 0x70, 0x02, 0x26, 0x16, 0xa8, - 0x73, 0x09, 0x81, 0xfa, 0x0a, 0x14, 0x1b, 0xfd, 0x6e, 0x10, 0xe5, 0x80, 0x3c, 0x23, 0xd2, 0x81, - 0x94, 0xea, 0x8e, 0xeb, 0xfb, 0xdd, 0x81, 0x14, 0x05, 0x9c, 0x4a, 0x03, 0xd2, 0xef, 0x71, 0xc0, - 0x5d, 0xb7, 0xdb, 0x27, 0x1d, 0x96, 0x18, 0x72, 0x58, 0x83, 0x3d, 0x69, 0x62, 0xb0, 0x5e, 0x81, - 0xd9, 0x6a, 0xab, 0xd2, 0xeb, 0xb9, 0xfb, 0x4e, 0x40, 0x1a, 0xb5, 0x84, 0xcc, 0xb0, 0x08, 0xd3, - 0x1b, 0x4e, 0xb0, 0x7f, 0x28, 0xcc, 0x83, 0x0f, 0xac, 0x5f, 0xa6, 0x60, 0x5e, 0x06, 0xa1, 0xc9, - 0xb6, 0xb1, 0x02, 0x05, 0xec, 0x3c, 0x08, 0x74, 0xc3, 0x50, 0x41, 0x09, 0xd6, 0x93, 0x4e, 0xb4, - 0x9e, 0x98, 0xb6, 0x32, 0x49, 0xda, 0xfa, 0x6c, 0x41, 0x29, 0xd9, 0x16, 0x66, 0xc6, 0xda, 0x82, - 0xae, 0xf7, 0xec, 0xa9, 0xf5, 0x5e, 0x87, 0x82, 0x92, 0x9d, 0x26, 0x84, 0xb0, 0xc9, 0x1e, 0xfa, - 0xfb, 0x14, 0x98, 0xf6, 0xd3, 0xf4, 0xd0, 0x28, 0x9f, 0xa6, 0xcf, 0x92, 0x4f, 0x93, 0xd5, 0x96, - 0x19, 0xab, 0xb6, 0x71, 0xf9, 0x77, 0xfa, 0xcc, 0xf9, 0x77, 0xe6, 0x94, 0xc1, 0x21, 0x7b, 0x42, - 0xfe, 0xcd, 0x9d, 0x7a, 0xeb, 0xbe, 0x9d, 0x82, 0x1c, 0x6e, 0xdf, 0xe3, 0x1e, 0x6c, 0x42, 0xda, - 0xf6, 0x5d, 0x19, 0xc6, 0x6d, 0xdf, 0xa5, 0xfe, 0xd2, 0xe8, 0x77, 0xc8, 0x23, 0xe9, 0x2f, 0x6c, - 0x40, 0x6d, 0xb7, 0x49, 0x1c, 0x9f, 0x6c, 0xba, 0x3d, 0x9e, 0x34, 0x78, 0x36, 0xd1, 0x81, 0xd4, - 0xd3, 0x6d, 0x6f, 0xd8, 0xa7, 0xbe, 0xd8, 0x69, 0xfa, 0x7d, 0x91, 0x59, 0x34, 0x18, 0xba, 0x0b, - 0xb3, 0x9c, 0xa9, 0xeb, 0x07, 0xae, 0xf7, 0x58, 0xd8, 0xb8, 0x96, 0xd7, 0xe4, 0xec, 0xca, 0x2a, - 0x21, 0xcf, 0x6b, 0x1a, 0xef, 0xd2, 0x2d, 0x98, 0x8f, 0x91, 0x9c, 0x94, 0x99, 0x32, 0x6a, 0x66, - 0x7a, 0x07, 0xf2, 0xcc, 0xa1, 0xf6, 0x5d, 0xaf, 0x43, 0x19, 0xe9, 0xa4, 0x05, 0x23, 0x9d, 0xeb, - 0x2a, 0x64, 0xec, 0xc7, 0x03, 0xce, 0x37, 0xa7, 0x2b, 0x97, 0xf3, 0x50, 0x2c, 0x66, 0x34, 0xd4, - 0x6a, 0xd9, 0x46, 0x50, 0xc5, 0xcc, 0x62, 0xf6, 0xdb, 0x7a, 0xcf, 0x00, 0x60, 0xf2, 0xbf, 0x36, - 0x24, 0x3e, 0x33, 0xec, 0x96, 0x73, 0x4c, 0xa4, 0x61, 0xd3, 0xdf, 0xaa, 0xe7, 0xa4, 0x74, 0xcf, - 0x11, 0xd3, 0x49, 0x47, 0xd3, 0x29, 0x41, 0xf6, 0x9e, 0xf3, 0xa8, 0xdd, 0xfd, 0x3a, 0x11, 0x9a, - 0x95, 0x43, 0xea, 0x65, 0xd2, 0xb8, 0x6b, 0x22, 0x6f, 0x47, 0x00, 0x96, 0xd0, 0x5b, 0x8d, 0x1a, - 0xb3, 0x35, 0x9a, 0xd0, 0x5b, 0x8d, 0x9a, 0x65, 0x01, 0xd8, 0xbe, 0x2b, 0x67, 0xb6, 0x08, 0xd3, - 0x55, 0x77, 0xd8, 0x0f, 0xc4, 0xe2, 0xf9, 0xc0, 0xfa, 0x8d, 0x41, 0xa3, 0x2b, 0xf3, 0x4e, 0x56, - 0x45, 0x27, 0x7a, 0xe6, 0x0d, 0xc8, 0x6f, 0x0f, 0x88, 0xe7, 0x04, 0x5d, 0xb7, 0x2f, 0x14, 0x75, - 0x5e, 0xef, 0x35, 0x18, 0xef, 0xf6, 0x00, 0x47, 0x74, 0x68, 0x23, 0xec, 0x4e, 0xb8, 0x9b, 0x5e, - 0x49, 0xe8, 0x4e, 0x18, 0xc1, 0xf8, 0x16, 0xe5, 0xa9, 0xf7, 0x04, 0x4d, 0x28, 0x54, 0x5b, 0x51, - 0x6e, 0x4b, 0x5a, 0xeb, 0x35, 0x59, 0x5d, 0xa6, 0xc6, 0x77, 0x44, 0x9c, 0xc2, 0xfa, 0x44, 0xe8, - 0xce, 0x09, 0x26, 0xe8, 0xee, 0xf4, 0xf2, 0x4e, 0xd6, 0x98, 0xfc, 0xd0, 0x17, 0xa8, 0xb1, 0xef, - 0xcc, 0x40, 0x56, 0x5a, 0x10, 0x8b, 0xf3, 0xec, 0x67, 0x98, 0x03, 0x22, 0x00, 0x2a, 0xc3, 0xcc, - 0x3d, 0x12, 0x1c, 0xba, 0x9d, 0x24, 0x57, 0xe2, 0x18, 0xe6, 0x4a, 0x82, 0x0a, 0xad, 0xab, 0x7e, - 0xc3, 0x5c, 0x60, 0x24, 0xb6, 0x45, 0x58, 0xb1, 0x46, 0xd5, 0xcf, 0x2a, 0xac, 0xba, 0x0c, 0x13, - 0x0a, 0x73, 0x96, 0xc2, 0xda, 0xbf, 0x8c, 0x56, 0x97, 0x5a, 0xd6, 0xc1, 0x1a, 0x0b, 0xba, 0x49, - 0x8d, 0x21, 0x92, 0x30, 0xcd, 0x24, 0x5c, 0x4a, 0xb0, 0xd2, 0x48, 0x80, 0xca, 0x40, 0xf9, 0x6d, - 0x85, 0x7f, 0x26, 0xce, 0x6f, 0xc7, 0xf8, 0x15, 0x06, 0x1a, 0xdc, 0x23, 0xf7, 0x4c, 0xca, 0xcb, - 0x11, 0x16, 0xab, 0x8e, 0xbc, 0xae, 0xd7, 0x43, 0x22, 0x2d, 0x94, 0xf4, 0x89, 0x47, 0x78, 0xac, - 0x57, 0x4f, 0xeb, 0xba, 0xbf, 0x8b, 0xa6, 0xae, 0x34, 0xce, 0x39, 0xb1, 0x1e, 0x1d, 0x5e, 0xd3, - 0x1c, 0x88, 0xd5, 0x82, 0x23, 0x09, 0x58, 0x41, 0x63, 0xcd, 0xd9, 0xd6, 0x75, 0x67, 0x61, 0x25, - 0x62, 0xc2, 0x87, 0x25, 0x1e, 0xeb, 0xae, 0x75, 0x0b, 0x8a, 0x35, 0xd2, 0x23, 0x01, 0x11, 0xd3, - 0x11, 0xf5, 0xe3, 0x33, 0x2a, 0xbb, 0x46, 0x80, 0x75, 0x7a, 0xb4, 0x01, 0x73, 0x3b, 0x9e, 0xfb, - 0xe8, 0x71, 0xb4, 0x61, 0x45, 0x26, 0x41, 0xab, 0xbc, 0x74, 0x0a, 0x3c, 0xc2, 0x61, 0xb5, 0xa1, - 0xc0, 0x4c, 0xd0, 0x1f, 0xb8, 0x7d, 0x9f, 0x4c, 0xa8, 0x88, 0x44, 0x5c, 0x4f, 0x69, 0x71, 0xbd, - 0xe9, 0xf8, 0x41, 0x14, 0xed, 0xe5, 0xd0, 0x2a, 0x03, 0x52, 0x36, 0x4b, 0x91, 0x7d, 0xbb, 0xeb, - 0x29, 0x9e, 0x26, 0x87, 0xd6, 0x1f, 0x32, 0xb4, 0x7a, 0x14, 0x64, 0x4f, 0xd7, 0x25, 0x2f, 0x41, - 0xbe, 0xee, 0x79, 0xae, 0x57, 0x75, 0x3b, 0x84, 0x4d, 0xb3, 0x88, 0x23, 0x00, 0xcd, 0xfc, 0x6c, - 0x70, 0x8f, 0xf8, 0xbe, 0x73, 0x40, 0x44, 0x69, 0xab, 0xc1, 0x68, 0x41, 0xd3, 0xf0, 0x37, 0x2b, - 0x5b, 0x84, 0x0c, 0x88, 0xc7, 0x5c, 0x2a, 0x87, 0x15, 0x08, 0xba, 0xa5, 0x69, 0x50, 0xf8, 0xcc, - 0xc5, 0x98, 0xd7, 0x73, 0xb4, 0x70, 0x7b, 0x4d, 0xe7, 0xd4, 0x8a, 0xdc, 0xe3, 0x63, 0xa7, 0xdf, - 0xe1, 0x15, 0x7f, 0x36, 0xc1, 0x8a, 0x14, 0x3c, 0xd6, 0xa8, 0xa9, 0xf9, 0x32, 0x47, 0x12, 0x9f, - 0xcf, 0xc5, 0x3f, 0xaf, 0xa0, 0xb1, 0x4a, 0x4b, 0xed, 0xa7, 0xda, 0x1b, 0xfa, 0x01, 0xf1, 0x6a, - 0x84, 0x16, 0x7e, 0xbe, 0xf0, 0x1c, 0xcd, 0x7e, 0x74, 0x0a, 0x3c, 0xc2, 0x81, 0x6e, 0x42, 0x3e, - 0xea, 0x87, 0xb9, 0xef, 0xac, 0xa8, 0xec, 0x21, 0x92, 0xf5, 0x69, 0x98, 0xf8, 0xc3, 0x5e, 0x80, - 0x23, 0x16, 0x74, 0x13, 0x40, 0xf1, 0x7b, 0xee, 0x40, 0xcb, 0xaa, 0x80, 0xb8, 0x21, 0x61, 0x18, - 0xf1, 0xfd, 0x43, 0xb2, 0x7f, 0x44, 0x3c, 0xee, 0xbe, 0xb3, 0x09, 0xca, 0x53, 0xf0, 0x58, 0xa3, - 0xb6, 0xee, 0xb2, 0x76, 0x8a, 0x17, 0x45, 0xa1, 0x5a, 0x5e, 0xa6, 0xe9, 0x81, 0x42, 0xfc, 0x92, - 0xc1, 0x92, 0xd6, 0xf9, 0xd8, 0x66, 0x52, 0xac, 0xd8, 0x4a, 0x49, 0x6b, 0x3d, 0xa7, 0x6d, 0x04, - 0xad, 0x4d, 0xde, 0x64, 0x49, 0x49, 0xd4, 0x26, 0x6c, 0x60, 0xdd, 0x81, 0x22, 0xad, 0xcb, 0x6d, - 0x67, 0xaf, 0x47, 0xee, 0xfb, 0xc4, 0x43, 0x4b, 0x90, 0xa3, 0x7f, 0xfb, 0x51, 0x81, 0x15, 0x8e, - 0x29, 0x6e, 0xc7, 0xf1, 0xfd, 0x77, 0x5d, 0xaf, 0x23, 0xfa, 0x86, 0x70, 0x6c, 0x7d, 0xd7, 0xa0, - 0xb3, 0x64, 0x0d, 0x49, 0x62, 0x8e, 0x1e, 0x5f, 0xa0, 0x69, 0xad, 0x4d, 0x7a, 0xa4, 0xb5, 0x89, - 0xce, 0x5d, 0x32, 0xea, 0xb9, 0xcb, 0x32, 0x4b, 0x6c, 0x7a, 0xa5, 0xa6, 0x40, 0xac, 0xef, 0xa7, - 0xa8, 0x0d, 0xd3, 0x5a, 0xbd, 0x7a, 0xe8, 0xf4, 0x0f, 0x08, 0xba, 0x11, 0xce, 0x4e, 0x1c, 0x92, - 0x2c, 0xe8, 0x55, 0x28, 0x43, 0x45, 0x1a, 0xe4, 0xeb, 0x58, 0x07, 0xe0, 0xec, 0x4a, 0xf5, 0x7a, - 0x29, 0xde, 0x1a, 0x44, 0x34, 0x58, 0xa1, 0x47, 0x36, 0xcc, 0xd1, 0x36, 0xbf, 0xeb, 0xf4, 0xee, - 0x91, 0xe3, 0x3d, 0xe2, 0xc9, 0x92, 0xe3, 0xc5, 0x71, 0x12, 0xca, 0x3a, 0x39, 0xaf, 0xd4, 0x47, - 0x64, 0x2c, 0x55, 0x60, 0x21, 0x81, 0xec, 0x4c, 0xe7, 0x48, 0xd7, 0xa0, 0xd8, 0x3e, 0x1c, 0x06, - 0x1d, 0xf7, 0xdd, 0x3e, 0x8f, 0xdb, 0x74, 0x6f, 0xe8, 0x8f, 0x70, 0xcb, 0xe4, 0xd0, 0xfa, 0x49, - 0x06, 0xce, 0xb5, 0xf7, 0x0f, 0x49, 0x67, 0xd8, 0x23, 0xc2, 0xcb, 0x13, 0x77, 0xf7, 0x0a, 0x14, - 0x37, 0x5c, 0x37, 0xf0, 0x03, 0xcf, 0x19, 0x0c, 0xba, 0xfd, 0x03, 0xf6, 0xd1, 0x1c, 0xd6, 0x81, - 0x34, 0x34, 0x88, 0xe6, 0x8c, 0x29, 0x34, 0xcd, 0x14, 0xaa, 0x85, 0x06, 0x05, 0x8d, 0x55, 0x5a, - 0x1e, 0x93, 0x22, 0x55, 0x89, 0x5a, 0xa4, 0x34, 0x4e, 0x95, 0x58, 0xdf, 0xfd, 0x5b, 0x23, 0x2b, - 0x16, 0x85, 0xc8, 0x33, 0x7a, 0x60, 0x50, 0x08, 0xf0, 0x88, 0x86, 0xb6, 0x60, 0x9e, 0xf7, 0xac, - 0x4a, 0x13, 0x2b, 0x22, 0xab, 0x56, 0x0f, 0xc5, 0x88, 0x70, 0x9c, 0x2f, 0x9e, 0x67, 0xb3, 0x67, - 0xcc, 0xb3, 0x5b, 0x30, 0x7f, 0xd7, 0xed, 0xf6, 0xf9, 0x81, 0x87, 0x88, 0x7f, 0x22, 0xd0, 0x6a, - 0xb3, 0x89, 0x11, 0xe1, 0x38, 0x1f, 0xda, 0x04, 0x93, 0x4b, 0x67, 0x89, 0x98, 0x4f, 0x28, 0x1f, - 0xaf, 0xb3, 0x46, 0x69, 0x70, 0x8c, 0xcb, 0xba, 0x9e, 0x30, 0x2d, 0x1a, 0x33, 0xea, 0x8f, 0xba, - 0x7e, 0x40, 0x8d, 0x82, 0x46, 0xaf, 0x3c, 0x0e, 0xc7, 0x56, 0x2f, 0x41, 0xab, 0xe8, 0x06, 0x64, - 0x68, 0xc0, 0x11, 0x6e, 0xaa, 0x29, 0x45, 0x8b, 0x54, 0xc2, 0x59, 0x19, 0x31, 0xeb, 0x98, 0x1d, - 0xff, 0x88, 0x76, 0x8b, 0x7b, 0x8e, 0x2f, 0x6d, 0x5e, 0x83, 0x51, 0xb3, 0xd7, 0xd5, 0x38, 0xde, - 0xec, 0x5f, 0x8c, 0xeb, 0x64, 0x02, 0xb5, 0xa3, 0xe7, 0xcb, 0xf0, 0xe0, 0xd7, 0x88, 0x0e, 0x7e, - 0xd1, 0xeb, 0x90, 0x13, 0x34, 0xf2, 0x08, 0xfa, 0x59, 0xcd, 0xf8, 0x74, 0x1f, 0x93, 0xe7, 0x51, - 0x92, 0xc5, 0xfa, 0x73, 0x86, 0x16, 0x85, 0xfc, 0x83, 0x34, 0x4b, 0xc9, 0x33, 0x7b, 0x43, 0x39, - 0xb3, 0xff, 0xe7, 0x3a, 0x7d, 0xad, 0x84, 0x8d, 0x5c, 0x8e, 0xa9, 0xf3, 0xb9, 0x84, 0xea, 0x9a, - 0x1d, 0xe8, 0x9f, 0xf2, 0x72, 0x2e, 0xff, 0x44, 0x97, 0x73, 0x90, 0x7c, 0xe6, 0xab, 0x9f, 0x4f, - 0x16, 0x4e, 0x73, 0x9a, 0x3b, 0x7b, 0xe2, 0x69, 0x6e, 0xf1, 0x4b, 0xbb, 0xe6, 0xfb, 0x81, 0xc1, - 0xef, 0x88, 0xc5, 0x85, 0x28, 0xd3, 0xad, 0xac, 0x45, 0x2e, 0x27, 0x34, 0x17, 0x65, 0x4e, 0xa1, - 0xe9, 0x9c, 0x83, 0x96, 0x30, 0x14, 0x14, 0x64, 0xc2, 0xd4, 0x5e, 0xd2, 0xa7, 0x76, 0x71, 0xcc, - 0xb6, 0xaa, 0xd3, 0xfb, 0x6d, 0x8a, 0x9d, 0xa2, 0x3e, 0x15, 0xe7, 0xf8, 0xea, 0xe0, 0xf3, 0xc4, - 0x83, 0x4f, 0x6a, 0x0d, 0xf6, 0x69, 0xac, 0xc1, 0xfe, 0x7c, 0xad, 0xc1, 0x4e, 0xb6, 0x86, 0xef, - 0x19, 0x00, 0x4a, 0xd8, 0x4e, 0xaa, 0x56, 0xa4, 0x81, 0xa4, 0x14, 0x03, 0xb9, 0x02, 0x45, 0x6a, - 0xf6, 0xa4, 0xaf, 0x07, 0x46, 0x1d, 0x38, 0xa2, 0xb3, 0xcc, 0xa9, 0x75, 0xf6, 0xe3, 0x68, 0x52, - 0x54, 0x6d, 0xff, 0x3d, 0xa2, 0x36, 0x2b, 0xd6, 0x20, 0x9f, 0xa4, 0xb9, 0x37, 0x4e, 0xd2, 0xdc, - 0x8b, 0xba, 0xe6, 0x2e, 0x24, 0x7c, 0x81, 0x66, 0x71, 0x45, 0x71, 0xdf, 0x30, 0x46, 0xdb, 0xf7, - 0x71, 0xa5, 0x9e, 0xae, 0xa8, 0xd4, 0xc9, 0x8a, 0x4a, 0x9f, 0x5a, 0x51, 0x7f, 0x34, 0x46, 0x7b, - 0x40, 0xf4, 0x32, 0xe4, 0xc4, 0x56, 0x4b, 0x75, 0x2d, 0x24, 0x98, 0x81, 0x4c, 0x99, 0x92, 0x94, - 0xb2, 0x55, 0x25, 0x5b, 0x2a, 0xce, 0x56, 0xd5, 0xd9, 0x24, 0x29, 0x7a, 0x95, 0x1d, 0x65, 0x0b, - 0x3e, 0x1e, 0x03, 0x16, 0x93, 0x4e, 0xbc, 0x04, 0x63, 0x44, 0x8c, 0x6e, 0x42, 0x21, 0x52, 0x2c, - 0x4d, 0x98, 0xe9, 0xf1, 0x7a, 0x97, 0x6d, 0xb7, 0xc2, 0x60, 0x7d, 0xcb, 0x80, 0x82, 0x58, 0x3a, - 0x0b, 0x63, 0xaf, 0xb1, 0x75, 0xf3, 0x60, 0x64, 0x88, 0x60, 0x14, 0xc6, 0x69, 0x81, 0xd1, 0x3a, - 0xbf, 0x90, 0x1c, 0xad, 0xf3, 0x45, 0x70, 0x5e, 0xbe, 0xf8, 0x92, 0x12, 0xe3, 0x05, 0x4a, 0x63, - 0x8e, 0x18, 0xac, 0x5f, 0xa5, 0xe0, 0xbc, 0xe8, 0x31, 0x64, 0xdd, 0x28, 0x8e, 0xc5, 0x9e, 0x87, - 0xb9, 0xd6, 0xf0, 0x78, 0xfb, 0x41, 0x24, 0x9c, 0xc7, 0xd8, 0x11, 0x28, 0xb5, 0x11, 0x06, 0x09, - 0xe7, 0xcf, 0x3d, 0x4d, 0x07, 0xa2, 0x55, 0x30, 0x25, 0x5f, 0x78, 0x55, 0xc7, 0xfb, 0xbf, 0x18, - 0x1c, 0x5d, 0x80, 0x99, 0x16, 0x79, 0x14, 0x84, 0xd7, 0xec, 0x62, 0x84, 0x6c, 0x28, 0xf0, 0x5f, - 0x1b, 0x8f, 0xb7, 0x88, 0xbc, 0x05, 0x59, 0x53, 0x95, 0x9e, 0xb8, 0x92, 0xb2, 0xc2, 0xc4, 0xfb, - 0x2c, 0x55, 0xcc, 0xd2, 0x4d, 0x30, 0x47, 0x09, 0x92, 0xaf, 0x44, 0xc7, 0xdc, 0x87, 0xfc, 0x3c, - 0xc5, 0x2f, 0xe6, 0x27, 0xa6, 0xa4, 0xaf, 0x6e, 0x44, 0x93, 0x02, 0xc0, 0xcf, 0x52, 0xe2, 0x59, - 0x0b, 0x8d, 0x93, 0x37, 0xc3, 0x6c, 0xcc, 0x1d, 0x60, 0x25, 0xe6, 0x89, 0x2c, 0x4a, 0x32, 0x12, - 0x3d, 0x4a, 0x72, 0x0b, 0xbb, 0x19, 0xc6, 0xd9, 0xd4, 0x24, 0xfe, 0xb1, 0x51, 0xb6, 0x0d, 0x05, - 0x45, 0x78, 0x42, 0x93, 0x5d, 0xd6, 0xa3, 0xec, 0xd8, 0x97, 0x17, 0x8a, 0x71, 0x30, 0xa1, 0x13, - 0x43, 0xf7, 0x49, 0x42, 0x93, 0xb2, 0xde, 0xfb, 0xd3, 0xfa, 0xb9, 0x53, 0xa2, 0xc5, 0xdd, 0xd2, - 0x02, 0x4c, 0x62, 0x85, 0x15, 0xa1, 0x65, 0x88, 0x52, 0x43, 0xd2, 0x8d, 0x30, 0xf3, 0x8b, 0x90, - 0xbe, 0x90, 0x90, 0xef, 0xe5, 0x29, 0x8a, 0xac, 0x11, 0x5e, 0x89, 0x36, 0x54, 0x64, 0xcc, 0xc5, - 0xa4, 0x6d, 0x90, 0x16, 0x17, 0x6e, 0xfe, 0x8d, 0xb0, 0xe8, 0x14, 0xed, 0xfa, 0x42, 0x42, 0xa9, - 0x29, 0x3f, 0x26, 0xcb, 0xd3, 0xeb, 0xf2, 0x2a, 0x88, 0x77, 0x1b, 0x5a, 0xfb, 0x28, 0x4f, 0x48, - 0xb5, 0x0b, 0xa1, 0x96, 0xb0, 0x6b, 0xd1, 0x80, 0x89, 0x53, 0xbb, 0x2c, 0xe3, 0x5e, 0x1e, 0x6d, - 0x3e, 0x75, 0x2a, 0x9c, 0xc0, 0x89, 0xea, 0x23, 0x07, 0x6a, 0xa2, 0xb0, 0x3a, 0xb1, 0x8f, 0x1d, - 0x39, 0x86, 0x93, 0xf1, 0xae, 0xc3, 0x1a, 0x13, 0x19, 0xef, 0x3a, 0x68, 0x4b, 0x8f, 0x77, 0xc0, - 0xcc, 0xfa, 0xda, 0xb8, 0xd3, 0xc5, 0xc9, 0x61, 0x0e, 0xad, 0xab, 0x45, 0x89, 0x38, 0xeb, 0xbc, - 0x90, 0x5c, 0x8a, 0xc8, 0xeb, 0xa1, 0x08, 0xf2, 0x99, 0x83, 0xe4, 0xfb, 0x39, 0x30, 0xe5, 0x96, - 0x84, 0x17, 0xe9, 0xe1, 0xb5, 0xb9, 0xa1, 0x5e, 0x9b, 0x27, 0x15, 0x6c, 0x51, 0x46, 0x48, 0x6b, - 0x19, 0x61, 0x5b, 0xd7, 0x10, 0x4f, 0xc3, 0x2f, 0x25, 0xd9, 0x41, 0x78, 0x3f, 0x3e, 0x59, 0x4b, - 0x09, 0xef, 0xb8, 0xbe, 0x7c, 0x33, 0xeb, 0x80, 0x39, 0x72, 0x66, 0x20, 0x1b, 0xe1, 0xb5, 0x89, - 0x4b, 0x1d, 0x65, 0x52, 0xa3, 0x5e, 0x4c, 0x22, 0x6a, 0xa8, 0x75, 0x04, 0x7f, 0x00, 0xfb, 0xc2, - 0x44, 0xf1, 0x21, 0x35, 0xd7, 0x63, 0xc4, 0xad, 0x7a, 0x33, 0x9c, 0xda, 0x9b, 0x95, 0x78, 0x53, - 0x78, 0xa2, 0x78, 0x33, 0x7b, 0x86, 0x78, 0x33, 0x12, 0x1d, 0x8b, 0x67, 0x8e, 0x8e, 0x31, 0xd7, - 0x9f, 0x7b, 0x22, 0xd7, 0xd7, 0xbd, 0xf2, 0xdc, 0x17, 0xeb, 0x95, 0x4b, 0xef, 0xc0, 0xf9, 0x44, - 0x1b, 0x39, 0x63, 0x9e, 0xd2, 0x2e, 0x88, 0x14, 0xf1, 0xeb, 0xec, 0x0d, 0xe3, 0x98, 0xa4, 0x7a, - 0x62, 0xc8, 0x68, 0x40, 0x41, 0x7d, 0xfe, 0xf8, 0x19, 0x5e, 0x38, 0x59, 0x3f, 0x4c, 0xc1, 0x62, - 0xd2, 0x5d, 0xd0, 0x84, 0x1b, 0xc7, 0x9d, 0xd8, 0x33, 0xd2, 0xf2, 0x49, 0x37, 0x4b, 0xfa, 0x73, - 0xd2, 0x58, 0x51, 0xf5, 0x74, 0x1e, 0x95, 0xda, 0x27, 0x3f, 0x2a, 0x9d, 0xd4, 0x47, 0x2b, 0x1a, - 0x55, 0x75, 0xfd, 0x53, 0x03, 0x60, 0xc3, 0xd9, 0x3f, 0x1a, 0x0e, 0x68, 0x5d, 0xa6, 0x84, 0x5b, - 0x43, 0x0b, 0xb7, 0x0d, 0x3d, 0xdc, 0x72, 0xbd, 0xfc, 0xbb, 0x2a, 0x3f, 0x12, 0xf2, 0x39, 0x57, - 0xdd, 0xdf, 0x34, 0x64, 0xcd, 0xd9, 0x08, 0xc8, 0x71, 0xe2, 0x33, 0x21, 0x0b, 0x66, 0xab, 0x43, - 0xcf, 0x23, 0xfd, 0xe0, 0x4d, 0xe5, 0x6e, 0x44, 0x83, 0x51, 0x9a, 0x1a, 0x79, 0xe0, 0x0c, 0x7b, - 0x82, 0x86, 0xd7, 0xdc, 0x1a, 0x8c, 0x6e, 0x51, 0xa3, 0x1f, 0x10, 0xaf, 0xef, 0xf4, 0x44, 0xb1, - 0x1d, 0x8e, 0xad, 0x1f, 0x19, 0x6a, 0xe9, 0x8b, 0x5e, 0x87, 0x6c, 0xd5, 0xed, 0x07, 0x84, 0xbd, - 0x0a, 0x8a, 0x9f, 0x54, 0x86, 0x84, 0x65, 0x41, 0xc5, 0x15, 0x23, 0x79, 0x96, 0x30, 0xbb, 0xf8, - 0x08, 0x11, 0x67, 0xec, 0xf4, 0x23, 0x75, 0x28, 0x8a, 0x5a, 0xfd, 0x3f, 0x80, 0xfb, 0x83, 0x8e, - 0x13, 0xf0, 0xab, 0x95, 0x8b, 0xb0, 0xa0, 0x3d, 0x3f, 0xe3, 0x28, 0x73, 0x0a, 0x9d, 0x87, 0x79, - 0xf9, 0xe4, 0xac, 0xd9, 0x6e, 0x09, 0xb0, 0x81, 0x16, 0xe0, 0x1c, 0x8d, 0x53, 0x6c, 0x3a, 0x02, - 0x98, 0x42, 0x45, 0xc8, 0xdb, 0xed, 0x6d, 0x31, 0x4c, 0xaf, 0x96, 0x21, 0x1f, 0x3e, 0x13, 0x47, - 0xe7, 0xa0, 0xd0, 0x72, 0xbd, 0x63, 0xa7, 0xc7, 0x86, 0xe6, 0x14, 0x32, 0x61, 0xd6, 0xee, 0x1e, - 0x13, 0x77, 0x18, 0x70, 0x88, 0xb1, 0xfa, 0xd7, 0x14, 0x40, 0x74, 0x59, 0x8e, 0xe6, 0x00, 0xec, - 0xf6, 0xf6, 0xee, 0xfd, 0x9d, 0x5a, 0xc5, 0xae, 0x9b, 0x53, 0x08, 0x60, 0xa6, 0xb2, 0xb3, 0x53, - 0x6f, 0xd5, 0x4c, 0x03, 0xe5, 0x20, 0x83, 0xeb, 0x95, 0x9a, 0x99, 0x42, 0xb3, 0x90, 0xb3, 0xf1, - 0xfd, 0x56, 0x95, 0xd2, 0xa4, 0xa9, 0xd0, 0x3b, 0x75, 0x7b, 0x37, 0x84, 0x64, 0x50, 0x01, 0xb2, - 0xd5, 0xed, 0x56, 0xab, 0x5e, 0xb5, 0xcd, 0x69, 0x2a, 0x52, 0x0c, 0x76, 0xf1, 0xb6, 0x39, 0x83, - 0xe6, 0xa1, 0xd8, 0xdc, 0xbe, 0xb3, 0xbb, 0x59, 0xaf, 0x60, 0x7b, 0xa3, 0x5e, 0xb1, 0xcd, 0x2c, - 0x95, 0x50, 0x6d, 0x29, 0x90, 0x1c, 0x9b, 0xa8, 0x0a, 0xc9, 0x23, 0x04, 0x73, 0xd5, 0xcd, 0x7a, - 0x75, 0x6b, 0x77, 0xb3, 0xb2, 0x55, 0xaf, 0xef, 0xd4, 0xb1, 0x09, 0x54, 0x81, 0xf4, 0xcb, 0xd5, - 0xe6, 0xfd, 0xb6, 0x5d, 0xc7, 0xbb, 0xb5, 0xba, 0x5d, 0x69, 0x34, 0xdb, 0x66, 0x81, 0x12, 0x53, - 0x44, 0x7b, 0xb3, 0x82, 0x6b, 0xbb, 0x8d, 0xd6, 0xed, 0x6d, 0x73, 0x96, 0x09, 0x68, 0xed, 0x56, - 0x9a, 0xcd, 0x6d, 0x3a, 0xcb, 0xdd, 0x46, 0xcd, 0x2c, 0x52, 0x45, 0xab, 0x02, 0xda, 0x36, 0x9d, - 0xff, 0x1c, 0x53, 0x34, 0xd3, 0xc0, 0x6e, 0xb5, 0xb5, 0xdb, 0xac, 0x6c, 0xd4, 0x9b, 0xe6, 0x39, - 0x54, 0x82, 0xc5, 0x08, 0xf8, 0xd6, 0x36, 0xde, 0x12, 0xe4, 0x26, 0x95, 0xbc, 0x53, 0xb1, 0xab, - 0x9b, 0x14, 0xd1, 0xb6, 0xb7, 0x71, 0xdd, 0x9c, 0xa7, 0x22, 0x6a, 0xf5, 0x66, 0x9d, 0x53, 0x73, - 0x20, 0xa2, 0xc0, 0x1d, 0xbc, 0xfd, 0x3f, 0xff, 0xab, 0x2c, 0x6c, 0x61, 0xb5, 0x05, 0x10, 0xbd, - 0xc5, 0xa3, 0xda, 0xa2, 0x7b, 0xcc, 0x21, 0xe6, 0x14, 0x55, 0xb5, 0xb4, 0x6f, 0xd3, 0xa0, 0x1b, - 0xca, 0x2c, 0x26, 0xdc, 0xfd, 0x79, 0xf1, 0xac, 0x11, 0x93, 0xff, 0x27, 0xfb, 0x01, 0xe9, 0x98, - 0xe9, 0xd5, 0x55, 0xc8, 0x87, 0x4f, 0xd6, 0x28, 0x7b, 0x9b, 0x04, 0x6c, 0x64, 0x4e, 0x51, 0x76, - 0x7e, 0xbb, 0xc2, 0x01, 0xc6, 0xea, 0xaf, 0x53, 0x80, 0x64, 0x29, 0xa1, 0x18, 0x26, 0xb5, 0x82, - 0xee, 0xfe, 0x91, 0x6a, 0x8f, 0xca, 0xdb, 0xa0, 0xd0, 0x1e, 0xa9, 0x99, 0xc6, 0xc0, 0x29, 0x74, - 0x01, 0x90, 0xfa, 0x14, 0x49, 0x9a, 0x26, 0xfd, 0xfa, 0x1d, 0x12, 0x84, 0x66, 0x9e, 0x41, 0xcf, - 0xc4, 0x32, 0x9e, 0x40, 0x4d, 0x53, 0x95, 0xb6, 0x09, 0x37, 0x52, 0x01, 0x9b, 0xa1, 0x1b, 0xa0, - 0x1f, 0x29, 0x08, 0x4c, 0x16, 0x5d, 0x86, 0x67, 0xdb, 0x24, 0x88, 0x17, 0x6b, 0x82, 0x20, 0x87, - 0x96, 0xe0, 0x82, 0x20, 0x08, 0xb3, 0xbd, 0xc0, 0xe5, 0xa9, 0x0a, 0xf9, 0x6f, 0xa1, 0x35, 0x13, - 0xe8, 0xc2, 0x24, 0x28, 0xbc, 0x81, 0x30, 0x0b, 0xd4, 0x28, 0x77, 0x68, 0x5a, 0x15, 0x47, 0x56, - 0xe6, 0x2c, 0xe5, 0xc5, 0xe4, 0xd8, 0x7d, 0x28, 0x6f, 0xb6, 0xcc, 0x22, 0x9d, 0xa5, 0x7e, 0x96, - 0x27, 0x3e, 0x34, 0xb7, 0xfa, 0x9e, 0x01, 0x45, 0xad, 0x44, 0xa5, 0xf6, 0x20, 0x01, 0xa2, 0x7b, - 0x37, 0xa7, 0xa8, 0x56, 0x24, 0x50, 0xbb, 0xc4, 0x35, 0x0d, 0xf4, 0x6f, 0xf0, 0xaf, 0x31, 0x94, - 0xac, 0x15, 0x30, 0xd9, 0x27, 0xdd, 0x87, 0xa4, 0x63, 0xa6, 0xd0, 0xb3, 0x70, 0x31, 0x46, 0x76, - 0xdb, 0xe9, 0xf6, 0xa8, 0x79, 0xa8, 0xdf, 0xc4, 0xc3, 0x7e, 0x9f, 0x0a, 0xce, 0xac, 0xee, 0x25, - 0x15, 0xc9, 0x74, 0x29, 0x1a, 0x34, 0x9a, 0xe3, 0x28, 0x46, 0x4a, 0x32, 0x62, 0x98, 0x76, 0xe0, - 0x0e, 0x06, 0x74, 0x56, 0xab, 0x87, 0x60, 0x8e, 0xde, 0xda, 0x53, 0x43, 0xab, 0x74, 0x3a, 0x22, - 0x0f, 0x9a, 0x53, 0x91, 0x3e, 0x25, 0xc8, 0xa0, 0x4a, 0x6f, 0x07, 0x8e, 0x17, 0x48, 0x48, 0x8a, - 0xda, 0x11, 0x95, 0x2a, 0x01, 0x69, 0x2a, 0x65, 0xab, 0xdb, 0xeb, 0xbd, 0xed, 0x1e, 0xef, 0x75, - 0x89, 0x99, 0x59, 0xbd, 0xa7, 0xdd, 0x76, 0x53, 0x34, 0xad, 0x7c, 0x38, 0xc4, 0x9c, 0x62, 0x11, - 0xb3, 0x25, 0x87, 0x06, 0x1d, 0x56, 0xc3, 0x61, 0x8a, 0x6d, 0x32, 0x2b, 0xea, 0x04, 0x24, 0xbd, - 0x51, 0xff, 0xf0, 0x93, 0xe5, 0xa9, 0x0f, 0x3e, 0x5d, 0x36, 0x3e, 0xfc, 0x74, 0xd9, 0xf8, 0xf8, - 0xd3, 0x65, 0xe3, 0xed, 0x1b, 0xca, 0x7f, 0xfe, 0x1d, 0x3b, 0x81, 0xd7, 0x7d, 0xe4, 0x7a, 0xdd, - 0x83, 0x6e, 0x5f, 0x0e, 0xfa, 0xe4, 0xfa, 0xe0, 0xe8, 0xe0, 0xfa, 0x60, 0xef, 0x7a, 0x94, 0x11, - 0xf6, 0x66, 0xd8, 0xbf, 0xfd, 0xdd, 0xf8, 0x5b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x36, 0x76, 0x6e, - 0x91, 0x55, 0x38, 0x00, 0x00, + // 3664 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3b, 0xcd, 0x6f, 0x1b, 0xc7, + 0xbd, 0x5a, 0x92, 0x12, 0xc9, 0x1f, 0x45, 0x79, 0x35, 0x92, 0x6d, 0x46, 0xf1, 0x93, 0xf5, 0x36, + 0x7e, 0x79, 0xb6, 0x92, 0xd0, 0x78, 0x32, 0x12, 0x24, 0xef, 0x29, 0xf6, 0xa3, 0x48, 0xda, 0xa2, + 0x45, 0x53, 0xca, 0x70, 0x9d, 0xbc, 0x17, 0x20, 0xd0, 0x5b, 0x89, 0x63, 0x89, 0x4f, 0x14, 0x97, + 0xdd, 0x5d, 0x3a, 0x76, 0x8f, 0x45, 0x51, 0xa0, 0xed, 0xa5, 0x28, 0x50, 0x20, 0x28, 0xfa, 0x81, + 0x5e, 0x7b, 0x69, 0x0e, 0x3d, 0x14, 0x05, 0x8a, 0x5e, 0x73, 0xcc, 0x5f, 0x10, 0x24, 0x39, 0xb6, + 0x87, 0xde, 0x8a, 0x02, 0x45, 0xd1, 0x62, 0xbe, 0x76, 0x67, 0xb8, 0x4b, 0x4a, 0x72, 0x9c, 0xa4, + 0x68, 0x73, 0x12, 0xe7, 0xf7, 0xb5, 0x33, 0xbf, 0xf9, 0x7d, 0xce, 0x8c, 0xc0, 0xec, 0xb9, 0x07, + 0x3e, 0xf1, 0x1e, 0x76, 0xf7, 0x49, 0x79, 0xe0, 0xb9, 0x81, 0x8b, 0x20, 0x82, 0x2c, 0xbd, 0x74, + 0xd0, 0x0d, 0x0e, 0x87, 0x7b, 0xe5, 0x7d, 0xf7, 0xf8, 0xfa, 0x81, 0x7b, 0xe0, 0x5e, 0x67, 0x24, + 0x7b, 0xc3, 0x07, 0x6c, 0xc4, 0x06, 0xec, 0x17, 0x67, 0x5d, 0x9a, 0x3b, 0x26, 0x81, 0xd3, 0x71, + 0x02, 0x87, 0x8f, 0xad, 0x5f, 0x67, 0x20, 0x5b, 0x6d, 0xb5, 0x03, 0xd7, 0x23, 0x08, 0x41, 0xe6, + 0xfe, 0xfd, 0x46, 0xad, 0x64, 0xac, 0x18, 0x57, 0xf3, 0x98, 0xfd, 0x46, 0xcf, 0xc3, 0x5c, 0x9b, + 0x7f, 0xa9, 0xd2, 0xe9, 0x78, 0xc4, 0xf7, 0x4b, 0x29, 0x86, 0x1d, 0x81, 0xa2, 0x65, 0x80, 0xf6, + 0x1b, 0x4d, 0x49, 0x93, 0x66, 0x34, 0x0a, 0x04, 0x95, 0x01, 0x35, 0xdd, 0xfd, 0xa3, 0x11, 0x59, + 0x19, 0x46, 0x97, 0x80, 0xa1, 0xf2, 0xaa, 0x41, 0x4f, 0xd2, 0x4d, 0x73, 0x79, 0x11, 0x04, 0x5d, + 0x81, 0x0c, 0x76, 0x7b, 0xa4, 0x34, 0xb3, 0x62, 0x5c, 0x9d, 0x5b, 0x33, 0xcb, 0xe1, 0xb2, 0xaa, + 0x2d, 0x0a, 0xc7, 0x0c, 0x4b, 0x57, 0x64, 0x77, 0xf7, 0x8f, 0x4a, 0xd9, 0x15, 0xe3, 0x6a, 0x06, + 0xb3, 0xdf, 0xe8, 0x05, 0x98, 0x6e, 0x07, 0x4e, 0x40, 0x4a, 0x39, 0xc6, 0x7a, 0xbe, 0xac, 0xa8, + 0xb7, 0xe5, 0x76, 0x08, 0x43, 0x62, 0x4e, 0x83, 0x5e, 0x87, 0x99, 0xa6, 0xb3, 0x47, 0x7a, 0x7e, + 0x29, 0xbf, 0x92, 0xbe, 0x5a, 0x58, 0xbb, 0xac, 0x52, 0x0b, 0xbd, 0x95, 0x39, 0x45, 0xbd, 0x1f, + 0x78, 0x8f, 0x37, 0x32, 0x1f, 0x7c, 0x74, 0x79, 0x0a, 0x0b, 0x26, 0xf4, 0x1f, 0x90, 0x7f, 0xcb, + 0xf5, 0x8e, 0xf8, 0xf7, 0x80, 0x7d, 0x6f, 0x21, 0x9a, 0x6a, 0x88, 0xc2, 0x11, 0x15, 0xb2, 0x60, + 0xf6, 0x8d, 0x21, 0xf1, 0x1e, 0xcb, 0xa5, 0x17, 0xd8, 0xd2, 0x35, 0x18, 0x7a, 0x05, 0xa0, 0xea, + 0xf6, 0x1f, 0x74, 0x0f, 0x6a, 0x4e, 0xe0, 0x94, 0x66, 0x57, 0x8c, 0xab, 0x85, 0xb5, 0x0b, 0xda, + 0xcc, 0x42, 0x2c, 0x56, 0x28, 0x97, 0x5a, 0x50, 0x50, 0xe6, 0x8a, 0x4c, 0x48, 0x1f, 0x91, 0xc7, + 0x62, 0xbb, 0xe9, 0x4f, 0x74, 0x0d, 0xa6, 0x1f, 0x3a, 0xbd, 0x21, 0x61, 0x9b, 0x5c, 0x50, 0xe7, + 0xca, 0xf8, 0x9a, 0x5d, 0x3f, 0xc0, 0x9c, 0xe2, 0x3f, 0x53, 0xaf, 0x1a, 0xd6, 0x8f, 0xd3, 0x90, + 0xb5, 0x9f, 0x82, 0xf1, 0xc8, 0x6d, 0x4a, 0x27, 0x6d, 0x53, 0xe6, 0x14, 0xdb, 0xf4, 0x32, 0xcc, + 0xb4, 0x0f, 0x1d, 0xaf, 0x43, 0x2d, 0x85, 0x6e, 0xd3, 0x45, 0x95, 0xda, 0x6e, 0x31, 0x5c, 0xa3, + 0xff, 0xc0, 0x95, 0xdb, 0xc3, 0x89, 0xd1, 0x1a, 0x2c, 0x36, 0xdd, 0x83, 0xc0, 0xe9, 0xf6, 0xe8, + 0x84, 0x88, 0x27, 0x67, 0x39, 0xc3, 0x66, 0x99, 0x88, 0x1b, 0x63, 0xc8, 0xd9, 0x53, 0x1a, 0x72, + 0x2e, 0x66, 0xc8, 0xfa, 0x5e, 0xe6, 0x4f, 0xbb, 0x97, 0x31, 0x3b, 0x81, 0xb8, 0x9d, 0x58, 0x7f, + 0x31, 0x20, 0xd7, 0x74, 0x0f, 0xfe, 0x0e, 0x36, 0x68, 0x1d, 0x72, 0x98, 0x0c, 0x7a, 0xdd, 0x7d, + 0x47, 0x6e, 0xd1, 0x92, 0x4a, 0xdf, 0x74, 0x0f, 0x04, 0x5a, 0xd9, 0xa5, 0x90, 0x63, 0x44, 0x47, + 0x33, 0xa7, 0xd5, 0x91, 0xf5, 0x07, 0x03, 0x66, 0xe9, 0xfa, 0xe5, 0xf6, 0xa3, 0x12, 0x64, 0xf9, + 0x80, 0xab, 0x21, 0x83, 0xe5, 0x10, 0x6d, 0x28, 0x13, 0x4c, 0xb1, 0x09, 0x3e, 0x3f, 0x32, 0xc1, + 0x50, 0x4a, 0x59, 0x12, 0x32, 0x2f, 0x52, 0xa6, 0xb9, 0x08, 0xd3, 0xf5, 0x81, 0xbb, 0x7f, 0x28, + 0xd4, 0xc4, 0x07, 0x68, 0x09, 0x72, 0x4d, 0xe2, 0x74, 0x88, 0xd7, 0xa8, 0x31, 0x55, 0x65, 0x70, + 0x38, 0x66, 0x7a, 0x25, 0xde, 0x31, 0x8b, 0x6f, 0x54, 0xaf, 0xc4, 0x3b, 0x5e, 0xfa, 0x2f, 0x28, + 0x6a, 0x1f, 0x50, 0xdd, 0x34, 0xc3, 0xdd, 0x74, 0x51, 0x75, 0xd3, 0xbc, 0xea, 0x91, 0x0f, 0x61, + 0x4e, 0xd7, 0x25, 0xba, 0xad, 0xab, 0x80, 0x89, 0x29, 0xac, 0x95, 0xc6, 0x2d, 0x6e, 0x23, 0x47, + 0x75, 0xff, 0xe1, 0x47, 0x97, 0x0d, 0xac, 0xab, 0xee, 0x12, 0xe4, 0xa5, 0xd8, 0x1a, 0xfb, 0x6e, + 0x06, 0x47, 0x00, 0xeb, 0xe3, 0x34, 0x98, 0x22, 0x1c, 0x6e, 0x12, 0xc7, 0x0b, 0xf6, 0x88, 0x13, + 0xfc, 0x03, 0xe6, 0x93, 0x32, 0x20, 0xdb, 0xf1, 0xa5, 0xec, 0xaa, 0x47, 0x9c, 0x80, 0x74, 0x98, + 0xf3, 0xe7, 0x70, 0x02, 0x26, 0xe6, 0xa4, 0xb9, 0x84, 0x60, 0x7e, 0x05, 0x8a, 0x8d, 0x7e, 0x37, + 0x88, 0xf2, 0x44, 0x9e, 0x11, 0xe9, 0x40, 0x4a, 0x75, 0xc7, 0xf5, 0xfd, 0xee, 0x40, 0xf7, 0x77, + 0x1d, 0x48, 0xbf, 0xc7, 0x01, 0x77, 0xdd, 0x6e, 0x9f, 0x74, 0x58, 0xf2, 0xc8, 0x61, 0x0d, 0xf6, + 0xa4, 0xc9, 0xc3, 0x7a, 0x05, 0x66, 0xab, 0xad, 0x4a, 0xaf, 0xe7, 0xee, 0x3b, 0x01, 0x69, 0xd4, + 0x12, 0xb2, 0xc7, 0x22, 0x4c, 0x6f, 0x38, 0xc1, 0xfe, 0xa1, 0x30, 0x0f, 0x3e, 0xb0, 0x7e, 0x93, + 0x82, 0x79, 0x19, 0x84, 0x26, 0xdb, 0xc6, 0x0a, 0x14, 0xb0, 0xf3, 0x20, 0xd0, 0x0d, 0x43, 0x05, + 0x25, 0x58, 0x4f, 0x3a, 0xd1, 0x7a, 0x62, 0xda, 0xca, 0x24, 0x69, 0xeb, 0xb3, 0x05, 0xa5, 0x64, + 0x5b, 0x98, 0x19, 0x6b, 0x0b, 0xba, 0xde, 0xb3, 0xa7, 0xd6, 0x7b, 0x1d, 0x0a, 0x4a, 0x06, 0x9b, + 0x10, 0xc2, 0x26, 0x7b, 0xe8, 0x0f, 0xd2, 0x60, 0xda, 0x4f, 0xd3, 0x43, 0xa3, 0x9c, 0x9b, 0x3e, + 0x4b, 0xce, 0x4d, 0x56, 0x5b, 0x66, 0xac, 0xda, 0xc6, 0xe5, 0xe8, 0xe9, 0x33, 0xe7, 0xe8, 0x99, + 0x53, 0x06, 0x87, 0xec, 0x09, 0x39, 0x3a, 0xf7, 0xc4, 0x39, 0x3a, 0x9f, 0x90, 0xa3, 0xbf, 0x9d, + 0x82, 0x1c, 0x6e, 0xdf, 0xe3, 0x5e, 0x6e, 0x42, 0xda, 0xf6, 0x5d, 0x19, 0xea, 0x6d, 0xdf, 0xa5, + 0x3e, 0xd5, 0xe8, 0x77, 0xc8, 0x23, 0xe9, 0x53, 0x6c, 0x40, 0xed, 0xbb, 0x49, 0x1c, 0x9f, 0x6c, + 0xba, 0x3d, 0x9e, 0x58, 0x78, 0xc6, 0xd1, 0x81, 0xf4, 0xf3, 0xb6, 0x37, 0xec, 0x53, 0x7f, 0xed, + 0x34, 0xfd, 0xbe, 0xc8, 0x3e, 0x1a, 0x0c, 0xdd, 0x85, 0x59, 0xce, 0xd4, 0xf5, 0x03, 0xd7, 0x7b, + 0x2c, 0xfc, 0x40, 0xcb, 0x7d, 0x72, 0x76, 0x65, 0x95, 0x90, 0xe7, 0x3e, 0x8d, 0x77, 0xe9, 0x16, + 0xcc, 0xc7, 0x48, 0x4e, 0xca, 0x5e, 0x19, 0x35, 0x7b, 0xbd, 0x03, 0x79, 0xe6, 0x74, 0xfb, 0xae, + 0xd7, 0xa1, 0x8c, 0x74, 0xd2, 0x82, 0x91, 0xce, 0x75, 0x15, 0x32, 0xf6, 0xe3, 0x01, 0xe7, 0x9b, + 0xd3, 0x37, 0x80, 0xf3, 0x50, 0x2c, 0x66, 0x34, 0xd4, 0xb2, 0xd9, 0x66, 0x51, 0xc5, 0xcc, 0x62, + 0xf6, 0xdb, 0x7a, 0xcf, 0x00, 0x60, 0xf2, 0xbf, 0x36, 0x24, 0x3e, 0x33, 0xfe, 0x96, 0x73, 0x4c, + 0xa4, 0xf1, 0xd3, 0xdf, 0xaa, 0x77, 0xa5, 0x74, 0xef, 0x12, 0xd3, 0x49, 0x47, 0xd3, 0x29, 0x41, + 0xf6, 0x9e, 0xf3, 0xa8, 0xdd, 0xfd, 0x3a, 0x11, 0x9a, 0x95, 0x43, 0xea, 0x89, 0xd2, 0x01, 0x6a, + 0x22, 0xb7, 0x47, 0x00, 0x96, 0xf4, 0x5b, 0x8d, 0x1a, 0xb3, 0x47, 0x9a, 0xf4, 0x5b, 0x8d, 0x9a, + 0x65, 0x01, 0xd8, 0xbe, 0x2b, 0x67, 0xb6, 0x08, 0xd3, 0x55, 0x77, 0xd8, 0x0f, 0xc4, 0xe2, 0xf9, + 0xc0, 0xfa, 0xbd, 0x41, 0x23, 0x30, 0xf3, 0x60, 0x56, 0x8d, 0x27, 0x7a, 0xef, 0x0d, 0xc8, 0x6f, + 0x0f, 0x88, 0xe7, 0x04, 0x5d, 0xb7, 0x2f, 0x14, 0x75, 0x5e, 0xef, 0x59, 0x18, 0xef, 0xf6, 0x00, + 0x47, 0x74, 0x68, 0x23, 0xec, 0x72, 0xb8, 0x2b, 0x5f, 0x49, 0xe8, 0x72, 0x18, 0xc1, 0xf8, 0x56, + 0xe7, 0xa9, 0xf7, 0x16, 0x4d, 0x28, 0x54, 0x5b, 0x51, 0xfe, 0x4b, 0x5a, 0xeb, 0x35, 0x59, 0x81, + 0xa6, 0xc6, 0x77, 0x56, 0x9c, 0xc2, 0xfa, 0x44, 0xe8, 0xce, 0x09, 0x26, 0xe8, 0xee, 0xf4, 0xf2, + 0x4e, 0xd6, 0x98, 0xfc, 0xd0, 0x17, 0xa8, 0xb1, 0xef, 0xcc, 0x40, 0x56, 0x5a, 0x10, 0xcb, 0x05, + 0xec, 0x67, 0x98, 0x27, 0x22, 0x00, 0x2a, 0xc3, 0xcc, 0x3d, 0x12, 0x1c, 0xba, 0x9d, 0x24, 0x57, + 0xe2, 0x18, 0xe6, 0x4a, 0x82, 0x0a, 0xad, 0xab, 0x7e, 0xc3, 0x5c, 0x60, 0x24, 0xfe, 0x45, 0x58, + 0xb1, 0x46, 0xd5, 0xcf, 0x2a, 0xac, 0x02, 0x0d, 0x93, 0x0e, 0x73, 0x96, 0xc2, 0xda, 0xbf, 0x8c, + 0x56, 0xa0, 0x5a, 0x66, 0xc2, 0x1a, 0x0b, 0xba, 0x49, 0x8d, 0x21, 0x92, 0x30, 0xcd, 0x24, 0x5c, + 0x4a, 0xb0, 0xd2, 0x48, 0x80, 0xca, 0x40, 0xf9, 0x6d, 0x85, 0x7f, 0x26, 0xce, 0x6f, 0xc7, 0xf8, + 0x15, 0x06, 0x9a, 0x00, 0x22, 0xf7, 0x4c, 0xca, 0xdd, 0x11, 0x16, 0xab, 0x8e, 0xbc, 0xae, 0xd7, + 0x4c, 0x22, 0x75, 0x94, 0xf4, 0x89, 0x47, 0x78, 0xac, 0x57, 0x58, 0xeb, 0xba, 0xbf, 0x8b, 0xe6, + 0xb0, 0x34, 0xce, 0x39, 0xb1, 0x1e, 0x1d, 0x5e, 0xd3, 0x1c, 0x88, 0xd5, 0x8b, 0x23, 0x49, 0x5a, + 0x41, 0x63, 0xcd, 0xd9, 0xd6, 0x75, 0x67, 0x61, 0x65, 0x64, 0xc2, 0x87, 0x25, 0x1e, 0xeb, 0xae, + 0x75, 0x0b, 0x8a, 0x35, 0xd2, 0x23, 0x01, 0x11, 0xd3, 0x11, 0x35, 0xe6, 0x33, 0x2a, 0xbb, 0x46, + 0x80, 0x75, 0x7a, 0xb4, 0x01, 0x73, 0x3b, 0x9e, 0xfb, 0xe8, 0x71, 0xb4, 0x61, 0x45, 0x26, 0x41, + 0xab, 0xce, 0x74, 0x0a, 0x3c, 0xc2, 0x61, 0xb5, 0xa1, 0xc0, 0x4c, 0xd0, 0x1f, 0xb8, 0x7d, 0x9f, + 0x4c, 0xa8, 0x9a, 0x44, 0x5c, 0x4f, 0x69, 0x71, 0xbd, 0xe9, 0xf8, 0x41, 0x14, 0xed, 0xe5, 0xd0, + 0x2a, 0x03, 0x52, 0x36, 0x4b, 0x91, 0x7d, 0xbb, 0xeb, 0x29, 0x9e, 0x26, 0x87, 0xd6, 0x1f, 0x33, + 0xb4, 0xc2, 0x14, 0x64, 0x4f, 0xd7, 0x25, 0x2f, 0x41, 0xbe, 0xee, 0x79, 0xae, 0x57, 0x75, 0x3b, + 0x84, 0x4d, 0xb3, 0x88, 0x23, 0x00, 0xcd, 0xfc, 0x6c, 0x70, 0x8f, 0xf8, 0xbe, 0x73, 0x40, 0x44, + 0xf9, 0xab, 0xc1, 0x68, 0xd1, 0xd3, 0xf0, 0x37, 0x2b, 0x5b, 0x84, 0x0c, 0x88, 0xc7, 0x5c, 0x2a, + 0x87, 0x15, 0x08, 0xba, 0xa5, 0x69, 0x50, 0xf8, 0xcc, 0xc5, 0x98, 0xd7, 0x73, 0xb4, 0x70, 0x7b, + 0x4d, 0xe7, 0xd4, 0x8a, 0xdc, 0xe3, 0x63, 0xa7, 0xdf, 0xe1, 0x5d, 0x41, 0x36, 0xc1, 0x8a, 0x14, + 0x3c, 0xd6, 0xa8, 0xa9, 0xf9, 0x32, 0x47, 0x12, 0x9f, 0xcf, 0xc5, 0x3f, 0xaf, 0xa0, 0xb1, 0x4a, + 0x4b, 0xed, 0xa7, 0xda, 0x1b, 0xfa, 0x01, 0xf1, 0x6a, 0x84, 0x16, 0x87, 0xbe, 0xf0, 0x1c, 0xcd, + 0x7e, 0x74, 0x0a, 0x3c, 0xc2, 0x81, 0x6e, 0x42, 0x3e, 0xea, 0x99, 0xb9, 0xef, 0xac, 0xa8, 0xec, + 0x21, 0x92, 0x15, 0x73, 0x98, 0xf8, 0xc3, 0x5e, 0x80, 0x23, 0x16, 0x74, 0x13, 0x40, 0xf1, 0x7b, + 0xee, 0x40, 0xcb, 0xaa, 0x80, 0xb8, 0x21, 0x61, 0x18, 0xf1, 0xfd, 0x43, 0xb2, 0x7f, 0x44, 0x3c, + 0xee, 0xbe, 0xb3, 0x09, 0xca, 0x53, 0xf0, 0x58, 0xa3, 0xb6, 0xee, 0xb2, 0x96, 0x8b, 0x17, 0x45, + 0xa1, 0x5a, 0x5e, 0xa6, 0xe9, 0x81, 0x42, 0xfc, 0x92, 0xc1, 0x92, 0xd6, 0xf9, 0xd8, 0x66, 0x52, + 0xac, 0xd8, 0x4a, 0x49, 0x6b, 0x3d, 0xa7, 0x6d, 0x04, 0xad, 0x4d, 0xde, 0x64, 0x49, 0x49, 0xd4, + 0x26, 0x6c, 0x60, 0xdd, 0x81, 0x22, 0xad, 0xdd, 0x6d, 0x67, 0xaf, 0x47, 0xee, 0xfb, 0xc4, 0x43, + 0x4b, 0x90, 0xa3, 0x7f, 0xfb, 0x51, 0x81, 0x15, 0x8e, 0x29, 0x6e, 0xc7, 0xf1, 0xfd, 0x77, 0x5d, + 0xaf, 0x23, 0x7a, 0x8b, 0x70, 0x6c, 0x7d, 0xd7, 0xa0, 0xb3, 0x64, 0x4d, 0x4b, 0x62, 0x8e, 0x1e, + 0x5f, 0xa0, 0x69, 0xed, 0x4f, 0x7a, 0xa4, 0xfd, 0x89, 0xce, 0x66, 0x32, 0xea, 0xd9, 0xcc, 0x32, + 0x4b, 0x6c, 0x7a, 0xa5, 0xa6, 0x40, 0xac, 0x1f, 0xa6, 0xa8, 0x0d, 0xd3, 0x7a, 0xbe, 0x7a, 0xe8, + 0xf4, 0x0f, 0x08, 0xba, 0x11, 0xce, 0x4e, 0x1c, 0xa4, 0x2c, 0xe8, 0x55, 0x28, 0x43, 0x45, 0x1a, + 0xe4, 0xeb, 0x58, 0x07, 0xe0, 0xec, 0x4a, 0xf5, 0x7a, 0x29, 0xde, 0x3e, 0x44, 0x34, 0x58, 0xa1, + 0x47, 0x36, 0xcc, 0x35, 0xfa, 0xdd, 0xa0, 0xeb, 0xf4, 0xee, 0x91, 0xe3, 0x3d, 0xe2, 0xc9, 0x92, + 0xe3, 0xc5, 0x71, 0x12, 0xca, 0x3a, 0x39, 0xaf, 0xd4, 0x47, 0x64, 0x2c, 0x55, 0x60, 0x21, 0x81, + 0xec, 0x4c, 0x67, 0x4d, 0xd7, 0xa0, 0xd8, 0x3e, 0x1c, 0x06, 0x1d, 0xf7, 0xdd, 0x3e, 0x8f, 0xdb, + 0x74, 0x6f, 0xe8, 0x8f, 0x70, 0xcb, 0xe4, 0xd0, 0xfa, 0x79, 0x06, 0xce, 0xb5, 0xf7, 0x0f, 0x49, + 0x67, 0xd8, 0x23, 0xc2, 0xcb, 0x13, 0x77, 0xf7, 0x0a, 0x14, 0x37, 0x5c, 0x37, 0xf0, 0x03, 0xcf, + 0x19, 0x0c, 0xba, 0xfd, 0x03, 0xf6, 0xd1, 0x1c, 0xd6, 0x81, 0x34, 0x34, 0x88, 0x06, 0x8e, 0x29, + 0x34, 0xcd, 0x14, 0xaa, 0x85, 0x06, 0x05, 0x8d, 0x55, 0x5a, 0x1e, 0x93, 0x22, 0x55, 0x89, 0x5a, + 0xa4, 0x34, 0x4e, 0x95, 0x58, 0xdf, 0xfd, 0x5b, 0x23, 0x2b, 0x16, 0x85, 0xc8, 0x33, 0x7a, 0x60, + 0x50, 0x08, 0xf0, 0x88, 0x86, 0xb6, 0x60, 0x9e, 0xf7, 0xb5, 0x4a, 0xa3, 0x2b, 0x22, 0xab, 0x56, + 0x0f, 0xc5, 0x88, 0x70, 0x9c, 0x2f, 0x9e, 0x67, 0xb3, 0x67, 0xcc, 0xb3, 0x5b, 0x30, 0x7f, 0xd7, + 0xed, 0xf6, 0xf9, 0xa1, 0x88, 0x88, 0x7f, 0x22, 0xd0, 0x6a, 0xb3, 0x89, 0x11, 0xe1, 0x38, 0x1f, + 0xda, 0x04, 0x93, 0x4b, 0x67, 0x89, 0x98, 0x4f, 0x28, 0x1f, 0xaf, 0xb3, 0x46, 0x69, 0x70, 0x8c, + 0xcb, 0xba, 0x9e, 0x30, 0x2d, 0x1a, 0x33, 0xea, 0x8f, 0xba, 0x7e, 0x40, 0x8d, 0x82, 0x46, 0xaf, + 0x3c, 0x0e, 0xc7, 0x56, 0x2f, 0x41, 0xab, 0xe8, 0x06, 0x64, 0x68, 0xc0, 0x11, 0x6e, 0xaa, 0x29, + 0x45, 0x8b, 0x54, 0xc2, 0x59, 0x19, 0x31, 0xeb, 0x98, 0x1d, 0xff, 0x88, 0x76, 0x8b, 0x7b, 0x8e, + 0x2f, 0x6d, 0x5e, 0x83, 0x51, 0xb3, 0xd7, 0xd5, 0x38, 0xde, 0xec, 0x5f, 0x8c, 0xeb, 0x64, 0x02, + 0xb5, 0xa3, 0xe7, 0xcb, 0xf0, 0x70, 0xd8, 0x88, 0x0e, 0x87, 0xd1, 0xeb, 0x90, 0x13, 0x34, 0xf2, + 0x98, 0xfa, 0x59, 0xcd, 0xf8, 0x74, 0x1f, 0x93, 0x67, 0x56, 0x92, 0xc5, 0xfa, 0x73, 0x86, 0x16, + 0x85, 0xfc, 0x83, 0x34, 0x4b, 0xc9, 0x73, 0x7d, 0x43, 0x39, 0xd7, 0xff, 0xe7, 0x3a, 0xa1, 0xad, + 0x84, 0x8d, 0x5c, 0x8e, 0xa9, 0xf3, 0xb9, 0x84, 0xea, 0x9a, 0x1d, 0xfa, 0x9f, 0xf2, 0x92, 0x2f, + 0xff, 0x44, 0x97, 0x7c, 0x90, 0x7c, 0x2e, 0xac, 0x9f, 0x61, 0x16, 0x4e, 0x73, 0xe2, 0x3b, 0x7b, + 0xe2, 0x89, 0x6f, 0xf1, 0x4b, 0xbb, 0x2e, 0xfc, 0x91, 0xc1, 0xef, 0x9a, 0xc5, 0xc5, 0x2a, 0xd3, + 0xad, 0xac, 0x45, 0x2e, 0x27, 0x34, 0x17, 0x65, 0x4e, 0xa1, 0xe9, 0x9c, 0x83, 0x96, 0x30, 0x14, + 0x14, 0x64, 0xc2, 0xd4, 0x5e, 0xd2, 0xa7, 0x76, 0x71, 0xcc, 0xb6, 0xaa, 0xd3, 0xfb, 0x5e, 0x9a, + 0x9d, 0xb4, 0x3e, 0x15, 0xe7, 0xf8, 0xea, 0x70, 0xf4, 0xa9, 0x1c, 0x8e, 0x52, 0x8b, 0xb1, 0x4f, + 0x63, 0x31, 0xf6, 0xe7, 0x6b, 0x31, 0x76, 0xb2, 0xc5, 0x7c, 0xdf, 0x00, 0x50, 0x42, 0x7b, 0x52, + 0x45, 0x23, 0x8d, 0x28, 0xa5, 0x18, 0xd1, 0x15, 0x28, 0x52, 0xd7, 0x20, 0x7d, 0x3d, 0x78, 0xea, + 0xc0, 0x11, 0xbd, 0x66, 0x4e, 0x7d, 0x5f, 0xf0, 0xb3, 0x68, 0x52, 0x54, 0x6d, 0xff, 0x3d, 0xa2, + 0x36, 0x2b, 0xd6, 0x44, 0x9f, 0xa4, 0xb9, 0x37, 0x4e, 0xd2, 0xdc, 0x8b, 0xba, 0xe6, 0x2e, 0x24, + 0x7c, 0x81, 0x66, 0x7a, 0x45, 0x71, 0xdf, 0x30, 0x46, 0x5b, 0xfc, 0x71, 0xe5, 0xa0, 0xae, 0xa8, + 0xd4, 0xc9, 0x8a, 0x4a, 0x9f, 0x5a, 0x51, 0x7f, 0x32, 0x46, 0xfb, 0x44, 0xf4, 0x32, 0xe4, 0xc4, + 0x56, 0x4b, 0x75, 0x2d, 0x24, 0x98, 0x81, 0x4c, 0xab, 0x92, 0x94, 0xb2, 0x55, 0x25, 0x5b, 0x2a, + 0xce, 0x56, 0xd5, 0xd9, 0x24, 0x29, 0x7a, 0x95, 0x1d, 0x77, 0x0b, 0x3e, 0x1e, 0x27, 0x16, 0x93, + 0x4e, 0xc5, 0x04, 0x63, 0x44, 0x8c, 0x6e, 0x42, 0x21, 0x52, 0x2c, 0x4d, 0xaa, 0xe9, 0xf1, 0x7a, + 0x97, 0xad, 0xb9, 0xc2, 0x60, 0x7d, 0xcb, 0x80, 0x82, 0x58, 0x3a, 0x0b, 0x75, 0xaf, 0xb1, 0x75, + 0xf3, 0x80, 0x65, 0x88, 0x80, 0x15, 0xc6, 0x72, 0x81, 0xd1, 0xba, 0xc3, 0x90, 0x1c, 0xad, 0xf3, + 0x45, 0x70, 0x5e, 0xbe, 0xf8, 0x92, 0x92, 0x07, 0x04, 0x4a, 0x63, 0x8e, 0x18, 0xac, 0xdf, 0xa6, + 0xe0, 0xbc, 0xe8, 0x43, 0x64, 0x6d, 0x29, 0x8e, 0xce, 0x9e, 0x87, 0xb9, 0xd6, 0xf0, 0x78, 0xfb, + 0x41, 0x24, 0x9c, 0xc7, 0xe1, 0x11, 0x28, 0xb5, 0x11, 0x06, 0x09, 0xe7, 0xcf, 0x3d, 0x4d, 0x07, + 0xa2, 0x55, 0x30, 0x25, 0x5f, 0x78, 0xe5, 0xc7, 0x7b, 0xc4, 0x18, 0x1c, 0x5d, 0x80, 0x99, 0x16, + 0x79, 0x14, 0x84, 0xd7, 0xf5, 0x62, 0x84, 0x6c, 0x28, 0xf0, 0x5f, 0x1b, 0x8f, 0xb7, 0x88, 0xbc, + 0x29, 0x59, 0x53, 0x95, 0x9e, 0xb8, 0x92, 0xb2, 0xc2, 0xc4, 0x7b, 0x31, 0x55, 0xcc, 0xd2, 0x4d, + 0x30, 0x47, 0x09, 0x92, 0xaf, 0x56, 0xc7, 0xdc, 0x99, 0xfc, 0x2a, 0xc5, 0x2f, 0xf8, 0x27, 0xa6, + 0xad, 0xaf, 0x6e, 0x56, 0x93, 0x02, 0xc0, 0x2f, 0x53, 0xe2, 0x79, 0x0c, 0x8d, 0x93, 0x37, 0xc3, + 0x8c, 0xcd, 0x1d, 0x60, 0x25, 0xe6, 0x89, 0x2c, 0x4a, 0x32, 0x12, 0x3d, 0x4a, 0x72, 0x0b, 0xbb, + 0x19, 0xc6, 0xd9, 0xd4, 0x24, 0xfe, 0xb1, 0x51, 0xb6, 0x0d, 0x05, 0x45, 0x78, 0x42, 0x23, 0x5e, + 0xd6, 0xa3, 0xec, 0xd8, 0x17, 0x1c, 0x8a, 0x71, 0x30, 0xa1, 0x13, 0x43, 0xf7, 0x49, 0x42, 0x93, + 0xb2, 0xde, 0xfb, 0xd3, 0xfa, 0xd9, 0x54, 0xa2, 0xc5, 0xdd, 0xd2, 0x02, 0x4c, 0x62, 0x15, 0x16, + 0xa1, 0x65, 0x88, 0x52, 0x43, 0xd2, 0x8d, 0x30, 0xf3, 0x8b, 0x90, 0xbe, 0x90, 0x90, 0xef, 0xe5, + 0x49, 0x8b, 0xac, 0x11, 0x5e, 0x89, 0x36, 0x54, 0x64, 0xcc, 0xc5, 0xa4, 0x6d, 0x90, 0x16, 0x17, + 0x6e, 0xfe, 0x8d, 0xb0, 0x30, 0x15, 0x2d, 0xfd, 0x42, 0x42, 0x39, 0x2a, 0x3f, 0x26, 0x4b, 0xd8, + 0xeb, 0xf2, 0xba, 0x88, 0x77, 0x24, 0x5a, 0x8b, 0x29, 0x4f, 0x51, 0xb5, 0x4b, 0xa3, 0x96, 0xb0, + 0x6b, 0xd1, 0xa4, 0x89, 0x93, 0xbd, 0x2c, 0xe3, 0x5e, 0x1e, 0x6d, 0x50, 0x75, 0x2a, 0x9c, 0xc0, + 0x89, 0xea, 0x23, 0x87, 0x6e, 0xa2, 0xf8, 0x3a, 0xb1, 0xd7, 0x1d, 0x39, 0xaa, 0x93, 0xf1, 0xae, + 0xc3, 0x4a, 0x30, 0x19, 0xef, 0x3a, 0x68, 0x4b, 0x8f, 0x77, 0xc0, 0xcc, 0xfa, 0xda, 0xb8, 0x13, + 0xc8, 0xc9, 0x61, 0x0e, 0xad, 0xab, 0x45, 0x89, 0x38, 0x0f, 0xbd, 0x90, 0x5c, 0x8a, 0xc8, 0x2b, + 0xa4, 0x08, 0xf2, 0x99, 0x83, 0xe4, 0xfb, 0x39, 0x30, 0xe5, 0x96, 0x84, 0x97, 0xed, 0xe1, 0xd5, + 0xba, 0xa1, 0x5e, 0xad, 0x27, 0x15, 0x6c, 0x51, 0x46, 0x48, 0x6b, 0x19, 0x61, 0x5b, 0xd7, 0x10, + 0x4f, 0xc3, 0x2f, 0x25, 0xd9, 0x41, 0x78, 0x87, 0x3e, 0x59, 0x4b, 0x09, 0xef, 0xc1, 0xbe, 0x7c, + 0x33, 0xeb, 0x80, 0x39, 0x72, 0xae, 0x20, 0x9b, 0xe5, 0xb5, 0x89, 0x4b, 0x1d, 0x65, 0x52, 0xa3, + 0x5e, 0x4c, 0x22, 0x6a, 0xa8, 0x75, 0x04, 0x7f, 0x6c, 0xfb, 0xc2, 0x44, 0xf1, 0x21, 0x35, 0xd7, + 0x63, 0xc4, 0xad, 0x7a, 0x33, 0x9c, 0xda, 0x9b, 0x95, 0x78, 0x53, 0x78, 0xa2, 0x78, 0x33, 0x7b, + 0x86, 0x78, 0x33, 0x12, 0x1d, 0x8b, 0x67, 0x8e, 0x8e, 0x31, 0xd7, 0x9f, 0x7b, 0x22, 0xd7, 0xd7, + 0xbd, 0xf2, 0xdc, 0x17, 0xeb, 0x95, 0x4b, 0xef, 0xc0, 0xf9, 0x44, 0x1b, 0x39, 0x63, 0x9e, 0xd2, + 0x2e, 0x91, 0x14, 0xf1, 0xeb, 0xec, 0x2d, 0xe4, 0x98, 0xa4, 0x7a, 0x62, 0xc8, 0x68, 0x40, 0x41, + 0x7d, 0x46, 0xf9, 0x19, 0x5e, 0x4a, 0x59, 0x3f, 0x49, 0xc1, 0x62, 0xd2, 0x7d, 0xd1, 0x84, 0x5b, + 0xc9, 0x9d, 0xd8, 0x73, 0xd4, 0xf2, 0x49, 0xb7, 0x4f, 0xfa, 0xb3, 0xd4, 0x58, 0x51, 0xf5, 0x74, + 0x1e, 0xa7, 0xda, 0x27, 0x3f, 0x4e, 0x9d, 0xd4, 0x47, 0x2b, 0x1a, 0x55, 0x75, 0xfd, 0x0b, 0x03, + 0x60, 0xc3, 0xd9, 0x3f, 0x1a, 0x0e, 0xd8, 0xc9, 0x40, 0x14, 0x6e, 0x0d, 0x2d, 0xdc, 0x36, 0xf4, + 0x70, 0xcb, 0xf5, 0xf2, 0xef, 0xaa, 0xfc, 0x48, 0xc8, 0xe7, 0x5c, 0x75, 0x7f, 0xd3, 0x90, 0x35, + 0x67, 0x23, 0x20, 0xc7, 0x89, 0x4f, 0x89, 0x2c, 0x98, 0xad, 0x0e, 0x3d, 0x8f, 0xf4, 0x83, 0x37, + 0x95, 0xfb, 0x13, 0x0d, 0x46, 0x69, 0x6a, 0xe4, 0x81, 0x33, 0xec, 0x09, 0x1a, 0x5e, 0x73, 0x6b, + 0x30, 0xba, 0x45, 0x8d, 0x7e, 0x40, 0xbc, 0xbe, 0xd3, 0x13, 0xc5, 0x76, 0x38, 0xb6, 0x7e, 0x6a, + 0xa8, 0xa5, 0x2f, 0x7a, 0x1d, 0xb2, 0x55, 0xb7, 0x1f, 0x10, 0xf6, 0x72, 0x28, 0x7e, 0x9a, 0x19, + 0x12, 0x96, 0x05, 0x15, 0x57, 0x8c, 0xe4, 0x59, 0xc2, 0xec, 0x72, 0x24, 0x44, 0x9c, 0xb1, 0xd3, + 0x8f, 0xd4, 0xa1, 0x28, 0x6a, 0xf5, 0xff, 0x00, 0xee, 0x0f, 0x3a, 0x4e, 0xc0, 0xaf, 0x5f, 0x2e, + 0xc2, 0x82, 0xf6, 0x44, 0x8d, 0xa3, 0xcc, 0x29, 0x74, 0x1e, 0xe6, 0xe5, 0xb3, 0xb4, 0x66, 0xbb, + 0x25, 0xc0, 0x06, 0x5a, 0x80, 0x73, 0x34, 0x4e, 0xb1, 0xe9, 0x08, 0x60, 0x0a, 0x15, 0x21, 0x6f, + 0xb7, 0xb7, 0xc5, 0x30, 0xbd, 0x5a, 0x86, 0x7c, 0xf8, 0xdc, 0x1c, 0x9d, 0x83, 0x42, 0xcb, 0xf5, + 0x8e, 0x9d, 0x1e, 0x1b, 0x9a, 0x53, 0xc8, 0x84, 0x59, 0xbb, 0x7b, 0x4c, 0xdc, 0x61, 0xc0, 0x21, + 0xc6, 0xea, 0x5f, 0x53, 0x00, 0xd1, 0x85, 0x3a, 0x9a, 0x03, 0xb0, 0xdb, 0xdb, 0xbb, 0xf7, 0x77, + 0x6a, 0x15, 0xbb, 0x6e, 0x4e, 0x21, 0x80, 0x99, 0xca, 0xce, 0x4e, 0xbd, 0x55, 0x33, 0x0d, 0x94, + 0x83, 0x0c, 0xae, 0x57, 0x6a, 0x66, 0x0a, 0xcd, 0x42, 0xce, 0xc6, 0xf7, 0x5b, 0x55, 0x4a, 0x93, + 0xa6, 0x42, 0xef, 0xd4, 0xed, 0xdd, 0x10, 0x92, 0x41, 0x05, 0xc8, 0x56, 0xb7, 0x5b, 0xad, 0x7a, + 0xd5, 0x36, 0xa7, 0xa9, 0x48, 0x31, 0xd8, 0xc5, 0xdb, 0xe6, 0x0c, 0x9a, 0x87, 0x62, 0x73, 0xfb, + 0xce, 0xee, 0x66, 0xbd, 0x82, 0xed, 0x8d, 0x7a, 0xc5, 0x36, 0xb3, 0x54, 0x42, 0xb5, 0xa5, 0x40, + 0x72, 0x6c, 0xa2, 0x2a, 0x24, 0x8f, 0x10, 0xcc, 0x55, 0x37, 0xeb, 0xd5, 0xad, 0xdd, 0xcd, 0xca, + 0x56, 0xbd, 0xbe, 0x53, 0xc7, 0x26, 0x50, 0x05, 0xd2, 0x2f, 0x57, 0x9b, 0xf7, 0xdb, 0x76, 0x1d, + 0xef, 0xd6, 0xea, 0x76, 0xa5, 0xd1, 0x6c, 0x9b, 0x05, 0x4a, 0x4c, 0x11, 0xed, 0xcd, 0x0a, 0xae, + 0xed, 0x36, 0x5a, 0xb7, 0xb7, 0xcd, 0x59, 0x26, 0xa0, 0xb5, 0x5b, 0x69, 0x36, 0xb7, 0xe9, 0x2c, + 0x77, 0x1b, 0x35, 0xb3, 0x48, 0x15, 0xad, 0x0a, 0x68, 0xdb, 0x74, 0xfe, 0x73, 0x4c, 0xd1, 0x4c, + 0x03, 0xbb, 0xd5, 0xd6, 0x6e, 0xb3, 0xb2, 0x51, 0x6f, 0x9a, 0xe7, 0x50, 0x09, 0x16, 0x23, 0xe0, + 0x5b, 0xdb, 0x78, 0x4b, 0x90, 0x9b, 0x54, 0xf2, 0x4e, 0xc5, 0xae, 0x6e, 0x52, 0x44, 0xdb, 0xde, + 0xc6, 0x75, 0x73, 0x9e, 0x8a, 0xa8, 0xd5, 0x9b, 0x75, 0x4e, 0xcd, 0x81, 0x88, 0x02, 0x77, 0xf0, + 0xf6, 0xff, 0xfc, 0xaf, 0xb2, 0xb0, 0x85, 0xd5, 0x16, 0x40, 0xf4, 0x5e, 0x8f, 0x6a, 0x8b, 0xee, + 0x31, 0x87, 0x98, 0x53, 0x54, 0xd5, 0xd2, 0xbe, 0x4d, 0x83, 0x6e, 0x28, 0xb3, 0x98, 0x70, 0xf7, + 0xe7, 0xc5, 0xd3, 0x47, 0x4c, 0xfe, 0x9f, 0xec, 0x07, 0xa4, 0x63, 0xa6, 0x57, 0x57, 0x21, 0x1f, + 0x3e, 0x6b, 0xa3, 0xec, 0x6d, 0x12, 0xb0, 0x91, 0x39, 0x45, 0xd9, 0xf9, 0x0d, 0x0c, 0x07, 0x18, + 0xab, 0xbf, 0x4b, 0x01, 0x92, 0xa5, 0x84, 0x62, 0x98, 0xd4, 0x0a, 0xba, 0xfb, 0x47, 0xaa, 0x3d, + 0x2a, 0xef, 0x87, 0x42, 0x7b, 0xa4, 0x66, 0x1a, 0x03, 0xa7, 0xd0, 0x05, 0x40, 0xea, 0x73, 0x25, + 0x69, 0x9a, 0xf4, 0xeb, 0x77, 0x48, 0x10, 0x9a, 0x79, 0x06, 0x3d, 0x13, 0xcb, 0x78, 0x02, 0x35, + 0x4d, 0x55, 0xda, 0x26, 0xdc, 0x48, 0x05, 0x6c, 0x86, 0x6e, 0x80, 0x7e, 0xa4, 0x20, 0x30, 0x59, + 0x74, 0x19, 0x9e, 0x6d, 0x93, 0x20, 0x5e, 0xac, 0x09, 0x82, 0x1c, 0x5a, 0x82, 0x0b, 0x82, 0x20, + 0xcc, 0xf6, 0x02, 0x97, 0xa7, 0x2a, 0xe4, 0xbf, 0x85, 0xd6, 0x4c, 0xa0, 0x0b, 0x93, 0xa0, 0xf0, + 0x96, 0xc2, 0x2c, 0x50, 0xa3, 0xdc, 0xa1, 0x69, 0x55, 0x1c, 0x59, 0x99, 0xb3, 0x94, 0x17, 0x93, + 0x63, 0xf7, 0xa1, 0xbc, 0xfd, 0x32, 0x8b, 0x74, 0x96, 0xfa, 0x59, 0x9e, 0xf8, 0xd0, 0xdc, 0xea, + 0x7b, 0x06, 0x14, 0xb5, 0x12, 0x95, 0xda, 0x83, 0x04, 0x88, 0xee, 0xdd, 0x9c, 0xa2, 0x5a, 0x91, + 0x40, 0xed, 0xa2, 0xd7, 0x34, 0xd0, 0xbf, 0xc1, 0xbf, 0xc6, 0x50, 0xb2, 0x56, 0xc0, 0x64, 0x9f, + 0x74, 0x1f, 0x92, 0x8e, 0x99, 0x42, 0xcf, 0xc2, 0xc5, 0x18, 0xd9, 0x6d, 0xa7, 0xdb, 0xa3, 0xe6, + 0xa1, 0x7e, 0x13, 0x0f, 0xfb, 0x7d, 0x2a, 0x38, 0xb3, 0xba, 0x97, 0x54, 0x24, 0xd3, 0xa5, 0x68, + 0xd0, 0x68, 0x8e, 0xa3, 0x18, 0x29, 0xc9, 0x88, 0x61, 0xda, 0x81, 0x3b, 0x18, 0xd0, 0x59, 0xad, + 0x1e, 0x82, 0x39, 0x7a, 0xb3, 0x4f, 0x0d, 0xad, 0xd2, 0xe9, 0x88, 0x3c, 0x68, 0x4e, 0x45, 0xfa, + 0x94, 0x20, 0x83, 0x2a, 0xbd, 0x1d, 0x38, 0x5e, 0x20, 0x21, 0x29, 0x6a, 0x47, 0x54, 0xaa, 0x04, + 0xa4, 0xa9, 0x94, 0xad, 0x6e, 0xaf, 0xf7, 0xb6, 0x7b, 0xbc, 0xd7, 0x25, 0x66, 0x66, 0xf5, 0x9e, + 0x76, 0x23, 0x4e, 0xd1, 0xb4, 0xf2, 0xe1, 0x10, 0x73, 0x8a, 0x45, 0xcc, 0x96, 0x1c, 0x1a, 0x74, + 0x58, 0x0d, 0x87, 0x29, 0xb6, 0xc9, 0xac, 0xa8, 0x13, 0x90, 0xf4, 0x46, 0xfd, 0xc3, 0x4f, 0x96, + 0xa7, 0x3e, 0xf8, 0x74, 0xd9, 0xf8, 0xf0, 0xd3, 0x65, 0xe3, 0xe3, 0x4f, 0x97, 0x8d, 0xb7, 0x6f, + 0x28, 0xff, 0x65, 0x78, 0xec, 0x04, 0x5e, 0xf7, 0x91, 0xeb, 0x75, 0x0f, 0xba, 0x7d, 0x39, 0xe8, + 0x93, 0xeb, 0x83, 0xa3, 0x83, 0xeb, 0x83, 0xbd, 0xeb, 0x51, 0x46, 0xd8, 0x9b, 0x61, 0xff, 0x62, + 0x78, 0xe3, 0x6f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x85, 0xe4, 0x53, 0x53, 0xc1, 0x38, 0x00, 0x00, } func (m *CNStore) Marshal() (dAtA []byte, err error) { @@ -4919,6 +4946,13 @@ func (m *TNStore) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.QueryAddress) > 0 { + i -= len(m.QueryAddress) + copy(dAtA[i:], m.QueryAddress) + i = encodeVarintLogservice(dAtA, i, uint64(len(m.QueryAddress))) + i-- + dAtA[i] = 0x52 + } if m.ConfigData != nil { { size, err := m.ConfigData.MarshalToSizedBuffer(dAtA[:i]) @@ -5487,6 +5521,13 @@ func (m *TNStoreHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.QueryAddress) > 0 { + i -= len(m.QueryAddress) + copy(dAtA[i:], m.QueryAddress) + i = encodeVarintLogservice(dAtA, i, uint64(len(m.QueryAddress))) + i-- + dAtA[i] = 0x4a + } if m.ConfigData != nil { { size, err := m.ConfigData.MarshalToSizedBuffer(dAtA[:i]) @@ -7096,6 +7137,13 @@ func (m *TNStoreInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.QueryAddress) > 0 { + i -= len(m.QueryAddress) + copy(dAtA[i:], m.QueryAddress) + i = encodeVarintLogservice(dAtA, i, uint64(len(m.QueryAddress))) + i-- + dAtA[i] = 0x4a + } if m.ConfigData != nil { { size, err := m.ConfigData.MarshalToSizedBuffer(dAtA[:i]) @@ -8425,6 +8473,10 @@ func (m *TNStore) Size() (n int) { l = m.ConfigData.Size() n += 1 + l + sovLogservice(uint64(l)) } + l = len(m.QueryAddress) + if l > 0 { + n += 1 + l + sovLogservice(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -8690,6 +8742,10 @@ func (m *TNStoreHeartbeat) Size() (n int) { l = m.ConfigData.Size() n += 1 + l + sovLogservice(uint64(l)) } + l = len(m.QueryAddress) + if l > 0 { + n += 1 + l + sovLogservice(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -9401,6 +9457,10 @@ func (m *TNStoreInfo) Size() (n int) { l = m.ConfigData.Size() n += 1 + l + sovLogservice(uint64(l)) } + l = len(m.QueryAddress) + if l > 0 { + n += 1 + l + sovLogservice(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -10689,6 +10749,38 @@ func (m *TNStore) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field QueryAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLogservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthLogservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthLogservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.QueryAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipLogservice(dAtA[iNdEx:]) @@ -12418,6 +12510,38 @@ func (m *TNStoreHeartbeat) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field QueryAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLogservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthLogservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthLogservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.QueryAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipLogservice(dAtA[iNdEx:]) @@ -17156,6 +17280,38 @@ func (m *TNStoreInfo) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field QueryAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLogservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthLogservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthLogservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.QueryAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipLogservice(dAtA[iNdEx:]) diff --git a/pkg/pb/metadata/metadata.pb.go b/pkg/pb/metadata/metadata.pb.go index fa793ef834e9..c9eb858ea793 100644 --- a/pkg/pb/metadata/metadata.pb.go +++ b/pkg/pb/metadata/metadata.pb.go @@ -654,10 +654,12 @@ type TNService struct { // Shards TN shards on service Shards []TNShard `protobuf:"bytes,6,rep,name=Shards,proto3" json:"Shards"` // Labels labels on service - Labels map[string]LabelList `protobuf:"bytes,7,rep,name=Labels,proto3" json:"Labels" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Labels map[string]LabelList `protobuf:"bytes,7,rep,name=Labels,proto3" json:"Labels" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // QueryAddress it the address of query service on the tn + QueryAddress string `protobuf:"bytes,8,opt,name=QueryAddress,proto3" json:"QueryAddress,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *TNService) Reset() { *m = TNService{} } @@ -742,6 +744,13 @@ func (m *TNService) GetLabels() map[string]LabelList { return nil } +func (m *TNService) GetQueryAddress() string { + if m != nil { + return m.QueryAddress + } + return "" +} + // LabelList defines the labels on CN store. type LabelList struct { Labels []string `protobuf:"bytes,1,rep,name=Labels,proto3" json:"Labels,omitempty"` @@ -811,53 +820,52 @@ func init() { func init() { proto.RegisterFile("metadata.proto", fileDescriptor_56d9f74966f40d04) } var fileDescriptor_56d9f74966f40d04 = []byte{ - // 721 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0x5d, 0x4e, 0xdb, 0x4a, + // 720 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x55, 0xcd, 0x4e, 0xdb, 0x4a, 0x14, 0x66, 0xe2, 0x10, 0xc7, 0x27, 0x5c, 0x64, 0xe6, 0xea, 0x72, 0x2d, 0x74, 0x15, 0x90, 0x6f, - 0x1f, 0xd2, 0xa8, 0x4d, 0x0a, 0xad, 0xaa, 0xaa, 0x52, 0xa5, 0x82, 0xa9, 0x10, 0x95, 0x65, 0x82, - 0x63, 0xfa, 0xf7, 0xe6, 0x24, 0x83, 0xb1, 0xe2, 0x78, 0x22, 0xc7, 0xa1, 0x64, 0x0b, 0xdd, 0x43, - 0xd7, 0xd1, 0x2d, 0xf0, 0xc8, 0x0a, 0x50, 0xcb, 0x4a, 0x2a, 0x8f, 0x3d, 0xb1, 0x71, 0x12, 0xe0, - 0xa1, 0x4f, 0x9e, 0x73, 0xbe, 0x33, 0xdf, 0xf9, 0xce, 0xcf, 0xc8, 0xb0, 0x3a, 0x20, 0xa1, 0xdd, - 0xb3, 0x43, 0xbb, 0x31, 0x0c, 0x68, 0x48, 0x71, 0x99, 0xdb, 0x1b, 0x4f, 0x1d, 0x37, 0x3c, 0x1b, - 0x77, 0x1a, 0x5d, 0x3a, 0x68, 0x3a, 0xd4, 0xa1, 0x4d, 0x16, 0xd0, 0x19, 0x9f, 0x32, 0x8b, 0x19, - 0xec, 0x14, 0x5f, 0x54, 0x0f, 0xe1, 0x2f, 0xcb, 0x68, 0x9f, 0xd9, 0x41, 0xcf, 0x24, 0x5d, 0x1a, - 0xf4, 0xb0, 0x02, 0x22, 0x33, 0x0f, 0xf7, 0x15, 0xb4, 0x85, 0x6a, 0x45, 0x93, 0x9b, 0xb8, 0x0a, - 0xa0, 0x53, 0x87, 0x83, 0x05, 0x06, 0x66, 0x3c, 0xea, 0x37, 0x04, 0x62, 0xc2, 0x85, 0x0f, 0x72, - 0xb4, 0x8c, 0xab, 0xb2, 0xf3, 0x6f, 0x63, 0xaa, 0xfb, 0x16, 0xbc, 0x57, 0xbe, 0xbc, 0xde, 0x5c, - 0xba, 0xba, 0xde, 0x44, 0x66, 0x4e, 0xce, 0x7f, 0x20, 0x99, 0x64, 0xe8, 0xb9, 0x5d, 0x7b, 0x9a, - 0x33, 0x75, 0x44, 0x62, 0x77, 0x7b, 0xbd, 0x80, 0x8c, 0x46, 0x8a, 0xb0, 0x85, 0x6a, 0x92, 0xc9, - 0x4d, 0xf5, 0x03, 0xac, 0x72, 0x69, 0xf7, 0x16, 0x56, 0x07, 0xd9, 0x18, 0x0f, 0x3a, 0x24, 0x38, - 0x3a, 0x4d, 0xa8, 0x47, 0x49, 0xaa, 0x19, 0xbf, 0x1a, 0x42, 0x99, 0xf3, 0xe2, 0xf7, 0xf9, 0x1c, - 0x49, 0x95, 0x4a, 0x5a, 0xe5, 0x6d, 0x3c, 0x53, 0x66, 0x5e, 0xdd, 0x9d, 0x75, 0xaa, 0x06, 0xeb, - 0x6c, 0x48, 0x03, 0x82, 0x31, 0x14, 0x4f, 0x4e, 0x92, 0x1a, 0x24, 0x93, 0x9d, 0x71, 0x13, 0x4a, - 0x8c, 0x2b, 0x92, 0x2d, 0xd4, 0x2a, 0x3b, 0x6b, 0x33, 0x6d, 0xde, 0x2b, 0x46, 0x99, 0xcd, 0x24, - 0x4c, 0x6d, 0xc5, 0x55, 0x2c, 0x24, 0x7c, 0x96, 0x23, 0xc4, 0xb3, 0x15, 0xe5, 0x18, 0x35, 0x10, - 0xb5, 0x3b, 0x14, 0x3e, 0x82, 0xa2, 0x49, 0x3d, 0xc2, 0x2a, 0x5b, 0xdd, 0x91, 0x53, 0x3a, 0xcd, - 0x88, 0xfc, 0x26, 0x43, 0xd5, 0x1f, 0x02, 0x48, 0x9a, 0xd1, 0x26, 0xc1, 0xb9, 0xdb, 0x25, 0x51, - 0x4b, 0x92, 0xe3, 0x94, 0x2c, 0x75, 0xe0, 0x06, 0x60, 0x9d, 0x76, 0xfb, 0x89, 0x83, 0x6f, 0x41, - 0x81, 0x85, 0xcd, 0x41, 0xf0, 0x4b, 0x58, 0x6f, 0xb9, 0x43, 0xe2, 0xb9, 0x3e, 0xc9, 0xdd, 0x89, - 0x37, 0x67, 0x01, 0x1a, 0x6d, 0x7d, 0xfb, 0x58, 0xe7, 0xb1, 0x45, 0x16, 0x9b, 0xf1, 0x44, 0xb8, - 0x16, 0x7a, 0x1c, 0x5f, 0x8e, 0xf1, 0xd4, 0x83, 0xdf, 0x40, 0x49, 0xb7, 0x3b, 0xc4, 0x1b, 0x29, - 0x25, 0xd6, 0xca, 0xcd, 0x6c, 0xed, 0x49, 0xae, 0x46, 0x1c, 0xf1, 0xce, 0x0f, 0x83, 0x09, 0xef, - 0x6b, 0xec, 0xc2, 0xdb, 0x20, 0x7d, 0xa4, 0x41, 0xbf, 0x1d, 0xda, 0x21, 0x51, 0x44, 0xd6, 0xbd, - 0xbf, 0x53, 0x86, 0x29, 0x64, 0xa6, 0x51, 0x58, 0x85, 0x95, 0xe3, 0x31, 0x09, 0x26, 0x5c, 0x53, - 0x99, 0x69, 0xba, 0xe5, 0xdb, 0x30, 0xa0, 0x92, 0xc9, 0x89, 0x65, 0x10, 0xfa, 0x64, 0x92, 0x34, - 0x39, 0x3a, 0xe2, 0xc7, 0xb0, 0x7c, 0x6e, 0x7b, 0xe3, 0x78, 0x62, 0x95, 0x6c, 0x4e, 0x76, 0x4f, - 0x77, 0x47, 0xa1, 0x19, 0x47, 0xbc, 0x2e, 0xbc, 0x42, 0xea, 0x77, 0x01, 0x24, 0xeb, 0x81, 0x93, - 0x7b, 0x02, 0x6b, 0xd6, 0x85, 0x3f, 0x77, 0x70, 0xb3, 0x00, 0x7e, 0x01, 0xff, 0xe8, 0xd4, 0xb1, - 0x6c, 0xd7, 0x9b, 0x3b, 0xb6, 0xf9, 0xe0, 0x82, 0xed, 0x28, 0x2e, 0xdc, 0x8e, 0xfb, 0xa6, 0x98, - 0xbe, 0xb0, 0xd2, 0x83, 0x5e, 0x58, 0x66, 0xec, 0x62, 0x7e, 0xec, 0xd6, 0xfd, 0x63, 0xff, 0xe3, - 0xf3, 0xf9, 0x1f, 0xa4, 0xa9, 0x1f, 0xaf, 0x4f, 0xb5, 0xa1, 0x2d, 0xa1, 0x26, 0xf1, 0xa4, 0xf5, - 0x6d, 0xa8, 0x24, 0xca, 0xac, 0xc9, 0x90, 0xe0, 0x12, 0x14, 0x34, 0x43, 0x5e, 0x8a, 0xbe, 0x96, - 0x21, 0x23, 0x2c, 0x82, 0xa0, 0x1f, 0x1d, 0xc8, 0x05, 0x2c, 0xc1, 0x72, 0xcb, 0x3c, 0xfa, 0xf4, - 0x59, 0x16, 0xea, 0x0a, 0x94, 0xe2, 0x17, 0xcc, 0xa2, 0x5a, 0x71, 0xf4, 0x6e, 0x4b, 0x46, 0xf5, - 0xb7, 0x99, 0xc5, 0xc5, 0x15, 0x10, 0x4f, 0xfc, 0xbe, 0x4f, 0xbf, 0xfa, 0xf2, 0x52, 0x64, 0x44, - 0x88, 0xeb, 0x3b, 0x32, 0xc2, 0x2b, 0x50, 0xde, 0x0f, 0x6c, 0xd7, 0x8f, 0xac, 0x42, 0x04, 0x31, - 0x8b, 0xf4, 0x64, 0x61, 0x4f, 0xbb, 0xfa, 0x55, 0x45, 0x97, 0x37, 0x55, 0x74, 0x75, 0x53, 0x45, - 0x3f, 0x6f, 0xaa, 0xe8, 0xcb, 0x76, 0xe6, 0xdf, 0x36, 0xb0, 0xc3, 0xc0, 0xbd, 0xa0, 0x81, 0xeb, - 0xb8, 0x3e, 0x37, 0x7c, 0xd2, 0x1c, 0xf6, 0x9d, 0xe6, 0xb0, 0xd3, 0xe4, 0xdd, 0xe8, 0x94, 0xd8, - 0x6f, 0xee, 0xf9, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4f, 0x04, 0x0e, 0xff, 0x31, 0x07, 0x00, - 0x00, + 0x17, 0x69, 0xd4, 0x26, 0x85, 0x56, 0x55, 0x55, 0xa9, 0x52, 0xc1, 0x54, 0x88, 0xca, 0x32, 0xc1, + 0x31, 0xfd, 0xdb, 0x39, 0xc9, 0x60, 0xac, 0x38, 0x9e, 0xc8, 0x71, 0x28, 0x79, 0x85, 0xbe, 0x50, + 0xd7, 0xdd, 0xb1, 0xe4, 0x09, 0x50, 0xcb, 0x93, 0x54, 0x1e, 0x7b, 0x62, 0xe3, 0x24, 0xc0, 0xae, + 0x2b, 0xcf, 0x39, 0xdf, 0x99, 0xef, 0x7c, 0xe7, 0x67, 0x64, 0x58, 0x1d, 0x90, 0xd0, 0xee, 0xd9, + 0xa1, 0xdd, 0x18, 0x06, 0x34, 0xa4, 0xb8, 0xcc, 0xed, 0x8d, 0xa7, 0x8e, 0x1b, 0x9e, 0x8d, 0x3b, + 0x8d, 0x2e, 0x1d, 0x34, 0x1d, 0xea, 0xd0, 0x26, 0x0b, 0xe8, 0x8c, 0x4f, 0x99, 0xc5, 0x0c, 0x76, + 0x8a, 0x2f, 0xaa, 0x87, 0xf0, 0x97, 0x65, 0xb4, 0xcf, 0xec, 0xa0, 0x67, 0x92, 0x2e, 0x0d, 0x7a, + 0x58, 0x01, 0x91, 0x99, 0x87, 0xfb, 0x0a, 0xda, 0x42, 0xb5, 0xa2, 0xc9, 0x4d, 0x5c, 0x05, 0xd0, + 0xa9, 0xc3, 0xc1, 0x02, 0x03, 0x33, 0x1e, 0xf5, 0x1b, 0x02, 0x31, 0xe1, 0xc2, 0x07, 0x39, 0x5a, + 0xc6, 0x55, 0xd9, 0xf9, 0xb7, 0x31, 0xd5, 0x7d, 0x0b, 0xde, 0x2b, 0x5f, 0x5e, 0x6f, 0x2e, 0x5d, + 0x5d, 0x6f, 0x22, 0x33, 0x27, 0xe7, 0x3f, 0x90, 0x4c, 0x32, 0xf4, 0xdc, 0xae, 0x3d, 0xcd, 0x99, + 0x3a, 0x22, 0xb1, 0xbb, 0xbd, 0x5e, 0x40, 0x46, 0x23, 0x45, 0xd8, 0x42, 0x35, 0xc9, 0xe4, 0xa6, + 0xfa, 0x01, 0x56, 0xb9, 0xb4, 0x7b, 0x0b, 0xab, 0x83, 0x6c, 0x8c, 0x07, 0x1d, 0x12, 0x1c, 0x9d, + 0x26, 0xd4, 0xa3, 0x24, 0xd5, 0x8c, 0x5f, 0x0d, 0xa1, 0xcc, 0x79, 0xf1, 0xfb, 0x7c, 0x8e, 0xa4, + 0x4a, 0x25, 0xad, 0xf2, 0x36, 0x9e, 0x29, 0x33, 0xaf, 0xee, 0xce, 0x3a, 0x55, 0x83, 0x75, 0x36, + 0xa4, 0x01, 0xc1, 0x18, 0x8a, 0x27, 0x27, 0x49, 0x0d, 0x92, 0xc9, 0xce, 0xb8, 0x09, 0x25, 0xc6, + 0x15, 0xc9, 0x16, 0x6a, 0x95, 0x9d, 0xb5, 0x99, 0x36, 0xef, 0x15, 0xa3, 0xcc, 0x66, 0x12, 0xa6, + 0xb6, 0xe2, 0x2a, 0x16, 0x12, 0x3e, 0xcb, 0x11, 0xe2, 0xd9, 0x8a, 0x72, 0x8c, 0x1a, 0x88, 0xda, + 0x1d, 0x0a, 0x1f, 0x41, 0xd1, 0xa4, 0x1e, 0x61, 0x95, 0xad, 0xee, 0xc8, 0x29, 0x9d, 0x66, 0x44, + 0x7e, 0x93, 0xa1, 0xea, 0x77, 0x01, 0x24, 0xcd, 0x68, 0x93, 0xe0, 0xdc, 0xed, 0x92, 0xa8, 0x25, + 0xc9, 0x71, 0x4a, 0x96, 0x3a, 0x70, 0x03, 0xb0, 0x4e, 0xbb, 0xfd, 0xc4, 0xc1, 0xb7, 0xa0, 0xc0, + 0xc2, 0xe6, 0x20, 0xf8, 0x25, 0xac, 0xb7, 0xdc, 0x21, 0xf1, 0x5c, 0x9f, 0xe4, 0xee, 0xc4, 0x9b, + 0xb3, 0x00, 0x8d, 0xb6, 0xbe, 0x7d, 0xac, 0xf3, 0xd8, 0x22, 0x8b, 0xcd, 0x78, 0x22, 0x5c, 0x0b, + 0x3d, 0x8e, 0x2f, 0xc7, 0x78, 0xea, 0xc1, 0x6f, 0xa0, 0xa4, 0xdb, 0x1d, 0xe2, 0x8d, 0x94, 0x12, + 0x6b, 0xe5, 0x66, 0xb6, 0xf6, 0x24, 0x57, 0x23, 0x8e, 0x78, 0xe7, 0x87, 0xc1, 0x84, 0xf7, 0x35, + 0x76, 0xe1, 0x6d, 0x90, 0x3e, 0xd2, 0xa0, 0xdf, 0x0e, 0xed, 0x90, 0x28, 0x22, 0xeb, 0xde, 0xdf, + 0x29, 0xc3, 0x14, 0x32, 0xd3, 0x28, 0xac, 0xc2, 0xca, 0xf1, 0x98, 0x04, 0x13, 0xae, 0xa9, 0xcc, + 0x34, 0xdd, 0xf2, 0x6d, 0x18, 0x50, 0xc9, 0xe4, 0xc4, 0x32, 0x08, 0x7d, 0x32, 0x49, 0x9a, 0x1c, + 0x1d, 0xf1, 0x63, 0x58, 0x3e, 0xb7, 0xbd, 0x71, 0x3c, 0xb1, 0x4a, 0x36, 0x27, 0xbb, 0xa7, 0xbb, + 0xa3, 0xd0, 0x8c, 0x23, 0x5e, 0x17, 0x5e, 0x21, 0xf5, 0x87, 0x00, 0x92, 0xf5, 0xc0, 0xc9, 0x3d, + 0x81, 0x35, 0xeb, 0xc2, 0x9f, 0x3b, 0xb8, 0x59, 0x00, 0xbf, 0x80, 0x7f, 0x74, 0xea, 0x58, 0xb6, + 0xeb, 0xcd, 0x1d, 0xdb, 0x7c, 0x70, 0xc1, 0x76, 0x14, 0x17, 0x6e, 0xc7, 0x7d, 0x53, 0x4c, 0x5f, + 0x58, 0xe9, 0x41, 0x2f, 0x2c, 0x33, 0x76, 0x31, 0x3f, 0x76, 0xeb, 0x01, 0x63, 0xff, 0x13, 0x33, + 0xfc, 0x1f, 0xa4, 0xa9, 0x1f, 0xaf, 0x4f, 0xf5, 0xa3, 0x2d, 0xa1, 0x26, 0x71, 0x61, 0xf5, 0x6d, + 0xa8, 0x24, 0xea, 0xad, 0xc9, 0x90, 0xe0, 0x12, 0x14, 0x34, 0x43, 0x5e, 0x8a, 0xbe, 0x96, 0x21, + 0x23, 0x2c, 0x82, 0xa0, 0x1f, 0x1d, 0xc8, 0x05, 0x2c, 0xc1, 0x72, 0xcb, 0x3c, 0xfa, 0xf4, 0x59, + 0x16, 0xea, 0x0a, 0x94, 0xe2, 0x57, 0xce, 0xa2, 0x5a, 0x71, 0xf4, 0x6e, 0x4b, 0x46, 0xf5, 0xb7, + 0x99, 0xe5, 0xc6, 0x15, 0x10, 0x4f, 0xfc, 0xbe, 0x4f, 0xbf, 0xfa, 0xf2, 0x52, 0x64, 0x44, 0x88, + 0xeb, 0x3b, 0x32, 0xc2, 0x2b, 0x50, 0xde, 0x0f, 0x6c, 0xd7, 0x8f, 0xac, 0x42, 0x04, 0x31, 0x8b, + 0xf4, 0x64, 0x61, 0x4f, 0xbb, 0xfa, 0x55, 0x45, 0x97, 0x37, 0x55, 0x74, 0x75, 0x53, 0x45, 0x3f, + 0x6f, 0xaa, 0xe8, 0xcb, 0x76, 0xe6, 0xff, 0x37, 0xb0, 0xc3, 0xc0, 0xbd, 0xa0, 0x81, 0xeb, 0xb8, + 0x3e, 0x37, 0x7c, 0xd2, 0x1c, 0xf6, 0x9d, 0xe6, 0xb0, 0xd3, 0xe4, 0xdd, 0xe8, 0x94, 0xd8, 0xaf, + 0xf0, 0xf9, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x92, 0x68, 0x8e, 0x73, 0x55, 0x07, 0x00, 0x00, } func (m *TNShardRecord) Marshal() (dAtA []byte, err error) { @@ -1282,6 +1290,13 @@ func (m *TNService) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.QueryAddress) > 0 { + i -= len(m.QueryAddress) + copy(dAtA[i:], m.QueryAddress) + i = encodeVarintMetadata(dAtA, i, uint64(len(m.QueryAddress))) + i-- + dAtA[i] = 0x42 + } if len(m.Labels) > 0 { for k := range m.Labels { v := m.Labels[k] @@ -1631,6 +1646,10 @@ func (m *TNService) Size() (n int) { n += mapEntrySize + 1 + sovMetadata(uint64(mapEntrySize)) } } + l = len(m.QueryAddress) + if l > 0 { + n += 1 + l + sovMetadata(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -3156,6 +3175,38 @@ func (m *TNService) Unmarshal(dAtA []byte) error { } m.Labels[mapkey] = *mapvalue iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field QueryAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMetadata + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthMetadata + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.QueryAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipMetadata(dAtA[iNdEx:]) diff --git a/pkg/pb/query/query.pb.go b/pkg/pb/query/query.pb.go index f23814a7e143..b86f52dfd130 100644 --- a/pkg/pb/query/query.pb.go +++ b/pkg/pb/query/query.pb.go @@ -4,6 +4,7 @@ package query import ( + encoding_binary "encoding/binary" fmt "fmt" io "io" math "math" @@ -49,6 +50,8 @@ const ( CmdMethod_GetLockInfo CmdMethod = 5 // GetTxnInfo gets the txn info from the cn CmdMethod_GetTxnInfo CmdMethod = 6 + // GetCacheInfo gets the cache info from the cn,tn + CmdMethod_GetCacheInfo CmdMethod = 7 ) var CmdMethod_name = map[int32]string{ @@ -59,6 +62,7 @@ var CmdMethod_name = map[int32]string{ 4: "TraceSpan", 5: "GetLockInfo", 6: "GetTxnInfo", + 7: "GetCacheInfo", } var CmdMethod_value = map[string]int32{ @@ -69,6 +73,7 @@ var CmdMethod_value = map[string]int32{ "TraceSpan": 4, "GetLockInfo": 5, "GetTxnInfo": 6, + "GetCacheInfo": 7, } func (x CmdMethod) String() string { @@ -206,10 +211,12 @@ type Request struct { // GetLockInfoRequest is the request for getting the lock from the cn GetLockInfoRequest *GetLockInfoRequest `protobuf:"bytes,8,opt,name=GetLockInfoRequest,proto3" json:"GetLockInfoRequest,omitempty"` // GetTxnInfoRequest is the request for getting the txn info from the cn - GetTxnInfoRequest *GetTxnInfoRequest `protobuf:"bytes,9,opt,name=GetTxnInfoRequest,proto3" json:"GetTxnInfoRequest,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + GetTxnInfoRequest *GetTxnInfoRequest `protobuf:"bytes,9,opt,name=GetTxnInfoRequest,proto3" json:"GetTxnInfoRequest,omitempty"` + // GetCacheInfoRequest is the request for getting the cache info from the cn,tn + GetCacheInfoRequest *GetCacheInfoRequest `protobuf:"bytes,10,opt,name=GetCacheInfoRequest,proto3" json:"GetCacheInfoRequest,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *Request) Reset() { *m = Request{} } @@ -308,6 +315,13 @@ func (m *Request) GetGetTxnInfoRequest() *GetTxnInfoRequest { return nil } +func (m *Request) GetGetCacheInfoRequest() *GetCacheInfoRequest { + if m != nil { + return m.GetCacheInfoRequest + } + return nil +} + // ShowProcessListResponse is the response of command ShowProcessList. type ShowProcessListResponse struct { Sessions []*status.Session `protobuf:"bytes,1,rep,name=Sessions,proto3" json:"Sessions,omitempty"` @@ -375,10 +389,12 @@ type Response struct { // GetLockInfoResponse is the response of GetLockInfo GetLockInfoResponse *GetLockInfoResponse `protobuf:"bytes,8,opt,name=GetLockInfoResponse,proto3" json:"GetLockInfoResponse,omitempty"` // GetTxnInfoResponse is the response to GetTxnInfo - GetTxnInfoResponse *GetTxnInfoResponse `protobuf:"bytes,9,opt,name=GetTxnInfoResponse,proto3" json:"GetTxnInfoResponse,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + GetTxnInfoResponse *GetTxnInfoResponse `protobuf:"bytes,9,opt,name=GetTxnInfoResponse,proto3" json:"GetTxnInfoResponse,omitempty"` + // GetCacheInfoResponse is the response to GetCacheInfo + GetCacheInfoResponse *GetCacheInfoResponse `protobuf:"bytes,10,opt,name=GetCacheInfoResponse,proto3" json:"GetCacheInfoResponse,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *Response) Reset() { *m = Response{} } @@ -477,6 +493,13 @@ func (m *Response) GetGetTxnInfoResponse() *GetTxnInfoResponse { return nil } +func (m *Response) GetGetCacheInfoResponse() *GetCacheInfoResponse { + if m != nil { + return m.GetCacheInfoResponse + } + return nil +} + // AlterAccountRequest is the "alter account restricted" query request. type AlterAccountRequest struct { // Tenant is the tenant which to alter. @@ -1217,6 +1240,185 @@ func (m *GetTxnInfoResponse) GetTxnInfoList() []*TxnInfo { return nil } +type GetCacheInfoRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetCacheInfoRequest) Reset() { *m = GetCacheInfoRequest{} } +func (m *GetCacheInfoRequest) String() string { return proto.CompactTextString(m) } +func (*GetCacheInfoRequest) ProtoMessage() {} +func (*GetCacheInfoRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_5c6ac9b241082464, []int{18} +} +func (m *GetCacheInfoRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GetCacheInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GetCacheInfoRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *GetCacheInfoRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetCacheInfoRequest.Merge(m, src) +} +func (m *GetCacheInfoRequest) XXX_Size() int { + return m.Size() +} +func (m *GetCacheInfoRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetCacheInfoRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_GetCacheInfoRequest proto.InternalMessageInfo + +type CacheInfo struct { + // NodeType is the type of the node. cn, tn + NodeType string `protobuf:"bytes,1,opt,name=NodeType,proto3" json:"NodeType,omitempty"` + // NodeId is the uuid of the node. + NodeId string `protobuf:"bytes,2,opt,name=NodeId,proto3" json:"NodeId,omitempty"` + // CacheType is the type of the cache. memory, disk + CacheType string `protobuf:"bytes,3,opt,name=CacheType,proto3" json:"CacheType,omitempty"` + // Used is the used bytes of the cache for memory cache + Used uint64 `protobuf:"varint,4,opt,name=Used,proto3" json:"Used,omitempty"` + // Free is the free bytes of the cache for memory cache + Free uint64 `protobuf:"varint,5,opt,name=Free,proto3" json:"Free,omitempty"` + // HitRatio is the hit ratio of the cache. + HitRatio float32 `protobuf:"fixed32,6,opt,name=HitRatio,proto3" json:"HitRatio,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CacheInfo) Reset() { *m = CacheInfo{} } +func (m *CacheInfo) String() string { return proto.CompactTextString(m) } +func (*CacheInfo) ProtoMessage() {} +func (*CacheInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_5c6ac9b241082464, []int{19} +} +func (m *CacheInfo) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CacheInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_CacheInfo.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *CacheInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_CacheInfo.Merge(m, src) +} +func (m *CacheInfo) XXX_Size() int { + return m.Size() +} +func (m *CacheInfo) XXX_DiscardUnknown() { + xxx_messageInfo_CacheInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_CacheInfo proto.InternalMessageInfo + +func (m *CacheInfo) GetNodeType() string { + if m != nil { + return m.NodeType + } + return "" +} + +func (m *CacheInfo) GetNodeId() string { + if m != nil { + return m.NodeId + } + return "" +} + +func (m *CacheInfo) GetCacheType() string { + if m != nil { + return m.CacheType + } + return "" +} + +func (m *CacheInfo) GetUsed() uint64 { + if m != nil { + return m.Used + } + return 0 +} + +func (m *CacheInfo) GetFree() uint64 { + if m != nil { + return m.Free + } + return 0 +} + +func (m *CacheInfo) GetHitRatio() float32 { + if m != nil { + return m.HitRatio + } + return 0 +} + +type GetCacheInfoResponse struct { + CacheInfoList []*CacheInfo `protobuf:"bytes,1,rep,name=CacheInfoList,proto3" json:"CacheInfoList,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetCacheInfoResponse) Reset() { *m = GetCacheInfoResponse{} } +func (m *GetCacheInfoResponse) String() string { return proto.CompactTextString(m) } +func (*GetCacheInfoResponse) ProtoMessage() {} +func (*GetCacheInfoResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_5c6ac9b241082464, []int{20} +} +func (m *GetCacheInfoResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GetCacheInfoResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GetCacheInfoResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *GetCacheInfoResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetCacheInfoResponse.Merge(m, src) +} +func (m *GetCacheInfoResponse) XXX_Size() int { + return m.Size() +} +func (m *GetCacheInfoResponse) XXX_DiscardUnknown() { + xxx_messageInfo_GetCacheInfoResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_GetCacheInfoResponse proto.InternalMessageInfo + +func (m *GetCacheInfoResponse) GetCacheInfoList() []*CacheInfo { + if m != nil { + return m.CacheInfoList + } + return nil +} + func init() { proto.RegisterEnum("query.CmdMethod", CmdMethod_name, CmdMethod_value) proto.RegisterType((*QueryRequest)(nil), "query.QueryRequest") @@ -1237,78 +1439,90 @@ func init() { proto.RegisterType((*TxnLockInfo)(nil), "query.TxnLockInfo") proto.RegisterType((*TxnInfo)(nil), "query.TxnInfo") proto.RegisterType((*GetTxnInfoResponse)(nil), "query.GetTxnInfoResponse") + proto.RegisterType((*GetCacheInfoRequest)(nil), "query.GetCacheInfoRequest") + proto.RegisterType((*CacheInfo)(nil), "query.CacheInfo") + proto.RegisterType((*GetCacheInfoResponse)(nil), "query.GetCacheInfoResponse") } func init() { proto.RegisterFile("query.proto", fileDescriptor_5c6ac9b241082464) } var fileDescriptor_5c6ac9b241082464 = []byte{ - // 1054 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0xc1, 0x6e, 0xdb, 0x46, - 0x10, 0x0d, 0x23, 0x4a, 0x22, 0x47, 0x8a, 0xcd, 0xac, 0x0d, 0x47, 0x75, 0x53, 0x5b, 0x20, 0x0a, - 0xc4, 0x48, 0x5a, 0x3a, 0x50, 0x0e, 0x05, 0x8a, 0x1e, 0xe2, 0xa8, 0x4d, 0x2a, 0xc4, 0x6e, 0xda, - 0x91, 0xd2, 0x06, 0x39, 0x14, 0xa0, 0xa4, 0x8d, 0x44, 0x58, 0xe2, 0x2a, 0x24, 0x85, 0xc8, 0xe8, - 0x4f, 0xf4, 0x77, 0x7a, 0xea, 0x35, 0xb7, 0xf6, 0xd8, 0x53, 0x5b, 0xf8, 0x4b, 0x8a, 0x1d, 0x2e, - 0x49, 0x51, 0xa4, 0x80, 0x1e, 0x72, 0xdb, 0x99, 0x79, 0xf3, 0xb8, 0x3b, 0xfb, 0x66, 0xb8, 0xd0, - 0x78, 0xbb, 0xe4, 0xc1, 0x95, 0xb3, 0x08, 0x44, 0x24, 0x58, 0x95, 0x8c, 0xc3, 0x66, 0x18, 0xb9, - 0xd1, 0x32, 0x8c, 0x9d, 0x87, 0x30, 0x13, 0xa3, 0x4b, 0xb5, 0x36, 0xa3, 0x95, 0xaf, 0x96, 0x9f, - 0x4f, 0xbc, 0x68, 0xba, 0x1c, 0x3a, 0x23, 0x31, 0x3f, 0x9d, 0x88, 0x89, 0x38, 0x25, 0xf7, 0x70, - 0xf9, 0x86, 0x2c, 0x32, 0x68, 0xa5, 0xe0, 0xc7, 0x13, 0x21, 0x26, 0x33, 0x9e, 0xa1, 0x22, 0x6f, - 0xce, 0xc3, 0xc8, 0x9d, 0x2f, 0x62, 0x80, 0xfd, 0x29, 0x34, 0x7f, 0x90, 0x5f, 0x47, 0xfe, 0x76, - 0xc9, 0xc3, 0x88, 0xed, 0x43, 0x95, 0xec, 0x96, 0xd6, 0xd6, 0x4e, 0x4c, 0x8c, 0x0d, 0xfb, 0x3b, - 0x38, 0xe8, 0x4f, 0xc5, 0xbb, 0xef, 0x03, 0x31, 0xe2, 0x61, 0x78, 0xee, 0x85, 0x51, 0x82, 0x3f, - 0x80, 0xda, 0x80, 0xfb, 0xae, 0x1f, 0xa9, 0x04, 0x65, 0xb1, 0xbb, 0x60, 0xf6, 0xaf, 0x42, 0x15, - 0xba, 0xd9, 0xd6, 0x4e, 0x0c, 0xcc, 0x1c, 0xf6, 0x1f, 0x3a, 0xd4, 0x13, 0x86, 0xbb, 0x60, 0xaa, - 0x65, 0xef, 0x6b, 0x22, 0xd1, 0x31, 0x73, 0x30, 0x07, 0xcc, 0xee, 0x7c, 0x7c, 0xc1, 0xa3, 0xa9, - 0x18, 0x13, 0xcf, 0x4e, 0xc7, 0x72, 0xe2, 0xe2, 0xa5, 0x7e, 0xcc, 0x20, 0xec, 0x8b, 0xfc, 0x79, - 0x5a, 0x95, 0xb6, 0x76, 0xd2, 0xe8, 0xec, 0xa9, 0x94, 0xf5, 0x10, 0xe6, 0x0f, 0xfe, 0x72, 0xdb, - 0x11, 0x5b, 0x3a, 0x51, 0x7c, 0xa2, 0x28, 0xca, 0x41, 0xb8, 0xad, 0x3e, 0xe7, 0xb0, 0x77, 0x36, - 0x8b, 0x78, 0x70, 0x36, 0x1a, 0x89, 0xa5, 0x9f, 0x72, 0x56, 0x89, 0xf3, 0x50, 0x71, 0x96, 0x20, - 0xb0, 0x2c, 0x8d, 0x3d, 0x86, 0xdd, 0xe7, 0xde, 0x6c, 0xd6, 0x15, 0xbe, 0x9f, 0x30, 0xd5, 0x88, - 0xe9, 0x40, 0x31, 0x6d, 0x44, 0x71, 0x13, 0xce, 0xba, 0x60, 0x0d, 0x02, 0x77, 0xc4, 0xfb, 0x0b, - 0x37, 0xa5, 0xa8, 0x13, 0xc5, 0x1d, 0x45, 0xb1, 0x19, 0xc6, 0x42, 0x02, 0xeb, 0x01, 0x7b, 0xc6, - 0xa3, 0x73, 0x31, 0xba, 0xec, 0xf9, 0x6f, 0x44, 0x42, 0x63, 0x10, 0xcd, 0x47, 0x8a, 0xa6, 0x08, - 0xc0, 0x92, 0x24, 0xf6, 0x14, 0x6e, 0x3f, 0xe3, 0xd1, 0x60, 0xe5, 0xaf, 0x33, 0x99, 0xc4, 0xd4, - 0xca, 0x98, 0xf2, 0x71, 0x2c, 0xa6, 0xd8, 0x4f, 0xe1, 0x4e, 0xe1, 0x06, 0xc2, 0x85, 0xf0, 0x43, - 0xce, 0x1e, 0x80, 0xd1, 0xe7, 0x61, 0xe8, 0x09, 0x3f, 0x6c, 0x69, 0xed, 0xca, 0x49, 0xa3, 0xb3, - 0xeb, 0xa8, 0x56, 0x53, 0x7e, 0x4c, 0x01, 0xf6, 0xef, 0x3a, 0x18, 0x69, 0xe6, 0x87, 0x95, 0xe6, - 0x3e, 0x54, 0xbf, 0x09, 0x02, 0x11, 0x90, 0x26, 0x9b, 0x18, 0x1b, 0xec, 0xd5, 0xd6, 0x8d, 0x2b, - 0xe1, 0x1d, 0x6d, 0x13, 0x5e, 0x8c, 0xc2, 0xad, 0xe7, 0x7e, 0x01, 0xfb, 0x79, 0x0d, 0x29, 0xda, - 0x58, 0x7b, 0x1f, 0x97, 0x6a, 0x4f, 0x71, 0x96, 0x26, 0x4a, 0xed, 0x64, 0x72, 0x52, 0x64, 0xb5, - 0x9c, 0x76, 0x36, 0xc3, 0x58, 0x48, 0x90, 0x17, 0xbe, 0xa6, 0x27, 0xc5, 0x52, 0xcf, 0x5d, 0x78, - 0x21, 0x8e, 0xc5, 0x14, 0xd9, 0x58, 0x39, 0x39, 0x29, 0x26, 0x23, 0xd7, 0x58, 0x25, 0x08, 0x2c, - 0x4b, 0x53, 0x8a, 0x4e, 0x35, 0xa5, 0xc8, 0xcc, 0x4d, 0x45, 0x6f, 0x00, 0xb0, 0x24, 0xc9, 0xee, - 0x95, 0x76, 0x3c, 0x3b, 0x04, 0x23, 0x1e, 0x7e, 0xbd, 0x31, 0x49, 0xa9, 0x82, 0xa9, 0x2d, 0x87, - 0x68, 0x9f, 0x04, 0x49, 0xd2, 0x30, 0x51, 0x59, 0xf6, 0x97, 0xe5, 0x37, 0xc8, 0x6c, 0x68, 0xba, - 0xd2, 0xdf, 0x5f, 0x8e, 0xe4, 0xad, 0x13, 0x9f, 0x81, 0x39, 0x9f, 0xdd, 0x2b, 0x8c, 0x0a, 0x29, - 0x67, 0xc5, 0xa4, 0xe4, 0x5c, 0xc1, 0xcc, 0xc1, 0x5a, 0x50, 0xff, 0x91, 0x07, 0xb2, 0x0b, 0x48, - 0xcc, 0x3a, 0x26, 0xa6, 0xfd, 0x59, 0xf1, 0xde, 0x25, 0x3a, 0xff, 0xf5, 0xc4, 0xb4, 0x5f, 0x15, - 0x27, 0x0c, 0xb3, 0xa0, 0xd2, 0x9d, 0x8f, 0xd5, 0x2f, 0x42, 0x2e, 0x65, 0x33, 0x48, 0x40, 0x48, - 0xdf, 0x32, 0x31, 0x36, 0xe4, 0x0e, 0x07, 0xd3, 0x80, 0x87, 0x53, 0x31, 0x1b, 0x53, 0x2d, 0x2a, - 0x98, 0x39, 0xec, 0x7b, 0x25, 0xd2, 0x61, 0x0c, 0x74, 0xb9, 0x56, 0xdc, 0xb4, 0xb6, 0xf7, 0xcb, - 0xe6, 0x93, 0xfd, 0x97, 0x06, 0x46, 0xe2, 0x93, 0xfb, 0x1f, 0xb8, 0xc3, 0x19, 0x57, 0xb7, 0xa1, - 0x63, 0x62, 0x4a, 0xc2, 0xe7, 0xfc, 0x4a, 0x6e, 0xac, 0x72, 0xd2, 0x44, 0x5a, 0xb3, 0xfb, 0x71, - 0xe6, 0x85, 0x18, 0x73, 0xda, 0xd6, 0x4e, 0x67, 0xc7, 0xa1, 0xff, 0x73, 0xe2, 0xc5, 0x34, 0xce, - 0xda, 0xd0, 0xf0, 0x42, 0x74, 0xfd, 0x09, 0x97, 0x2e, 0x6a, 0x62, 0x03, 0xd7, 0x5d, 0xec, 0x1e, - 0xd4, 0xbf, 0x15, 0xb3, 0x31, 0x0f, 0xc2, 0x56, 0x95, 0xe6, 0xd1, 0xad, 0x98, 0xec, 0x27, 0xd7, - 0x93, 0x6a, 0xc2, 0x24, 0x2a, 0x81, 0xd2, 0x27, 0x81, 0xb5, 0x52, 0xa0, 0x8a, 0xda, 0x3f, 0x97, - 0x36, 0x83, 0x3c, 0x4a, 0xd7, 0xef, 0x25, 0x75, 0xa7, 0x35, 0x7b, 0x04, 0xcd, 0x04, 0x27, 0xa7, - 0x05, 0x1d, 0x53, 0x4e, 0xc4, 0x58, 0xe3, 0x29, 0x45, 0x0e, 0x64, 0xef, 0x95, 0x4c, 0x69, 0x7b, - 0x0a, 0x8d, 0xc1, 0xca, 0xff, 0x7f, 0x15, 0x45, 0xf1, 0x2e, 0xad, 0xa8, 0x5c, 0xb3, 0x07, 0x50, - 0x7f, 0xb1, 0x88, 0x68, 0x26, 0xc7, 0xbf, 0xe8, 0xdb, 0x59, 0x41, 0x55, 0x00, 0x13, 0x84, 0xfd, - 0x9b, 0x06, 0x75, 0xf5, 0x71, 0xf6, 0x18, 0x8c, 0x6e, 0xc0, 0xdd, 0x88, 0x9f, 0xc5, 0x4f, 0x0e, - 0xd9, 0xec, 0xf1, 0x23, 0xc7, 0x49, 0x1e, 0x39, 0xce, 0x20, 0x79, 0xe4, 0x3c, 0x31, 0xde, 0xff, - 0x7d, 0x7c, 0xe3, 0xd7, 0x7f, 0x8e, 0x35, 0x4c, 0xb3, 0x58, 0x1b, 0xf4, 0x0b, 0x1e, 0xb9, 0xa4, - 0xbc, 0x46, 0xa7, 0xe9, 0xc8, 0xc7, 0xd5, 0x60, 0xe5, 0x4b, 0x1f, 0x52, 0x44, 0x1e, 0xe5, 0x65, - 0xc8, 0x83, 0xc1, 0xca, 0xa7, 0xcd, 0x19, 0x98, 0x98, 0xec, 0x21, 0x98, 0xb2, 0xe6, 0x72, 0x97, - 0x61, 0x4b, 0xa7, 0xd2, 0xb1, 0x64, 0x6a, 0x65, 0xb5, 0xc0, 0x0c, 0x64, 0xbf, 0x2e, 0x9b, 0x2c, - 0xa5, 0x37, 0xf3, 0x90, 0xea, 0xb9, 0x71, 0x31, 0x3b, 0x19, 0x3b, 0x11, 0xac, 0x43, 0xee, 0xff, - 0xb2, 0xf6, 0x07, 0x62, 0xa6, 0x7a, 0xb9, 0x59, 0x37, 0xd8, 0x1e, 0xec, 0x6e, 0xfc, 0x14, 0x2c, - 0x8d, 0x59, 0xd0, 0x5c, 0x1f, 0x26, 0xd6, 0x4d, 0xd6, 0x04, 0x23, 0xe9, 0x6b, 0xab, 0xc2, 0x6e, - 0x81, 0x99, 0x76, 0x97, 0xa5, 0xb3, 0x5d, 0x68, 0xac, 0x49, 0xca, 0xaa, 0xb2, 0x1d, 0x80, 0xec, - 0x20, 0x56, 0xed, 0xc9, 0x57, 0xef, 0xaf, 0x8f, 0xb4, 0x3f, 0xaf, 0x8f, 0xb4, 0x7f, 0xaf, 0x8f, - 0xb4, 0xd7, 0xce, 0xda, 0xbb, 0x74, 0xee, 0x46, 0x81, 0xb7, 0x12, 0x81, 0x37, 0xf1, 0xfc, 0xc4, - 0xf0, 0xf9, 0xe9, 0xe2, 0x72, 0x72, 0xba, 0x18, 0x9e, 0xd2, 0x79, 0x86, 0x35, 0xba, 0xac, 0x47, - 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xdd, 0xc6, 0x90, 0xb3, 0x09, 0x0b, 0x00, 0x00, + // 1188 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xcd, 0x6e, 0xdb, 0x46, + 0x10, 0x0e, 0xa3, 0x3f, 0x72, 0xa4, 0xd8, 0xcc, 0xda, 0x75, 0x54, 0x37, 0xb5, 0x05, 0xa2, 0x40, + 0x8c, 0xa4, 0x95, 0x03, 0x07, 0x68, 0x81, 0xa2, 0x87, 0x38, 0x6a, 0xed, 0x08, 0xb1, 0x9d, 0x76, + 0x24, 0xb7, 0x41, 0x0e, 0x05, 0x68, 0x69, 0x23, 0x11, 0x96, 0xb8, 0x0a, 0x49, 0x21, 0xf2, 0x43, + 0x14, 0xc8, 0x0b, 0xf4, 0xd0, 0xc7, 0xe8, 0x1b, 0xe4, 0xd8, 0x63, 0x4f, 0x6d, 0xe1, 0x27, 0x29, + 0x76, 0xb8, 0xfc, 0x93, 0xd6, 0x40, 0x0f, 0xbd, 0xcd, 0xcc, 0x7e, 0xf3, 0x71, 0x77, 0xf4, 0xcd, + 0xec, 0x0a, 0xea, 0x6f, 0xe7, 0x3c, 0xb8, 0x6a, 0xcf, 0x02, 0x11, 0x09, 0x56, 0x21, 0x67, 0xbb, + 0x11, 0x46, 0x6e, 0x34, 0x0f, 0xe3, 0xe0, 0x36, 0x4c, 0xc4, 0xe0, 0x52, 0xd9, 0x56, 0xb4, 0xf0, + 0x95, 0xf9, 0xc5, 0xc8, 0x8b, 0xc6, 0xf3, 0x8b, 0xf6, 0x40, 0x4c, 0xf7, 0x47, 0x62, 0x24, 0xf6, + 0x29, 0x7c, 0x31, 0x7f, 0x43, 0x1e, 0x39, 0x64, 0x29, 0xf8, 0xee, 0x48, 0x88, 0xd1, 0x84, 0x67, + 0xa8, 0xc8, 0x9b, 0xf2, 0x30, 0x72, 0xa7, 0xb3, 0x18, 0xe0, 0x7c, 0x06, 0x8d, 0x1f, 0xe4, 0xd7, + 0x91, 0xbf, 0x9d, 0xf3, 0x30, 0x62, 0x9b, 0x50, 0x21, 0xbf, 0x69, 0xb4, 0x8c, 0x3d, 0x0b, 0x63, + 0xc7, 0x39, 0x83, 0xad, 0xde, 0x58, 0xbc, 0xfb, 0x3e, 0x10, 0x03, 0x1e, 0x86, 0x27, 0x5e, 0x18, + 0x25, 0xf8, 0x2d, 0xa8, 0xf6, 0xb9, 0xef, 0xfa, 0x91, 0x4a, 0x50, 0x1e, 0xbb, 0x0f, 0x56, 0xef, + 0x2a, 0x54, 0x4b, 0xb7, 0x5b, 0xc6, 0x9e, 0x89, 0x59, 0xc0, 0xf9, 0xb5, 0x02, 0xb5, 0x84, 0xe1, + 0x3e, 0x58, 0xca, 0xec, 0x7e, 0x4b, 0x24, 0x65, 0xcc, 0x02, 0xac, 0x0d, 0x56, 0x67, 0x3a, 0x3c, + 0xe5, 0xd1, 0x58, 0x0c, 0x89, 0x67, 0xed, 0xc0, 0x6e, 0xc7, 0xc5, 0x4b, 0xe3, 0x98, 0x41, 0xd8, + 0x57, 0xc5, 0xf3, 0x34, 0x4b, 0x2d, 0x63, 0xaf, 0x7e, 0xb0, 0xa1, 0x52, 0xf2, 0x4b, 0x58, 0x3c, + 0xf8, 0xf9, 0x4d, 0x47, 0x6c, 0x96, 0x89, 0xe2, 0x53, 0x45, 0xa1, 0x07, 0xe1, 0x4d, 0xf5, 0x39, + 0x81, 0x8d, 0xc3, 0x49, 0xc4, 0x83, 0xc3, 0xc1, 0x40, 0xcc, 0xfd, 0x94, 0xb3, 0x42, 0x9c, 0xdb, + 0x8a, 0x53, 0x83, 0x40, 0x5d, 0x1a, 0x7b, 0x0a, 0xeb, 0x2f, 0xbc, 0xc9, 0xa4, 0x23, 0x7c, 0x3f, + 0x61, 0xaa, 0x12, 0xd3, 0x96, 0x62, 0x5a, 0x5a, 0xc5, 0x65, 0x38, 0xeb, 0x80, 0xdd, 0x0f, 0xdc, + 0x01, 0xef, 0xcd, 0xdc, 0x94, 0xa2, 0x46, 0x14, 0xf7, 0x14, 0xc5, 0xf2, 0x32, 0xae, 0x24, 0xb0, + 0x2e, 0xb0, 0x63, 0x1e, 0x9d, 0x88, 0xc1, 0x65, 0xd7, 0x7f, 0x23, 0x12, 0x1a, 0x93, 0x68, 0x3e, + 0x56, 0x34, 0xab, 0x00, 0xd4, 0x24, 0xb1, 0x23, 0xb8, 0x7b, 0xcc, 0xa3, 0xfe, 0xc2, 0xcf, 0x33, + 0x59, 0xc4, 0xd4, 0xcc, 0x98, 0x8a, 0xeb, 0xb8, 0x9a, 0x22, 0xeb, 0x7c, 0xcc, 0xa3, 0x8e, 0x3b, + 0x18, 0xf3, 0x3c, 0x13, 0x14, 0xea, 0xac, 0x41, 0xa0, 0x2e, 0xcd, 0x39, 0x82, 0x7b, 0x2b, 0xbf, + 0x67, 0x38, 0x13, 0x7e, 0xc8, 0xd9, 0x23, 0x30, 0x7b, 0x3c, 0x0c, 0x3d, 0xe1, 0x87, 0x4d, 0xa3, + 0x55, 0xda, 0xab, 0x1f, 0xac, 0xb7, 0x55, 0xe3, 0xaa, 0x38, 0xa6, 0x00, 0xe7, 0x7d, 0x05, 0xcc, + 0x34, 0xf3, 0xff, 0x15, 0xfa, 0x26, 0x54, 0xbe, 0x0b, 0x02, 0x11, 0x90, 0xc2, 0x1b, 0x18, 0x3b, + 0xec, 0xd5, 0x8d, 0x1b, 0x57, 0x32, 0xde, 0xb9, 0x49, 0xc6, 0x31, 0x0a, 0x6f, 0x3c, 0xf7, 0x4b, + 0xd8, 0x2c, 0x2a, 0x52, 0xd1, 0xc6, 0x4a, 0xfe, 0x44, 0xab, 0x64, 0xc5, 0xa9, 0x4d, 0x94, 0x4a, + 0xcc, 0xc4, 0xa9, 0xc8, 0xaa, 0x05, 0x25, 0x2e, 0x2f, 0xe3, 0x4a, 0x82, 0x94, 0x4f, 0x4e, 0x9d, + 0x8a, 0xa5, 0x56, 0x90, 0xcf, 0xca, 0x3a, 0xae, 0xa6, 0x28, 0xf9, 0x64, 0xe2, 0x54, 0x4c, 0xe6, + 0xb2, 0x7c, 0x96, 0x11, 0xa8, 0x4b, 0x53, 0xfd, 0x91, 0x2a, 0x54, 0x91, 0x59, 0xcb, 0xfd, 0xb1, + 0x04, 0x40, 0x4d, 0x92, 0x2c, 0x7b, 0x51, 0xa0, 0x8a, 0x0c, 0x0a, 0x65, 0xd7, 0x41, 0x50, 0x9b, + 0xe8, 0x74, 0xb5, 0x03, 0x89, 0x6d, 0x83, 0x19, 0xcf, 0xe6, 0xee, 0x90, 0xb4, 0x59, 0xc2, 0xd4, + 0x97, 0x33, 0xbe, 0x47, 0x0a, 0x27, 0xad, 0x59, 0xa8, 0x3c, 0xe7, 0x6b, 0xbd, 0x24, 0x98, 0x03, + 0x0d, 0x57, 0xc6, 0x7b, 0xf3, 0x81, 0x94, 0x11, 0xf1, 0x99, 0x58, 0x88, 0x39, 0xdd, 0x95, 0x49, + 0x26, 0xfb, 0x43, 0x31, 0xa9, 0xfe, 0x28, 0x61, 0x16, 0x60, 0x4d, 0xa8, 0xfd, 0xc8, 0x03, 0xd9, + 0x56, 0xd4, 0x1d, 0x65, 0x4c, 0x5c, 0xe7, 0xf3, 0x55, 0x21, 0x49, 0x74, 0xf1, 0xeb, 0x89, 0xeb, + 0xbc, 0x5a, 0x1d, 0x80, 0xcc, 0x86, 0x52, 0x67, 0x3a, 0x54, 0x37, 0x98, 0x34, 0x65, 0x77, 0x49, + 0x40, 0x48, 0xdf, 0xb2, 0x30, 0x76, 0xe4, 0x0e, 0xfb, 0xe3, 0x80, 0x87, 0x63, 0x31, 0x19, 0x52, + 0x2d, 0x4a, 0x98, 0x05, 0x9c, 0x07, 0x1a, 0x2d, 0x32, 0x06, 0x65, 0x69, 0x2b, 0x6e, 0xb2, 0x9d, + 0x4d, 0xdd, 0xf8, 0x74, 0xfe, 0x34, 0xc0, 0x4c, 0x62, 0x72, 0xff, 0x7d, 0xf7, 0x62, 0xc2, 0xd5, + 0xaf, 0x51, 0xc6, 0xc4, 0x95, 0x84, 0x2f, 0xf8, 0x95, 0xdc, 0x58, 0x69, 0xaf, 0x81, 0x64, 0xb3, + 0x87, 0x71, 0xe6, 0xa9, 0x18, 0x72, 0xda, 0xd6, 0xda, 0xc1, 0x5a, 0x9b, 0x9e, 0x0f, 0x49, 0x14, + 0xd3, 0x75, 0xd6, 0x82, 0xba, 0x17, 0xa2, 0xeb, 0x8f, 0xb8, 0x0c, 0xd1, 0x54, 0x30, 0x31, 0x1f, + 0x62, 0x0f, 0xa0, 0xf6, 0x5c, 0x4c, 0x86, 0x3c, 0x08, 0x9b, 0x15, 0x1a, 0x70, 0x77, 0x62, 0xb2, + 0x9f, 0x5c, 0x4f, 0xca, 0x13, 0x93, 0x55, 0x09, 0x94, 0x31, 0x09, 0xac, 0x6a, 0x81, 0x6a, 0xd5, + 0xf9, 0x59, 0xdb, 0x5d, 0xf2, 0x28, 0x1d, 0xbf, 0x9b, 0xd4, 0x9d, 0x6c, 0xf6, 0x04, 0x1a, 0x09, + 0x4e, 0x8e, 0x1f, 0x3a, 0xa6, 0x1c, 0xb1, 0xb1, 0xce, 0x53, 0x8a, 0x02, 0xc8, 0xd9, 0xd0, 0x5c, + 0x22, 0xce, 0x18, 0xea, 0xfd, 0x85, 0xff, 0xdf, 0x2a, 0x8a, 0xe2, 0x5d, 0x5a, 0x51, 0x69, 0xb3, + 0x47, 0x50, 0x7b, 0x39, 0x8b, 0x68, 0xc8, 0xc7, 0x2f, 0x88, 0xbb, 0x59, 0x41, 0xd5, 0x02, 0x26, + 0x08, 0xe7, 0x77, 0x03, 0x6a, 0xea, 0xe3, 0xec, 0x29, 0x98, 0x9d, 0x80, 0xbb, 0x11, 0x3f, 0x8c, + 0x5f, 0x44, 0x72, 0x7a, 0xc4, 0x6f, 0xb0, 0x76, 0xf2, 0x06, 0x6b, 0xf7, 0x93, 0x37, 0xd8, 0x33, + 0xf3, 0xc3, 0x5f, 0xbb, 0xb7, 0xde, 0xff, 0xbd, 0x6b, 0x60, 0x9a, 0xc5, 0x5a, 0x50, 0x3e, 0xe5, + 0x91, 0x4b, 0xca, 0xab, 0x1f, 0x34, 0xda, 0xf2, 0xed, 0xd7, 0x5f, 0xf8, 0x32, 0x86, 0xb4, 0x22, + 0x8f, 0x72, 0x1e, 0xf2, 0xa0, 0xbf, 0xf0, 0x69, 0x73, 0x26, 0x26, 0x2e, 0x7b, 0x0c, 0x96, 0xac, + 0xb9, 0xdc, 0x65, 0xd8, 0x2c, 0x53, 0xe9, 0x58, 0x32, 0x06, 0xb3, 0x5a, 0x60, 0x06, 0x72, 0x5e, + 0xeb, 0x46, 0x95, 0xf6, 0x97, 0x79, 0x4c, 0xf5, 0x5c, 0xfa, 0x61, 0xd6, 0x32, 0x76, 0x22, 0xc8, + 0x43, 0x9c, 0x8f, 0xb4, 0x77, 0xb2, 0xf3, 0x9b, 0x01, 0x56, 0x1a, 0x94, 0x83, 0xe7, 0x4c, 0x0c, + 0x79, 0xff, 0x6a, 0xc6, 0xd5, 0xe7, 0x52, 0x5f, 0x0e, 0x1e, 0x69, 0x77, 0x87, 0xaa, 0x0d, 0x95, + 0x27, 0xfb, 0x90, 0x08, 0x28, 0x29, 0x9e, 0x49, 0x59, 0x40, 0x6e, 0xfe, 0x3c, 0xe4, 0x43, 0x92, + 0x76, 0x19, 0xc9, 0x96, 0xb1, 0xa3, 0x80, 0xc7, 0xb7, 0x55, 0x19, 0xc9, 0x96, 0x5f, 0x7e, 0xee, + 0x45, 0xe8, 0x46, 0x9e, 0xa0, 0x8b, 0xe7, 0x36, 0xa6, 0xbe, 0x73, 0xa6, 0x1f, 0xbb, 0xec, 0x4b, + 0xb8, 0x93, 0x06, 0xa9, 0x0c, 0xf1, 0x13, 0x20, 0xbd, 0xa9, 0xd3, 0x84, 0x22, 0xec, 0xe1, 0x2f, + 0x46, 0xee, 0x7a, 0x67, 0x96, 0x7a, 0x64, 0xdb, 0xb7, 0xd8, 0x06, 0xac, 0x2f, 0xdd, 0xb8, 0xb6, + 0xc1, 0x6c, 0x68, 0xe4, 0x07, 0xab, 0x7d, 0x9b, 0x35, 0xc0, 0x4c, 0x66, 0x9c, 0x5d, 0x62, 0x77, + 0xc0, 0x4a, 0x27, 0x8d, 0x5d, 0x66, 0xeb, 0x50, 0xcf, 0xb5, 0x97, 0x5d, 0x61, 0x6b, 0x00, 0xd9, + 0x8f, 0x6a, 0x57, 0x25, 0x5f, 0xfe, 0x34, 0x76, 0xed, 0xd9, 0x37, 0x1f, 0xae, 0x77, 0x8c, 0x3f, + 0xae, 0x77, 0x8c, 0x7f, 0xae, 0x77, 0x8c, 0xd7, 0xed, 0xdc, 0x9f, 0x8a, 0xa9, 0x1b, 0x05, 0xde, + 0x42, 0x04, 0xde, 0xc8, 0xf3, 0x13, 0xc7, 0xe7, 0xfb, 0xb3, 0xcb, 0xd1, 0xfe, 0xec, 0x62, 0x9f, + 0x8e, 0x79, 0x51, 0x25, 0x29, 0x3f, 0xf9, 0x37, 0x00, 0x00, 0xff, 0xff, 0xe6, 0xd5, 0x88, 0x51, + 0xc6, 0x0c, 0x00, 0x00, } func (m *QueryRequest) Marshal() (dAtA []byte, err error) { @@ -1413,6 +1627,18 @@ func (m *Request) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.GetCacheInfoRequest != nil { + { + size, err := m.GetCacheInfoRequest.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x52 + } if m.GetTxnInfoRequest != nil { { size, err := m.GetTxnInfoRequest.MarshalToSizedBuffer(dAtA[:i]) @@ -1575,6 +1801,18 @@ func (m *Response) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.GetCacheInfoResponse != nil { + { + size, err := m.GetCacheInfoResponse.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x52 + } if m.GetTxnInfoResponse != nil { { size, err := m.GetTxnInfoResponse.MarshalToSizedBuffer(dAtA[:i]) @@ -2196,12 +2434,12 @@ func (m *TxnInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x12 } - n16, err16 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CreateAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CreateAt):]) - if err16 != nil { - return 0, err16 + n18, err18 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CreateAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CreateAt):]) + if err18 != nil { + return 0, err18 } - i -= n16 - i = encodeVarintQuery(dAtA, i, uint64(n16)) + i -= n18 + i = encodeVarintQuery(dAtA, i, uint64(n18)) i-- dAtA[i] = 0xa return len(dAtA) - i, nil @@ -2255,6 +2493,138 @@ func (m *GetTxnInfoResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *GetCacheInfoRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GetCacheInfoRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetCacheInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + return len(dAtA) - i, nil +} + +func (m *CacheInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CacheInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CacheInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.HitRatio != 0 { + i -= 4 + encoding_binary.LittleEndian.PutUint32(dAtA[i:], uint32(math.Float32bits(float32(m.HitRatio)))) + i-- + dAtA[i] = 0x35 + } + if m.Free != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.Free)) + i-- + dAtA[i] = 0x28 + } + if m.Used != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.Used)) + i-- + dAtA[i] = 0x20 + } + if len(m.CacheType) > 0 { + i -= len(m.CacheType) + copy(dAtA[i:], m.CacheType) + i = encodeVarintQuery(dAtA, i, uint64(len(m.CacheType))) + i-- + dAtA[i] = 0x1a + } + if len(m.NodeId) > 0 { + i -= len(m.NodeId) + copy(dAtA[i:], m.NodeId) + i = encodeVarintQuery(dAtA, i, uint64(len(m.NodeId))) + i-- + dAtA[i] = 0x12 + } + if len(m.NodeType) > 0 { + i -= len(m.NodeType) + copy(dAtA[i:], m.NodeType) + i = encodeVarintQuery(dAtA, i, uint64(len(m.NodeType))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *GetCacheInfoResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GetCacheInfoResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetCacheInfoResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.CacheInfoList) > 0 { + for iNdEx := len(m.CacheInfoList) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.CacheInfoList[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { offset -= sovQuery(v) base := offset @@ -2341,6 +2711,10 @@ func (m *Request) Size() (n int) { l = m.GetTxnInfoRequest.Size() n += 1 + l + sovQuery(uint64(l)) } + if m.GetCacheInfoRequest != nil { + l = m.GetCacheInfoRequest.Size() + n += 1 + l + sovQuery(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -2405,6 +2779,10 @@ func (m *Response) Size() (n int) { l = m.GetTxnInfoResponse.Size() n += 1 + l + sovQuery(uint64(l)) } + if m.GetCacheInfoResponse != nil { + l = m.GetCacheInfoResponse.Size() + n += 1 + l + sovQuery(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -2676,22 +3054,85 @@ func (m *GetTxnInfoResponse) Size() (n int) { return n } -func sovQuery(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozQuery(x uint64) (n int) { - return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +func (m *GetCacheInfoRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n } -func (m *QueryRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } + +func (m *CacheInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.NodeType) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + l = len(m.NodeId) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + l = len(m.CacheType) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + if m.Used != 0 { + n += 1 + sovQuery(uint64(m.Used)) + } + if m.Free != 0 { + n += 1 + sovQuery(uint64(m.Free)) + } + if m.HitRatio != 0 { + n += 5 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetCacheInfoResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.CacheInfoList) > 0 { + for _, e := range m.CacheInfoList { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovQuery(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozQuery(x uint64) (n int) { + return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *QueryRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } if iNdEx >= l { return io.ErrUnexpectedEOF } @@ -3187,6 +3628,42 @@ func (m *Request) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GetCacheInfoRequest", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GetCacheInfoRequest == nil { + m.GetCacheInfoRequest = &GetCacheInfoRequest{} + } + if err := m.GetCacheInfoRequest.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipQuery(dAtA[iNdEx:]) @@ -3611,6 +4088,42 @@ func (m *Response) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GetCacheInfoResponse", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GetCacheInfoResponse == nil { + m.GetCacheInfoResponse = &GetCacheInfoResponse{} + } + if err := m.GetCacheInfoResponse.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipQuery(dAtA[iNdEx:]) @@ -5040,6 +5553,338 @@ func (m *GetTxnInfoResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *GetCacheInfoRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetCacheInfoRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetCacheInfoRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CacheInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CacheInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CacheInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NodeType = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NodeId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CacheType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CacheType = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Used", wireType) + } + m.Used = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Used |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Free", wireType) + } + m.Free = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Free |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 5 { + return fmt.Errorf("proto: wrong wireType = %d for field HitRatio", wireType) + } + var v uint32 + if (iNdEx + 4) > l { + return io.ErrUnexpectedEOF + } + v = uint32(encoding_binary.LittleEndian.Uint32(dAtA[iNdEx:])) + iNdEx += 4 + m.HitRatio = float32(math.Float32frombits(v)) + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetCacheInfoResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetCacheInfoResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetCacheInfoResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CacheInfoList", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CacheInfoList = append(m.CacheInfoList, &CacheInfo{}) + if err := m.CacheInfoList[len(m.CacheInfoList)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipQuery(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/pkg/perfcounter/named.go b/pkg/perfcounter/named.go index 33f1bade0053..cf7794bdb7f6 100644 --- a/pkg/perfcounter/named.go +++ b/pkg/perfcounter/named.go @@ -15,6 +15,8 @@ package perfcounter import ( + "github.com/matrixorigin/matrixone/pkg/pb/query" + "strings" "sync" "github.com/matrixorigin/matrixone/pkg/logutil" @@ -23,12 +25,20 @@ import ( var Named sync.Map -func NameForNode(uuid string) string { - return "node:" + uuid +func NameForNode(nodeType, uuid string) string { + return "node:" + nodeType + ":" + uuid +} + +func decodeName(name string) (string, string) { + s := strings.Split(name, ":") + if len(s) != 3 { + return "", "" + } + return strings.TrimSpace(s[1]), strings.TrimSpace(s[2]) } func LogNodeCacheStats(uuid string) { - v, ok := Named.Load(NameForNode(uuid)) + v, ok := Named.Load(NameForNode("", uuid)) if !ok { return } @@ -48,3 +58,65 @@ func LogNodeCacheStats(uuid string) { float64(counter.FileService.Cache.Disk.Read.Load())), ) } + +// GetCacheStats returns the cache stats for nodes. +func GetCacheStats(callback func(info []*query.CacheInfo)) { + var ok = false + var ptr *CounterSet + var name string + Named.Range(func(k, v interface{}) bool { + if callback != nil { + name = "" + ptr = nil + + if name, ok = k.(string); !ok { + return true + } + if strings.Contains(strings.ToLower(name), "global") { + return true + } + if ptr, ok = v.(*CounterSet); !ok { + return true + } + if ptr == nil { + return true + } + + nodeType, nodeId := decodeName(name) + if len(nodeType) == 0 || len(nodeId) == 0 { + return true + } + + //memory + read1 := ptr.FileService.Cache.Memory.Read.Load() + if read1 <= 0 { + read1 = 1 + } + ci1 := &query.CacheInfo{ + NodeType: nodeType, + NodeId: nodeId, + CacheType: "memory", + Used: uint64(ptr.FileService.Cache.Memory.Used.Load()), + Free: uint64(ptr.FileService.Cache.Memory.Available.Load()), + HitRatio: float32(ptr.FileService.Cache.Memory.Hit.Load()) / float32(read1), + } + + read2 := ptr.FileService.Cache.Disk.Read.Load() + if read2 <= 0 { + read2 = 1 + } + ci2 := &query.CacheInfo{ + NodeType: nodeType, + NodeId: nodeId, + CacheType: "disk", + Used: 0, + Free: 0, + HitRatio: float32(ptr.FileService.Cache.Disk.Hit.Load()) / float32(read2), + } + + callback([]*query.CacheInfo{ci1, ci2}) + } + + return true + }) +} diff --git a/pkg/queryservice/handler.go b/pkg/queryservice/handler.go index 1e35926b3d9f..d7a12c0c1051 100644 --- a/pkg/queryservice/handler.go +++ b/pkg/queryservice/handler.go @@ -44,10 +44,12 @@ func (s *queryService) handleShowProcessList(ctx context.Context, req *pb.Reques // It is called "processList" is because it is used in "SHOW PROCESSLIST" statement. func (s *queryService) processList(tenant string, sysTenant bool) ([]*status.Session, error) { var ss []Session - if sysTenant { - ss = s.sessionMgr.GetAllSessions() - } else { - ss = s.sessionMgr.GetSessionsByTenant(tenant) + if s.sessionMgr != nil { + if sysTenant { + ss = s.sessionMgr.GetAllSessions() + } else { + ss = s.sessionMgr.GetSessionsByTenant(tenant) + } } sessions := make([]*status.Session, 0, len(ss)) for _, ses := range ss { diff --git a/pkg/queryservice/query_service_test.go b/pkg/queryservice/query_service_test.go index 3137d720f03e..06b1c2666f55 100644 --- a/pkg/queryservice/query_service_test.go +++ b/pkg/queryservice/query_service_test.go @@ -17,6 +17,7 @@ package queryservice import ( "context" "fmt" + "github.com/matrixorigin/matrixone/pkg/pb/lock" "os" "testing" "time" @@ -194,6 +195,45 @@ func runTestWithQueryService(t *testing.T, cn metadata.CNService, } return nil }, false) + qs.AddHandleFunc(pb.CmdMethod_GetCacheInfo, func(ctx context.Context, request *pb.Request, resp *pb.Response) error { + ci := &pb.CacheInfo{ + NodeType: cn.ServiceID, + NodeId: "uuid", + CacheType: "memory", + } + resp.GetCacheInfoResponse = &pb.GetCacheInfoResponse{ + CacheInfoList: []*pb.CacheInfo{ci}, + } + return nil + }, false) + qs.AddHandleFunc(pb.CmdMethod_GetTxnInfo, func(ctx context.Context, request *pb.Request, resp *pb.Response) error { + ti := &pb.TxnInfo{ + CreateAt: time.Now(), + Meta: nil, + UserTxn: true, + WaitLocks: nil, + } + resp.GetTxnInfoResponse = &pb.GetTxnInfoResponse{ + CnId: "uuid", + TxnInfoList: []*pb.TxnInfo{ti}, + } + return nil + }, false) + qs.AddHandleFunc(pb.CmdMethod_GetLockInfo, func(ctx context.Context, request *pb.Request, resp *pb.Response) error { + li := &pb.LockInfo{ + TableId: 100, + Keys: nil, + LockMode: lock.LockMode_Shared, + IsRangeLock: true, + Holders: nil, + Waiters: nil, + } + resp.GetLockInfoResponse = &pb.GetLockInfoResponse{ + CnId: "uuid1", + LockInfoList: []*pb.LockInfo{li}, + } + return nil + }, false) err = qs.Start() assert.NoError(t, err) @@ -238,3 +278,153 @@ func TestQueryServiceTraceSpan(t *testing.T) { assert.Equal(t, "echo", resp.TraceSpanResponse.Resp) }) } + +func TestRequestMultipleCn(t *testing.T) { + type args struct { + ctx context.Context + nodes []string + qs QueryService + genRequest func() *pb.Request + handleValidResponse func(string, *pb.Response) + handleInvalidResponse func(string) + } + + cn := metadata.CNService{ServiceID: "test_request_multi_cn"} + runTestWithQueryService(t, cn, func(svc QueryService, addr string, sm *SessionManager) { + ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) + defer cancel() + + ////// + + tests := []struct { + name string + args args + wantErr assert.ErrorAssertionFunc + }{ + { + name: "genRequest is nil", + args: args{ + ctx: context.Background(), + nodes: []string{}, + qs: nil, + genRequest: nil, + handleValidResponse: nil, + handleInvalidResponse: nil, + }, + wantErr: func(t assert.TestingT, err error, i ...interface{}) bool { + assert.NotNil(t, err) + return true + }, + }, + { + name: "handleValidResponse is nil", + args: args{ + ctx: context.Background(), + nodes: []string{}, + qs: nil, + genRequest: func() *pb.Request { return nil }, + handleValidResponse: nil, + handleInvalidResponse: nil, + }, + wantErr: func(t assert.TestingT, err error, i ...interface{}) bool { + assert.NotNil(t, err) + return true + }, + }, + { + name: "get cache info", + args: args{ + ctx: context.Background(), + nodes: []string{}, + qs: nil, + genRequest: func() *pb.Request { + req := svc.NewRequest(pb.CmdMethod_GetCacheInfo) + req.GetCacheInfoRequest = &pb.GetCacheInfoRequest{} + return req + }, + handleValidResponse: func(nodeAddr string, rsp *pb.Response) { + if rsp != nil && rsp.GetCacheInfoResponse != nil { + assert.GreaterOrEqual(t, len(rsp.GetCacheInfoResponse.GetCacheInfoList()), 1) + } + }, + handleInvalidResponse: nil, + }, + wantErr: func(t assert.TestingT, err error, i ...interface{}) bool { + assert.Nil(t, err) + return true + }, + }, + { + name: "get txn info", + args: args{ + ctx: context.Background(), + nodes: []string{}, + qs: nil, + genRequest: func() *pb.Request { + req := svc.NewRequest(pb.CmdMethod_GetTxnInfo) + req.GetTxnInfoRequest = &pb.GetTxnInfoRequest{} + return req + }, + handleValidResponse: func(nodeAddr string, rsp *pb.Response) { + if rsp != nil && rsp.GetTxnInfoResponse != nil { + fmt.Printf("%v\n", rsp.GetTxnInfoResponse.TxnInfoList[0].UserTxn) + assert.Equal(t, rsp.GetTxnInfoResponse.GetCnId(), "uuid") + assert.True(t, rsp.GetTxnInfoResponse.TxnInfoList[0].UserTxn) + assert.GreaterOrEqual(t, len(rsp.GetTxnInfoResponse.TxnInfoList), 1) + } + }, + handleInvalidResponse: nil, + }, + wantErr: func(t assert.TestingT, err error, i ...interface{}) bool { + assert.Nil(t, err) + return true + }, + }, + { + name: "get lock info", + args: args{ + ctx: context.Background(), + nodes: []string{}, + qs: nil, + genRequest: func() *pb.Request { + req := svc.NewRequest(pb.CmdMethod_GetLockInfo) + req.GetLockInfoRequest = &pb.GetLockInfoRequest{} + return req + }, + handleValidResponse: func(nodeAddr string, rsp *pb.Response) { + if rsp != nil && rsp.GetLockInfoResponse != nil { + li := rsp.GetLockInfoResponse.LockInfoList[0] + fmt.Printf("%v %v %v %v\n", rsp.GetLockInfoResponse.GetCnId(), li.TableId, li.LockMode, li.IsRangeLock) + assert.Equal(t, rsp.GetLockInfoResponse.GetCnId(), "uuid1") + assert.Equal(t, li.TableId, uint64(100)) + assert.Equal(t, li.LockMode, lock.LockMode_Shared) + assert.True(t, li.IsRangeLock) + assert.GreaterOrEqual(t, len(rsp.GetLockInfoResponse.LockInfoList), 1) + } + }, + handleInvalidResponse: nil, + }, + wantErr: func(t assert.TestingT, err error, i ...interface{}) bool { + assert.Nil(t, err) + return true + }, + }, + } + + ////// + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.wantErr(t, + RequestMultipleCn(ctx, + []string{addr}, + svc, + tt.args.genRequest, + tt.args.handleValidResponse, + tt.args.handleInvalidResponse), + fmt.Sprintf("RequestMultipleCn(%v, %v, %v, %v, %v, %v)", tt.args.ctx, tt.args.nodes, tt.args.qs, tt.args.genRequest != nil, tt.args.handleValidResponse != nil, tt.args.handleInvalidResponse != nil)) + }) + } + }) + +} diff --git a/pkg/sql/colexec/table_function/system_view.go b/pkg/sql/colexec/table_function/system_view.go index a67500d15ae6..ff22953466c5 100644 --- a/pkg/sql/colexec/table_function/system_view.go +++ b/pkg/sql/colexec/table_function/system_view.go @@ -15,6 +15,7 @@ package table_function import ( + "context" "encoding/hex" "fmt" "github.com/matrixorigin/matrixone/pkg/clusterservice" @@ -165,14 +166,14 @@ func moLocksCall(_ int, proc *process.Process, arg *Argument) (bool, error) { if hLen == 0 && wLen == 0 { //one record - if err := fillRecord(proc, bat, record); err != nil { + if err := fillLockRecord(proc, arg.Attrs, bat, record); err != nil { return false, err } } else if hLen == 0 && wLen != 0 { //wLen records for j := 0; j < wLen; j++ { record[plan2.MoLocksColTypeLockWait] = []byte(hex.EncodeToString(wList[j].GetTxnID())) - if err := fillRecord(proc, bat, record); err != nil { + if err := fillLockRecord(proc, arg.Attrs, bat, record); err != nil { return false, err } } @@ -180,7 +181,7 @@ func moLocksCall(_ int, proc *process.Process, arg *Argument) (bool, error) { //hLen records for j := 0; j < hLen; j++ { record[plan2.MoLocksColTypeTxnId] = []byte(hex.EncodeToString(hList[j].GetTxnID())) - if err := fillRecord(proc, bat, record); err != nil { + if err := fillLockRecord(proc, arg.Attrs, bat, record); err != nil { return false, err } } @@ -190,7 +191,7 @@ func moLocksCall(_ int, proc *process.Process, arg *Argument) (bool, error) { for k := 0; k < wLen; k++ { record[plan2.MoLocksColTypeTxnId] = []byte(hex.EncodeToString(hList[j].GetTxnID())) record[plan2.MoLocksColTypeLockWait] = []byte(hex.EncodeToString(wList[k].GetTxnID())) - if err := fillRecord(proc, bat, record); err != nil { + if err := fillLockRecord(proc, arg.Attrs, bat, record); err != nil { return false, err } } @@ -212,9 +213,10 @@ func moLocksCall(_ int, proc *process.Process, arg *Argument) (bool, error) { } } -func fillRecord(proc *process.Process, bat *batch.Batch, record [][]byte) error { - for colIdx, colData := range record { - if err := vector.AppendBytes(bat.Vecs[colIdx], colData, false, proc.GetMPool()); err != nil { +func fillLockRecord(proc *process.Process, attrs []string, bat *batch.Batch, record [][]byte) error { + for colIdx, attr := range attrs { + realColIdx := plan2.MoLocksColName2Index[strings.ToLower(attr)] + if err := vector.AppendBytes(bat.Vecs[colIdx], record[realColIdx], false, proc.GetMPool()); err != nil { return err } } @@ -226,7 +228,7 @@ func getLocks(proc *process.Process) ([]*query.GetLockInfoResponse, error) { var err error var nodes []string - disttae.SelectForSuperTenant(clusterservice.NewSelector(), "root", nil, + selectSuperTenant(clusterservice.NewSelector(), "root", nil, func(s *metadata.CNService) { nodes = append(nodes, s.QueryAddress) }) @@ -245,7 +247,7 @@ func getLocks(proc *process.Process) ([]*query.GetLockInfoResponse, error) { } } - err = queryservice.RequestMultipleCn(proc.Ctx, nodes, proc.QueryService, genRequest, handleValidResponse, nil) + err = requestMultipleCn(proc.Ctx, nodes, proc.QueryService, genRequest, handleValidResponse, nil) return rsps, err } @@ -502,7 +504,7 @@ func moTransactionsCall(_ int, proc *process.Process, arg *Argument) (bool, erro record[plan2.MoTransactionsColTypeLockContent] = []byte{} record[plan2.MoTransactionsColTypeLockMode] = []byte{} - if err := fillRecord(proc, bat, record); err != nil { + if err := fillTxnRecord(proc, arg.Attrs, bat, record); err != nil { return false, err } } else { @@ -540,7 +542,7 @@ func moTransactionsCall(_ int, proc *process.Process, arg *Argument) (bool, erro lockMode := options.GetMode().String() record[plan2.MoTransactionsColTypeLockMode] = []byte(lockMode) - if err := fillRecord(proc, bat, record); err != nil { + if err := fillTxnRecord(proc, arg.Attrs, bat, record); err != nil { return false, err } } @@ -562,12 +564,22 @@ func moTransactionsCall(_ int, proc *process.Process, arg *Argument) (bool, erro } } +func fillTxnRecord(proc *process.Process, attrs []string, bat *batch.Batch, record [][]byte) error { + for colIdx, attr := range attrs { + realColIdx := plan2.MoTransactionsColName2Index[strings.ToLower(attr)] + if err := vector.AppendBytes(bat.Vecs[colIdx], record[realColIdx], false, proc.GetMPool()); err != nil { + return err + } + } + return nil +} + // getTxns get txn info from all cn func getTxns(proc *process.Process) ([]*query.GetTxnInfoResponse, error) { var err error var nodes []string - disttae.SelectForSuperTenant(clusterservice.NewSelector(), "root", nil, + selectSuperTenant(clusterservice.NewSelector(), "root", nil, func(s *metadata.CNService) { nodes = append(nodes, s.QueryAddress) }) @@ -586,6 +598,149 @@ func getTxns(proc *process.Process) ([]*query.GetTxnInfoResponse, error) { } } - err = queryservice.RequestMultipleCn(proc.Ctx, nodes, proc.QueryService, genRequest, handleValidResponse, nil) + err = requestMultipleCn(proc.Ctx, nodes, proc.QueryService, genRequest, handleValidResponse, nil) return rsps, err } + +func moCachePrepare(proc *process.Process, arg *Argument) error { + arg.ctr.state = dataProducing + if len(arg.Args) > 0 { + return moerr.NewInvalidInput(proc.Ctx, "moCache: no argument is required") + } + for i := range arg.Attrs { + arg.Attrs[i] = strings.ToUpper(arg.Attrs[i]) + } + return nil +} + +func moCacheCall(_ int, proc *process.Process, arg *Argument) (bool, error) { + switch arg.ctr.state { + case dataProducing: + + rsps, err := getCacheStats(proc) + if err != nil { + return false, err + } + + //alloc batch + bat := batch.NewWithSize(len(arg.Attrs)) + for i, col := range arg.Attrs { + col = strings.ToLower(col) + idx, ok := plan2.MoCacheColName2Index[col] + if !ok { + return false, moerr.NewInternalError(proc.Ctx, "bad input select columns name %v", col) + } + + tp := plan2.MoCacheColTypes[idx] + bat.Vecs[i] = vector.NewVec(tp) + } + bat.Attrs = arg.Attrs + for _, rsp := range rsps { + if rsp == nil || len(rsp.CacheInfoList) == 0 { + continue + } + + for _, cache := range rsp.CacheInfoList { + if cache == nil { + continue + } + + if err = fillCacheRecord(proc, arg.Attrs, bat, cache); err != nil { + return false, err + } + } + } + + bat.SetRowCount(bat.Vecs[0].Length()) + proc.SetInputBatch(bat) + arg.ctr.state = dataFinished + return false, nil + + case dataFinished: + proc.SetInputBatch(nil) + return true, nil + default: + return false, moerr.NewInternalError(proc.Ctx, "unknown state %v", arg.ctr.state) + } +} + +func fillCacheRecord(proc *process.Process, attrs []string, bat *batch.Batch, cache *query.CacheInfo) error { + var err error + for colIdx, attr := range attrs { + switch plan2.MoCacheColType(plan2.MoCacheColName2Index[strings.ToLower(attr)]) { + case plan2.MoCacheColTypeNodeType: + if err = vector.AppendBytes(bat.Vecs[colIdx], []byte(cache.GetNodeType()), false, proc.GetMPool()); err != nil { + return err + } + case plan2.MoCacheColTypeNodeId: + if err = vector.AppendBytes(bat.Vecs[colIdx], []byte(cache.GetNodeId()), false, proc.GetMPool()); err != nil { + return err + } + case plan2.MoCacheColTypeType: + if err = vector.AppendBytes(bat.Vecs[colIdx], []byte(cache.GetCacheType()), false, proc.GetMPool()); err != nil { + return err + } + case plan2.MoCacheColTypeUsed: + if err = vector.AppendFixed(bat.Vecs[colIdx], cache.GetUsed(), false, proc.GetMPool()); err != nil { + return err + } + case plan2.MoCacheColTypeFree: + if err = vector.AppendFixed(bat.Vecs[colIdx], cache.GetFree(), false, proc.GetMPool()); err != nil { + return err + } + case plan2.MoCacheColTypeHitRatio: + if err = vector.AppendFixed(bat.Vecs[colIdx], cache.GetHitRatio(), false, proc.GetMPool()); err != nil { + return err + } + } + } + + return err +} + +// getCacheStats get txn info from all cn, tn +func getCacheStats(proc *process.Process) ([]*query.GetCacheInfoResponse, error) { + var err error + var nodes []string + + selectSuperTenant(clusterservice.NewSelector(), "root", nil, + func(s *metadata.CNService) { + nodes = append(nodes, s.QueryAddress) + }) + + listTnService(func(s *metadata.TNService) { + nodes = append(nodes, s.QueryAddress) + }) + + genRequest := func() *query.Request { + req := proc.QueryService.NewRequest(query.CmdMethod_GetCacheInfo) + req.GetCacheInfoRequest = &query.GetCacheInfoRequest{} + return req + } + + rsps := make([]*query.GetCacheInfoResponse, 0) + + handleValidResponse := func(nodeAddr string, rsp *query.Response) { + if rsp != nil && rsp.GetCacheInfoResponse != nil { + rsps = append(rsps, rsp.GetCacheInfoResponse) + } + } + + err = requestMultipleCn(proc.Ctx, nodes, proc.QueryService, genRequest, handleValidResponse, nil) + return rsps, err +} + +var selectSuperTenant = func(selector clusterservice.Selector, + username string, + filter func(string) bool, + appendFn func(service *metadata.CNService)) { + disttae.SelectForSuperTenant(selector, username, filter, appendFn) +} + +var listTnService = func(appendFn func(service *metadata.TNService)) { + disttae.ListTnService(appendFn) +} + +var requestMultipleCn = func(ctx context.Context, nodes []string, qs queryservice.QueryService, genRequest func() *query.Request, handleValidResponse func(string, *query.Response), handleInvalidResponse func(string)) error { + return queryservice.RequestMultipleCn(ctx, nodes, qs, genRequest, handleValidResponse, handleInvalidResponse) +} diff --git a/pkg/sql/colexec/table_function/system_view_test.go b/pkg/sql/colexec/table_function/system_view_test.go new file mode 100644 index 000000000000..d06dc70aaf9a --- /dev/null +++ b/pkg/sql/colexec/table_function/system_view_test.go @@ -0,0 +1,607 @@ +// Copyright 2023 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package table_function + +import ( + "context" + "fmt" + "github.com/golang/mock/gomock" + "github.com/matrixorigin/matrixone/pkg/clusterservice" + "github.com/matrixorigin/matrixone/pkg/common/mpool" + "github.com/matrixorigin/matrixone/pkg/container/vector" + "github.com/matrixorigin/matrixone/pkg/logservice" + "github.com/matrixorigin/matrixone/pkg/pb/lock" + pb "github.com/matrixorigin/matrixone/pkg/pb/logservice" + "github.com/matrixorigin/matrixone/pkg/pb/metadata" + "github.com/matrixorigin/matrixone/pkg/pb/query" + "github.com/matrixorigin/matrixone/pkg/queryservice" + "github.com/matrixorigin/matrixone/pkg/vm/process" + "github.com/prashantv/gostub" + "github.com/stretchr/testify/assert" + "reflect" + "testing" + "time" +) + +var _ queryservice.QueryService = &mockQueryService{} + +type mockQueryService struct { +} + +func (m *mockQueryService) SendMessage(ctx context.Context, address string, req *query.Request) (*query.Response, error) { + return nil, nil +} + +func (m *mockQueryService) NewRequest(method query.CmdMethod) *query.Request { + req := &query.Request{ + CmdMethod: method, + } + switch method { + case query.CmdMethod_GetCacheInfo: + req.GetCacheInfoRequest = &query.GetCacheInfoRequest{} + case query.CmdMethod_GetTxnInfo: + req.GetTxnInfoRequest = &query.GetTxnInfoRequest{} + case query.CmdMethod_GetLockInfo: + req.GetLockInfoRequest = &query.GetLockInfoRequest{} + default: + panic(fmt.Sprintf("usp method:%s", method.String())) + } + return req +} + +func (m *mockQueryService) Release(response *query.Response) { +} + +func (m *mockQueryService) Start() error { + return nil +} + +func (m *mockQueryService) Close() error { + return nil +} + +func (m *mockQueryService) AddHandleFunc(method query.CmdMethod, h func(context.Context, *query.Request, *query.Response) error, async bool) { +} + +func (m *mockQueryService) ServiceID() string { + return "mock_query_service" +} + +func Test_gettingInfo(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + wantCacheInfo := &query.CacheInfo{ + NodeType: "cache_node", + NodeId: "cache_node_id", + CacheType: "mock_cache", + } + + wantTxnInfo := &query.TxnInfo{ + CreateAt: time.Time{}, + Meta: nil, + UserTxn: true, + WaitLocks: nil, + } + + wantLockInfo := &query.LockInfo{ + TableId: 1000, + Keys: nil, + LockMode: lock.LockMode_Exclusive, + IsRangeLock: true, + Holders: nil, + Waiters: nil, + } + + selectStubs := gostub.Stub(&selectSuperTenant, + func(selector clusterservice.Selector, + username string, + filter func(string) bool, + appendFn func(service *metadata.CNService)) { + if appendFn != nil { + appendFn(&metadata.CNService{ + QueryAddress: "127.0.0.1:6060", + }) + } + }) + defer selectStubs.Reset() + + listTnStubs := gostub.Stub(&listTnService, func(appendFn func(service *metadata.TNService)) { + }) + defer listTnStubs.Reset() + + requestMultipleCnStubs := gostub.Stub(&requestMultipleCn, + func(ctx context.Context, + nodes []string, + qs queryservice.QueryService, + genRequest func() *query.Request, + handleValidResponse func(string, *query.Response), + handleInvalidResponse func(string)) error { + req := genRequest() + fmt.Println(">>>>>", *req) + resp := &query.Response{ + CmdMethod: req.CmdMethod, + } + switch req.CmdMethod { + case query.CmdMethod_GetCacheInfo: + resp.GetCacheInfoResponse = &query.GetCacheInfoResponse{ + CacheInfoList: []*query.CacheInfo{ + wantCacheInfo, + }, + } + case query.CmdMethod_GetTxnInfo: + resp.GetTxnInfoResponse = &query.GetTxnInfoResponse{ + TxnInfoList: []*query.TxnInfo{ + wantTxnInfo, + }, + } + case query.CmdMethod_GetLockInfo: + resp.GetLockInfoResponse = &query.GetLockInfoResponse{ + CnId: "xxx", + LockInfoList: []*query.LockInfo{ + wantLockInfo, + }, + } + default: + panic(fmt.Sprintf("usp method %v", req.CmdMethod.String())) + } + + fmt.Println(">>>>>", *resp) + handleValidResponse("", resp) + return nil + }) + defer requestMultipleCnStubs.Reset() + + mp, err := mpool.NewMPool("ut_pool", 0, mpool.NoFixed) + if err != nil { + assert.NoError(t, err) + } + defer mpool.DeleteMPool(mp) + + testProc := process.New(context.Background(), mp, nil, nil, nil, nil, &mockQueryService{}, nil, nil) + + type args struct { + proc *process.Process + } + //////test get cache status + tests := []struct { + name string + args args + want []*query.GetCacheInfoResponse + wantErr bool + }{ + { + name: "t1", + args: args{ + proc: testProc, + }, + want: []*query.GetCacheInfoResponse{ + { + CacheInfoList: []*query.CacheInfo{ + wantCacheInfo, + }, + }, + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := getCacheStats(tt.args.proc) + if (err != nil) != tt.wantErr { + t.Errorf("getCacheStats() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("getCacheStats() got = %v, want %v", got, tt.want) + } + }) + } + + /////test get txns info + tests1 := []struct { + name string + args args + want []*query.GetTxnInfoResponse + wantErr bool + }{ + { + name: "t2", + args: args{ + proc: testProc, + }, + want: []*query.GetTxnInfoResponse{ + { + TxnInfoList: []*query.TxnInfo{ + wantTxnInfo, + }, + }, + }, + wantErr: false, + }, + } + for _, tt := range tests1 { + t.Run(tt.name, func(t *testing.T) { + got, err := getTxns(tt.args.proc) + if (err != nil) != tt.wantErr { + t.Errorf("getCacheStats() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("getCacheStats() got = %v, want %v", got, tt.want) + } + }) + } + + /////test get locks info + tests2 := []struct { + name string + args args + want []*query.GetLockInfoResponse + wantErr bool + }{ + { + name: "t3", + args: args{ + proc: testProc, + }, + want: []*query.GetLockInfoResponse{ + { + CnId: "xxx", + LockInfoList: []*query.LockInfo{ + wantLockInfo, + }, + }, + }, + wantErr: false, + }, + } + for _, tt := range tests2 { + t.Run(tt.name, func(t *testing.T) { + got, err := getLocks(tt.args.proc) + if (err != nil) != tt.wantErr { + t.Errorf("getCacheStats() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("getCacheStats() got = %v, want %v", got, tt.want) + } + }) + } + + /////test moCacheCall + + type argsx struct { + in0 int + proc *process.Process + arg *Argument + } + tests4 := []struct { + name string + args argsx + want bool + wantErr bool + }{ + { + name: "", + args: argsx{ + proc: testProc, + arg: &Argument{ + ctr: &container{ + state: dataProducing, + executorsForArgs: nil, + }, + Rets: nil, + Args: nil, + Attrs: []string{ + "type", + "used", + "hit_ratio", + }, + Params: nil, + Name: "", + retSchema: nil, + }, + }, + want: false, + wantErr: false, + }, + } + for _, tt := range tests4 { + t.Run(tt.name, func(t *testing.T) { + got, err := moCacheCall(tt.args.in0, tt.args.proc, tt.args.arg) + if (err != nil) != tt.wantErr { + t.Errorf("moCacheCall() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("moCacheCall() got = %v, want %v", got, tt.want) + } + + assert.Equal(t, len(testProc.Reg.InputBatch.Attrs), 3) + assert.Equal(t, testProc.Reg.InputBatch.Attrs[0], "type") + assert.Equal(t, testProc.Reg.InputBatch.Attrs[1], "used") + assert.Equal(t, testProc.Reg.InputBatch.Attrs[2], "hit_ratio") + + assert.Equal(t, vector.MustStrCol(tt.args.proc.Reg.InputBatch.GetVector(0))[0], "mock_cache") + assert.Equal(t, vector.MustFixedCol[uint64](tt.args.proc.Reg.InputBatch.GetVector(1))[0], uint64(0)) + + }) + } + + ///// test moTransactionsCall + + tests5 := []struct { + name string + args argsx + want bool + wantErr assert.ErrorAssertionFunc + }{ + { + name: "", + args: argsx{ + proc: testProc, + arg: &Argument{ + ctr: &container{ + state: dataProducing, + executorsForArgs: nil, + }, + Rets: nil, + Args: nil, + Attrs: []string{ + "user_txn", + }, + Params: nil, + Name: "", + retSchema: nil, + }, + }, + want: false, + wantErr: func(assert.TestingT, error, ...interface{}) bool { + + return true + }, + }, + } + for _, tt := range tests5 { + t.Run(tt.name, func(t *testing.T) { + got, err := moTransactionsCall(tt.args.in0, tt.args.proc, tt.args.arg) + if !tt.wantErr(t, err, fmt.Sprintf("moTransactionsCall(%v, %v, %v)", tt.args.in0, tt.args.proc, tt.args.arg)) { + return + } + assert.Equalf(t, tt.want, got, "moTransactionsCall(%v, %v, %v)", tt.args.in0, tt.args.proc, tt.args.arg) + + assert.Equal(t, len(testProc.Reg.InputBatch.Attrs), 1) + assert.Equal(t, testProc.Reg.InputBatch.Attrs[0], "user_txn") + + assert.Equal(t, vector.MustStrCol(tt.args.proc.Reg.InputBatch.GetVector(0))[0], "true") + }) + } + + ///// test moLocksCall + + tests6 := []struct { + name string + args argsx + want bool + wantErr assert.ErrorAssertionFunc + }{ + { + name: "", + args: argsx{ + proc: testProc, + arg: &Argument{ + ctr: &container{ + state: dataProducing, + executorsForArgs: nil, + }, + Rets: nil, + Args: nil, + Attrs: []string{ + "table_id", + "lock_key", + "lock_mode", + }, + Params: nil, + Name: "", + retSchema: nil, + }, + }, + want: false, + wantErr: func(assert.TestingT, error, ...interface{}) bool { + + return true + }, + }, + } + for _, tt := range tests6 { + t.Run(tt.name, func(t *testing.T) { + got, err := moLocksCall(tt.args.in0, tt.args.proc, tt.args.arg) + if !tt.wantErr(t, err, fmt.Sprintf("moLocksCall(%v, %v, %v)", tt.args.in0, tt.args.proc, tt.args.arg)) { + return + } + assert.Equalf(t, tt.want, got, "moLocksCall(%v, %v, %v)", tt.args.in0, tt.args.proc, tt.args.arg) + + assert.Equal(t, len(testProc.Reg.InputBatch.Attrs), 3) + assert.Equal(t, tt.args.proc.Reg.InputBatch.Attrs[0], "table_id") + assert.Equal(t, tt.args.proc.Reg.InputBatch.Attrs[1], "lock_key") + assert.Equal(t, tt.args.proc.Reg.InputBatch.Attrs[2], "lock_mode") + + assert.Equal(t, vector.MustStrCol(tt.args.proc.Reg.InputBatch.GetVector(0))[0], "1000") + assert.Equal(t, vector.MustStrCol(tt.args.proc.Reg.InputBatch.GetVector(1))[0], "range") + assert.Equal(t, vector.MustStrCol(tt.args.proc.Reg.InputBatch.GetVector(2))[0], "Exclusive") + }) + } +} + +var _ logservice.CNHAKeeperClient = &mockHKClient{} + +type mockHKClient struct { +} + +func (m *mockHKClient) Close() error { + return nil +} + +func (m *mockHKClient) AllocateID(ctx context.Context) (uint64, error) { + return 0, nil +} + +func (m *mockHKClient) AllocateIDByKey(ctx context.Context, key string) (uint64, error) { + return 0, nil +} + +func (m *mockHKClient) AllocateIDByKeyWithBatch(ctx context.Context, key string, batch uint64) (uint64, error) { + return 0, nil +} + +func (m *mockHKClient) GetClusterDetails(ctx context.Context) (pb.ClusterDetails, error) { + cd := pb.ClusterDetails{ + CNStores: []pb.CNStore{ + { + ConfigData: &pb.ConfigData{ + Content: map[string]*pb.ConfigItem{ + "xxxx": { + Name: "xxxx", + CurrentValue: "123", + DefaultValue: "0", + }, + }, + }, + }, + }, + TNStores: []pb.TNStore{ + { + ConfigData: &pb.ConfigData{ + Content: map[string]*pb.ConfigItem{ + "xxxx": { + Name: "xxxx", + CurrentValue: "123", + DefaultValue: "0", + }, + }, + }, + }, + }, + LogStores: []pb.LogStore{ + { + ConfigData: &pb.ConfigData{ + Content: map[string]*pb.ConfigItem{ + "xxxx": { + Name: "xxxx", + CurrentValue: "123", + DefaultValue: "0", + }, + }, + }, + }, + }, + ProxyStores: []pb.ProxyStore{ + { + ConfigData: &pb.ConfigData{ + Content: map[string]*pb.ConfigItem{ + "xxxx": { + Name: "xxxx", + CurrentValue: "123", + DefaultValue: "0", + }, + }, + }, + }, + }, + } + + return cd, nil +} + +func (m *mockHKClient) GetClusterState(ctx context.Context) (pb.CheckerState, error) { + return pb.CheckerState{}, nil +} + +func (m *mockHKClient) GetBackupData(ctx context.Context) ([]byte, error) { + return nil, nil +} + +func (m *mockHKClient) SendCNHeartbeat(ctx context.Context, hb pb.CNStoreHeartbeat) (pb.CommandBatch, error) { + return pb.CommandBatch{}, nil +} + +func Test_moConfigurationsCall(t *testing.T) { + mp, err := mpool.NewMPool("ut_pool", 0, mpool.NoFixed) + if err != nil { + assert.NoError(t, err) + } + defer mpool.DeleteMPool(mp) + testProc := process.New(context.Background(), mp, nil, nil, nil, nil, &mockQueryService{}, &mockHKClient{}, nil) + + type args struct { + in0 int + proc *process.Process + arg *Argument + } + tests := []struct { + name string + args args + want bool + wantErr assert.ErrorAssertionFunc + }{ + { + name: "t1", + args: args{ + proc: testProc, + arg: &Argument{ + ctr: &container{ + state: dataProducing, + executorsForArgs: nil, + }, + Rets: nil, + Args: nil, + Attrs: []string{ + "name", + "current_value", + "default_value", + }, + Params: nil, + Name: "", + retSchema: nil, + }, + }, + want: false, + wantErr: func(t assert.TestingT, err error, i ...interface{}) bool { + return true + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := moConfigurationsCall(tt.args.in0, tt.args.proc, tt.args.arg) + if !tt.wantErr(t, err, fmt.Sprintf("moConfigurationsCall(%v, %v, %v)", tt.args.in0, tt.args.proc, tt.args.arg)) { + return + } + assert.Equalf(t, tt.want, got, "moConfigurationsCall(%v, %v, %v)", tt.args.in0, tt.args.proc, tt.args.arg) + + assert.Equal(t, len(testProc.Reg.InputBatch.Attrs), 3) + assert.Equal(t, tt.args.proc.Reg.InputBatch.Attrs[0], "name") + assert.Equal(t, tt.args.proc.Reg.InputBatch.Attrs[1], "current_value") + assert.Equal(t, tt.args.proc.Reg.InputBatch.Attrs[2], "default_value") + + for i := 0; i < 4; i++ { + assert.Equal(t, vector.MustStrCol(tt.args.proc.Reg.InputBatch.GetVector(0))[i], "xxxx") + assert.Equal(t, vector.MustStrCol(tt.args.proc.Reg.InputBatch.GetVector(1))[i], "123") + assert.Equal(t, vector.MustStrCol(tt.args.proc.Reg.InputBatch.GetVector(2))[i], "0") + } + }) + } +} diff --git a/pkg/sql/colexec/table_function/table_function.go b/pkg/sql/colexec/table_function/table_function.go index ce39ec5dd71d..85ca19743bf4 100644 --- a/pkg/sql/colexec/table_function/table_function.go +++ b/pkg/sql/colexec/table_function/table_function.go @@ -51,6 +51,8 @@ func Call(idx int, proc *process.Process, arg any, isFirst bool, isLast bool) (p f, e = moConfigurationsCall(idx, proc, tblArg) case "mo_transactions": f, e = moTransactionsCall(idx, proc, tblArg) + case "mo_cache": + f, e = moCacheCall(idx, proc, tblArg) default: return process.ExecStop, moerr.NewNotSupported(proc.Ctx, fmt.Sprintf("table function %s is not supported", tblArg.Name)) } @@ -119,6 +121,8 @@ func Prepare(proc *process.Process, arg any) error { return moConfigurationsPrepare(proc, tblArg) case "mo_transactions": return moTransactionsPrepare(proc, tblArg) + case "mo_cache": + return moCachePrepare(proc, tblArg) default: return moerr.NewNotSupported(proc.Ctx, fmt.Sprintf("table function %s is not supported", tblArg.Name)) } diff --git a/pkg/sql/plan/query_builder.go b/pkg/sql/plan/query_builder.go index 59996af778a6..bc1010adb525 100644 --- a/pkg/sql/plan/query_builder.go +++ b/pkg/sql/plan/query_builder.go @@ -3351,6 +3351,8 @@ func (builder *QueryBuilder) buildTableFunction(tbl *tree.TableFunction, ctx *Bi nodeId, err = builder.buildMoLocks(tbl, ctx, exprs, childId) case "mo_transactions": nodeId, err = builder.buildMoTransactions(tbl, ctx, exprs, childId) + case "mo_cache": + nodeId, err = builder.buildMoCache(tbl, ctx, exprs, childId) default: err = moerr.NewNotSupported(builder.GetContext(), "table function '%s' not supported", id) } diff --git a/pkg/sql/plan/system_view.go b/pkg/sql/plan/system_view.go index 4a65d5a87ed7..8b5ba7df2559 100644 --- a/pkg/sql/plan/system_view.go +++ b/pkg/sql/plan/system_view.go @@ -275,3 +275,73 @@ func (builder *QueryBuilder) buildMoTransactions(tbl *tree.TableFunction, ctx *B } return builder.appendNode(node, ctx), err } + +var MoCacheColNames = []string{ + "node_type", + "node_id", + "type", + "used", + "free", + "hit_ratio", +} + +var MoCacheColTypes = []types.Type{ + types.New(types.T_varchar, types.MaxVarcharLen, 0), + types.New(types.T_varchar, types.MaxVarcharLen, 0), + types.New(types.T_varchar, types.MaxVarcharLen, 0), + types.New(types.T_uint64, 0, 0), + types.New(types.T_uint64, 0, 0), + types.New(types.T_float32, 0, 0), +} + +var MoCacheColName2Index = map[string]int32{ + "node_type": 0, + "node_id": 1, + "type": 2, + "used": 3, + "free": 4, + "hit_ratio": 5, +} + +type MoCacheColType int32 + +const ( + MoCacheColTypeNodeType = iota + MoCacheColTypeNodeId + MoCacheColTypeType + MoCacheColTypeUsed + MoCacheColTypeFree + MoCacheColTypeHitRatio +) + +func (builder *QueryBuilder) buildMoCache(tbl *tree.TableFunction, ctx *BindContext, exprs []*plan.Expr, childId int32) (int32, error) { + var err error + + colDefs := make([]*plan.ColDef, 0, len(MoCacheColNames)) + + for i, name := range MoCacheColNames { + colDefs = append(colDefs, &plan.ColDef{ + Name: name, + Typ: &plan.Type{ + Id: int32(MoCacheColTypes[i].Oid), + Width: MoCacheColTypes[i].Width, + }, + }) + } + + node := &plan.Node{ + NodeType: plan.Node_FUNCTION_SCAN, + Stats: &plan.Stats{}, + TableDef: &plan.TableDef{ + TableType: "func_table", + TblFunc: &plan.TableFunction{ + Name: "mo_cache", + }, + Cols: colDefs, + }, + BindingTags: []int32{builder.genNewTag()}, + Children: []int32{childId}, + TblFuncExprList: exprs, + } + return builder.appendNode(node, ctx), err +} diff --git a/pkg/tnservice/cfg.go b/pkg/tnservice/cfg.go index 62b159bebd97..ba58b461672e 100644 --- a/pkg/tnservice/cfg.go +++ b/pkg/tnservice/cfg.go @@ -162,6 +162,13 @@ type Config struct { LockService lockservice.Config `toml:"lockservice"` Ctl ctlservice.Config `toml:"ctl"` + + // IsStandalone indicates whether the tn is in standalone cluster not an independent process. + // For the tn does not boost an independent queryservice in standalone mode. + // cn,tn shares the same queryservice in standalone mode. + // Under distributed deploy mode, cn,tn are independent os process. + // they have their own queryservice. + InStandalone bool } func (c *Config) Validate() error { diff --git a/pkg/tnservice/service_ports.go b/pkg/tnservice/service_ports.go index dfcc48aa75b2..8bf4a7d8d94c 100644 --- a/pkg/tnservice/service_ports.go +++ b/pkg/tnservice/service_ports.go @@ -22,6 +22,7 @@ const ( LogtailService LockService CtlService + QueryService MaxService ) @@ -36,6 +37,8 @@ func (s PortSlot) String() string { return "Lock service" case CtlService: return "Ctl service" + case QueryService: + return "Query service" default: return "Unknown service" } @@ -110,3 +113,17 @@ func (s *store) ctlServiceListenAddr() string { } return s.cfg.Ctl.Address.ListenAddress } + +func (s *store) queryServiceServiceAddr() string { + if s.newPortStrategy() { + return s.addressMgr.ServiceAddress(int(QueryService)) + } + return "" +} + +func (s *store) queryServiceListenAddr() string { + if s.newPortStrategy() { + return s.addressMgr.ListenAddress(int(QueryService)) + } + return "" +} diff --git a/pkg/tnservice/store.go b/pkg/tnservice/store.go index fca31a1f1675..4b882b3aa25b 100644 --- a/pkg/tnservice/store.go +++ b/pkg/tnservice/store.go @@ -17,6 +17,8 @@ package tnservice import ( "context" "errors" + "github.com/matrixorigin/matrixone/pkg/pb/query" + "github.com/matrixorigin/matrixone/pkg/queryservice" "github.com/matrixorigin/matrixone/pkg/util" "sync" "time" @@ -132,6 +134,8 @@ type store struct { addressMgr address.AddressManager config *util.ConfigData + // queryService for getting cache info from tnservice + queryService queryservice.QueryService } // NewService create TN Service @@ -203,6 +207,9 @@ func NewService( if err := s.initCtlService(); err != nil { return nil, err } + + s.initQueryService(cfg.InStandalone) + s.initTaskHolder() s.initSqlWriterFactory() return s, nil @@ -218,6 +225,11 @@ func (s *store) Start() error { if err := s.ctlservice.Start(); err != nil { return err } + if s.queryService != nil { + if err := s.queryService.Start(); err != nil { + return err + } + } s.rt.SubLogger(runtime.SystemInit).Info("dn heartbeat task started") return s.stopper.RunTask(s.heartbeatTask) } @@ -417,3 +429,41 @@ func (s *store) initClusterService() { s.cfg.Cluster.RefreshInterval.Duration) runtime.ProcessLevelRuntime().SetGlobalVariables(runtime.ClusterService, s.moCluster) } + +// initQueryService +// inStandalone: +// +// true: tn is boosted in a standalone cluster. cn has a queryservice already. +// false: tn is boosted in an independent process. tn needs a queryservice. +func (s *store) initQueryService(inStandalone bool) { + if inStandalone { + s.queryService = nil + return + } + var err error + s.queryService, err = queryservice.NewQueryService(s.cfg.UUID, + s.queryServiceListenAddr(), s.cfg.RPC, nil) + if err != nil { + panic(err) + } + s.initQueryCommandHandler() +} + +func (s *store) initQueryCommandHandler() { + if s.queryService != nil { + s.queryService.AddHandleFunc(query.CmdMethod_GetCacheInfo, s.handleGetCacheInfo, false) + } +} + +func (s *store) handleGetCacheInfo(ctx context.Context, req *query.Request, resp *query.Response) error { + resp.GetCacheInfoResponse = new(query.GetCacheInfoResponse) + perfcounter.GetCacheStats(func(infos []*query.CacheInfo) { + for _, info := range infos { + if info != nil { + resp.GetCacheInfoResponse.CacheInfoList = append(resp.GetCacheInfoResponse.CacheInfoList, info) + } + } + }) + + return nil +} diff --git a/pkg/tnservice/store_heartbeat.go b/pkg/tnservice/store_heartbeat.go index c6cc2f03f31d..3d2885cc8459 100644 --- a/pkg/tnservice/store_heartbeat.go +++ b/pkg/tnservice/store_heartbeat.go @@ -65,6 +65,10 @@ func (s *store) heartbeat(ctx context.Context) { ConfigData: s.config.GetData(), } + if s.queryService != nil { + hb.QueryAddress = s.queryServiceServiceAddr() + } + cb, err := s.hakeeperClient.SendTNHeartbeat(ctx2, hb) if err != nil { s.rt.Logger().Error("failed to send tn heartbeat", zap.Error(err)) diff --git a/pkg/vm/engine/disttae/util.go b/pkg/vm/engine/disttae/util.go index 4ac4a0976f3a..1f091952c3dc 100644 --- a/pkg/vm/engine/disttae/util.go +++ b/pkg/vm/engine/disttae/util.go @@ -1287,3 +1287,14 @@ func extractPKValueFromEqualExprs( } return } + +// ListTnService gets all tn service in the cluster +func ListTnService(appendFn func(service *metadata.TNService)) { + mc := clusterservice.GetMOCluster() + mc.GetTNService(clusterservice.NewSelector(), func(tn metadata.TNService) bool { + if appendFn != nil { + appendFn(&tn) + } + return true + }) +} diff --git a/proto/logservice.proto b/proto/logservice.proto index c138baaca275..0ac184c02bfb 100644 --- a/proto/logservice.proto +++ b/proto/logservice.proto @@ -64,6 +64,8 @@ message TNStore { string LockServiceAddress = 7; string CtlAddress = 8; ConfigData ConfigData = 9; + // QueryAddress is the address of the queryservice on tn + string QueryAddress = 10; } message LogStore { @@ -174,6 +176,8 @@ message TNStoreHeartbeat { string LockServiceAddress = 6; string CtlAddress = 7; ConfigData ConfigData = 8; + // QueryAddress is the address of queryservice on tn + string QueryAddress = 9; }; message RSMState { @@ -507,6 +511,8 @@ message TNStoreInfo { string LockServiceAddress = 6; string CtlAddress = 7; ConfigData ConfigData = 8; + // QueryAddress is the address of queryservice on tn + string QueryAddress = 9; } // TNState contains all TN details known to the HAKeeper. diff --git a/proto/metadata.proto b/proto/metadata.proto index bcec8892c50d..3ad5f742c715 100644 --- a/proto/metadata.proto +++ b/proto/metadata.proto @@ -142,6 +142,8 @@ message TNService { repeated TNShard Shards = 6 [(gogoproto.nullable) = false]; // Labels labels on service map Labels = 7 [(gogoproto.nullable) = false]; + // QueryAddress it the address of query service on the tn + string QueryAddress = 8; } // LabelList defines the labels on CN store. diff --git a/proto/query.proto b/proto/query.proto index 5295e91be3b9..843f79c2f36b 100644 --- a/proto/query.proto +++ b/proto/query.proto @@ -40,6 +40,8 @@ enum CmdMethod { GetLockInfo = 5; // GetTxnInfo gets the txn info from the cn GetTxnInfo = 6; + // GetCacheInfo gets the cache info from the cn,tn + GetCacheInfo = 7; } // QueryRequest is the common query request. It contains the query @@ -77,6 +79,8 @@ message Request { GetLockInfoRequest GetLockInfoRequest = 8; // GetTxnInfoRequest is the request for getting the txn info from the cn GetTxnInfoRequest GetTxnInfoRequest = 9; + // GetCacheInfoRequest is the request for getting the cache info from the cn,tn + GetCacheInfoRequest GetCacheInfoRequest = 10; } // ShowProcessListResponse is the response of command ShowProcessList. @@ -104,6 +108,8 @@ message Response { GetLockInfoResponse GetLockInfoResponse = 8; // GetTxnInfoResponse is the response to GetTxnInfo GetTxnInfoResponse GetTxnInfoResponse = 9; + // GetCacheInfoResponse is the response to GetCacheInfo + GetCacheInfoResponse GetCacheInfoResponse = 10; } // AlterAccountRequest is the "alter account restricted" query request. @@ -187,4 +193,25 @@ message TxnInfo{ message GetTxnInfoResponse{ string CnId = 1; repeated TxnInfo TxnInfoList = 2; +} + +message GetCacheInfoRequest{} + +message CacheInfo{ + // NodeType is the type of the node. cn, tn + string NodeType = 1; + // NodeId is the uuid of the node. + string NodeId = 2; + // CacheType is the type of the cache. memory, disk + string CacheType = 3; + // Used is the used bytes of the cache for memory cache + uint64 Used = 4; + // Free is the free bytes of the cache for memory cache + uint64 Free = 5; + // HitRatio is the hit ratio of the cache. + float HitRatio = 6; +} + +message GetCacheInfoResponse{ + repeated CacheInfo CacheInfoList = 1; } \ No newline at end of file diff --git a/test/distributed/cases/dml/select/sp_table.result b/test/distributed/cases/dml/select/sp_table.result index 36265fc495c7..12f208359dca 100644 --- a/test/distributed/cases/dml/select/sp_table.result +++ b/test/distributed/cases/dml/select/sp_table.result @@ -4,6 +4,7 @@ mo_catalog mo_increment_columns select relname,relkind from mo_catalog.mo_tables where reldatabase = 'mo_catalog' and account_id = 0 and relname not like '__mo_index_unique__%' order by relname; relname relkind mo_account r +mo_cache v mo_columns r mo_configurations v mo_database r diff --git a/test/distributed/cases/dml/show/database_statistics.result b/test/distributed/cases/dml/show/database_statistics.result index 5baf445620c0..facd7665cdb1 100644 --- a/test/distributed/cases/dml/show/database_statistics.result +++ b/test/distributed/cases/dml/show/database_statistics.result @@ -9,7 +9,7 @@ Number of tables in mysql 5 show table_number from mo_catalog; Number of tables in mo_catalog -21 +22 show table_number from system_metrics; Number of tables in system_metrics 20 diff --git a/test/distributed/cases/dml/show/show.result b/test/distributed/cases/dml/show/show.result index a8929ec50a7e..20439bbc9941 100644 --- a/test/distributed/cases/dml/show/show.result +++ b/test/distributed/cases/dml/show/show.result @@ -243,9 +243,10 @@ mo_tables mo_locks mo_variables mo_transactions +mo_cache show table_number from mo_catalog; Number of tables in mo_catalog -21 +22 show column_number from mo_database; Number of columns in mo_database 9 diff --git a/test/distributed/cases/mo_cloud/mo_cloud.result b/test/distributed/cases/mo_cloud/mo_cloud.result index 62db8ab0e87d..65250b95f6dc 100644 --- a/test/distributed/cases/mo_cloud/mo_cloud.result +++ b/test/distributed/cases/mo_cloud/mo_cloud.result @@ -596,7 +596,7 @@ system_metrics 7 accountadmin information_schema 16 accountadmin mysql 5 accountadmin mo_mo 0 accountadmin -mo_catalog 19 - +mo_catalog 21 - SELECT mo_catalog.mo_database.datname,mo_catalog.mo_tables.relname,mo_catalog.mo_tables.relkind, if (role_name IS NULL,'-', role_name) AS `owner` FROM mo_catalog.mo_database LEFT JOIN mo_catalog.mo_tables ON mo_catalog.mo_database.datname = mo_catalog.mo_tables.reldatabase LEFT JOIN mo_catalog.mo_role ON mo_catalog.mo_tables.owner=role_id ORDER BY reldatabase, relname; datname relname relkind owner mo_mo null null - @@ -616,6 +616,7 @@ information_schema tables v accountadmin information_schema triggers r accountadmin information_schema user_privileges r accountadmin information_schema views v accountadmin +mo_catalog mo_cache v accountadmin mo_catalog mo_columns r - mo_catalog mo_database r - mo_catalog mo_increment_columns accountadmin diff --git a/test/distributed/cases/tenant/privilege/create_user_default_role.result b/test/distributed/cases/tenant/privilege/create_user_default_role.result index bf17a1dc262b..be0b1e285d12 100644 --- a/test/distributed/cases/tenant/privilege/create_user_default_role.result +++ b/test/distributed/cases/tenant/privilege/create_user_default_role.result @@ -42,6 +42,7 @@ mo_configurations mo_locks mo_variables mo_transactions +mo_cache create database t; internal error: do not have privilege to execute the statement grant create database on account * to r1; diff --git a/test/distributed/cases/tenant/tenant.result b/test/distributed/cases/tenant/tenant.result index 22a8bb754c47..51408debabb5 100644 --- a/test/distributed/cases/tenant/tenant.result +++ b/test/distributed/cases/tenant/tenant.result @@ -10,6 +10,7 @@ drop account if exists tenant_test; select account_id,relname,relkind from mo_catalog.mo_tables where reldatabase = 'mo_catalog' and relname not like '__mo_index_unique__%' order by relname; account_id relname relkind 0 mo_account r +0 mo_cache v 0 mo_columns r 0 mo_configurations v 0 mo_database r diff --git a/test/distributed/cases/zz_accesscontrol/create_account.result b/test/distributed/cases/zz_accesscontrol/create_account.result index 2f2a4df4c2bd..02109858b564 100644 --- a/test/distributed/cases/zz_accesscontrol/create_account.result +++ b/test/distributed/cases/zz_accesscontrol/create_account.result @@ -177,6 +177,7 @@ mo_configurations mo_locks mo_variables mo_transactions +mo_cache select user_name,authentication_string,owner from mo_user; user_name authentication_string owner admin *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 2