文档章节

记 S3Service 代码中的一个低级错误

开源老码农
 开源老码农
发布于 02/22 11:16
字数 335
阅读 1.9K
收藏 1

osgl-storageosgl 工具箱 中用于简化存储的. 其特点是接口简单, 支持多种存储引擎插件, 包括本地文件系统, AWS S3, Azure Blob, 七牛 Kodo 服务.

最近老码农在一次调试中偶然发现了 osgl-storage S3Service 中一个隐藏很久的第几错误, 在此记录下来.

osgl-storage 的结构很简单, 大致是有 StorageService 来操作 SObject:

S3Service 定义了一个字段 defStorageClass, 用于设定默认的 S3 存储等级:

public class S3Service extends StorageServiceBase<S3Obj> implements IStorageService {  
	public enum StorageClass {  
		STANDARD, REDUCED_REDUNDANCY, GLACIER;
	}
	private StorageClass defStorageClass = StorageClass.REDUCED_REDUNDANCY;
	...
}

S3Service 也重载了 StorageServiceBaseconfigure(Map) 方法, 并在其中处理用户配置的 def storage class:

@Override  
protected void configure(Map<String, String> conf) {
	super.configure(conf, "s3");
	...
	String sc = conf.get(CONF\_DEF\_STORAGE_CLASS);
	if (null != sc) {
		defStorageClass = StorageClass.valueOf(sc, defStorageClass);
	}
	...
}

S3Service 的构造函数:

public S3Service(Map<String, String> conf) {  
  super(conf, S3Obj.class);  
}

StorageServiceBase 的构造函数:

public StorageServiceBase(Map<String, String> conf, Class<SOBJ_TYPE> sobjType) {  
  this.sobjType = $.requireNotNull(sobjType);  
  configure(conf);  
}

到这里请各位看官研究一下这个低级错误在哪里. 我们在评论中揭晓答案 ^_^

© 著作权归作者所有

开源老码农

开源老码农

粉丝 359
博文 61
码字总数 71128
作品 4
其它
架构师
私信 提问
加载中

评论(6)

开源老码农
开源老码农 博主
渔民小镇说到点子上了. 问题出在初始化时序上面.

1. S3Service::constructor
2. StorageServiceBase::constructor
3. S3Service::configure()
4. S3Service 剩下的构造工作, 包括初始化 defStorageClass 字段

上面的时序的问题就在于 defStorageClass 本来在第三步 S3Service::configure() 方法里面依旧被配置好了, 结果第四步又重置为 REDUCED_REDUNDANCY 了
渔民小镇
渔民小镇
这次能看出来,主要是 大佬C 给的提示有点多。 如果不给提示。我也懵不到点上哦。
开源中国首席看批官
开源中国首席看批官
在java中子类初始化完成一定,要先初始化父类,而configure方法是在StorageServiceBase构造函数调用的,而且configure是在S3Service子类重写的了的,所以会导致行为不一致(我没有试过,但是可能会导致configure重写失效)
渔民小镇
渔民小镇
重写不会失效哦。 引用使用子类的,调用的就是子类重写的方法。
开源中国首席看批官
开源中国首席看批官
因为,父类都没有初始化完成,怎么可能调用子类的方法
渔民小镇
渔民小镇
如果使用子类引用, 调用的是子类的方法。可以把父类变量类型看成一个空壳模板。 你说的父类没初始化完成, 只不过是在子类中不能使用父类的属性,因为父类没初始化完成的原因。 我看这上面的错误不出意外应该是父类属性初始化问题。 private StorageClass defStorageClass = StorageClass.REDUCED_REDUNDANCY;
Uncaught RangeError: Maximum call stack size exceeded 调试日记

异常处理汇总-前端系列 http://www.cnblogs.com/dunitian/p/4523015.html 开发道路上不是解决问题最重要,而是解决问题的过程,这个过程我们称之为~~~调试 记一次填坑记,下次一定注意休息。...

毒逆天
2016/09/12
0
0
标示符无效

SELECT FROM ( SELECT row_., ROWNUM rownum FROM ( SELECT * FROM AMACTUALACCNTINFO WHERE AMACTUALACCNTINFO.cmpnyname IN ( '昭通市镇雄县分公司' ) ) row ) WHERE rownum > 0 AND rown......

北京_
2014/09/11
27
0
如何用Java平台访问开源云存储?

尽管云计算这一术语并不新鲜(Amazon在2006年就开始提供它的云服务),但从2008年起它才开始真正成为流行词,这期间,Google和 Amazon的云服务逐渐获得了公众的关注。 Google的App Engine使用户...

红薯
2009/10/14
693
0
程序在发布前就应该发现的一些错误

在软件开发过程中,写出影响性能或者有BUG的代码,都是我们无法回避的现实问题。 不过,如果能够在程序发布前(自测或者测试阶段)将这些问题找出来,我想大家都是可接受的。 今天就来介绍一...

Fish Li
2012/11/05
0
0
安卓一个用wait notify解决并发的场景

勉强算是个难点 场景: 我集成了讯飞语音,想封装下,仅仅调用startSpeaking(String)就可以说话,这个简单。可是,当你有多条消息同时来临的时候,他内部会stop前面的语音消息,只会speak最后...

qq_36523667
2018/04/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

维护UP主权益 B站宣布AV号将全面升级为BV号

今日(3月23日),B站官方公开了一则有关于“AV号全面升级”的相关公告。官方表示:为了保护信息安全,容纳更多投稿,维护UP主的权益,自2020年3月23日起,AV号将全面升级为BV号,未来BV号将...

osc_6n4iy0i5
6分钟前
19
0
TikTok为施瓦辛格校园慈善机构捐赠300万美元

据外媒报道,社交媒体公司TikTok日前表示,将向美加州前州长、好莱坞演员阿诺德·施瓦辛格创办的After-School All-Stars(以下简称ASAS)慈善机构捐赠300万美元,以此来帮助那些因新冠病毒爆...

osc_iqngllfn
8分钟前
16
0
暴风集团收问询函:按照规则要求披露2019年业绩情况

2月10日下午消息,暴风集团收问询函,深交所要求公司说明未在规定时间内披露业绩预告的原因,目前的进展情况及解决措施。同时,请公司尽快按照规则要求披露2019年业绩情况。 以下为问询函全文...

osc_zyjrm8ih
9分钟前
22
0
爱奇艺2019年亏损103亿 CEO龚宇:会员费太低 要涨价

日前国内知名视频平台爱奇艺发布了2019年Q4及全年财报,去年一年营收290亿元,净亏损103亿元。面对这样的情况,CEO龚宇在财报会议中表示2020年将提高会员价格。从2017年到2019年,爱奇艺一直...

osc_j9ayg4mu
10分钟前
25
0
Microsoft Edge for Mac(edge浏览器) 83.0.477.0中文版

microsoftedge浏览器是一款作为windows操作系统的官方内置浏览器。microsoftedge浏览器对比ie浏览器来说功能更好,而且它还集成Contana等新功能,交互界面更加简洁,还增加了对Firefox浏览器...

云不若
12分钟前
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部