func (ta *TabletActor) executeHook(actionNode *actionnode.ActionNode) (err error) { // FIXME(msolomon) shouldn't the reply get distilled into an error? h := actionNode.Args.(*hook.Hook) topotools.ConfigureTabletHook(h, ta.tabletAlias) actionNode.Reply = h.Execute() return nil }
// ExecuteHook executes the provided hook locally, and returns the result. func (agent *ActionAgent) ExecuteHook(ctx context.Context, hk *hook.Hook) *hook.HookResult { if err := agent.lock(ctx); err != nil { // client gave up return &hook.HookResult{} } defer agent.unlock() // Execute the hooks topotools.ConfigureTabletHook(hk, agent.TabletAlias) hr := hk.Execute() // We never know what the hook did, so let's refresh our state. if err := agent.refreshTablet(ctx, "ExecuteHook"); err != nil { log.Errorf("refreshTablet after ExecuteHook failed: %v", err) } return hr }
// change a tablet type to RESTORE and set all the other arguments. // from now on, we can go to: // - back to IDLE if we don't use the tablet at all (after for instance // a successful ReserveForRestore but a failed Snapshot) // - to SCRAP if something in the process on the target host fails // - to SPARE if the clone works func (ta *TabletActor) changeTypeToRestore(tablet, sourceTablet *topo.TabletInfo, parentAlias topo.TabletAlias, keyRange key.KeyRange) error { // run the optional preflight_assigned hook hk := hook.NewSimpleHook("preflight_assigned") topotools.ConfigureTabletHook(hk, ta.tabletAlias) if err := hk.ExecuteOptional(); err != nil { return err } // change the type tablet.Parent = parentAlias tablet.Keyspace = sourceTablet.Keyspace tablet.Shard = sourceTablet.Shard tablet.Type = topo.TYPE_RESTORE tablet.KeyRange = keyRange tablet.DbNameOverride = sourceTablet.DbNameOverride if err := topo.UpdateTablet(ta.ts, tablet); err != nil { return err } // and create the replication graph items return topo.CreateTabletReplicationData(ta.ts, tablet.Tablet) }
// ExecuteHook executes the provided hook locally, and returns the result. // Should be called under RPCWrapLockAction. func (agent *ActionAgent) ExecuteHook(ctx context.Context, hk *hook.Hook) *hook.HookResult { topotools.ConfigureTabletHook(hk, agent.TabletAlias) return hk.Execute() }