diff --git a/.github/workflows/check_and_build.yaml b/.github/workflows/check_and_build.yaml index b0c35969b0..5aceb4257b 100644 --- a/.github/workflows/check_and_build.yaml +++ b/.github/workflows/check_and_build.yaml @@ -63,3 +63,47 @@ jobs: - name: Build run: make cdc + + basic_e2e_test: + runs-on: ubuntu-latest + name: E2E Test + steps: + - name: Check out code + uses: actions/checkout@v2 + + - name: Setup Go environment + uses: actions/setup-go@v3 + with: + go-version: '1.21' + + - name: Integration Build + run: | + tests/scripts/download-integration-test-binaries.sh master true + go build -o ./tools/bin/failpoint-ctl github.com/pingcap/failpoint/failpoint-ctl + make integration_test_build + ls -l bin/ && ls -l tools/bin/ + + - name: Test charset_gbk + run: | + pwd && ls -l bin/ && ls -l tools/bin/ + export TICDC_NEWARCH=true && make integration_test CASE=charset_gbk + + - name: Copy logs to hack permission + if: ${{ always() }} + run: | + cat /tmp/tidb_cdc_test/charset_gbk/stdout.log + tail -n 10 /tmp/tidb_cdc_test/charset_gbk/cdc.log + mkdir ./logs + sudo cp -r -L /tmp/tidb_cdc_test/charset_gbk/stdout.log ./logs/ + sudo cp -r -L /tmp/tidb_cdc_test/charset_gbk/cdc.log ./logs/ + sudo chown -R runner ./logs + + # Update logs as artifact seems not stable, so we set `continue-on-error: true` here. + - name: Upload logs + continue-on-error: true + uses: actions/upload-artifact@v4 + if: ${{ always() }} + with: + name: upstream-switch-logs + path: | + ./logs diff --git a/Makefile b/Makefile index b795ee62fe..8ca6c3f644 100644 --- a/Makefile +++ b/Makefile @@ -114,15 +114,15 @@ generate-protobuf: cdc: $(GOBUILD) -ldflags '$(LDFLAGS)' -o bin/cdc ./cmd -integration_test_build: check_failpoint_ctl - # $(FAILPOINT_ENABLE) +integration_test_build: check_failpoint_ctl + $(FAILPOINT_ENABLE) $(GOTEST) -ldflags '$(LDFLAGS)' -c -cover -covermode=atomic \ -coverpkg=github.com/pingcap/ticdc/... \ -o bin/cdc.test github.com/pingcap/ticdc/cmd \ || { $(FAILPOINT_DISABLE); echo "Failed to build cdc.test"; exit 1; } $(GOBUILD) -ldflags '$(LDFLAGS)' -o bin/cdc ./cmd/main.go \ || { $(FAILPOINT_DISABLE); exit 1; } - # $(FAILPOINT_DISABLE) + $(FAILPOINT_DISABLE) failpoint-enable: check_failpoint_ctl $(FAILPOINT_ENABLE) diff --git a/downstreamadapter/dispatcher/dispatcher.go b/downstreamadapter/dispatcher/dispatcher.go index 8c0ba78ac9..bf750b160f 100644 --- a/downstreamadapter/dispatcher/dispatcher.go +++ b/downstreamadapter/dispatcher/dispatcher.go @@ -235,9 +235,11 @@ func (d *Dispatcher) HandleEvents(dispatcherEvents []DispatcherEvent) (block boo log.Info("Received a stale event, ignore it", zap.Any("event", event), zap.Any("dispatcher", d.id)) } if event.GetType() == commonEvent.TypeDMLEvent || - event.GetType() == commonEvent.TypeDDLEvent { + event.GetType() == commonEvent.TypeDDLEvent || + event.GetType() == commonEvent.TypeHandshakeEvent { if event.GetSeq() != d.lastEventSeq.Add(1) { - log.Warn("Received a out-of-order event, reset the dispatcher", zap.Any("event", event), zap.Any("dispatcher", d.id)) + log.Warn("Received a out-of-order event, reset the dispatcher", zap.Any("dispatcher", d.id), + zap.Uint64("receivedSeq", event.GetSeq()), zap.Uint64("lastEventSeq", d.lastEventSeq.Load()), zap.Any("event", event)) d.reset() return false } diff --git a/downstreamadapter/dispatcher/helper.go b/downstreamadapter/dispatcher/helper.go index b8e62939ae..d126d03c52 100644 --- a/downstreamadapter/dispatcher/helper.go +++ b/downstreamadapter/dispatcher/helper.go @@ -220,7 +220,7 @@ func SetDispatcherTaskScheduler(taskScheduler threadpool.ThreadPool) { DispatcherTaskScheduler = taskScheduler } -// EventsHandler is used to dispatcher the events received. +// EventsHandler is used to dispatch the received events. // If the event is a DML event, it will be added to the sink for writing to downstream. // If the event is a resolved TS event, it will be update the resolvedTs of the dispatcher. // If the event is a DDL event, diff --git a/logservice/eventstore/event_store.go b/logservice/eventstore/event_store.go index 33184319f4..9e16836a7e 100644 --- a/logservice/eventstore/event_store.go +++ b/logservice/eventstore/event_store.go @@ -542,7 +542,7 @@ func (e *eventStore) updateMetrics(ctx context.Context) error { e.dispatcherStates.RLock() for _, subscriptionStat := range e.dispatcherStates.n { // resolved ts lag - resolvedTs := subscriptionStat.resolvedTs + resolvedTs := atomic.LoadUint64(&subscriptionStat.resolvedTs) resolvedPhyTs := oracle.ExtractPhysical(resolvedTs) resolvedLag := float64(currentPhyTs-resolvedPhyTs) / 1e3 metrics.EventStoreDispatcherResolvedTsLagHist.Observe(float64(resolvedLag)) @@ -616,7 +616,7 @@ func (e *eventStore) batchAndWriteEvents(ctx context.Context, db *pebble.DB, inp log.Warn("unknown subscriptionID", zap.Uint64("subID", uint64(subID))) continue } - subscriptionStat.resolvedTs = resolvedTs + atomic.StoreUint64(&subscriptionStat.resolvedTs, resolvedTs) for dispatcherID := range subscriptionStat.ids { dispatcherStat := e.dispatcherStates.m[dispatcherID] dispatcherStat.notifier(resolvedTs) diff --git a/maintainer/maintainer.go b/maintainer/maintainer.go index 209e8d0966..fbf7ff4d28 100644 --- a/maintainer/maintainer.go +++ b/maintainer/maintainer.go @@ -614,13 +614,11 @@ func (m *Maintainer) getNewBootstrapFn() bootstrap.NewBootstrapMessageFn { zap.Error(err)) } return func(id node.ID) *messaging.TargetMessage { - var ddlDispatcherID *heartbeatpb.DispatcherID // only send dispatcher id to dispatcher manager on the same node if id == m.selfNode.ID { - ddlDispatcherID = m.tableTriggerEventDispatcherID.ToPB() log.Info("create table event trigger dispatcher", zap.String("changefeed", m.id.String()), zap.String("server", id.String()), - zap.String("dispatcher id", ddlDispatcherID.String())) + zap.String("dispatcher id", m.tableTriggerEventDispatcherID.String())) } log.Info("send maintainer bootstrap message", zap.String("changefeed", m.id.String()), @@ -633,7 +631,7 @@ func (m *Maintainer) getNewBootstrapFn() bootstrap.NewBootstrapMessageFn { ChangefeedID: m.id.ToPB(), Config: cfgBytes, StartTs: m.startCheckpointTs, - TableTriggerEventDispatcherId: ddlDispatcherID, + TableTriggerEventDispatcherId: m.tableTriggerEventDispatcherID.ToPB(), }) } } diff --git a/pkg/sink/mysql/mysql_writer.go b/pkg/sink/mysql/mysql_writer.go index c816e058b4..8a9b62b70a 100644 --- a/pkg/sink/mysql/mysql_writer.go +++ b/pkg/sink/mysql/mysql_writer.go @@ -93,7 +93,6 @@ func (w *MysqlWriter) FlushDDLEvent(event *commonEvent.DDLEvent) error { if !(event.TiDBOnly && !w.cfg.IsTiDB) { err := w.execDDLWithMaxRetries(event) - if err != nil { log.Error("exec ddl failed", zap.Error(err)) return err @@ -270,9 +269,6 @@ func (w *MysqlWriter) SendDDLTs(event *commonEvent.DDLEvent) error { case commonEvent.InfluenceTypeNormal: tableIds = append(tableIds, relatedTables.TableIDs...) case commonEvent.InfluenceTypeDB: - if w.tableSchemaStore == nil { - log.Panic("table schema store is nil") - } ids := w.tableSchemaStore.GetTableIdsByDB(relatedTables.SchemaID) tableIds = append(tableIds, ids...) case commonEvent.InfluenceTypeAll: @@ -299,41 +295,45 @@ func (w *MysqlWriter) SendDDLTs(event *commonEvent.DDLEvent) error { tableIds = append(tableIds, table.TableID) } - // generate query - //INSERT INTO `tidb_cdc`.`ddl_ts` (ticdc_cluster_id, changefeed, ddl_ts, table_id) values(...) ON DUPLICATE KEY UPDATE ddl_ts=VALUES(ddl_ts), created_at=CURRENT_TIMESTAMP; - var builder strings.Builder - builder.WriteString("INSERT INTO ") - builder.WriteString(filter.TiCDCSystemSchema) - builder.WriteString(".") - builder.WriteString(filter.DDLTsTable) - builder.WriteString("(ticdc_cluster_id, changefeed, ddl_ts, table_id) VALUES ") + if len(tableIds) > 0 { + // generate query + //INSERT INTO `tidb_cdc`.`ddl_ts` (ticdc_cluster_id, changefeed, ddl_ts, table_id) values(...) ON DUPLICATE KEY UPDATE ddl_ts=VALUES(ddl_ts), created_at=CURRENT_TIMESTAMP; + var builder strings.Builder + builder.WriteString("INSERT INTO ") + builder.WriteString(filter.TiCDCSystemSchema) + builder.WriteString(".") + builder.WriteString(filter.DDLTsTable) + builder.WriteString("(ticdc_cluster_id, changefeed, ddl_ts, table_id) VALUES ") - for idx, tableId := range tableIds { - builder.WriteString("('") - builder.WriteString(ticdcClusterID) - builder.WriteString("', '") - builder.WriteString(changefeedID) - builder.WriteString("', '") - builder.WriteString(ddlTs) - builder.WriteString("', ") - builder.WriteString(strconv.FormatInt(tableId, 10)) - builder.WriteString(")") - if idx < len(tableIds)-1 { - builder.WriteString(", ") + for idx, tableId := range tableIds { + builder.WriteString("('") + builder.WriteString(ticdcClusterID) + builder.WriteString("', '") + builder.WriteString(changefeedID) + builder.WriteString("', '") + builder.WriteString(ddlTs) + builder.WriteString("', ") + builder.WriteString(strconv.FormatInt(tableId, 10)) + builder.WriteString(")") + if idx < len(tableIds)-1 { + builder.WriteString(", ") + } } - } - builder.WriteString(" ON DUPLICATE KEY UPDATE ddl_ts=VALUES(ddl_ts), created_at=CURRENT_TIMESTAMP;") + builder.WriteString(" ON DUPLICATE KEY UPDATE ddl_ts=VALUES(ddl_ts), created_at=CURRENT_TIMESTAMP;") - query := builder.String() - log.Info("query is", zap.Any("query", query)) - _, err = tx.Exec(query) - if err != nil { - log.Error("failed to write ddl ts table", zap.Error(err)) - err2 := tx.Rollback() - if err2 != nil { - log.Error("failed to write ddl ts table", zap.Error(err2)) + query := builder.String() + log.Info("query is", zap.Any("query", query)) + _, err = tx.Exec(query) + if err != nil { + log.Error("failed to write ddl ts table", zap.Error(err)) + err2 := tx.Rollback() + if err2 != nil { + log.Error("failed to write ddl ts table", zap.Error(err2)) + } + return cerror.WrapError(cerror.ErrMySQLTxnError, errors.WithMessage(err, "failed to write ddl ts table;")) } - return cerror.WrapError(cerror.ErrMySQLTxnError, errors.WithMessage(err, "failed to write ddl ts table;")) + } else { + log.Error("table ids is empty when write ddl ts table, FIX IT", zap.Any("event", event)) } if len(dropTableIds) > 0 { diff --git a/pkg/sink/util/helper.go b/pkg/sink/util/helper.go index 64fb9ca459..748087462f 100644 --- a/pkg/sink/util/helper.go +++ b/pkg/sink/util/helper.go @@ -13,6 +13,7 @@ import ( "github.com/pingcap/ticdc/pkg/sink/codec/common" cerror "github.com/pingcap/tiflow/pkg/errors" "github.com/pingcap/tiflow/pkg/util" + "go.uber.org/zap" ) // GetEncoderConfig returns the encoder config and validates the config. @@ -78,17 +79,34 @@ func (s *TableSchemaStore) AddEvent(event *commonEvent.DDLEvent) { s.tableIDStore.AddEvent(event) } +func (s *TableSchemaStore) initialized() bool { + if s == nil || (s.tableIDStore == nil && s.tableNameStore == nil) { + log.Warn("TableSchemaStore is not initialized", zap.Any("tableSchemaStore", s)) + return false + } + return true +} + func (s *TableSchemaStore) GetTableIdsByDB(schemaID int64) []int64 { + if !s.initialized() { + return nil + } return s.tableIDStore.GetTableIdsByDB(schemaID) } func (s *TableSchemaStore) GetAllTableIds() []int64 { + if !s.initialized() { + return nil + } return s.tableIDStore.GetAllTableIds() } // GetAllTableNames only will be called when maintainer send message to ask dispatcher to write checkpointTs to downstream. // So the ts must be <= the latest received event ts of table trigger event dispatcher. func (s *TableSchemaStore) GetAllTableNames(ts uint64) []*commonEvent.SchemaTableName { + if !s.initialized() { + return nil + } return s.tableNameStore.GetAllTableNames(ts) } diff --git a/tests/scripts/download-integration-test-binaries.sh b/tests/scripts/download-integration-test-binaries.sh new file mode 100755 index 0000000000..765d848aed --- /dev/null +++ b/tests/scripts/download-integration-test-binaries.sh @@ -0,0 +1,229 @@ +#!/usr/bin/env bash +# Copyright 2023 PingCAP, Inc. +# +# 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, +# See the License for the specific language governing permissions and +# limitations under the License. + +# download-integration-test-binaries.sh will +# * download all the binaries needed for integration testing + +set -euo pipefail + +# Default values +DEFAULT_BRANCH=${1:-master} + +TIDB_BRANCH=${TIDB_BRANCH:-$DEFAULT_BRANCH} +TIKV_BRANCH=${TIKV_BRANCH:-$DEFAULT_BRANCH} +PD_BRANCH=${PD_BRANCH:-$DEFAULT_BRANCH} +TIFLASH_BRANCH=${TIFLASH_BRANCH:-$DEFAULT_BRANCH} + +COMMUNITY=${2:-false} +VERSION=${3:-v8.1.0} +OS=${4:-linux} +ARCH=${5:-amd64} + +# Constants +FILE_SERVER_URL="http://fileserver.pingcap.net" +TMP_DIR="tmp" +THIRD_BIN_DIR="third_bin" +BIN_DIR="bin" + +# ANSI color codes +GREEN='\033[0;32m' +NC='\033[0m' # No Color + +# Functions +log_green() { + echo -e "${GREEN}$1${NC}" +} + +download_file() { + local url=$1 + local file_name=$2 + local file_path=$3 + if [[ -f "${file_path}" ]]; then + echo "File ${file_name} already exists, skipping download" + return + fi + echo ">>> Downloading ${file_name} from ${url}" + wget --no-verbose --retry-connrefused --waitretry=1 -t 3 -O "${file_path}" "${url}" +} + +get_sha1() { + local repo="$1" + local branch="$2" + local sha1=$(curl -s "${FILE_SERVER_URL}/download/refs/pingcap/${repo}/${branch}/sha1") + if [ $? -ne 0 ] || echo "$sha1" | grep -q "Error"; then + echo "Failed to get sha1 for ${repo} branch ${branch}: $sha1. Using default branch ${DEFAULT_BRANCH} instead" >&2 + branch=$DEFAULT_BRANCH + sha1=$(curl -s "${FILE_SERVER_URL}/download/refs/pingcap/${repo}/${branch}/sha1") + fi + echo "$branch:$sha1" +} + +download_community_binaries() { + local dist="${VERSION}-${OS}-${ARCH}" + local tidb_file_name="tidb-community-server-$dist" + local tidb_tar_name="${tidb_file_name}.tar.gz" + local tidb_url="https://download.pingcap.org/$tidb_tar_name" + local toolkit_file_name="tidb-community-toolkit-$dist" + local toolkit_tar_name="${toolkit_file_name}.tar.gz" + local toolkit_url="https://download.pingcap.org/$toolkit_tar_name" + + log_green "Downloading community binaries..." + download_file "$tidb_url" "$tidb_tar_name" "${TMP_DIR}/$tidb_tar_name" + download_file "$toolkit_url" "$toolkit_tar_name" "${TMP_DIR}/$toolkit_tar_name" + + # Extract binaries + tar -xz -C ${TMP_DIR} -f ${TMP_DIR}/$tidb_tar_name + tar -xz -C ${THIRD_BIN_DIR} -f ${TMP_DIR}/$tidb_file_name/pd-${dist}.tar.gz + tar -xz -C ${THIRD_BIN_DIR} -f ${TMP_DIR}/$tidb_file_name/tikv-${dist}.tar.gz + tar -xz -C ${THIRD_BIN_DIR} -f ${TMP_DIR}/$tidb_file_name/tidb-${dist}.tar.gz + tar -xz -C ${THIRD_BIN_DIR} -f ${TMP_DIR}/$tidb_file_name/tiflash-${dist}.tar.gz + mv ${THIRD_BIN_DIR}/tiflash ${THIRD_BIN_DIR}/_tiflash + mv ${THIRD_BIN_DIR}/_tiflash/* ${THIRD_BIN_DIR} && rm -rf ${THIRD_BIN_DIR}/_tiflash + tar -xz -C ${THIRD_BIN_DIR} pd-ctl -f ${TMP_DIR}/$tidb_file_name/ctl-${dist}.tar.gz + tar -xz -C ${THIRD_BIN_DIR} $toolkit_file_name/etcdctl $toolkit_file_name/sync_diff_inspector -f ${TMP_DIR}/$toolkit_tar_name + mv ${THIRD_BIN_DIR}/$toolkit_file_name/* ${THIRD_BIN_DIR} && rm -rf ${THIRD_BIN_DIR}/$toolkit_file_name + + # Download additional tools + download_ycsb + download_minio + download_jq + + chmod a+x ${THIRD_BIN_DIR}/* +} + +download_ycsb() { + local ycsb_file_name="go-ycsb-${OS}-${ARCH}" + local ycsb_tar_name="${ycsb_file_name}.tar.gz" + local ycsb_url="https://github.com/pingcap/go-ycsb/releases/download/v1.0.0/${ycsb_tar_name}" + wget -O "${TMP_DIR}/$ycsb_tar_name" "$ycsb_url" + tar -xz -C ${THIRD_BIN_DIR} -f ${TMP_DIR}/$ycsb_tar_name +} + +download_minio() { + local minio_url="https://dl.min.io/server/minio/release/${OS}-${ARCH}/minio" + download_file "$minio_url" "minio" "${THIRD_BIN_DIR}/minio" +} + +download_jq() { + local os_name=$([ "$OS" == "darwin" ] && echo -n "macos" || echo -n "$OS") + local jq_url="https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-${os_name}-${ARCH}" + wget -O ${THIRD_BIN_DIR}/jq "$jq_url" +} + +download_binaries() { + log_green "Downloading binaries..." + + # Get sha1 based on branch name + local tidb_branch_sha1=$(get_sha1 "tidb" "$TIDB_BRANCH") + local tikv_branch_sha1=$(get_sha1 "tikv" "$TIKV_BRANCH") + local pd_branch_sha1=$(get_sha1 "pd" "$PD_BRANCH") + local tiflash_branch_sha1=$(get_sha1 "tiflash" "$TIFLASH_BRANCH") + + local tidb_branch=$(echo "$tidb_branch_sha1" | cut -d':' -f1) + local tidb_sha1=$(echo "$tidb_branch_sha1" | cut -d':' -f2) + local tikv_branch=$(echo "$tikv_branch_sha1" | cut -d':' -f1) + local tikv_sha1=$(echo "$tikv_branch_sha1" | cut -d':' -f2) + local pd_branch=$(echo "$pd_branch_sha1" | cut -d':' -f1) + local pd_sha1=$(echo "$pd_branch_sha1" | cut -d':' -f2) + local tiflash_branch=$(echo "$tiflash_branch_sha1" | cut -d':' -f1) + local tiflash_sha1=$(echo "$tiflash_branch_sha1" | cut -d':' -f2) + + # Define download URLs + local tidb_download_url="${FILE_SERVER_URL}/download/builds/pingcap/tidb/${tidb_sha1}/centos7/tidb-server.tar.gz" + local tikv_download_url="${FILE_SERVER_URL}/download/builds/pingcap/tikv/${tikv_sha1}/centos7/tikv-server.tar.gz" + local pd_download_url="${FILE_SERVER_URL}/download/builds/pingcap/pd/${pd_sha1}/centos7/pd-server.tar.gz" + local tiflash_download_url="${FILE_SERVER_URL}/download/builds/pingcap/tiflash/${tiflash_branch}/${tiflash_sha1}/centos7/tiflash.tar.gz" + local minio_download_url="${FILE_SERVER_URL}/download/minio.tar.gz" + local go_ycsb_download_url="${FILE_SERVER_URL}/download/builds/pingcap/go-ycsb/test-br/go-ycsb" + local etcd_download_url="${FILE_SERVER_URL}/download/builds/pingcap/cdc/etcd-v3.4.7-linux-amd64.tar.gz" + local sync_diff_inspector_url="${FILE_SERVER_URL}/download/builds/pingcap/cdc/sync_diff_inspector_hash-a129f096_linux-amd64.tar.gz" + local jq_download_url="${FILE_SERVER_URL}/download/builds/pingcap/test/jq-1.6/jq-linux64" + local schema_registry_url="${FILE_SERVER_URL}/download/builds/pingcap/cdc/schema-registry.tar.gz" + + # Download and extract binaries + download_and_extract "$tidb_download_url" "tidb-server.tar.gz" "bin/tidb-server" + download_and_extract "$pd_download_url" "pd-server.tar.gz" "bin/*" + download_and_extract "$tikv_download_url" "tikv-server.tar.gz" "bin/tikv-server" + download_and_extract "$tiflash_download_url" "tiflash.tar.gz" + download_and_extract "$minio_download_url" "minio.tar.gz" + download_and_extract "$etcd_download_url" "etcd.tar.gz" "etcd-v3.4.7-linux-amd64/etcdctl" + download_and_extract "$sync_diff_inspector_url" "sync_diff_inspector.tar.gz" + download_and_extract "$schema_registry_url" "schema-registry.tar.gz" + + download_file "$go_ycsb_download_url" "go-ycsb" "${THIRD_BIN_DIR}/go-ycsb" + download_file "$jq_download_url" "jq" "${THIRD_BIN_DIR}/jq" + + chmod a+x ${THIRD_BIN_DIR}/* +} + +download_and_extract() { + local url=$1 + local file_name=$2 + local extract_path=${3:-""} + + download_file "$url" "$file_name" "${TMP_DIR}/$file_name" + if [ -n "$extract_path" ]; then + tar -xz --wildcards -C ${THIRD_BIN_DIR} $extract_path -f ${TMP_DIR}/$file_name + else + tar -xz --wildcards -C ${THIRD_BIN_DIR} -f ${TMP_DIR}/$file_name + fi + + # Move extracted files if necessary + case $file_name in + "tidb-server.tar.gz") mv ${THIRD_BIN_DIR}/bin/tidb-server ${THIRD_BIN_DIR}/ ;; + "pd-server.tar.gz") mv ${THIRD_BIN_DIR}/bin/* ${THIRD_BIN_DIR}/ ;; + "tikv-server.tar.gz") mv ${THIRD_BIN_DIR}/bin/tikv-server ${THIRD_BIN_DIR}/ ;; + "tiflash.tar.gz") + mv ${THIRD_BIN_DIR}/tiflash ${THIRD_BIN_DIR}/_tiflash + mv ${THIRD_BIN_DIR}/_tiflash/* ${THIRD_BIN_DIR}/ && rm -rf ${THIRD_BIN_DIR}/_tiflash + ;; + "etcd.tar.gz") + mv ${THIRD_BIN_DIR}/etcd-v3.4.7-linux-amd64/etcdctl ${THIRD_BIN_DIR}/ + rm -rf ${THIRD_BIN_DIR}/etcd-v3.4.7-linux-amd64 + ;; + "schema-registry.tar.gz") + mv ${THIRD_BIN_DIR}/schema-registry ${THIRD_BIN_DIR}/_schema_registry + mv ${THIRD_BIN_DIR}/_schema_registry/* ${THIRD_BIN_DIR}/ && rm -rf ${THIRD_BIN_DIR}/_schema_registry + ;; + esac +} + +# Main execution +cleanup() { + rm -rf ${TMP_DIR} ${THIRD_BIN_DIR} +} + +setup() { + cleanup + rm -rf ${BIN_DIR} + mkdir -p ${THIRD_BIN_DIR} ${TMP_DIR} ${BIN_DIR} +} + +main() { + setup + + if [ "$COMMUNITY" = true ]; then + download_community_binaries + else + download_binaries + fi + + # Move binaries to final location + mv ${THIRD_BIN_DIR}/* ./${BIN_DIR} + + cleanup + log_green "Download SUCCESS" +} + +main