@@ -8,6 +8,7 @@ package backup
88import (
99 "context"
1010 "fmt"
11+ "math/rand"
1112 "reflect"
1213 "strings"
1314 "testing"
@@ -26,11 +27,27 @@ import (
2627 "github.com/cockroachdb/cockroach/pkg/testutils/sqlutils"
2728 "github.com/cockroachdb/cockroach/pkg/util/leaktest"
2829 "github.com/cockroachdb/cockroach/pkg/util/log"
30+ "github.com/cockroachdb/cockroach/pkg/util/randutil"
2931 "github.com/cockroachdb/cockroach/pkg/util/stop"
3032 "github.com/kr/pretty"
3133 "github.com/stretchr/testify/require"
3234)
3335
36+ var orParams = base.TestClusterArgs {
37+ // Online restore is not supported in a secondary tenant yet.
38+ ServerArgs : base.TestServerArgs {
39+ DefaultTestTenant : base .TestIsSpecificToStorageLayerAndNeedsASystemTenant ,
40+ },
41+ }
42+
43+ func onlineImpl (rng * rand.Rand ) string {
44+ opt := "EXPERIMENTAL DEFERRED COPY"
45+ if rng .Intn (2 ) == 0 {
46+ opt = "EXPERIMENTAL COPY"
47+ }
48+ return opt
49+ }
50+
3451func TestOnlineRestoreBasic (t * testing.T ) {
3552 defer leaktest .AfterTest (t )()
3653 defer log .Scope (t ).Close (t )
@@ -40,16 +57,11 @@ func TestOnlineRestoreBasic(t *testing.T) {
4057 ctx := context .Background ()
4158
4259 const numAccounts = 1000
43- params := base.TestClusterArgs {
44- // Online restore is not supported in a secondary tenant yet.
45- ServerArgs : base.TestServerArgs {
46- DefaultTestTenant : base .TestIsSpecificToStorageLayerAndNeedsASystemTenant ,
47- },
48- }
49- tc , sqlDB , dir , cleanupFn := backupRestoreTestSetupWithParams (t , singleNode , numAccounts , InitManualReplication , params )
60+
61+ tc , sqlDB , dir , cleanupFn := backupRestoreTestSetupWithParams (t , singleNode , numAccounts , InitManualReplication , orParams )
5062 defer cleanupFn ()
5163
52- rtc , rSQLDB , cleanupFnRestored := backupRestoreTestSetupEmpty (t , 1 , dir , InitManualReplication , params )
64+ rtc , rSQLDB , cleanupFnRestored := backupRestoreTestSetupEmpty (t , 1 , dir , InitManualReplication , orParams )
5365 defer cleanupFnRestored ()
5466
5567 externalStorage := "nodelocal://1/backup"
@@ -118,6 +130,36 @@ func TestOnlineRestorePartitioned(t *testing.T) {
118130 sqlDB .Exec (t , fmt .Sprintf (`SHOW JOB WHEN COMPLETE %s` , j [0 ][4 ]))
119131}
120132
133+ func TestOnlineRestoreLinkCheckpoint (t * testing.T ) {
134+ defer leaktest .AfterTest (t )()
135+ defer log .Scope (t ).Close (t )
136+ defer nodelocal .ReplaceNodeLocalForTesting (t .TempDir ())()
137+
138+ rng , _ := randutil .NewTestRand ()
139+
140+ const numAccounts = 10
141+ _ , sqlDB , _ , cleanupFn := backupRestoreTestSetupWithParams (
142+ t ,
143+ singleNode ,
144+ numAccounts ,
145+ InitManualReplication ,
146+ orParams ,
147+ )
148+ defer cleanupFn ()
149+ sqlDB .Exec (t , "BACKUP DATABASE data INTO $1" , localFoo )
150+ sqlDB .Exec (t , "SET CLUSTER SETTING jobs.debug.pausepoints = 'restore.before_publishing_descriptors'" )
151+ var jobID jobspb.JobID
152+ stmt := fmt .Sprintf ("RESTORE DATABASE data FROM LATEST IN $1 WITH OPTIONS (new_db_name='data2', %s, detached)" , onlineImpl (rng ))
153+ sqlDB .QueryRow (t , stmt , localFoo ).Scan (& jobID )
154+ jobutils .WaitForJobToPause (t , sqlDB , jobID )
155+
156+ // Set a pauspoint during the link phase which should not get hit because of
157+ // checkpointing.
158+ sqlDB .Exec (t , "SET CLUSTER SETTING jobs.debug.pausepoints = 'restore.before_link'" )
159+ sqlDB .Exec (t , "RESUME JOB $1" , jobID )
160+ jobutils .WaitForJobToSucceed (t , sqlDB , jobID )
161+ }
162+
121163func TestOnlineRestoreStatementResult (t * testing.T ) {
122164 defer leaktest .AfterTest (t )()
123165 defer log .Scope (t ).Close (t )
0 commit comments