Skip to content

Commit 7a0c355

Browse files
committed
Merge branch '586-clone-snapshotting' into 'dle-4-0'
feat: reorganizing clone datasets (#586) See merge request postgres-ai/database-lab!977
2 parents d71103d + 59eaefe commit 7a0c355

File tree

109 files changed

+4844
-1186
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

109 files changed

+4844
-1186
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ Try it yourself right now:
6363
- Visit [Postgres.ai Console](https://console.postgres.ai/), set up your first organization and provision a DBLab Standard Edition (DBLab SE) to any cloud or on-prem
6464
- [Pricing](https://postgres.ai/pricing) (starting at $62/month)
6565
- [Doc: How to install DBLab SE](https://postgres.ai/docs/how-to-guides/administration/install-dle-from-postgres-ai)
66-
- Demo: https://demo.aws.postgres.ai (use the token `demo-token` to access)
66+
- Demo: https://demo.dblab.dev (use the token `demo-token` to access)
6767
- Looking for a free version? Install DBLab Community Edition by [following this tutorial](https://postgres.ai/docs/tutorials/database-lab-tutorial)
6868

6969
## How it works
@@ -200,7 +200,7 @@ Reach out to the Postgres.ai team if you want a trial or commercial license that
200200

201201
Many thanks to our amazing contributors!
202202

203-
<a href = "https://github.com/postgresml/pgcat/graphs/contributors">
203+
<a href = "https://github.com/postgres-ai/database-lab/graphs/contributors">
204204
<img src = "https://contrib.rocks/image?repo=postgres-ai/database-lab"/>
205205
</a>
206206

engine/.gitlab-ci.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,8 @@ build-image-swagger-release:
420420
artifacts:
421421
paths:
422422
- engine/bin
423+
before_script:
424+
- bash engine/test/_cleanup.sh
423425
script:
424426
- bash engine/test/1.synthetic.sh
425427
- bash engine/test/2.logical_generic.sh
@@ -482,7 +484,7 @@ integration-test:
482484
stage: integration-test
483485
variables:
484486
# Instruct Testcontainers to use the daemon of DinD.
485-
DOCKER_HOST: "tcp://docker:2375"
487+
# DOCKER_HOST: "tcp://docker:2375"
486488
# Instruct Docker not to start over TLS.
487489
DOCKER_TLS_CERTDIR: ""
488490
# Improve performance with overlayfs.

engine/api/swagger-spec/dblab_openapi.yaml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,11 @@ paths:
186186
required: true
187187
schema:
188188
type: string
189+
- name: branch
190+
in: query
191+
required: false
192+
schema:
193+
type: string
189194
responses:
190195
200:
191196
description: Returned a list of snapshots
@@ -1800,4 +1805,4 @@ components:
18001805
type: string
18011806
format: date-time
18021807
message:
1803-
type: string
1808+
type: string

engine/api/swagger-spec/dblab_server_swagger.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ externalDocs:
2121
url: https://gitlab.com/postgres-ai/docs/tree/master/docs/database-lab
2222

2323
servers:
24-
- url: "https://demo.aws.postgres.ai/api"
25-
description: "DBLab 3.x demo server; token: 'demo-token'"
24+
- url: "https://demo.dblab.dev/api"
25+
description: "DBLab demo server; token: 'demo-token'"
2626
x-examples:
2727
Verification-Token: "demo-token"
2828
- url: "{scheme}://{host}:{port}/{basePath}"

engine/internal/cloning/base.go

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,10 @@ func (c *Base) CreateClone(cloneRequest *types.CloneCreateRequest) (*models.Clon
171171
}
172172
}
173173

174+
if cloneRequest.Branch == "" {
175+
cloneRequest.Branch = snapshot.Branch
176+
}
177+
174178
clone := &models.Clone{
175179
ID: cloneRequest.ID,
176180
Snapshot: snapshot,
@@ -386,7 +390,7 @@ func (c *Base) refreshCloneMetadata(w *CloneWrapper) {
386390
return
387391
}
388392

389-
sessionState, err := c.provision.GetSessionState(w.Session, w.Clone.ID)
393+
sessionState, err := c.provision.GetSessionState(w.Session, w.Clone.Branch, w.Clone.ID)
390394
if err != nil {
391395
// Session not ready yet.
392396
log.Err(fmt.Errorf("failed to get a session state: %w", err))
@@ -482,6 +486,18 @@ func (c *Base) ResetClone(cloneID string, resetOptions types.ResetCloneRequest)
482486
return errors.Wrap(err, "failed to update clone status")
483487
}
484488

489+
if c.hasDependentSnapshots(w) {
490+
log.Warn("clone has dependent snapshots", cloneID)
491+
c.cloneMutex.Lock()
492+
w.Clone.Revision++
493+
w.Clone.HasDependent = true
494+
c.cloneMutex.Unlock()
495+
} else {
496+
c.cloneMutex.Lock()
497+
w.Clone.HasDependent = false
498+
c.cloneMutex.Unlock()
499+
}
500+
485501
go func() {
486502
var originalSnapshotID string
487503

@@ -719,9 +735,9 @@ func (c *Base) isIdleClone(wrapper *CloneWrapper) (bool, error) {
719735
return false, errors.New("failed to get clone session")
720736
}
721737

722-
if _, err := c.provision.LastSessionActivity(session, wrapper.Clone.ID, minimumTime); err != nil {
738+
if _, err := c.provision.LastSessionActivity(session, wrapper.Clone.Branch, wrapper.Clone.ID, minimumTime); err != nil {
723739
if err == pglog.ErrNotFound {
724-
log.Dbg(fmt.Sprintf("Not found recent activity for the session: %q. Clone name: %q",
740+
log.Dbg(fmt.Sprintf("Not found recent activity for session: %q. Clone name: %q",
725741
session.ID, wrapper.Clone.ID))
726742

727743
return hasNotQueryActivity(session)

engine/internal/cloning/snapshots.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313

1414
"gitlab.com/postgres-ai/database-lab/v3/pkg/log"
1515
"gitlab.com/postgres-ai/database-lab/v3/pkg/models"
16-
"gitlab.com/postgres-ai/database-lab/v3/pkg/util"
16+
"gitlab.com/postgres-ai/database-lab/v3/pkg/util/branching"
1717
)
1818

1919
// SnapshotBox contains instance snapshots.
@@ -206,7 +206,7 @@ func (c *Base) hasDependentSnapshots(w *CloneWrapper) bool {
206206
c.snapshotBox.snapshotMutex.RLock()
207207
defer c.snapshotBox.snapshotMutex.RUnlock()
208208

209-
poolName := util.GetPoolName(w.Clone.Snapshot.Pool, w.Clone.ID)
209+
poolName := branching.CloneName(w.Clone.Snapshot.Pool, w.Clone.Branch, w.Clone.ID, w.Clone.Revision)
210210

211211
for name := range c.snapshotBox.items {
212212
if strings.HasPrefix(name, poolName) {

engine/internal/observer/observer.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ func NewObserver(dockerClient *client.Client, cfg *Config, pm *pool.Manager) *Ob
8080
// GetCloneLog gets clone logs.
8181
// TODO (akartasov): Split log to chunks.
8282
func (o *Observer) GetCloneLog(ctx context.Context, obsClone *ObservingClone) ([]byte, error) {
83-
fileSelector := pglog.NewSelector(obsClone.pool.ClonePath(obsClone.cloneID))
83+
fileSelector := pglog.NewSelector(obsClone.pool.ClonePath(obsClone.branch, obsClone.cloneID))
8484
fileSelector.SetMinimumTime(obsClone.session.StartedAt)
8585

8686
if err := fileSelector.DiscoverLogDir(); err != nil {
@@ -187,11 +187,12 @@ func (o *Observer) maskLogs(entry []string, maskedFieldIndexes []int) {
187187
}
188188

189189
// AddObservingClone adds a new observing session to storage.
190-
func (o *Observer) AddObservingClone(cloneID string, port uint, session *ObservingClone) {
190+
func (o *Observer) AddObservingClone(cloneID, branch string, port uint, session *ObservingClone) {
191191
o.sessionMu.Lock()
192192
defer o.sessionMu.Unlock()
193193
session.pool = o.pm.First().Pool()
194194
session.cloneID = cloneID
195+
session.branch = branch
195196
session.port = port
196197

197198
o.storage[cloneID] = session

engine/internal/observer/observing_clone.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ var maskedFields = map[string]struct{}{
4343
type ObservingClone struct {
4444
pool *resources.Pool
4545
cloneID string
46+
branch string
4647
port uint
4748
superUserDB *pgx.Conn
4849

@@ -479,7 +480,7 @@ func (c *ObservingClone) currentArtifactsSessionPath() string {
479480
}
480481

481482
func (c *ObservingClone) artifactsSessionPath(sessionID uint64) string {
482-
return path.Join(c.pool.ObserverDir(c.cloneID), c.cloneID, strconv.FormatUint(sessionID, 10))
483+
return path.Join(c.pool.ObserverDir(c.branch, c.cloneID), c.cloneID, strconv.FormatUint(sessionID, 10))
483484
}
484485

485486
// CheckPerformanceRequirements checks monitoring data and returns an error if any of performance requires was not satisfied.

engine/internal/provision/databases/postgres/postgres.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ func Start(r runners.Runner, c *resources.AppConfig) error {
9999

100100
_, err = pgctlPromote(r, c)
101101
if err != nil {
102-
if runnerError := Stop(r, c.Pool, c.CloneName); runnerError != nil {
102+
if runnerError := Stop(r, c.Pool, c.CloneName, strconv.FormatUint(uint64(c.Port), 10)); runnerError != nil {
103103
log.Err(runnerError)
104104
}
105105

@@ -115,7 +115,7 @@ func Start(r runners.Runner, c *resources.AppConfig) error {
115115
if cnt > waitPostgresTimeout {
116116
collectDiagnostics(c)
117117

118-
if runnerErr := Stop(r, c.Pool, c.CloneName); runnerErr != nil {
118+
if runnerErr := Stop(r, c.Pool, c.CloneName, strconv.FormatUint(uint64(c.Port), 10)); runnerErr != nil {
119119
log.Err(runnerErr)
120120
}
121121

@@ -138,7 +138,7 @@ func collectDiagnostics(c *resources.AppConfig) {
138138
}
139139

140140
// Stop stops Postgres instance.
141-
func Stop(r runners.Runner, p *resources.Pool, name string) error {
141+
func Stop(r runners.Runner, p *resources.Pool, name, port string) error {
142142
log.Dbg("Stopping Postgres container...")
143143

144144
if _, err := docker.RemoveContainer(r, name); err != nil {
@@ -151,8 +151,8 @@ func Stop(r runners.Runner, p *resources.Pool, name string) error {
151151
log.Msg("docker container was not found, ignore", err)
152152
}
153153

154-
if _, err := r.Run("rm -rf " + p.SocketCloneDir(name) + "/*"); err != nil {
155-
return errors.Wrap(err, "failed to clean unix socket directory")
154+
if _, err := r.Run("rm -rf " + p.SocketCloneDir(name) + "/.*" + port); err != nil {
155+
return errors.Wrap(err, "failed to clean Unix socket directory")
156156
}
157157

158158
return nil

engine/internal/provision/databases/postgres/postgres_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ func TestRemoveContainers(t *testing.T) {
6767
})).
6868
Return("", nil)
6969

70-
err := Stop(runner, p, "test_clone")
70+
err := Stop(runner, p, "test_clone", "6200")
7171

7272
assert.Equal(t, tc.err, errors.Cause(err))
7373
}

0 commit comments

Comments
 (0)