Skip to content

Commit eae530e

Browse files
craig[bot]srosenbergandyyang890
committed
149505: cli: "no such host" error when starting CRDB on Mac r=darrylwong a=srosenberg When CockroachDB is started without `--advertise-addr`, it fallbacks to `--listen-addr`. If the latter is also unspecified, it defaults to the `hostname`. Subsequently, `validateAdvertiseAddr` attempts to resolve the hostname. If the resolution fails, the server aborts the startup sequence. This is a safe default because node discovery is compromised without a functioning DNS. On Mac, `hostname` is resolved via mDNS / Bonjour. Unless it's suffixed with `.local`, it doesn't resolve. An obvious workaround is to add it to /etc/hosts, or to change it via `sudo hostname $USER.local`. To make the (DEV) experience on Mac more seamless, this PR replaces DNS resolution error with a warning. Since we can't unambiguously determine if the user is running in DEV-mode, we assume that `--insecure` on Mac implies exactly that. We also update `roachprod` to explicitly use `--advertised-addr` with `127.0.0.1`. This also fixes `roachtest` in local mode. Fixes: #66426 Fixes: #149469 Release note: None 151355: changefeedccl/resolvedspan: integrate span.MultiFrontier into frontiers r=aerfrei,asg0451 a=andyyang890 Fixes #148110 --- **changefeedccl: fix ALTER CHANGEFEED span selection** This patch updates the ALTER CHANGEFEED code to use primary index spans instead of entire table spans to be consistent with the rest of the changefeed code and to help maintain the assumption that we will never merge spans from different tables in our frontier data structures. Release note: None --- **changefeedccl/resolvedspan: integrate span.MultiFrontier into frontiers** This patch integrates `span.MultiFrontier`s into the resolved span frontiers to give changefeed processors easy access to per-table resolved timestamps. Release note: None --- **changefeedccl/resolvedspan: add feature flag for per-table tracking** This patch adds a new cluster setting named `changefeed.frontier.per_table_tracking.enabled` to feature flag enabling per-table tracking in the resolved span frontiers. Release note: None Co-authored-by: Stan Rosenberg <[email protected]> Co-authored-by: Andy Yang <[email protected]>
3 parents e36054b + d59b605 + 0867a03 commit eae530e

File tree

11 files changed

+352
-174
lines changed

11 files changed

+352
-174
lines changed

