diff --git a/pkg/bkctl/bookie/set_readonly_state.go b/pkg/bkctl/bookie/set_readonly_state.go index 1180d7b4..36c67195 100644 --- a/pkg/bkctl/bookie/set_readonly_state.go +++ b/pkg/bkctl/bookie/set_readonly_state.go @@ -50,18 +50,20 @@ func setReadonlyStateCmd(vc *cmdutils.VerbCmd) { desc.ToString(), desc.ExampleToString()) + force := vc.Command.Flags().BoolP("force", "f", false, "force to set readonly state") + vc.SetRunFuncWithNameArg(func() error { - return doSetReadonlyState(vc) + return doSetReadonlyState(vc, *force) }, "the readonly state is boolean") } -func doSetReadonlyState(vc *cmdutils.VerbCmd) error { +func doSetReadonlyState(vc *cmdutils.VerbCmd, force bool) error { admin := cmdutils.NewBookieClient() readonly, err := strconv.ParseBool(vc.NameArg) if err != nil { return err } - err = admin.Bookie().SetReadonlyState(readonly) + err = admin.Bookie().SetReadonlyState(readonly, force) if err == nil { cmdutils.PrintJSON(vc.Command.OutOrStdout(), "Successfully set the readonly state of a bookie") } diff --git a/pkg/bookkeeper/bookie.go b/pkg/bookkeeper/bookie.go index 1569a95a..59685947 100644 --- a/pkg/bookkeeper/bookie.go +++ b/pkg/bookkeeper/bookie.go @@ -44,7 +44,7 @@ type Bookie interface { State() (*bkdata.State, error) // SetReadonlyState sets the readonly state of a bookie - SetReadonlyState(bool) error + SetReadonlyState(bool, bool) error } type bookie struct { @@ -61,12 +61,16 @@ func (c *bookieClient) Bookie() Bookie { } } -func (b *bookie) SetReadonlyState(readonly bool) error { +func (b *bookie) SetReadonlyState(readonly bool, force bool) error { endpoint := b.bk.endpoint(b.basePath, "/state/readonly") request := bkdata.ReadonlyState{ ReadOnly: readonly, } - return b.bk.Client.Put(endpoint, &request) + params := map[string]string{} + if readonly && force { + params["force"] = "true" + } + return b.bk.Client.PutWithQueryParams(endpoint, &request, nil, params) } func (b *bookie) LastLogMark() (map[string]string, error) {