@@ -7,6 +7,7 @@ package cloning
77import (
88 "context"
99 "database/sql"
10+ stderrors "errors"
1011 "fmt"
1112 "sort"
1213 "strconv"
@@ -308,6 +309,22 @@ func (c *Base) DestroyClone(cloneID string) error {
308309 return models .New (models .ErrCodeNotFound , "clone not found" )
309310 }
310311
312+ if err := c .destroyPreChecks (cloneID , w ); err != nil {
313+ if stderrors .Is (err , errNoSession ) {
314+ return nil
315+ }
316+
317+ return err
318+ }
319+
320+ go c .destroyClone (cloneID , w )
321+
322+ return nil
323+ }
324+
325+ var errNoSession = errors .New ("no clone session" )
326+
327+ func (c * Base ) destroyPreChecks (cloneID string , w * CloneWrapper ) error {
311328 if w .Clone .Protected && w .Clone .Status .Code != models .StatusFatal {
312329 return models .New (models .ErrCodeBadRequest , "clone is protected" )
313330 }
@@ -330,46 +347,65 @@ func (c *Base) DestroyClone(cloneID string) error {
330347 c .decrementCloneNumber (w .Clone .Snapshot .ID )
331348 }
332349
333- return nil
350+ return errNoSession
334351 }
335352
336- go func () {
337- if err := c .provision .StopSession (w .Session , w .Clone ); err != nil {
338- log .Errf ("Failed to delete a clone: %v." , err )
353+ return nil
354+ }
339355
340- if updateErr := c .UpdateCloneStatus (cloneID , models.Status {
341- Code : models .StatusFatal ,
342- Message : errors .Cause (err ).Error (),
343- }); updateErr != nil {
344- log .Errf ("Failed to update clone status: %v" , updateErr )
345- }
356+ func (c * Base ) DestroyCloneSync (cloneID string ) error {
357+ w , ok := c .findWrapper (cloneID )
358+ if ! ok {
359+ return models .New (models .ErrCodeNotFound , "clone not found" )
360+ }
346361
347- return
362+ if err := c .destroyPreChecks (cloneID , w ); err != nil {
363+ if stderrors .Is (err , errNoSession ) {
364+ return nil
348365 }
349366
350- c .deleteClone (cloneID )
367+ return err
368+ }
351369
352- if w .Clone .Snapshot != nil {
353- c .decrementCloneNumber (w .Clone .Snapshot .ID )
354- }
355- c .observingCh <- cloneID
370+ c .destroyClone (cloneID , w )
356371
357- c .SaveClonesState ()
372+ return nil
373+ }
358374
359- c .webhookCh <- webhooks.CloneEvent {
360- BasicEvent : webhooks.BasicEvent {
361- EventType : webhooks .CloneDeleteEvent ,
362- EntityID : cloneID ,
363- },
364- Host : c .config .AccessHost ,
365- Port : w .Session .Port ,
366- Username : w .Clone .DB .Username ,
367- DBName : w .Clone .DB .DBName ,
368- ContainerName : cloneID ,
375+ func (c * Base ) destroyClone (cloneID string , w * CloneWrapper ) {
376+ if err := c .provision .StopSession (w .Session , w .Clone ); err != nil {
377+ log .Errf ("Failed to delete a clone: %v." , err )
378+
379+ if updateErr := c .UpdateCloneStatus (cloneID , models.Status {
380+ Code : models .StatusFatal ,
381+ Message : errors .Cause (err ).Error (),
382+ }); updateErr != nil {
383+ log .Errf ("Failed to update clone status: %v" , updateErr )
369384 }
370- }()
371385
372- return nil
386+ return
387+ }
388+
389+ c .deleteClone (cloneID )
390+
391+ if w .Clone .Snapshot != nil {
392+ c .decrementCloneNumber (w .Clone .Snapshot .ID )
393+ }
394+ c .observingCh <- cloneID
395+
396+ c .SaveClonesState ()
397+
398+ c .webhookCh <- webhooks.CloneEvent {
399+ BasicEvent : webhooks.BasicEvent {
400+ EventType : webhooks .CloneDeleteEvent ,
401+ EntityID : cloneID ,
402+ },
403+ Host : c .config .AccessHost ,
404+ Port : w .Session .Port ,
405+ Username : w .Clone .DB .Username ,
406+ DBName : w .Clone .DB .DBName ,
407+ ContainerName : cloneID ,
408+ }
373409}
374410
375411// GetClone returns clone by ID.
0 commit comments