最近工作压力有点大,情绪偶然会失控,要好好反省一下自己。

上周本来打算写CSP相关的东西,但是目前做得还不够多,积累的经验不足,就放弃了。中间找到很好的参考资料,一并放在这里。一篇是比较短的论文,可以观其大略:http://www.cs.ucf.edu/courses/cop4020/sum2009/CSP-hoare.pdf,另一个链接是hoare写的关于进程演算的书:https://dl.dropboxusercontent.com/u/5660734/CSPbook_2004_Hoare.rar 对于理解CSP这个模型的数学基础很有帮助。不过书好长,还没看完。。。

本周合并了另一个项目组对mongodb改造的修改,对方完全重写我的代码,但没有配套单元测试,合并当天就测出bug了,有点碎碎念啊。没办法,硬着头皮剥离一部分依赖,独立出一个可执行文件来测bson_format的问题。正如之前写的这篇博客提到的,难点在于类型系统的对接。本次修改增加了一个array迭代,保证初次在引擎这边分配array的时候,已经是一块足够长的内存,而不是我原来实现时,迭代bson,有一个元素就合并一个。另外,上次序列化为bson时,我错将array当mapping来序列化了,原有的测试只针对长度,没针对具体内容,本次修改已经修正。

另外一个地方,是关于内存对象的生命周期的。本次修改直接重写了dbo_new, dbo_load, dbo_unload等方法,这些方法控制了dbd内存中,存放在apr_list里的一系列db对象。gamed通过rpc调用,以dbo_new或者dbo_load方法创建对象后,除非调用dbo_unload,否则对象是不会被释放的,整个生命周期非常清晰。虽然dbd启动过程中初始化了vm虚拟机,实际上并没有跑lpc脚本,所有工作都是在c层实现的。本次修改中,在序列化过程里,用到的字符串局部变量,都是通过vm虚拟机来申请和释放的。个人对此持保留看法。在序列化过程中,所用到的key值都是临时性的,bson化后就没有意义。一个简单粗暴的做法,就是直接在函数内定义定长字符串数组,然后每次需要序列化bson key的时候,都复制/格式化到这个数组上。这一方面可以避免堆区内存分配,另一方面避免无谓的内存泄露,以及可能出现的二次释放问题。

稍后,通过单元测试,修正了当天测试暴露出来的,反序列化array嵌套mapping对象时,array元素没有初始化好,导致序列化嵌套mapping时,引擎core dump的问题。接着,对方又抛出了一个新的修改,依然是没有单元测试。。目标是修正引擎的概率性崩溃,依据是序列化mapping过程中,对key做字符串化操作时,会改动到原有的mapping,然后造成内存泄露和/或mapping元素的二次释放问题,引致引擎崩溃。经单元测试发现,这个理由不成立,但代码里的确会有误释放的问题。至于误释放为什么没有引起单元测试崩溃,这个还需要看看gc那一块的代码。这次bug fix就没有吸合了,稍后通过在函数内定义一个局部定长字符串数组,加上key的复制来解决吧。

通过这几次引擎的修改,越来越发现,没有单元测试的代码,真的会没有信心的。不是说你用这个代码跑了两周,没有发现存储有问题,这个代码就是没有问题的。不同项目组里,用到的储存结构不一样,也许你的代码嵌套3层以后就会崩掉呢?或者就是这次暴露出的,复合类型的嵌套储存bug呢?没有办法用单元测试重现的bug,只靠看代码猜测,我觉得是不靠谱的,因为修好后你也没办法重现bug的环境,看看本次修改是否有效。希望大伙能够早日认同这个道理

做完底层又要赶逻辑代码,差点回不了家,残念……