pkg/base/BUILD.bazel

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ go_library(
3030
"//pkg/util",
3131
"//pkg/util/envutil",
3232
"//pkg/util/humanizeutil",
33+
"//pkg/util/log",
34+
"//pkg/util/log/severity",
3335
"//pkg/util/metric",
3436
"//pkg/util/mon",
3537
"//pkg/util/netutil/addr",

pkg/base/addr_validation.go

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,12 @@ import (
1010
"fmt"
1111
"net"
1212
"os"
13+
"runtime"
1314
"strconv"
1415

1516
"github.com/cockroachdb/cockroach/pkg/cli/cliflags"
17+
"github.com/cockroachdb/cockroach/pkg/util/log"
18+
"github.com/cockroachdb/cockroach/pkg/util/log/severity"
1619
"github.com/cockroachdb/errors"
1720
)
1821

@@ -32,7 +35,7 @@ import (
3235
func (cfg *Config) ValidateAddrs(ctx context.Context) error {
3336
// Validate the advertise address.
3437
advHost, advPort, err := validateAdvertiseAddr(ctx,
35-
cfg.AdvertiseAddr, cfg.Addr, "", cliflags.ListenAddr)
38+
cfg.AdvertiseAddr, cfg.Addr, "", cliflags.ListenAddr, cfg.Insecure)
3639
if err != nil {
3740
return invalidFlagErr(err, cliflags.AdvertiseAddr)
3841
}
@@ -48,7 +51,7 @@ func (cfg *Config) ValidateAddrs(ctx context.Context) error {
4851
// Validate the SQL advertise address. Use the provided advertise
4952
// addr as default.
5053
advSQLHost, advSQLPort, err := validateAdvertiseAddr(ctx,
51-
cfg.SQLAdvertiseAddr, cfg.SQLAddr, advHost, cliflags.ListenSQLAddr)
54+
cfg.SQLAdvertiseAddr, cfg.SQLAddr, advHost, cliflags.ListenSQLAddr, cfg.Insecure)
5255
if err != nil {
5356
return invalidFlagErr(err, cliflags.SQLAdvertiseAddr)
5457
}
@@ -64,7 +67,7 @@ func (cfg *Config) ValidateAddrs(ctx context.Context) error {
6467
// Validate the HTTP advertise address. Use the provided advertise
6568
// addr as default.
6669
advHTTPHost, advHTTPPort, err := validateAdvertiseAddr(ctx,
67-
cfg.HTTPAdvertiseAddr, cfg.HTTPAddr, advHost, cliflags.ListenHTTPAddr)
70+
cfg.HTTPAdvertiseAddr, cfg.HTTPAddr, advHost, cliflags.ListenHTTPAddr, cfg.Insecure)
6871
if err != nil {
6972
return errors.Wrap(err, "cannot compute public HTTP address")
7073
}
@@ -86,7 +89,10 @@ func (cfg *Config) ValidateAddrs(ctx context.Context) error {
8689
// that if the "host" part is empty, it gets filled in with
8790
// the configured listen address if any, or the canonical host name.
8891
func validateAdvertiseAddr(
89-
ctx context.Context, advAddr, listenAddr, defaultHost string, listenFlag cliflags.FlagInfo,
92+
ctx context.Context,
93+
advAddr, listenAddr, defaultHost string,
94+
listenFlag cliflags.FlagInfo,
95+
insecure bool,
9096
) (string, string, error) {
9197
listenHost, listenPort, err := getListenAddr(listenAddr, defaultHost)
9298
if err != nil {
@@ -132,7 +138,12 @@ func validateAdvertiseAddr(
132138
// locally but not elsewhere) but at least it prevents typos.
133139
_, err = net.DefaultResolver.LookupIPAddr(ctx, advHost)
134140
if err != nil {
135-
return "", "", err
141+
// Host resolution failed. Don't error out when running on Mac with `--insecure`.
142+
if runtime.GOOS == "darwin" && insecure {
143+
log.Ops.Shoutf(ctx, severity.WARNING, "Unable to resolve `hostname` due to %v\n", err)
144+
} else {
145+
return "", "", err
146+
}
136147
}
137148
}
138149
}

pkg/ccl/changefeedccl/BUILD.bazel

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,6 @@ go_test(
196196
srcs = [
197197
"alter_changefeed_test.go",
198198
"changefeed_dist_test.go",
199-
"changefeed_processors_test.go",
200199
"changefeed_stmt_test.go",
201200
"changefeed_test.go",
202201
"csv_test.go",

pkg/ccl/changefeedccl/alter_changefeed_stmt.go

Lines changed: 50 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -541,12 +541,19 @@ func generateAndValidateNewTargets(
541541
(initialScanType == `only` && originalInitialScanOnlyOption)
542542

543543
// TODO(#142376): Audit whether this list is generated correctly.
544-
var existingTargetIDs []descpb.ID
544+
var existingTargetSpanIDs []spanID
545545
for _, targetDesc := range newTableDescs {
546-
existingTargetIDs = append(existingTargetIDs, targetDesc.GetID())
546+
tableDesc, ok := targetDesc.(catalog.TableDescriptor)
547+
if !ok {
548+
return nil, nil, hlc.Timestamp{}, nil, errors.AssertionFailedf("expected table descriptor")
549+
}
550+
existingTargetSpanIDs = append(existingTargetSpanIDs, spanID{
551+
tableID: tableDesc.GetID(),
552+
indexID: tableDesc.GetPrimaryIndexID(),
553+
})
547554
}
548-
existingTargetSpans := fetchSpansForDescs(p, existingTargetIDs)
549-
var newTargetIDs []descpb.ID
555+
existingTargetSpans := fetchSpansForDescs(p, existingTargetSpanIDs)
556+
var addedTargetSpanIDs []spanID
550557
for _, target := range v.Targets {
551558
desc, found, err := getTargetDesc(ctx, p, descResolver, target.TableName)
552559
if err != nil {
@@ -563,10 +570,17 @@ func generateAndValidateNewTargets(
563570
k := targetKey{TableID: desc.GetID(), FamilyName: target.FamilyName}
564571
newTargets[k] = target
565572
newTableDescs[desc.GetID()] = desc
566-
newTargetIDs = append(newTargetIDs, k.TableID)
573+
tableDesc, ok := desc.(catalog.TableDescriptor)
574+
if !ok {
575+
return nil, nil, hlc.Timestamp{}, nil, errors.AssertionFailedf("expected table descriptor")
576+
}
577+
addedTargetSpanIDs = append(addedTargetSpanIDs, spanID{
578+
tableID: tableDesc.GetID(),
579+
indexID: tableDesc.GetPrimaryIndexID(),
580+
})
567581
}
568582

569-
addedTargetSpans := fetchSpansForDescs(p, newTargetIDs)
583+
addedTargetSpans := fetchSpansForDescs(p, addedTargetSpanIDs)
570584

571585
// By default, we will not perform an initial scan on newly added
572586
// targets. Hence, the user must explicitly state that they want an
@@ -632,13 +646,18 @@ func generateAndValidateNewTargets(
632646
for k := range newTargets {
633647
addedTargets[k.TableID] = struct{}{}
634648
}
635-
droppedIDs := make([]descpb.ID, 0, len(droppedTargets))
649+
droppedSpanIDs := make([]spanID, 0, len(droppedTargets))
636650
for k := range droppedTargets {
637651
if _, wasAdded := addedTargets[k.TableID]; !wasAdded {
638-
droppedIDs = append(droppedIDs, k.TableID)
652+
// For dropped tables, we might not have the desc anymore so
653+
// we can't get the index ID. In any case, it's safe to wipe
654+
// out the entire table span.
655+
droppedSpanIDs = append(droppedSpanIDs, spanID{
656+
tableID: k.TableID,
657+
})
639658
}
640659
}
641-
droppedTargetSpans := fetchSpansForDescs(p, droppedIDs)
660+
droppedTargetSpans := fetchSpansForDescs(p, droppedSpanIDs)
642661
if err := removeSpansFromProgress(newJobProgress, droppedTargetSpans); err != nil {
643662
return nil, nil, hlc.Timestamp{}, nil, err
644663
}
@@ -874,19 +893,33 @@ func getSpanLevelCheckpointFromProgress(
874893
return changefeedProgress.SpanLevelCheckpoint, nil
875894
}
876895

877-
func fetchSpansForDescs(p sql.PlanHookState, descIDs []descpb.ID) (primarySpans []roachpb.Span) {
878-
seen := make(map[descpb.ID]struct{})
896+
type spanID struct {
897+
tableID descpb.ID
898+
indexID descpb.IndexID
899+
}
900+
901+
func fetchSpansForDescs(p sql.PlanHookState, spanIDs []spanID) (primarySpans []roachpb.Span) {
902+
seen := make(map[spanID]struct{})
879903
codec := p.ExtendedEvalContext().Codec
880-
for _, id := range descIDs {
904+
for _, id := range spanIDs {
881905
if _, isDup := seen[id]; isDup {
882906
continue
883907
}
884908
seen[id] = struct{}{}
885-
tablePrefix := codec.TablePrefix(uint32(id))
886-
primarySpan := roachpb.Span{
887-
Key: tablePrefix,
888-
EndKey: tablePrefix.PrefixEnd(),
889-
}
909+
primarySpan := func() roachpb.Span {
910+
if id.indexID == 0 {
911+
tablePrefix := codec.TablePrefix(uint32(id.tableID))
912+
return roachpb.Span{
913+
Key: tablePrefix,
914+
EndKey: tablePrefix.PrefixEnd(),
915+
}
916+
}
917+
indexPrefix := codec.IndexPrefix(uint32(id.tableID), uint32(id.indexID))
918+
return roachpb.Span{
919+
Key: indexPrefix,
920+
EndKey: indexPrefix.PrefixEnd(),
921+
}
922+
}()
890923
primarySpans = append(primarySpans, primarySpan)
891924
}
892925
return primarySpans

pkg/ccl/changefeedccl/changefeed_processors.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,10 @@ func (ca *changeAggregator) setupSpansAndFrontier() (spans []roachpb.Span, err e
615615
if err != nil {
616616
return nil, err
617617
}
618-
ca.frontier, err = resolvedspan.NewAggregatorFrontier(ca.spec.Feed.StatementTime, initialHighWater, spans...)
618+
ca.frontier, err = resolvedspan.NewAggregatorFrontier(
619+
ca.spec.Feed.StatementTime, initialHighWater, ca.FlowCtx.Codec(),
620+
&ca.FlowCtx.Cfg.Settings.SV,
621+
spans...)
619622
if err != nil {
620623
return nil, err
621624
}
@@ -1419,7 +1422,10 @@ func (cf *changeFrontier) Start(ctx context.Context) {
14191422
}
14201423

14211424
// Set up the resolved span frontier.
1422-
cf.frontier, err = resolvedspan.NewCoordinatorFrontier(cf.spec.Feed.StatementTime, initialHighwater, cf.spec.TrackedSpans...)
1425+
cf.frontier, err = resolvedspan.NewCoordinatorFrontier(
1426+
cf.spec.Feed.StatementTime, initialHighwater, cf.FlowCtx.Codec(),
1427+
&cf.FlowCtx.Cfg.Settings.SV,
1428+
cf.spec.TrackedSpans...)
14231429
if err != nil {
14241430
log.Infof(cf.Ctx(), "change frontier moving to draining due to error setting up frontier: %v", err)
14251431
cf.MoveToDraining(err)

pkg/ccl/changefeedccl/changefeed_processors_test.go

Lines changed: 0 additions & 127 deletions
This file was deleted.

pkg/ccl/changefeedccl/changefeed_test.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8936,7 +8936,13 @@ func TestChangefeedBackfillCheckpoint(t *testing.T) {
89368936

89378937
// Verify that the resumed job has restored the progress from the checkpoint
89388938
// to the change frontier.
8939-
expectedFrontier, err := span.MakeFrontier(tableSpan)
8939+
expectedFrontier, err := resolvedspan.NewCoordinatorFrontier(
8940+
hlc.Timestamp{},
8941+
hlc.Timestamp{},
8942+
s.Codec,
8943+
&s.Server.ClusterSettings().SV,
8944+
tableSpan,
8945+
)
89408946
if err != nil {
89418947
t.Fatal(err)
89428948
}

pkg/ccl/changefeedccl/resolvedspan/BUILD.bazel

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ go_library(
1414
"//pkg/jobs/jobspb",
1515
"//pkg/roachpb",
1616
"//pkg/settings",
17+
"//pkg/sql/catalog/descpb",
1718
"//pkg/util/hlc",
19+
"//pkg/util/metamorphic",
1820
"//pkg/util/span",
1921
"@com_github_cockroachdb_errors//:errors",
2022
"@com_github_cockroachdb_redact//:redact",
@@ -27,10 +29,15 @@ go_test(
2729
deps = [
2830
":resolvedspan",
2931
"//pkg/jobs/jobspb",
32+
"//pkg/keys",
3033
"//pkg/roachpb",
34+
"//pkg/settings/cluster",
35+
"//pkg/sql/catalog/descpb",
3136
"//pkg/util/hlc",
3237
"//pkg/util/leaktest",
3338
"//pkg/util/log",
39+
"//pkg/util/randutil",
40+
"//pkg/util/span",
3441
"@com_github_cockroachdb_errors//:errors",
3542
"@com_github_stretchr_testify//require",
3643
],

0 commit comments

Comments
 (0)