@@ -145,36 +145,13 @@ func (tm *TabletManager) RestoreData(
145145 }
146146
147147 var (
148- err error
149- startTime time.Time
148+ err error
149+ startTime time.Time
150+ backupEngine string
150151 )
151152
152153 defer func () {
153- stopTime := time .Now ()
154-
155- h := hook .NewSimpleHook ("vttablet_restore_done" )
156- h .ExtraEnv = tm .hookExtraEnv ()
157- h .ExtraEnv ["TM_RESTORE_DATA_START_TS" ] = startTime .UTC ().Format (time .RFC3339 )
158- h .ExtraEnv ["TM_RESTORE_DATA_STOP_TS" ] = stopTime .UTC ().Format (time .RFC3339 )
159- h .ExtraEnv ["TM_RESTORE_DATA_DURATION" ] = stopTime .Sub (startTime ).String ()
160-
161- if err != nil {
162- h .ExtraEnv ["TM_RESTORE_DATA_ERROR" ] = err .Error ()
163- }
164-
165- // vttablet_restore_done is best-effort (for now?).
166- go func () {
167- // Package vthook already logs the stdout/stderr of hooks when they
168- // are run, so we don't duplicate that here.
169- hr := h .Execute ()
170- switch hr .ExitStatus {
171- case hook .HOOK_SUCCESS :
172- case hook .HOOK_DOES_NOT_EXIST :
173- log .Info ("No vttablet_restore_done hook." )
174- default :
175- log .Warning ("vttablet_restore_done hook failed" )
176- }
177- }()
154+ tm .invokeRestoreDoneHook (startTime , err , backupEngine )
178155 }()
179156
180157 startTime = time .Now ()
@@ -185,14 +162,46 @@ func (tm *TabletManager) RestoreData(
185162 RestoreToTimestamp : protoutil .TimeToProto (restoreToTimetamp ),
186163 AllowedBackupEngines : allowedBackupEngines ,
187164 }
188- err = tm .restoreDataLocked (ctx , logger , waitForBackupInterval , deleteBeforeRestore , req , mysqlShutdownTimeout )
165+ backupEngine , err = tm .restoreDataLocked (ctx , logger , waitForBackupInterval , deleteBeforeRestore , req , mysqlShutdownTimeout )
189166 if err != nil {
190167 return err
191168 }
192169 return nil
193170}
194171
195- func (tm * TabletManager ) restoreDataLocked (ctx context.Context , logger logutil.Logger , waitForBackupInterval time.Duration , deleteBeforeRestore bool , request * tabletmanagerdatapb.RestoreFromBackupRequest , mysqlShutdownTimeout time.Duration ) error {
172+ func (tm * TabletManager ) invokeRestoreDoneHook (startTime time.Time , err error , backupEngine string ) {
173+ stopTime := time .Now ()
174+
175+ h := hook .NewSimpleHook ("vttablet_restore_done" )
176+ h .ExtraEnv = tm .hookExtraEnv ()
177+ h .ExtraEnv ["TM_RESTORE_DATA_START_TS" ] = startTime .UTC ().Format (time .RFC3339 )
178+ h .ExtraEnv ["TM_RESTORE_DATA_STOP_TS" ] = stopTime .UTC ().Format (time .RFC3339 )
179+ h .ExtraEnv ["TM_RESTORE_DATA_DURATION" ] = stopTime .Sub (startTime ).String ()
180+
181+ if backupEngine != "" {
182+ h .ExtraEnv ["TM_RESTORE_DATA_BACKUP_ENGINE" ] = backupEngine
183+ }
184+
185+ if err != nil {
186+ h .ExtraEnv ["TM_RESTORE_DATA_ERROR" ] = err .Error ()
187+ }
188+
189+ // vttablet_restore_done is best-effort (for now?).
190+ go func () {
191+ // Package vthook already logs the stdout/stderr of hooks when they
192+ // are run, so we don't duplicate that here.
193+ hr := h .Execute ()
194+ switch hr .ExitStatus {
195+ case hook .HOOK_SUCCESS :
196+ case hook .HOOK_DOES_NOT_EXIST :
197+ log .Info ("No vttablet_restore_done hook." )
198+ default :
199+ log .Warning ("vttablet_restore_done hook failed" )
200+ }
201+ }()
202+ }
203+
204+ func (tm * TabletManager ) restoreDataLocked (ctx context.Context , logger logutil.Logger , waitForBackupInterval time.Duration , deleteBeforeRestore bool , request * tabletmanagerdatapb.RestoreFromBackupRequest , mysqlShutdownTimeout time.Duration ) (string , error ) {
196205
197206 tablet := tm .Tablet ()
198207 originalType := tablet .Type
@@ -203,14 +212,14 @@ func (tm *TabletManager) restoreDataLocked(ctx context.Context, logger logutil.L
203212 keyspace := tablet .Keyspace
204213 keyspaceInfo , err := tm .TopoServer .GetKeyspace (ctx , keyspace )
205214 if err != nil {
206- return err
215+ return "" , err
207216 }
208217
209218 // For a SNAPSHOT keyspace, we have to look for backups of BaseKeyspace
210219 // so we will pass the BaseKeyspace in RestoreParams instead of tablet.Keyspace
211220 if keyspaceInfo .KeyspaceType == topodatapb .KeyspaceType_SNAPSHOT {
212221 if keyspaceInfo .BaseKeyspace == "" {
213- return vterrors .New (vtrpcpb .Code_INVALID_ARGUMENT , fmt .Sprintf ("snapshot keyspace %v has no base_keyspace set" , tablet .Keyspace ))
222+ return "" , vterrors .New (vtrpcpb .Code_INVALID_ARGUMENT , fmt .Sprintf ("snapshot keyspace %v has no base_keyspace set" , tablet .Keyspace ))
214223 }
215224 keyspace = keyspaceInfo .BaseKeyspace
216225 log .Infof ("Using base_keyspace %v to restore keyspace %v using a backup time of %v" , keyspace , tablet .Keyspace , protoutil .TimeFromProto (request .BackupTime ).UTC ())
@@ -239,12 +248,12 @@ func (tm *TabletManager) restoreDataLocked(ctx context.Context, logger logutil.L
239248 }
240249 restoreToTimestamp := protoutil .TimeFromProto (request .RestoreToTimestamp ).UTC ()
241250 if request .RestoreToPos != "" && ! restoreToTimestamp .IsZero () {
242- return vterrors .Errorf (vtrpcpb .Code_INVALID_ARGUMENT , "--restore-to-pos and --restore-to-timestamp are mutually exclusive" )
251+ return "" , vterrors .Errorf (vtrpcpb .Code_INVALID_ARGUMENT , "--restore-to-pos and --restore-to-timestamp are mutually exclusive" )
243252 }
244253 if request .RestoreToPos != "" {
245254 pos , err := replication .DecodePosition (request .RestoreToPos )
246255 if err != nil {
247- return vterrors .Wrapf (err , "restore failed: unable to decode --restore-to-pos: %s" , request .RestoreToPos )
256+ return "" , vterrors .Wrapf (err , "restore failed: unable to decode --restore-to-pos: %s" , request .RestoreToPos )
248257 }
249258 params .RestoreToPos = pos
250259 }
@@ -258,19 +267,19 @@ func (tm *TabletManager) restoreDataLocked(ctx context.Context, logger logutil.L
258267 // so we keep our PrimaryTermStartTime (if any) if we aren't actually restoring.
259268 ok , err := mysqlctl .ShouldRestore (ctx , params )
260269 if err != nil {
261- return err
270+ return "" , err
262271 }
263272 if ! ok {
264273 params .Logger .Infof ("Attempting to restore, but mysqld already contains data. Assuming vttablet was just restarted." )
265- return nil
274+ return "" , nil
266275 }
267276 // We should not become primary after restore, because that would incorrectly
268277 // start a new primary term, and it's likely our data dir will be out of date.
269278 if originalType == topodatapb .TabletType_PRIMARY {
270279 originalType = tm .baseTabletType
271280 }
272281 if err := tm .tmState .ChangeTabletType (ctx , topodatapb .TabletType_RESTORE , DBActionNone ); err != nil {
273- return err
282+ return "" , err
274283 }
275284 // Loop until a backup exists, unless we were told to give up immediately.
276285 var backupManifest * mysqlctl.BackupManifest
@@ -292,7 +301,7 @@ func (tm *TabletManager) restoreDataLocked(ctx context.Context, logger logutil.L
292301 log .Infof ("No backup found. Waiting %v (from -wait_for_backup_interval flag) to check again." , waitForBackupInterval )
293302 select {
294303 case <- ctx .Done ():
295- return ctx .Err ()
304+ return "" , ctx .Err ()
296305 case <- time .After (waitForBackupInterval ):
297306 }
298307 }
@@ -308,7 +317,7 @@ func (tm *TabletManager) restoreDataLocked(ctx context.Context, logger logutil.L
308317 err = tm .restoreToTimeFromBinlog (ctx , pos , keyspaceInfo .SnapshotTime )
309318 if err != nil {
310319 log .Errorf ("unable to restore to the specified time %s, error : %v" , keyspaceInfo .SnapshotTime .String (), err )
311- return nil
320+ return "" , nil
312321 }
313322 }
314323 switch {
@@ -321,21 +330,21 @@ func (tm *TabletManager) restoreDataLocked(ctx context.Context, logger logutil.L
321330 // up with the primary.
322331 params .Logger .Infof ("Restore: disabling replication" )
323332 if err := tm .disableReplication (context .Background ()); err != nil {
324- return err
333+ return "" , err
325334 }
326335 } else if keyspaceInfo .KeyspaceType == topodatapb .KeyspaceType_NORMAL {
327336 // Reconnect to primary only for "NORMAL" keyspaces
328337 params .Logger .Infof ("Restore: starting replication at position %v" , pos )
329338 if err := tm .startReplication (context .Background (), pos , originalType ); err != nil {
330- return err
339+ return "" , err
331340 }
332341 }
333342 case err == mysqlctl .ErrNoBackup :
334343 // Starting with empty database.
335344 // We just need to initialize replication
336345 _ , err := tm .initializeReplication (ctx , originalType )
337346 if err != nil {
338- return err
347+ return "" , err
339348 }
340349 case err == nil && params .DryRun :
341350 // Do nothing here, let the rest of code run
@@ -346,7 +355,7 @@ func (tm *TabletManager) restoreDataLocked(ctx context.Context, logger logutil.L
346355 if err := tm .tmState .ChangeTabletType (bgCtx , originalType , DBActionNone ); err != nil {
347356 log .Errorf ("Could not change back to original tablet type %v: %v" , originalType , err )
348357 }
349- return vterrors .Wrap (err , "Can't restore backup" )
358+ return "" , vterrors .Wrap (err , "Can't restore backup" )
350359 }
351360
352361 // If we had type BACKUP or RESTORE it's better to set our type to the init_tablet_type to make result of the restore
@@ -365,7 +374,13 @@ func (tm *TabletManager) restoreDataLocked(ctx context.Context, logger logutil.L
365374 params .Logger .Infof ("Restore: changing tablet type to %v for %s" , originalType , tm .tabletAlias .String ())
366375 // Change type back to original type if we're ok to serve.
367376 bgCtx := context .Background ()
368- return tm .tmState .ChangeTabletType (bgCtx , originalType , DBActionNone )
377+
378+ var backupEngine string
379+ if backupManifest != nil {
380+ backupEngine = backupManifest .BackupMethod
381+ }
382+
383+ return backupEngine , tm .tmState .ChangeTabletType (bgCtx , originalType , DBActionNone )
369384}
370385
371386// restoreToTimeFromBinlog restores to the snapshot time of the keyspace
0 commit comments