dbd到mongo的序列化问题及稳定性的更多相关文章

  1. Java Mongo 自定义序列化笔记

    从insert方法入手 1. org.springframework.data.mongodb.repository.support.SimpleMongoRepository.java   inse ...

  2. 【mongo】mongo数据转json时特殊类型处理

    mongo数据库中的有些数据类型是无法用json序列化的,比如ObjectId或者datetime.datetime类型. 可以通过json.JSONEncoder来处理 import json im ...

  3. [java]序列化框架性能对比(kryo、hessian、java、protostuff)

    序列化框架性能对比(kryo.hessian.java.protostuff) 简介:   优点 缺点 Kryo 速度快,序列化后体积小 跨语言支持较复杂 Hessian 默认支持跨语言 较慢 Pro ...

  4. 序列化框架性能对比(kryo、hessian、java、protostuff)

    简介:   优点 缺点 Kryo 速度快,序列化后体积小 跨语言支持较复杂 Hessian 默认支持跨语言 较慢 Protostuff 速度快,基于protobuf 需静态编译 Protostuff- ...

  5. 转:使用Mongo Connector和Elasticsearch实现模糊匹配

    原文来自于:http://www.csdn.net/article/2014-09-01/2821485-how-to-perform-fuzzy-matching-with-mongo-connec ...

  6. 谈谈序列化—实体bean一定要实现Serializable接口?

    导读:最近在做项目的过程中,发现一个问题,就是我们最开始的时候,传递参数包括返回类型,都有map类型.但是由于map每次都要匹配key值,很麻烦.所以在之后就将参数传递和返回类型全都改成了实体bean ...

  7. Mongo C# Driver 聚合使用---深入浅出

    聚合查询结构体系 ​ 我们都知道Mongo中聚合是由$match,$project等聚合项组成,所以在C# Driver中具有两种类型:聚合管道(PipelineDefinition)和聚合管道项(I ...

  8. 迄今为止 .Net 平台功能最强大,性能最佳的 JSON 序列化和反序列化库。

    Swifter.Json 这是迄今为止 .Net 平台功能最强大,性能最佳的 JSON 序列化和反序列化库. Github : https://github.com/Dogwei/Swifter.Js ...

  9. 对Java Serializable(序列化)的理解和总结(一)

    导读:最近在做项目的过程中,发现一个问题,就是我们最开始的时候,传递参数包括返回类型,都有map类型.但是由于map每次都要匹配key值,很麻烦.所以在之后就将参数传递和返回类型全都改成了实体bean ...

随机推荐

  1. 安卓/res/menu/的使用

    <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http:/ ...

  2. POJ 1719 二分图最大匹配(记录路径)

    Shooting Contest Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4097   Accepted: 1499 ...

  3. MonoRail学习-入门实例篇

    1.到官方网站下载安装文件,地址如下: http://www.castleproject.org/index.php/Castle:Download目前最新版本Beta5(您也可以不需要下载,直接使用 ...

  4. python遍历文件夹下的文件

    在读文件的时候往往需要遍历文件夹,python的os.path包含了很多文件.文件夹操作的方法.下面列出: os.path.abspath(path) #返回绝对路径 os.path.basename ...

  5. 黑马程序员——C语言基础语法 关键字 标识符 注释 数据及数据类型

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (一下内容是对黑马苹果入学视频的个人知识点总结) (一)C语言简单介绍 (1)C语言程序是由函数组成的任何C语言程序都是由一 ...

  6. Linux下备份系统至另一硬盘

    首先会想到dd命令. 但,, 1,若是小硬盘还好,上T的大硬盘这样做肯定不明智; 2,况且dd是在硬件层面的拷贝,前面的MBR也会随之恢复到另一个盘,若源硬盘是100G,目标盘是200G,又会出问题, ...

  7. C/C++中函数参数传递详解(二)

    昨天看了内存管理的有关内容,有一点了解,但不是很深入,发现之前写代码时有很多细节问题没有注意到,只知道这样做可以实现功能,却不知道为什么可以这样,对于采用自己的方法造成的隐患也未知,更不晓得还有其他方 ...

  8. Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(一)

    MEX文件是一种可在matlab环境中调用的C语言(或fortran)衍生程序,mex的编译结果实际上就是一个带输出函数mexFunction 的dll文件. 中文名 mex文件 外文名 MATLAB ...

  9. Hadoop中常用的InputFormat、OutputFormat(转)

    Hadoop中的Map Reduce框架依赖InputFormat提供数据,依赖OutputFormat输出数据,每一个Map Reduce程序都离不开它们.Hadoop提供了一系列InputForm ...

  10. CDH上执行WordCount的意外和收获

    前面将Cloudera Manager安装到集群上的一台主机后,并通过Cloudera manager安装了hadoop-2.6.0-CDH5.4.4.今日来测试安装的集群是否很够很好的执行mapre ...