diff --git a/.github/workflows/dapr.yml b/.github/workflows/dapr.yml
index a7397d7ee15..cc8e3cfe37e 100644
--- a/.github/workflows/dapr.yml
+++ b/.github/workflows/dapr.yml
@@ -14,9 +14,8 @@
name: dapr
on:
- workflow_dispatch:
schedule:
- - cron: '00 22 * * *'
+ - cron: '00 22 * * *'
push:
branches:
- master
@@ -24,6 +23,7 @@ on:
- feature/*
tags:
- v*
+ - x*
pull_request:
branches:
- master
@@ -34,7 +34,7 @@ jobs:
name: Build ${{ matrix.target_os }}_${{ matrix.target_arch }} binaries
runs-on: ${{ matrix.os }}
env:
- GOVER: "1.19"
+ GOVER: 1.19
GOLANGCILINT_VER: v1.48.0
PROTOC_VERSION: "21.1"
GOOS: ${{ matrix.target_os }}
@@ -72,19 +72,14 @@ jobs:
image: tonistiigi/binfmt:latest
platforms: arm64
- name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v1
+ uses: docker/setup-buildx-action@v2
if: matrix.target_os == 'linux' && github.event_name != 'pull_request'
+ with:
+ version: v0.10.1 # Don't use latest since it broke our workflow once
- name: Check out code into the Go module directory
uses: actions/checkout@v2
- - name: Parse release version and set REL_VERSION and LATEST_RELEASE
+ - name: Parse release version and set REL_VERSION
run: python ./.github/scripts/get_release_version.py ${{ github.event_name }}
- - name: Set REPO_OWNER
- if: matrix.target_os != 'darwin'
- run: |
- REPO_OWNER=${{ github.repository_owner }}
- # Lowercase the value
- echo "REPO_OWNER=${REPO_OWNER,,}" >>${GITHUB_ENV}
- shell: bash
- name: Check white space in .md files
if: matrix.target_os == 'linux' && github.event_name == 'pull_request'
run: |
@@ -104,42 +99,6 @@ jobs:
echo >&2
exit 1
fi
- - name: Cache Go modules (Linux)
- if: matrix.target_os == 'linux'
- uses: actions/cache@v3
- with:
- path: |
- ~/.cache/go-build
- ~/go/pkg/mod
- key: ${{ matrix.target_os }}-${{ matrix.target_arch }}-go-${{ env.GOVER }}-build-${{ hashFiles('**/go.sum') }}
- restore-keys: |
- ${{ matrix.target_os }}-${{ matrix.target_arch }}-go-${{ env.GOVER }}-build-
- - name: Cache Go modules (Windows)
- if: matrix.target_os == 'windows'
- uses: actions/cache@v3
- with:
- path: |
- ~\AppData\Local\go-build
- ~\go\pkg\mod
- key: ${{ matrix.target_os }}-${{ matrix.target_arch }}-go-${{ env.GOVER }}-build-${{ hashFiles('**/go.sum') }}
- restore-keys: |
- ${{ matrix.target_os }}-${{ matrix.target_arch }}-go-${{ env.GOVER }}-build-
- - name: Cache Go modules (macOS)
- if: matrix.target_os == 'darwin'
- uses: actions/cache@v3
- with:
- path: |
- ~/Library/Caches/go-build
- ~/go/pkg/mod
- key: ${{ matrix.target_os }}-${{ matrix.target_arch }}-go-${{ env.GOVER }}-build-${{ hashFiles('**/go.sum') }}
- restore-keys: |
- ${{ matrix.target_os }}-${{ matrix.target_arch }}-go-${{ env.GOVER }}-build-
- - name: golangci-lint
- if: matrix.target_arch == 'amd64' && matrix.target_os == 'linux'
- uses: golangci/golangci-lint-action@v3.2.0
- with:
- version: ${{ env.GOLANGCILINT_VER }}
- skip-cache: true
- name: Run go mod tidy check diff
if: matrix.target_arch == 'amd64' && matrix.target_os == 'linux'
run: make modtidy check-diff
@@ -155,14 +114,6 @@ jobs:
rm -r protoc protoc-${{ env.PROTOC_VERSION }}-linux-x86_64.zip
make init-proto
make gen-proto check-proto-diff
- - name: Run make test
- if: matrix.target_arch == 'amd64'
- env:
- COVERAGE_OPTS: "-coverprofile=coverage.txt -covermode=atomic"
- run: make test
- - name: Codecov
- if: matrix.target_arch == 'amd64' && matrix.target_os == 'linux'
- uses: codecov/codecov-action@v1
- name: Run make release to build and archive binaries
env:
GOOS: ${{ matrix.target_os }}
@@ -183,292 +134,20 @@ jobs:
with:
name: dapr_grafana_dashboards
path: ./grafana/*.json
- - name: Docker Hub Login
- if: matrix.target_os != 'darwin' && github.event_name != 'pull_request' && env.DOCKER_REGISTRY_ID != ''
- uses: docker/login-action@v1
- env:
- DOCKER_REGISTRY_ID: ${{ secrets.DOCKER_REGISTRY_ID }}
- with:
- username: ${{ secrets.DOCKER_REGISTRY_ID }}
- password: ${{ secrets.DOCKER_REGISTRY_PASS }}
- - name: GitHub Container Registry login
- if: matrix.target_os != 'darwin' && github.event_name != 'pull_request'
- uses: docker/login-action@v1
+ - name: Configure AWS credentials
+ uses: aws-actions/configure-aws-credentials@v1
with:
- registry: ghcr.io
- username: ${{ github.repository_owner }}
- password: ${{ secrets.GITHUB_TOKEN }}
- - name: Build and push Docker images to Docker Hub
- if: matrix.target_os != 'darwin' && github.event_name != 'pull_request' && env.DOCKER_REGISTRY_ID != ''
- env:
- DOCKER_REGISTRY_ID: ${{ secrets.DOCKER_REGISTRY_ID }}
- DAPR_REGISTRY: ${{ secrets.DOCKER_REGISTRY }}
- TARGET_OS: ${{ matrix.target_os }}
- TARGET_ARCH: ${{ matrix.target_arch }}
- run: |
- echo "Build Docker images and push to Docker Hub..."
- DAPR_TAG=${{ env.REL_VERSION }} make docker-push
+ aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
+ aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
+ aws-region: ap-southeast-1
- # Mariner images are built only on linux/amd64 and linux/arm64
- if [ "$TARGET_OS" = "linux" ] && [ "$TARGET_ARCH" != "arm" ]; then
- DOCKERFILE=Dockerfile-mariner DAPR_TAG="${{ env.REL_VERSION }}-mariner" make docker-push
- fi
- shell: bash
- - name: Build and push Docker images to GHCR
+ - name: Login to Amazon ECR
if: matrix.target_os != 'darwin' && github.event_name != 'pull_request'
- env:
- DAPR_REGISTRY: ghcr.io/${{ env.REPO_OWNER }}
- TARGET_OS: ${{ matrix.target_os }}
- TARGET_ARCH: ${{ matrix.target_arch }}
- run: |
- echo "Build Docker images and push to GHCR..."
- DAPR_TAG=${{ env.REL_VERSION }} make docker-push
+ id: login-ecr
+ uses: aws-actions/amazon-ecr-login@v1
- # Mariner images are built only on linux/amd64 and linux/arm64
- if [ "$TARGET_OS" = "linux" ] && [ "$TARGET_ARCH" != "arm" ]; then
- DOCKERFILE=Dockerfile-mariner DAPR_TAG="${{ env.REL_VERSION }}-mariner" make docker-push
- fi
- shell: bash
- - name: Upload test results
- if: always() && matrix.target_arch == 'amd64'
- uses: actions/upload-artifact@master
- with:
- name: ${{ matrix.target_os }}_${{ matrix.target_arch }}_test_unit.json
- path: ${{ env.TEST_OUTPUT_FILE_PREFIX }}_unit.json
- publish:
- name: Publish docker image and binaries
- needs: build
- if: github.event_name != 'pull_request'
- env:
- ARTIFACT_DIR: ./release
- HELM_PACKAGE_DIR: helm
- DAPR_VERSION_ARTIFACT: dapr_version
- DOCKER_REGISTRY: ${{ secrets.DOCKER_REGISTRY }}
- HELMVER: v3.7.2
- runs-on: ubuntu-latest
- steps:
- - name: Set up Helm ${{ env.HELMVER }}
- uses: azure/setup-helm@v1
- with:
- version: ${{ env.HELMVER }}
- - name: Check out code into the Go module directory
- uses: actions/checkout@v2
- - name: Parse release version and set REL_VERSION and LATEST_RELEASE
- run: python ./.github/scripts/get_release_version.py ${{ github.event_name }}
- - name: Set REPO_OWNER
- if: matrix.target_os != 'darwin'
- shell: bash
- run: |
- REPO_OWNER=${{ github.repository_owner }}
- # Lowercase the value
- echo "REPO_OWNER=${REPO_OWNER,,}" >>${GITHUB_ENV}
- - name: Update Helm chart files for release version ${{ env.REL_VERSION }}
- run: bash ./.github/scripts/set_helm_dapr_version.sh
- - name: Generate Helm chart manifest
- if: env.DOCKER_REGISTRY != ''
- env:
- DAPR_REGISTRY: ${{ env.DOCKER_REGISTRY }}
- DAPR_TAG: ${{ env.REL_VERSION }}
- run: |
- make manifest-gen
- shell: bash
- - name: Move Helm chart manifest to artifact
- if: env.DOCKER_REGISTRY != ''
- run: |
- mkdir -p ${{ env.ARTIFACT_DIR }}
- mv ./dist/install/dapr.yaml ${{ env.ARTIFACT_DIR }}/dapr-operator.yaml
- - name: "download artifact: dapr_linux_amd64"
- uses: actions/download-artifact@master
- with:
- name: dapr_linux_amd64
- path: ${{ env.ARTIFACT_DIR }}
- - name: "download artifact: dapr_linux_arm"
- uses: actions/download-artifact@master
- with:
- name: dapr_linux_arm
- path: ${{ env.ARTIFACT_DIR }}
- - name: "download artifact: dapr_linux_arm64"
- uses: actions/download-artifact@master
- with:
- name: dapr_linux_arm64
- path: ${{ env.ARTIFACT_DIR }}
- - name: "download artifact: dapr_windows_amd64"
- uses: actions/download-artifact@master
- with:
- name: dapr_windows_amd64
- path: ${{ env.ARTIFACT_DIR }}
- - name: "download artifact: dapr_darwin_amd64"
- uses: actions/download-artifact@master
- with:
- name: dapr_darwin_amd64
- path: ${{ env.ARTIFACT_DIR }}
- - name: "download artifact: dapr_darwin_arm64"
- uses: actions/download-artifact@master
- with:
- name: dapr_darwin_arm64
- path: ${{ env.ARTIFACT_DIR }}
- - name: "download artifact: dapr_grafana_dashboards"
- uses: actions/download-artifact@master
- with:
- name: dapr_grafana_dashboards
- path: ${{ env.ARTIFACT_DIR }}
- - name: tar release binaries
- run: |
- IMAGE_ARCHS=(amd64 arm arm64)
- for img_arch in "${IMAGE_ARCHS[@]}"; do
- echo "Preparing linux_${img_arch} image..."
- RELEASE_DIR=dist/linux_${img_arch}/release/
- mkdir -p $RELEASE_DIR
- for tgzfile in $ARTIFACT_DIR/*linux_${img_arch}.tar.gz; do
- echo "Extracting $tgzfile ..."
- tar xzvf $tgzfile -C $RELEASE_DIR
- done
- done
- - name: generate checksum files
- run: cd ${ARTIFACT_DIR} && for i in *; do sha256sum -b $i > "$i.sha256"; done && cd -
- - name: lists artifacts
- run: ls -l ${{ env.ARTIFACT_DIR }}
- - name: publish binaries to github
- if: startswith(github.ref, 'refs/tags/v')
- run: |
- echo "installing github-release-cli..."
- sudo npm install --silent --no-progress -g github-release-cli@2.1.0
- if [ "$LATEST_RELEASE" = "true" ]; then
- export RELEASE_BODY=`cat ./docs/release_notes/v${REL_VERSION}.md`
- else
- export RELEASE_BODY="This is the release candidate ${REL_VERSION}"
- fi
- # Get the list of files
- RELEASE_ARTIFACT=(${ARTIFACT_DIR}/*)
- # Parse repository to get owner and repo names
- OWNER_NAME="${GITHUB_REPOSITORY%%/*}"
- REPO_NAME="${GITHUB_REPOSITORY#*/}"
- export GITHUB_TOKEN=${{ secrets.DAPR_BOT_TOKEN }}
- echo "Uploading Dapr Runtime Binaries to GitHub Release"
- github-release upload \
- --owner $OWNER_NAME \
- --repo $REPO_NAME \
- --tag "v${REL_VERSION}" \
- --release-name "Dapr Runtime v${REL_VERSION}" \
- --body "${RELEASE_BODY}" \
- --prerelease true \
- ${RELEASE_ARTIFACT[*]}
- shell: bash
- - name: Docker Hub Login
- uses: docker/login-action@v1
- if: matrix.target_os != 'darwin' && env.DOCKER_REGISTRY != ''
- with:
- username: ${{ secrets.DOCKER_REGISTRY_ID }}
- password: ${{ secrets.DOCKER_REGISTRY_PASS }}
- - name: GitHub Container Registry login
- uses: docker/login-action@v1
- if: matrix.target_os != 'darwin'
- with:
- registry: ghcr.io
- username: ${{ github.repository_owner }}
- password: ${{ secrets.GITHUB_TOKEN }}
- - name: Build and push Docker multiarch manifest to Docker Hub
- if: matrix.target_os != 'darwin' && env.DOCKER_REGISTRY_ID != ''
- env:
- DOCKER_REGISTRY_ID: ${{ secrets.DOCKER_REGISTRY_ID }}
- DAPR_REGISTRY: ${{ secrets.DOCKER_REGISTRY }}
- run: |
- echo "Build Docker multiarch manifest and push to GHCR"
- DAPR_TAG="${{ env.REL_VERSION }}" make docker-publish
-
- # Publish the `-mariner` tag
- # Mariner images are built only on linux/amd64 and linux/arm64
- # Also, these use the "latest-mariner" tag if it's the latest
- DOCKER_MULTI_ARCH="linux-amd64 linux-arm64" \
- DAPR_TAG="${{ env.REL_VERSION }}-mariner" \
- LATEST_TAG=latest-mariner \
- make docker-publish
- shell: bash
- - name: Build and push Docker multiarch manifest to GHCR
- if: matrix.target_os != 'darwin'
- env:
- DAPR_REGISTRY: ghcr.io/${{ env.REPO_OWNER }}
- run: |
- echo "Build Docker multiarch manifest and push to GHCR"
- DAPR_TAG="${{ env.REL_VERSION }}" make docker-publish
-
- # Publish the `-mariner` tag
- # Mariner images are built only on linux/amd64 and linux/arm64
- # Also, these use the "latest-mariner" tag if it's the latest
- DOCKER_MULTI_ARCH="linux-amd64 linux-arm64" \
- DAPR_TAG="${{ env.REL_VERSION }}-mariner" \
- LATEST_TAG=latest-mariner \
- make docker-publish
- shell: bash
- - name: Save release version
- run: |
- mkdir -p ${{ env.ARTIFACT_DIR }}/${{ env.HELM_PACKAGE_DIR }}
- echo ${REL_VERSION} > ${{ env.ARTIFACT_DIR }}/${{ env.HELM_PACKAGE_DIR }}/${{ env.DAPR_VERSION_ARTIFACT }}
- - name: Package Helm chart
- if: ${{ env.LATEST_RELEASE }} == "true" && env.DOCKER_REGISTRY != ''
- env:
- HELM_CHARTS_DIR: charts/dapr
- run: |
- mkdir -p ${{ env.ARTIFACT_DIR }}/${{ env.HELM_PACKAGE_DIR }}
- helm package ${{ env.HELM_CHARTS_DIR }} --destination ${{ env.ARTIFACT_DIR }}/${{ env.HELM_PACKAGE_DIR }}
- - name: Upload Helm charts package to artifacts
- if: ${{ env.LATEST_RELEASE }} == "true" && env.DOCKER_REGISTRY != ''
- uses: actions/upload-artifact@master
- with:
- name: dapr_helm_charts_package
- path: ${{ env.ARTIFACT_DIR }}/${{ env.HELM_PACKAGE_DIR }}
- # This job downloads the helm charts package artifact uploaded by the publish job,
- # checks out the helm charts git hub pages repo and commits the latest version of
- # helm charts package.
- # This does not run on forks
- helmpublish:
- name: Publish helm charts to Helm github pages repo
- needs: publish
- if: startswith(github.ref, 'refs/tags/v') && github.repository_owner == 'dapr'
- env:
- ARTIFACT_DIR: ./release
- DAPR_VERSION_ARTIFACT: dapr_version
- HELM_PACKAGE_DIR: helm
- runs-on: ubuntu-latest
- steps:
- - name: Create Helm charts directory
- run: |
- mkdir -p ${{ env.ARTIFACT_DIR }}/${{ env.HELM_PACKAGE_DIR }}
- - name: download artifacts - dapr_helm_charts_package
- uses: actions/download-artifact@master
- with:
- name: dapr_helm_charts_package
- path: ${{ env.ARTIFACT_DIR }}/${{ env.HELM_PACKAGE_DIR }}
- - name: Checkout Helm Charts Repo
- uses: actions/checkout@v2
- env:
- DAPR_HELM_REPO: dapr/helm-charts
- DAPR_HELM_REPO_CODE_PATH: helm-charts
- with:
- repository: ${{ env.DAPR_HELM_REPO }}
- ref: refs/heads/master
- token: ${{ secrets.DAPR_BOT_TOKEN }}
- path: ${{ env.DAPR_HELM_REPO_CODE_PATH }}
- - name: Upload helm charts to Helm Repo
- env:
- DAPR_HELM_REPO_CODE_PATH: helm-charts
- DAPR_HELM_REPO: https://dapr.github.io/helm-charts/
+ - name: Build and push docker images to GitHub container registry
+ if: matrix.target_os != 'darwin' && github.event_name != 'pull_request'
run: |
- daprVersion=`cat ${{ env.ARTIFACT_DIR }}/${{ env.HELM_PACKAGE_DIR }}/${{ env.DAPR_VERSION_ARTIFACT }}`
- cd ${{ env.ARTIFACT_DIR }}/${{ env.HELM_PACKAGE_DIR }}
- cp -r `ls -A | grep -v ${{ env.DAPR_VERSION_ARTIFACT }}` $GITHUB_WORKSPACE/${{ env.DAPR_HELM_REPO_CODE_PATH }}
- cd $GITHUB_WORKSPACE/${{ env.DAPR_HELM_REPO_CODE_PATH }}
- helm repo index --url ${{ env.DAPR_HELM_REPO }} --merge index.yaml .
- git config --global user.email "daprweb@microsoft.com"
- git config --global user.name "dapr-bot"
- git add --all
- # Check if the dapr-${daprVersion}.tgz file is modified.
- if git diff --name-only --staged | grep -q ${daprVersion}; then
- # If it is, we update the Helm chart, since this is an intentional update.
- git commit -m "Release - $daprVersion"
- git push
- else
- # If not, this update was accidentally triggered by tagging a release before updating the Helm chart.
- echo "::error::There is no change for ${daprVersion} Helm chart. Did you forget to update the chart version before tagging?"
- exit -1
- fi
+ echo "Build docker image and push image..."
+ make docker-push TARGET_OS=${{ matrix.target_os }} TARGET_ARCH=${{ matrix.target_arch }} DAPR_REGISTRY=798321202204.dkr.ecr.ap-southeast-1.amazonaws.com DAPR_TAG=${{ github.sha }}
\ No newline at end of file
diff --git a/README.md b/README.md
index 09b4cb82440..84306118d5f 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-
Any language, any framework, anywhere
+
Any language1, any framework, anywhere
[![Go Report Card](https://goreportcard.com/badge/github.com/dapr/dapr)](https://goreportcard.com/report/github.com/dapr/dapr)
diff --git a/docker/docker.mk b/docker/docker.mk
index 1c69fda22ad..9e2515cbc76 100644
--- a/docker/docker.mk
+++ b/docker/docker.mk
@@ -18,8 +18,8 @@ DOCKERFILE_DIR?=./docker
DAPR_SYSTEM_IMAGE_NAME?=$(RELEASE_NAME)
DAPR_RUNTIME_IMAGE_NAME?=daprd
-DAPR_PLACEMENT_IMAGE_NAME?=placement
-DAPR_SENTRY_IMAGE_NAME?=sentry
+DAPR_PLACEMENT_IMAGE_NAME?=dapr_placement
+DAPR_SENTRY_IMAGE_NAME?=dapr_sentry
# build docker image for linux
BIN_PATH=$(OUT_DIR)/$(TARGET_OS)_$(TARGET_ARCH)
diff --git a/docs/release_notes/v1.9.4.md b/docs/release_notes/v1.9.4.md
new file mode 100644
index 00000000000..4a1b0ab972b
--- /dev/null
+++ b/docs/release_notes/v1.9.4.md
@@ -0,0 +1,23 @@
+# Dapr 1.9.4
+
+## Fixes MQTT pubsub component failure to read messages on startup when multiple subscriptions are configured
+
+### Problem
+
+When using the MQTT component users who had multiple subcriptions could encounter an issue where messages would stop being processed for the component.
+
+### Impact
+
+This issue impacts users of the MQTT pubsub component on Dapr 1.9.0-1.9.3 that subscribe to multiple topics using the same component.
+
+### Root cause
+
+The issue occurs when there are two or more subscriptions, messages are being published to the first topic only, and the subscriber gets killed after publishing a few messages. If the subscriber comes back online after a few (two or more) messages have been published already, then it will only deliver the first pending message and stop.
+
+In the situation above, Dapr could enter into a deadlock and stop processing messages from MQTT.
+
+The issue was traced back to an error in the upstream MQTT SDK used by Dapr
+
+### Solution
+
+We have upgraded the MQTT SDK used by Dapr to a new version which fixes the error.
\ No newline at end of file
diff --git a/docs/release_notes/v1.9.5.md b/docs/release_notes/v1.9.5.md
new file mode 100644
index 00000000000..5f54e07c2cf
--- /dev/null
+++ b/docs/release_notes/v1.9.5.md
@@ -0,0 +1,85 @@
+# Dapr 1.9.5
+
+- Fixes a panic in the Azure Cosmos DB state store component when performing transaction request with ETags
+- Fixes component initialization failure when the built-in Kubernetes secret store is disabled
+- Fixes nil dereference crash in placement membership heartbeat loop in sidecar
+- Fixes MQTT message acknowledgement for retained messages
+
+## Fixes a panic in the Azure Cosmos DB state store component when performing transaction request with ETags
+
+### Problem
+
+When setting any ETag in a transaction request with the Azure Cosmos DB state store, Dapr panics with a nil pointer dereference.
+
+### Impact
+
+This issue impacts all users of the Azure Cosmos DB state store on Dapr 1.9.0-1.9.4.
+
+### Root cause
+
+When setting an ETag on a transaction request in the Azure Cosmos DB state store, a bug causes Dapr to panic.
+
+### Solution
+
+We fixed a bug that caused Dapr to panic.
+
+
+## Fixes component initialization failure when the built-in Kubernetes secret store is disabled
+
+### Problem
+
+When running on Kubernetes, Dapr automatically initializes a Kubernetes secret store in each sidecar. Starting with Dapr 1.8, this behavior can be [turned off](https://docs.dapr.io/reference/arguments-annotations-overview/) using the `dapr.io/disable-builtin-k8s-secret-store`.
+
+However, with the built-in Kubernetes secret store disabled, an error prevented components from being able to retrieve secrets [stored as Kubernetes secrets](https://docs.dapr.io/operations/components/component-secrets/#referencing-a-kubernetes-secret) during initialization. This caused components to fail to initialize due to not being able to read secrets, for example connection strings or passwords.
+
+### Impact
+
+The issue impacts users on Dapr 1.8.0-1.9.4 who want to disable the built-in Kubernetes secret store.
+
+### Root cause
+
+In Dapr, components that use secrets stored as Kubernetes secrets should not need the built-in Kubernetes secret store to be loaded to work. This is because the Dapr Operator service populates the secrets from the Kubernetes secret store and passes them to the sidecar automatically.
+
+However, during initialization of a component that references a secret stored in Kubernetes, a bug caused Dapr to return an error if the built-in Kubernetes secret store was disabled, and the value of the secret as included by the Dapr Operator was ignored.
+
+### Solution
+
+We have implemented a fix in the component initialization sequence. Now, components that reference secrets from the Kubernetes secret store do not need the built-in Kubernetes secret store to be enabled anymore.
+
+
+## Fixes panic in actor placement membership in Dapr sidecar
+
+### Problem
+
+When recovering from a failure in the connection to the Dapr placement service, the Dapr sidecar could have encountered a panic in some cases.
+
+### Impact
+
+The issue can impact all Dapr users on Dapr 1.7.0-1.9.4 using actors.
+
+### Root cause
+
+We identified a race condition in the actor placement service client that could have caused the Dapr to panic after recovering from a failure.
+
+### Solution
+
+We updated actor placement service to address the race condition and remove the cause for the panic.
+
+
+## Fixes MQTT message acknowledgement for retained messages
+
+### Problem
+
+Retained MQTT messages should be only processed once, however, they were not being acknowledged and thus were resent indefinitely.
+
+### Impact
+
+This issue impacts all users of the MQTT PubSub component on Dapr 1.9.0-1.9.4, where-in a subscriber using MQTT component receives a `retained` message.
+
+### Root cause
+
+MQTT retained messages were never being acknowledged and were therefore being resent indefinitely.
+
+### Solution
+
+We updated Dapr to acknowledge a retained message in the MQTT PubSub component.
\ No newline at end of file
diff --git a/go.mod b/go.mod
index 81bd6c7228d..a1326f05369 100644
--- a/go.mod
+++ b/go.mod
@@ -8,7 +8,7 @@ require (
github.com/PuerkitoBio/purell v1.1.1
github.com/agrea/ptr v0.0.0-20180711073057-77a518d99b7b
github.com/cenkalti/backoff/v4 v4.1.3
- github.com/dapr/components-contrib v1.9.1
+ github.com/dapr/components-contrib v1.9.6
github.com/dapr/kit v0.0.3-0.20220930182601-272e358ba6a7
github.com/fasthttp/router v1.4.12
github.com/fsnotify/fsnotify v1.5.4
@@ -175,7 +175,7 @@ require (
github.com/eapache/go-resiliency v1.2.0 // indirect
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 // indirect
github.com/eapache/queue v1.1.0 // indirect
- github.com/eclipse/paho.mqtt.golang v1.3.5 // indirect
+ github.com/eclipse/paho.mqtt.golang v1.4.2-0.20221018190109-a1800d8df9a4 // indirect
github.com/emicklei/go-restful v2.9.5+incompatible // indirect
github.com/emirpasic/gods v1.12.0 // indirect
github.com/evanphx/json-patch v4.12.0+incompatible // indirect
@@ -388,17 +388,17 @@ require (
)
replace (
+ github.com/dapr/components-contrib v1.9.6 => github.com/TheLandGame/components-contrib v0.0.0-20241122170834-508d9cbfe046
github.com/toolkits/concurrent => github.com/niean/gotools v0.0.0-20151221085310-ff3f51fc5c60
gopkg.in/couchbaselabs/gocbconnstr.v1 => github.com/couchbaselabs/gocbconnstr v1.0.5
k8s.io/client => github.com/kubernetes-client/go v0.0.0-20190928040339-c757968c4c36
)
-replace github.com/eclipse/paho.mqtt.golang => github.com/shivamkm07/paho.mqtt.golang v1.3.6-0.20220106130409-e28a1db639f8
-
// Uncomment for local development for testing with changes in the components-contrib repository.
// Don't commit with this uncommented!
//
// replace github.com/dapr/components-contrib => ../components-contrib
+
//
// Then, run `make modtidy` in this repository.
// This ensures that go.mod and go.sum are up-to-date.
diff --git a/go.sum b/go.sum
index 2be44c64bdf..99ccd01fb9e 100644
--- a/go.sum
+++ b/go.sum
@@ -228,6 +228,8 @@ github.com/Shopify/toxiproxy/v2 v2.1.6-0.20210914104332-15ea381dcdae/go.mod h1:/
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
github.com/StackExchange/wmi v0.0.0-20210224194228-fe8f1750fd46 h1:5sXbqlSomvdjlRbWyNqkPsJ3Fg+tQZCbgeX1VGljbQY=
github.com/StackExchange/wmi v0.0.0-20210224194228-fe8f1750fd46/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
+github.com/TheLandGame/components-contrib v0.0.0-20241122170834-508d9cbfe046 h1:7ciYMota8fW0LACi28k/Fg1wGSp/B71SefmhQ3w73PI=
+github.com/TheLandGame/components-contrib v0.0.0-20241122170834-508d9cbfe046/go.mod h1:U0cjxEEbZR7sNN9i1ZdWnkIOZP8iRSvoyF2gRhBaHfc=
github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
github.com/Workiva/go-datastructures v1.0.52/go.mod h1:Z+F2Rca0qCsVYDS8z7bAGm8f3UkzuWYS/oBZz5a7VVA=
github.com/Workiva/go-datastructures v1.0.53 h1:J6Y/52yX10Xc5JjXmGtWoSSxs3mZnGSaq37xZZh7Yig=
@@ -593,8 +595,6 @@ github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3E
github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg=
github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0=
github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0=
-github.com/dapr/components-contrib v1.9.1 h1:g2TpEwvnB4s5Lvf89QXzAlj3xaWGaxTZIhTY4LpIfYI=
-github.com/dapr/components-contrib v1.9.1/go.mod h1:ftVthBjl0e5G61J5XKkZKEjU/TGE0gNT9fJCNAdUjU8=
github.com/dapr/kit v0.0.3-0.20220930182601-272e358ba6a7 h1:XDb+PwAOxbVNvLxkmwPgKlH5ltYlDdz/GcEDMe8RJxE=
github.com/dapr/kit v0.0.3-0.20220930182601-272e358ba6a7/go.mod h1:FR+yc0R0szlKnJooVqJvl7FhWf21wzY4/EzmyFQrESw=
github.com/dave/jennifer v1.4.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg=
@@ -681,6 +681,8 @@ github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc=
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
+github.com/eclipse/paho.mqtt.golang v1.4.2-0.20221018190109-a1800d8df9a4 h1:yJj84YKRTY+zu/s9peWf0kuSq38zKT4KJUaFcJ1uRJM=
+github.com/eclipse/paho.mqtt.golang v1.4.2-0.20221018190109-a1800d8df9a4/go.mod h1:JGt0RsEwEX+Xa/agj90YJ9d9DH2b7upDZMK9HRbFvCA=
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc=
github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
@@ -1768,8 +1770,6 @@ github.com/shirou/gopsutil v3.20.11+incompatible h1:LJr4ZQK4mPpIV5gOa4jCOKOGb4ty
github.com/shirou/gopsutil v3.20.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
github.com/shirou/gopsutil/v3 v3.21.6 h1:vU7jrp1Ic/2sHB7w6UNs7MIkn7ebVtTb5D9j45o9VYE=
github.com/shirou/gopsutil/v3 v3.21.6/go.mod h1:JfVbDpIBLVzT8oKbvMg9P3wEIMDDpVn+LwHTKj0ST88=
-github.com/shivamkm07/paho.mqtt.golang v1.3.6-0.20220106130409-e28a1db639f8 h1:BXKXQzeHuVnSrHAKjvq9ICrgPC27tJ/hXWLMQo36c5s=
-github.com/shivamkm07/paho.mqtt.golang v1.3.6-0.20220106130409-e28a1db639f8/go.mod h1:JGt0RsEwEX+Xa/agj90YJ9d9DH2b7upDZMK9HRbFvCA=
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
diff --git a/pkg/actors/internal/placement.go b/pkg/actors/internal/placement.go
index 0e09e02bbd5..91a4b1fd4e6 100644
--- a/pkg/actors/internal/placement.go
+++ b/pkg/actors/internal/placement.go
@@ -306,12 +306,10 @@ func (p *ActorPlacement) closeStream() {
if p.clientStream != nil {
p.clientStream.CloseSend()
- p.clientStream = nil
}
if p.clientConn != nil {
p.clientConn.Close()
- p.clientConn = nil
}
}()
diff --git a/pkg/actors/internal/placement_test.go b/pkg/actors/internal/placement_test.go
index 211dd69e834..4be976d68cb 100644
--- a/pkg/actors/internal/placement_test.go
+++ b/pkg/actors/internal/placement_test.go
@@ -14,6 +14,7 @@ limitations under the License.
package internal
import (
+ "errors"
"fmt"
"io"
"net"
@@ -142,6 +143,106 @@ func TestAppHealthyStatus(t *testing.T) {
cleanup()
}
+type fakeStream struct {
+ //nolint:nosnakecase
+ placementv1pb.Placement_ReportDaprStatusClient
+ send func(host *placementv1pb.Host) error
+ recv func() (*placementv1pb.PlacementOrder, error)
+ closeSendCalled atomic.Int64
+}
+
+func (f *fakeStream) Send(host *placementv1pb.Host) error {
+ return f.send(host)
+}
+
+func (f *fakeStream) Recv() (*placementv1pb.PlacementOrder, error) {
+ return f.recv()
+}
+
+func (f *fakeStream) CloseSend() error {
+ f.closeSendCalled.Add(1)
+ return nil
+}
+
+func TestCloseOnRecv(t *testing.T) {
+ t.Run("should not panic", func(t *testing.T) {
+ address, testSrv, cleanup := newTestServer()
+
+ // set leader
+ testSrv.setLeader(true)
+
+ appHealth := atomic.Bool{}
+ appHealth.Store(true)
+
+ appHealthFunc := appHealth.Load
+ noopTableUpdateFunc := func() {}
+ testPlacement := NewActorPlacement(
+ []string{address}, nil, "testAppID", "127.0.0.1:1000", []string{"actorOne", "actorTwo"},
+ appHealthFunc, noopTableUpdateFunc)
+
+ // act
+ testPlacement.Start()
+
+ assert.NotNil(t, testPlacement.clientStream)
+
+ var called int
+ recvGroup := sync.WaitGroup{}
+ recvGroup.Add(1)
+
+ closeGroup := sync.WaitGroup{}
+ closeGroup.Add(1)
+
+ testPlacement.clientLock.Lock()
+ fs := &fakeStream{
+ recv: func() (*placementv1pb.PlacementOrder, error) {
+ defer func() {
+ called++
+ }()
+ if called == 0 { // first call should close stream and wait
+ recvGroup.Done()
+ closeGroup.Wait()
+ return &placementv1pb.PlacementOrder{
+ Operation: unlockOperation,
+ }, nil
+ }
+
+ if called == 1 { // force reconnect
+ return nil, errors.New("force reconnect")
+ }
+
+ return &placementv1pb.PlacementOrder{
+ Operation: unlockOperation,
+ }, nil
+ },
+ send: func(host *placementv1pb.Host) error {
+ return nil
+ },
+ }
+ testPlacement.clientStream = fs
+ testPlacement.clientLock.Unlock()
+
+ go func() {
+ recvGroup.Wait()
+ testPlacement.closeStream()
+ closeGroup.Done()
+ }()
+ // should not panic
+ closeGroup.Wait()
+ testPlacement.streamConnectedCond.L.Lock()
+ for !testPlacement.streamConnAlive {
+ testPlacement.streamConnectedCond.Wait()
+ }
+ testPlacement.streamConnectedCond.L.Unlock()
+
+ assert.Equal(t, called, 2)
+ assert.GreaterOrEqual(t, fs.closeSendCalled.Load(), int64(2))
+ assert.NotEqual(t, testPlacement.clientStream, fs)
+ // clean up
+ testPlacement.Stop()
+ cleanup()
+ })
+}
+
func TestOnPlacementOrder(t *testing.T) {
tableUpdateCount := 0
appHealthFunc := func() bool { return true }
diff --git a/pkg/http/api.go b/pkg/http/api.go
index 8f2a9baa5de..37314198433 100644
--- a/pkg/http/api.go
+++ b/pkg/http/api.go
@@ -408,7 +408,7 @@ func (a *api) constructHealthzEndpoints() []Endpoint {
return []Endpoint{
{
Methods: []string{fasthttp.MethodGet},
- Route: "healthz",
+ Route: "healthz/{appId:*}",
Version: apiVersionV1,
Handler: a.onGetHealthz,
},
@@ -1357,6 +1357,7 @@ func (a *api) getStateStoreName(reqCtx *fasthttp.RequestCtx) string {
}
func (a *api) onDirectMessage(reqCtx *fasthttp.RequestCtx) {
+ log.Infof("Received direct message: %s, startAt: %d", reqCtx.RequestURI(), time.Now().UnixMilli())
targetID := a.findTargetID(reqCtx)
if targetID == "" {
msg := NewErrorResponse("ERR_DIRECT_INVOKE", messages.ErrDirectInvokeNoAppID)
@@ -2020,7 +2021,13 @@ func (a *api) onGetHealthz(reqCtx *fasthttp.RequestCtx) {
respond(reqCtx, withError(fasthttp.StatusInternalServerError, msg))
log.Debug(msg)
} else {
- respond(reqCtx, withEmpty())
+ matchAppId := reqCtx.UserValue("appId").(string)
+ if matchAppId != "" && matchAppId != a.id {
+ msg := NewErrorResponse("ERR_HEALTH_APPID_NOT_MATCH", messages.ErrHealthAppIdNotMatch)
+ respond(reqCtx, withError(fasthttp.StatusInternalServerError, msg))
+ } else {
+ respond(reqCtx, withEmpty())
+ }
}
}
diff --git a/pkg/messages/api_errors.go b/pkg/messages/api_errors.go
index cc5a2f87026..a8cc603096b 100644
--- a/pkg/messages/api_errors.go
+++ b/pkg/messages/api_errors.go
@@ -70,7 +70,8 @@ const (
ErrMetadataGet = "failed deserializing metadata: %s"
// Healthz.
- ErrHealthNotReady = "dapr is not ready"
+ ErrHealthNotReady = "dapr is not ready"
+ ErrHealthAppIdNotMatch = "dapr appId is not match"
// Configuration.
ErrConfigurationStoresNotConfigured = "error configuration stores not configured"
diff --git a/pkg/messaging/direct_messaging.go b/pkg/messaging/direct_messaging.go
index bc202aa1802..53dd740d193 100644
--- a/pkg/messaging/direct_messaging.go
+++ b/pkg/messaging/direct_messaging.go
@@ -129,7 +129,10 @@ func (d *directMessaging) Invoke(ctx context.Context, targetAppID string, req *i
}
if app.id == d.appID && app.namespace == d.namespace {
- return d.invokeLocal(ctx, req)
+ log.Infof("invoke local app: %s.%s startAt: %d", app.id, app.namespace, time.Now().UnixMilli())
+ result, err := d.invokeLocal(ctx, req)
+ log.Infof("invoke local app: %s.%s endAt: %d", app.id, app.namespace, time.Now().UnixMilli())
+ return result, err
}
return d.invokeWithRetry(ctx, retry.DefaultLinearRetryCount, retry.DefaultLinearBackoffInterval, app, d.invokeRemote, req)
}
diff --git a/pkg/runtime/runtime.go b/pkg/runtime/runtime.go
index 08d31984591..c83ca3a9a54 100644
--- a/pkg/runtime/runtime.go
+++ b/pkg/runtime/runtime.go
@@ -2459,11 +2459,6 @@ func (a *DaprRuntime) processComponentSecrets(component componentsV1alpha1.Compo
}
secretStoreName := a.authSecretStoreOrDefault(component)
- secretStore := a.getSecretStore(secretStoreName)
- if secretStore == nil {
- log.Warnf("component %s references a secret store that isn't loaded: %s", component.Name, secretStoreName)
- return component, secretStoreName
- }
// If running in Kubernetes, do not fetch secrets from the Kubernetes secret store as they will be populated by the operator.
// Instead, base64 decode the secret values into their real self.
@@ -2491,6 +2486,12 @@ func (a *DaprRuntime) processComponentSecrets(component componentsV1alpha1.Compo
continue
}
+ secretStore := a.getSecretStore(secretStoreName)
+ if secretStore == nil {
+ log.Warnf("component %s references a secret store that isn't loaded: %s", component.Name, secretStoreName)
+ return component, secretStoreName
+ }
+
resp, ok := cache[m.SecretKeyRef.Name]
if !ok {
// TODO: cascade context.
diff --git a/tests/apps/pluggable_kafka-bindings/go.mod b/tests/apps/pluggable_kafka-bindings/go.mod
index aa31c5eeefe..c8883c159da 100644
--- a/tests/apps/pluggable_kafka-bindings/go.mod
+++ b/tests/apps/pluggable_kafka-bindings/go.mod
@@ -6,7 +6,7 @@ replace github.com/dapr/dapr => ../../../
require (
github.com/dapr-sandbox/components-go-sdk v0.0.0-20220928114348-32097c6273eb
- github.com/dapr/components-contrib v1.9.1
+ github.com/dapr/components-contrib v1.9.6
github.com/dapr/kit v0.0.3-0.20220930182601-272e358ba6a7
)
diff --git a/tests/apps/pluggable_kafka-bindings/go.sum b/tests/apps/pluggable_kafka-bindings/go.sum
index eb0c58ecc58..5ce705b9443 100644
--- a/tests/apps/pluggable_kafka-bindings/go.sum
+++ b/tests/apps/pluggable_kafka-bindings/go.sum
@@ -56,8 +56,8 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/dapr-sandbox/components-go-sdk v0.0.0-20220928114348-32097c6273eb h1:N35TA4ra10ZTCk66IiP2jCUcH8HKnN78MGyuO/64Gn0=
github.com/dapr-sandbox/components-go-sdk v0.0.0-20220928114348-32097c6273eb/go.mod h1:ybLpIBlVHbHt17ovO+19PyC4iIHGbuSstX1XPvHRYLo=
-github.com/dapr/components-contrib v1.9.1 h1:g2TpEwvnB4s5Lvf89QXzAlj3xaWGaxTZIhTY4LpIfYI=
-github.com/dapr/components-contrib v1.9.1/go.mod h1:ftVthBjl0e5G61J5XKkZKEjU/TGE0gNT9fJCNAdUjU8=
+github.com/dapr/components-contrib v1.9.6 h1:C12fnZhNim8AsOzTCsWZDZ0MXqsaG161fStVuVAQgN4=
+github.com/dapr/components-contrib v1.9.6/go.mod h1:U0cjxEEbZR7sNN9i1ZdWnkIOZP8iRSvoyF2gRhBaHfc=
github.com/dapr/kit v0.0.3-0.20220930182601-272e358ba6a7 h1:XDb+PwAOxbVNvLxkmwPgKlH5ltYlDdz/GcEDMe8RJxE=
github.com/dapr/kit v0.0.3-0.20220930182601-272e358ba6a7/go.mod h1:FR+yc0R0szlKnJooVqJvl7FhWf21wzY4/EzmyFQrESw=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
diff --git a/tests/apps/pluggable_redis-pubsub/go.mod b/tests/apps/pluggable_redis-pubsub/go.mod
index 12f83c70227..18d5597043f 100644
--- a/tests/apps/pluggable_redis-pubsub/go.mod
+++ b/tests/apps/pluggable_redis-pubsub/go.mod
@@ -6,7 +6,7 @@ replace github.com/dapr/dapr => ../../../
require (
github.com/dapr-sandbox/components-go-sdk v0.0.0-20220928114348-32097c6273eb
- github.com/dapr/components-contrib v1.9.1
+ github.com/dapr/components-contrib v1.9.6
github.com/dapr/kit v0.0.3-0.20220930182601-272e358ba6a7
)
diff --git a/tests/apps/pluggable_redis-pubsub/go.sum b/tests/apps/pluggable_redis-pubsub/go.sum
index a74aa1a075e..ea23069e8c4 100644
--- a/tests/apps/pluggable_redis-pubsub/go.sum
+++ b/tests/apps/pluggable_redis-pubsub/go.sum
@@ -15,8 +15,8 @@ github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWH
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/dapr-sandbox/components-go-sdk v0.0.0-20220928114348-32097c6273eb h1:N35TA4ra10ZTCk66IiP2jCUcH8HKnN78MGyuO/64Gn0=
github.com/dapr-sandbox/components-go-sdk v0.0.0-20220928114348-32097c6273eb/go.mod h1:ybLpIBlVHbHt17ovO+19PyC4iIHGbuSstX1XPvHRYLo=
-github.com/dapr/components-contrib v1.9.1 h1:g2TpEwvnB4s5Lvf89QXzAlj3xaWGaxTZIhTY4LpIfYI=
-github.com/dapr/components-contrib v1.9.1/go.mod h1:ftVthBjl0e5G61J5XKkZKEjU/TGE0gNT9fJCNAdUjU8=
+github.com/dapr/components-contrib v1.9.6 h1:C12fnZhNim8AsOzTCsWZDZ0MXqsaG161fStVuVAQgN4=
+github.com/dapr/components-contrib v1.9.6/go.mod h1:U0cjxEEbZR7sNN9i1ZdWnkIOZP8iRSvoyF2gRhBaHfc=
github.com/dapr/kit v0.0.3-0.20220930182601-272e358ba6a7 h1:XDb+PwAOxbVNvLxkmwPgKlH5ltYlDdz/GcEDMe8RJxE=
github.com/dapr/kit v0.0.3-0.20220930182601-272e358ba6a7/go.mod h1:FR+yc0R0szlKnJooVqJvl7FhWf21wzY4/EzmyFQrESw=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
diff --git a/tests/apps/pluggable_redis-statestore/go.mod b/tests/apps/pluggable_redis-statestore/go.mod
index cbaf3f73f43..0729500f4a6 100644
--- a/tests/apps/pluggable_redis-statestore/go.mod
+++ b/tests/apps/pluggable_redis-statestore/go.mod
@@ -6,7 +6,7 @@ replace github.com/dapr/dapr => ../../../
require (
github.com/dapr-sandbox/components-go-sdk v0.0.0-20220928114348-32097c6273eb
- github.com/dapr/components-contrib v1.9.1
+ github.com/dapr/components-contrib v1.9.6
github.com/dapr/kit v0.0.3-0.20220930182601-272e358ba6a7
)
diff --git a/tests/apps/pluggable_redis-statestore/go.sum b/tests/apps/pluggable_redis-statestore/go.sum
index 87920c78dcb..5b0661a1091 100644
--- a/tests/apps/pluggable_redis-statestore/go.sum
+++ b/tests/apps/pluggable_redis-statestore/go.sum
@@ -19,8 +19,8 @@ github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWH
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/dapr-sandbox/components-go-sdk v0.0.0-20220928114348-32097c6273eb h1:N35TA4ra10ZTCk66IiP2jCUcH8HKnN78MGyuO/64Gn0=
github.com/dapr-sandbox/components-go-sdk v0.0.0-20220928114348-32097c6273eb/go.mod h1:ybLpIBlVHbHt17ovO+19PyC4iIHGbuSstX1XPvHRYLo=
-github.com/dapr/components-contrib v1.9.1 h1:g2TpEwvnB4s5Lvf89QXzAlj3xaWGaxTZIhTY4LpIfYI=
-github.com/dapr/components-contrib v1.9.1/go.mod h1:ftVthBjl0e5G61J5XKkZKEjU/TGE0gNT9fJCNAdUjU8=
+github.com/dapr/components-contrib v1.9.6 h1:C12fnZhNim8AsOzTCsWZDZ0MXqsaG161fStVuVAQgN4=
+github.com/dapr/components-contrib v1.9.6/go.mod h1:U0cjxEEbZR7sNN9i1ZdWnkIOZP8iRSvoyF2gRhBaHfc=
github.com/dapr/kit v0.0.3-0.20220930182601-272e358ba6a7 h1:XDb+PwAOxbVNvLxkmwPgKlH5ltYlDdz/GcEDMe8RJxE=
github.com/dapr/kit v0.0.3-0.20220930182601-272e358ba6a7/go.mod h1:FR+yc0R0szlKnJooVqJvl7FhWf21wzY4/EzmyFQrESw=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
diff --git a/trigger-build.txt b/trigger-build.txt
new file mode 100644
index 00000000000..5f5fbe759f1
--- /dev/null
+++ b/trigger-build.txt
@@ -0,0 +1,3 @@
+1
+2
+3
\ No newline at end of file