// createTablet creates an individual tablet, with its agent, and adds // it to the map. If it's a master tablet, it also issues a TER. func createTablet(ctx context.Context, ts topo.Server, cell string, uid uint32, keyspace, shard, dbname string, tabletType topodatapb.TabletType, mysqld mysqlctl.MysqlDaemon, dbcfgs dbconfigs.DBConfigs) error { alias := &topodatapb.TabletAlias{ Cell: cell, Uid: uid, } log.Infof("Creating %v tablet %v for %v/%v", tabletType, topoproto.TabletAliasString(alias), keyspace, shard) flag.Set("debug-url-prefix", fmt.Sprintf("/debug-%d", uid)) controller := tabletserver.NewServer() initTabletType := tabletType if tabletType == topodatapb.TabletType_MASTER { initTabletType = topodatapb.TabletType_REPLICA } agent := tabletmanager.NewComboActionAgent(ctx, ts, alias, int32(8000+uid), int32(9000+uid), controller, dbcfgs, mysqld, keyspace, shard, dbname, strings.ToLower(initTabletType.String())) if tabletType == topodatapb.TabletType_MASTER { if err := agent.TabletExternallyReparented(ctx, ""); err != nil { return fmt.Errorf("TabletExternallyReparented failed on master %v: %v", topoproto.TabletAliasString(alias), err) } } tabletMap[uid] = &tablet{ keyspace: keyspace, shard: shard, tabletType: tabletType, dbname: dbname, qsc: controller, agent: agent, } return nil }
// initTabletMap creates the action agents and associated data structures // for all tablets func initTabletMap(ts topo.Server, topology string, mysqld mysqlctl.MysqlDaemon, dbcfgs dbconfigs.DBConfigs, mycnf *mysqlctl.Mycnf) { tabletMap = make(map[uint32]*tablet) ctx := context.Background() // disable publishing of stats from query service flag.Lookup("queryserver-config-enable-publish-stats").Value.Set("false") var uid uint32 = 1 keyspaceMap := make(map[string]bool) for _, entry := range strings.Split(topology, ",") { slash := strings.IndexByte(entry, '/') column := strings.IndexByte(entry, ':') if slash == -1 || column == -1 { log.Fatalf("invalid topology entry: %v", entry) } keyspace := entry[:slash] shard := entry[slash+1 : column] dbname := entry[column+1:] dbcfgs.App.DbName = dbname // create the keyspace if necessary, so we can set the // ShardingColumnName and ShardingColumnType if _, ok := keyspaceMap[keyspace]; !ok { // only set for sharding key info for sharded keyspaces scn := "" sct := topodatapb.KeyspaceIdType_UNSET if shard != "0" { var err error sct, err = key.ParseKeyspaceIDType(*shardingColumnType) if err != nil { log.Fatalf("parseKeyspaceIDType(%v) failed: %v", *shardingColumnType, err) } scn = *shardingColumnName } if err := ts.CreateKeyspace(ctx, keyspace, &topodatapb.Keyspace{ ShardingColumnName: scn, ShardingColumnType: sct, }); err != nil { log.Fatalf("CreateKeyspace(%v) failed: %v", keyspace, err) } keyspaceMap[keyspace] = true } // create the master alias := &topodatapb.TabletAlias{ Cell: cell, Uid: uid, } log.Infof("Creating master tablet %v for %v/%v", topoproto.TabletAliasString(alias), keyspace, shard) flag.Lookup("debug-url-prefix").Value.Set(fmt.Sprintf("/debug-%d", uid)) masterController := tabletserver.NewServer() masterAgent := tabletmanager.NewComboActionAgent(ctx, ts, alias, int32(8000+uid), int32(9000+uid), masterController, dbcfgs, mysqld, keyspace, shard, dbname, "replica") if err := masterAgent.TabletExternallyReparented(ctx, ""); err != nil { log.Fatalf("TabletExternallyReparented failed on master: %v", err) } tabletMap[uid] = &tablet{ keyspace: keyspace, shard: shard, tabletType: topodatapb.TabletType_MASTER, dbname: dbname, qsc: masterController, agent: masterAgent, } uid++ // create a replica slave alias = &topodatapb.TabletAlias{ Cell: cell, Uid: uid, } log.Infof("Creating replica tablet %v for %v/%v", topoproto.TabletAliasString(alias), keyspace, shard) flag.Lookup("debug-url-prefix").Value.Set(fmt.Sprintf("/debug-%d", uid)) replicaController := tabletserver.NewServer() tabletMap[uid] = &tablet{ keyspace: keyspace, shard: shard, tabletType: topodatapb.TabletType_REPLICA, dbname: dbname, qsc: replicaController, agent: tabletmanager.NewComboActionAgent(ctx, ts, alias, int32(8000+uid), int32(9000+uid), replicaController, dbcfgs, mysqld, keyspace, shard, dbname, "replica"), } uid++ // create a rdonly slave alias = &topodatapb.TabletAlias{ Cell: cell, Uid: uid, } log.Infof("Creating rdonly tablet %v for %v/%v", topoproto.TabletAliasString(alias), keyspace, shard) flag.Lookup("debug-url-prefix").Value.Set(fmt.Sprintf("/debug-%d", uid)) rdonlyController := tabletserver.NewServer() tabletMap[uid] = &tablet{ keyspace: keyspace, shard: shard, tabletType: topodatapb.TabletType_RDONLY, dbname: dbname, qsc: rdonlyController, agent: tabletmanager.NewComboActionAgent(ctx, ts, alias, int32(8000+uid), int32(9000+uid), rdonlyController, dbcfgs, mysqld, keyspace, shard, dbname, "rdonly"), } uid++ } // Rebuild the SrvKeyspace objects, we we can support range-based // sharding queries. wr := wrangler.New(logutil.NewConsoleLogger(), ts, nil) for keyspace := range keyspaceMap { if err := wr.RebuildKeyspaceGraph(ctx, keyspace, nil, true); err != nil { log.Fatalf("cannot rebuild %v: %v", keyspace, err) } } // Register the tablet dialer for tablet server tabletconn.RegisterDialer("internal", dialer) *tabletconn.TabletProtocol = "internal" // Register the tablet manager client factory for tablet manager tmclient.RegisterTabletManagerClientFactory("internal", func() tmclient.TabletManagerClient { return &internalTabletManagerClient{} }) *tmclient.TabletManagerProtocol = "internal" }
// initTabletMap creates the action agents and associated data structures // for all tablets func initTabletMap(ts topo.Server, topology string, mysqld mysqlctl.MysqlDaemon, dbcfgs *dbconfigs.DBConfigs, mycnf *mysqlctl.Mycnf) { tabletMap = make(map[uint32]*tablet) ctx := context.Background() // disable publishing of stats from query service flag.Lookup("queryserver-config-enable-publish-stats").Value.Set("false") var uid uint32 = 1 keyspaceMap := make(map[string]bool) for _, entry := range strings.Split(topology, ",") { slash := strings.IndexByte(entry, '/') column := strings.IndexByte(entry, ':') if slash == -1 || column == -1 { log.Fatalf("invalid topology entry: %v", entry) } keyspace := entry[:slash] shard := entry[slash+1 : column] dbname := entry[column+1:] keyspaceMap[keyspace] = true localDBConfigs := &(*dbcfgs) localDBConfigs.App.DbName = dbname // create the master alias := &pb.TabletAlias{ Cell: cell, Uid: uid, } log.Infof("Creating master tablet %v for %v/%v", topoproto.TabletAliasString(alias), keyspace, shard) flag.Lookup("debug-url-prefix").Value.Set(fmt.Sprintf("/debug-%d", uid)) masterController := tabletserver.NewServer() masterAgent := tabletmanager.NewComboActionAgent(ctx, ts, alias, int32(8000+uid), int32(9000+uid), masterController, localDBConfigs, mysqld, keyspace, shard, dbname, "replica") if err := masterAgent.TabletExternallyReparented(ctx, ""); err != nil { log.Fatalf("TabletExternallyReparented failed on master: %v", err) } tabletMap[uid] = &tablet{ keyspace: keyspace, shard: shard, tabletType: pb.TabletType_MASTER, dbname: dbname, qsc: masterController, agent: masterAgent, } uid++ // create a replica slave alias = &pb.TabletAlias{ Cell: cell, Uid: uid, } log.Infof("Creating replica tablet %v for %v/%v", topoproto.TabletAliasString(alias), keyspace, shard) flag.Lookup("debug-url-prefix").Value.Set(fmt.Sprintf("/debug-%d", uid)) replicaController := tabletserver.NewServer() tabletMap[uid] = &tablet{ keyspace: keyspace, shard: shard, tabletType: pb.TabletType_REPLICA, dbname: dbname, qsc: replicaController, agent: tabletmanager.NewComboActionAgent(ctx, ts, alias, int32(8000+uid), int32(9000+uid), replicaController, localDBConfigs, mysqld, keyspace, shard, dbname, "replica"), } uid++ // create a rdonly slave alias = &pb.TabletAlias{ Cell: cell, Uid: uid, } log.Infof("Creating rdonly tablet %v for %v/%v", topoproto.TabletAliasString(alias), keyspace, shard) flag.Lookup("debug-url-prefix").Value.Set(fmt.Sprintf("/debug-%d", uid)) rdonlyController := tabletserver.NewServer() tabletMap[uid] = &tablet{ keyspace: keyspace, shard: shard, tabletType: pb.TabletType_RDONLY, dbname: dbname, qsc: rdonlyController, agent: tabletmanager.NewComboActionAgent(ctx, ts, alias, int32(8000+uid), int32(9000+uid), rdonlyController, localDBConfigs, mysqld, keyspace, shard, dbname, "rdonly"), } uid++ } // Rebuild the SrvKeyspace objects, we we can support range-based // sharding queries. wr := wrangler.New(logutil.NewConsoleLogger(), ts, nil, 30*time.Second /*lockTimeout*/) for keyspace := range keyspaceMap { if err := wr.RebuildKeyspaceGraph(ctx, keyspace, nil, true); err != nil { log.Fatalf("cannot rebuild %v: %v", keyspace, err) } } // Register the tablet dialer tabletconn.RegisterDialer("internal", dialer) *tabletconn.TabletProtocol = "internal" }