sofastack / sofa-jarslink

Jarslink is a sofa ark plugin used to manage multi-application deployment
Apache License 2.0
3.05k stars 705 forks source link

The specified biz's state must not be deactivated #107

Closed Occult0318 closed 5 years ago

Occult0318 commented 5 years ago

sofa-ark>check -b Biz count=3 bizName='app-one', bizVersion='1.0.0', bizState='activated' bizName='app-two', bizVersion='2.0.0', bizState='deactivated' bizName='app-two', bizVersion='1.0.0', bizState='activated'

sofa-ark>switch -b -n app-two -v 2.0.0 The specified biz's state must not be deactivated.

运行biz-jvm-invocation-sample测试热更新遇到上述报错。

com.alipay.sofa.jarslink.runtime.command.SwitchCommand.java中对于switch命令的判断如下 if (biz.getBizState() == BizState.UNRESOLVED || biz.getBizState() != BizState.RESOLVED || biz.getBizState() != BizState.BROKEN) { LOGGER.info(String.format("The specified biz's state must not be %s.", biz.getBizState())); return String .format("The specified biz's state must not be %s.", biz.getBizState()); } else { bizManagerService.activeBiz(bizName, bizVersion); LOGGER.info(String.format("Switch biz:\'%s\' to be activated.", biz.getIdentity())); return String.format("Biz:\'%s\' is activated.", biz.getIdentity()); } 这个判断条件biz.getBizState() != BizState.RESOLVED || biz.getBizState() != BizState.BROKEN永远是true,所以没法进行热切,这是个bug吧゛(‘◇’)?

Occult0318 commented 5 years ago

修改判断条件为if (biz.getBizState() != BizState.DEACTIVATED) {}else{}以后重新打包运行就ok了,所以咱的理解有问题吗

QilongZhang commented 5 years ago

嗯,已经fix了。

if (biz.getBizState() != BizState.ACTIVATED
                && biz.getBizState() != BizState.DEACTIVATED) {
                LOGGER.info(String.format("The specified biz's state must not be %s.",
                    biz.getBizState()));
                return String
                    .format("The specified biz's state must not be %s.", biz.getBizState());
            } else {
                bizManagerService.activeBiz(bizName, bizVersion);
                LOGGER.info(String.format("Switch biz:\'%s\' to be activated.", biz.getIdentity()));
                return String.format("Biz:\'%s\' is activated.", biz.getIdentity());
            }
Occult0318 commented 5 years ago

if (biz.getBizState() != BizState.ACTIVATED && biz.getBizState() != BizState.DEACTIVATED) 已经是激活状态的包也可以切换吗,感觉好像没必要吧,虽然逻辑上好像没问题

QilongZhang commented 5 years ago

if (biz.getBizState() != BizState.ACTIVATED && biz.getBizState() != BizState.DEACTIVATED) 已经是激活状态的包也可以切换吗,感觉好像没必要吧,虽然逻辑上好像没问题

如果是Activated, 其实是不会做任何事,只是打印日志告诉用户模块已经处于activated了。和操作者希望看到的是一致的。

Occult0318 commented 5 years ago

嗯,好的