Skip to content

Commit 14fd74f

Browse files
author
Bogdan Tsechoev
committed
Merge branch '626-existing-snapshot' into 'dle-4-0'
fix: show error message on creating snapshot when data in the pool has not changed (#626) See merge request postgres-ai/database-lab!1033
2 parents 6f0fc48 + 8cac72a commit 14fd74f

File tree

8 files changed

+26
-14
lines changed

8 files changed

+26
-14
lines changed

engine/internal/retrieval/engine/postgres/snapshot/logical.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ func (s *LogicalInitial) Run(ctx context.Context) error {
161161
var existsError *thinclones.SnapshotExistsError
162162
if errors.As(err, &existsError) {
163163
log.Msg("Skip snapshotting: ", existsError.Error())
164-
return nil
164+
return err
165165
}
166166

167167
return errors.Wrap(err, "failed to create a snapshot")

engine/internal/retrieval/retrieval.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"gitlab.com/postgres-ai/database-lab/v3/internal/provision/pool"
2222
"gitlab.com/postgres-ai/database-lab/v3/internal/provision/resources"
2323
"gitlab.com/postgres-ai/database-lab/v3/internal/provision/runners"
24+
"gitlab.com/postgres-ai/database-lab/v3/internal/provision/thinclones"
2425
"gitlab.com/postgres-ai/database-lab/v3/internal/retrieval/components"
2526
"gitlab.com/postgres-ai/database-lab/v3/internal/retrieval/config"
2627
"gitlab.com/postgres-ai/database-lab/v3/internal/retrieval/dbmarker"
@@ -350,7 +351,9 @@ func (r *Retrieval) run(ctx context.Context, fsm pool.FSManager) (err error) {
350351
r.State.cleanAlerts()
351352
}
352353

353-
if err := r.SnapshotData(ctx, poolName); err != nil && err != errNoJobs {
354+
var existsErr *thinclones.SnapshotExistsError
355+
356+
if err := r.SnapshotData(ctx, poolName); err != nil && (err != errNoJobs || !errors.As(err, &existsErr)) {
354357
return err
355358
}
356359

@@ -455,7 +458,9 @@ func (r *Retrieval) SnapshotData(ctx context.Context, poolName string) error {
455458
defer func() {
456459
r.State.Status = models.Finished
457460

458-
if err != nil {
461+
var existsErr *thinclones.SnapshotExistsError
462+
463+
if err != nil && !errors.As(err, &existsErr) {
459464
r.State.Status = models.Failed
460465
r.State.addAlert(telemetry.Alert{
461466
Level: models.RefreshFailed,

engine/internal/srv/routes.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"fmt"
77
"net/http"
88
"os"
9+
"sort"
910
"strconv"
1011
"strings"
1112
"time"
@@ -172,6 +173,10 @@ func (s *Server) createSnapshot(w http.ResponseWriter, r *http.Request) {
172173
return
173174
}
174175

176+
sort.SliceStable(snapshotList, func(i, j int) bool {
177+
return snapshotList[i].CreatedAt.After(snapshotList[j].CreatedAt)
178+
})
179+
175180
if err := fsManager.InitBranching(); err != nil {
176181
api.SendBadRequestError(w, r, "Cannot verify branch metadata: "+err.Error())
177182
return

engine/test/1.synthetic.sh

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -164,12 +164,6 @@ if [[ $(dblab snapshot list | jq length) -eq 0 ]] ; then
164164
echo "No snapshot found" && exit 1
165165
fi
166166

167-
dblab snapshot create
168-
169-
if [[ $(dblab snapshot list | jq length) -eq 0 ]] ; then
170-
echo "Snapshot has not been created" && exit 1
171-
fi
172-
173167
## Create a clone
174168
CLONE_ID="testclone"
175169

engine/test/2.logical_generic.sh

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ set -euxo pipefail
44
TAG=${TAG:-${CI_COMMIT_REF_SLUG:-"master"}}
55
IMAGE2TEST="registry.gitlab.com/postgres-ai/database-lab/dblab-server:${TAG}"
66
DLE_SERVER_NAME="dblab_server_test"
7+
export EXTENDED_IMAGE_TAG="-minor-update" # -0.5.3
78

89
# Environment variables for replacement rules
910
export SOURCE_DBNAME="${SOURCE_DBNAME:-test}"
@@ -98,7 +99,7 @@ yq eval -i '
9899
.provision.portPool.to = env(DLE_PORT_POOL_TO) |
99100
.retrieval.spec.logicalDump.options.dumpLocation = env(DLE_TEST_MOUNT_DIR) + "/" + env(DLE_TEST_POOL_NAME) + "/dump" |
100101
.retrieval.spec.logicalRestore.options.dumpLocation = env(DLE_TEST_MOUNT_DIR) + "/" + env(DLE_TEST_POOL_NAME) + "/dump" |
101-
.databaseContainer.dockerImage = "registry.gitlab.com/postgres-ai/custom-images/extended-postgres:" + strenv(POSTGRES_VERSION)
102+
.databaseContainer.dockerImage = "registry.gitlab.com/postgres-ai/custom-images/extended-postgres:" + strenv(POSTGRES_VERSION) + env(EXTENDED_IMAGE_TAG)
102103
' "${configDir}/server.yml"
103104

104105
SHARED_PRELOAD_LIBRARIES="pg_stat_statements, auto_explain, pgaudit, logerrors, pg_stat_kcache"
@@ -176,7 +177,7 @@ PATCH_CONFIG_DATA=$(jq -n -c \
176177
--arg username "$SOURCE_USERNAME" \
177178
--arg password "$SOURCE_PASSWORD" \
178179
--arg spl "$SHARED_PRELOAD_LIBRARIES" \
179-
--arg dockerImage "registry.gitlab.com/postgres-ai/custom-images/extended-postgres:${POSTGRES_VERSION}" \
180+
--arg dockerImage "registry.gitlab.com/postgres-ai/custom-images/extended-postgres:${POSTGRES_VERSION}${EXTENDED_IMAGE_TAG}" \
180181
'{
181182
"global": {
182183
"debug": true
@@ -247,7 +248,7 @@ if [[ $(yq eval '.retrieval.spec.logicalDump.options.source.connection.dbname' $
247248
$(yq eval '.retrieval.spec.logicalDump.options.source.connection.username' ${configDir}/server.yml) != "$SOURCE_USERNAME" ||
248249
$(yq eval '.retrieval.spec.logicalDump.options.source.connection.password' ${configDir}/server.yml) != "$SOURCE_PASSWORD" ||
249250
$(yq eval '.retrieval.refresh.timetable' ${configDir}/server.yml) != "5 0 * * 1" ||
250-
$(yq eval '.databaseContainer.dockerImage' ${configDir}/server.yml) != "registry.gitlab.com/postgres-ai/custom-images/extended-postgres:${POSTGRES_VERSION}" ||
251+
$(yq eval '.databaseContainer.dockerImage' ${configDir}/server.yml) != "registry.gitlab.com/postgres-ai/custom-images/extended-postgres:${POSTGRES_VERSION}${EXTENDED_IMAGE_TAG}" ||
251252
$(yq eval '.databaseConfigs.configs.shared_buffers' ${configDir}/server.yml) != "256MB" ]] ; then
252253
echo "Configuration has not been updated properly"
253254
exit 1

engine/test/4.physical_basebackup.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ set -euxo pipefail
44
TAG=${TAG:-${CI_COMMIT_REF_SLUG:-"master"}}
55
IMAGE2TEST="registry.gitlab.com/postgres-ai/database-lab/dblab-server:${TAG}"
66
DLE_SERVER_NAME="dblab_server_test"
7+
export EXTENDED_IMAGE_TAG="-minor-update" # -0.5.3
78

89
# Environment variables for replacement rules
910
export SOURCE_HOST="${SOURCE_HOST:-172.17.0.1}"
@@ -110,7 +111,7 @@ yq eval -i '
110111
.poolManager.mountDir = env(DLE_TEST_MOUNT_DIR) |
111112
.provision.portPool.from = env(DLE_PORT_POOL_FROM) |
112113
.provision.portPool.to = env(DLE_PORT_POOL_TO) |
113-
.databaseContainer.dockerImage = "registry.gitlab.com/postgres-ai/custom-images/extended-postgres:" + strenv(POSTGRES_VERSION) |
114+
.databaseContainer.dockerImage = "registry.gitlab.com/postgres-ai/custom-images/extended-postgres:" + strenv(POSTGRES_VERSION) + env(EXTENDED_IMAGE_TAG) |
114115
.retrieval.spec.physicalRestore.options.envs.PGUSER = strenv(SOURCE_USERNAME) |
115116
.retrieval.spec.physicalRestore.options.envs.PGPASSWORD = strenv(SOURCE_PASSWORD) |
116117
.retrieval.spec.physicalRestore.options.envs.PGHOST = strenv(SOURCE_HOST) |

engine/test/5.logical_rds.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ set -euxo pipefail
44
TAG="${TAG:-"master"}"
55
IMAGE2TEST="registry.gitlab.com/postgres-ai/database-lab/dblab-server:${TAG}"
66
DLE_SERVER_NAME="dblab_server_test"
7+
export EXTENDED_IMAGE_TAG="-minor-update" # -0.5.3
78

89
# Environment variables for replacement rules
910
export DLE_TEST_MOUNT_DIR="/var/lib/test/dblab_mount"
@@ -48,7 +49,7 @@ yq eval -i '
4849
.poolManager.mountDir = env(DLE_TEST_MOUNT_DIR) |
4950
.provision.portPool.from = env(DLE_PORT_POOL_FROM) |
5051
.provision.portPool.to = env(DLE_PORT_POOL_TO) |
51-
.databaseContainer.dockerImage = "registry.gitlab.com/postgres-ai/custom-images/extended-postgres:" + strenv(POSTGRES_VERSION) |
52+
.databaseContainer.dockerImage = "registry.gitlab.com/postgres-ai/custom-images/extended-postgres:" + strenv(POSTGRES_VERSION) + env(EXTENDED_IMAGE_TAG) |
5253
.retrieval.spec.logicalDump.options.dumpLocation = env(DLE_TEST_MOUNT_DIR) + "/" + env(DLE_TEST_POOL_NAME) + "/dump" |
5354
.retrieval.spec.logicalDump.options.source.connection.dbname = strenv(SOURCE_DBNAME) |
5455
.retrieval.spec.logicalDump.options.source.connection.username = strenv(SOURCE_USERNAME) |

engine/test/_cleanup.sh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ set -euxo pipefail
33

44
DLE_TEST_MOUNT_DIR="/var/lib/test/dblab_mount"
55
DLE_TEST_POOL_NAME="test_dblab_pool"
6+
TMP_DATA_DIR="/tmp/dle_test/logical_generic"
67
ZFS_FILE="$(pwd)/zfs_file"
78

89
# Stop and remove test Docker containers
@@ -46,3 +47,7 @@ sudo rm -f "${ZFS_FILE}" \
4647
# Remove CLI configuration
4748
dblab config remove test \
4849
|| echo "Removing CLI configuration finished with errors but it is OK to ignore them."
50+
51+
# Clean up tmp source database
52+
sudo rm -rf ${TMP_DATA_DIR}/postgresql/* \
53+
|| echo "Cleaning up tmp source directory finished with errors but it is OK to ignore them."

0 commit comments

Comments
 (0)