@@ -2169,6 +2169,49 @@ func TestImportIntoCSVCancel(t *testing.T) {
21692169 sqlDB .Exec (t , fmt .Sprintf ("CANCEL JOB %d" , jobID ))
21702170 sqlDB .Exec (t , fmt .Sprintf ("SHOW JOB WHEN COMPLETE %d" , jobID ))
21712171 sqlDB .CheckQueryResults (t , "SELECT count(*) FROM t" , [][]string {{"0" }})
2172+
2173+ // Verify TablePublished is set after cleanup.
2174+ job , err := tc .ApplicationLayer (0 ).JobRegistry ().(* jobs.Registry ).LoadJob (ctx , jobspb .JobID (jobID ))
2175+ require .NoError (t , err )
2176+ payload := job .Payload ()
2177+ importDetails := payload .GetImport ()
2178+ require .True (t , importDetails .TablePublished , "expected TablePublished to be true after cleanup" )
2179+ }
2180+
2181+ func TestImportCancelAfterSuccess (t * testing.T ) {
2182+ defer leaktest .AfterTest (t )()
2183+ defer log .Scope (t ).Close (t )
2184+
2185+ // This is a regression test for #159603. If the cancel logic ran after the
2186+ // descriptor was marked as offline, we could end up deleting live data.
2187+
2188+ ctx := context .Background ()
2189+ baseDir := datapathutils .TestDataPath (t , "csv" )
2190+ tc := serverutils .StartCluster (t , 1 , base.TestClusterArgs {ServerArgs : base.TestServerArgs {
2191+ Knobs : base.TestingKnobs {
2192+ JobsTestingKnobs : jobs .NewTestingKnobsWithShortIntervals (),
2193+ },
2194+ ExternalIODir : baseDir ,
2195+ }})
2196+ defer tc .Stopper ().Stop (ctx )
2197+
2198+ sqlDB := sqlutils .MakeSQLRunner (tc .ServerConn (0 ))
2199+ testFiles := makeCSVData (t , 1 , 100 , 1 , 100 )
2200+
2201+ sqlDB .Exec (t , `CREATE TABLE t (a INT PRIMARY KEY, b STRING)` )
2202+
2203+ var jobID jobspb.JobID
2204+ sqlDB .QueryRow (t , fmt .Sprintf ("WITH j AS (IMPORT INTO t (a, b) CSV DATA (%s)) SELECT job_id FROM j" , testFiles .files [0 ])).Scan (& jobID )
2205+
2206+ var countBefore int
2207+ sqlDB .QueryRow (t , "SELECT count(*) FROM t" ).Scan (& countBefore )
2208+
2209+ sqlDB .Exec (t , "UPDATE system.jobs SET status = 'cancel-requested' WHERE id = $1" , jobID )
2210+ jobutils .WaitForJobToCancel (t , sqlDB , jobID )
2211+
2212+ var countAfter int
2213+ sqlDB .QueryRow (t , "SELECT count(*) FROM t" ).Scan (& countAfter )
2214+ require .Equal (t , countBefore , countAfter , "data should not be rolled back" )
21722215}
21732216
21742217// Verify that a failed import will clean up after itself. This means:
0 commit comments