Bug 1:对不可迭代类进行迭代(libcloud.storage.driver.cloudfile line. 141-142)
     使用libcloud连接自搭建swift服务,自己在服务器上搭建swift服务,利用keystone进行认证(swift自带认证服务swauth libcloud好像不支持),配置好keystone服务器(keystone服务器ip为192.168.137.201),先利用curl命令确认swift和keystone服务是正常运行。
     执行如下几行代码进行openstack StorageDriver类的初始化:   
 CloudDriver = get_driver(Provider.CLOUDFILES_SWIFT)
driver = CloudDriver(user_id, passwd, secure=False, region='RegionOne',
ex_tenant_name=tenant_name,
ex_force_auth_url='http://192.168.137.201:35357',
ex_force_auth_version='2.0_passwd',
ex_force_service_type='object-store',
ex_force_service_name='Swift')
     注意,其中auth_url要与自己认证服务器url一致,且auth_version/service_type/service_name等信息均要与keystone服务器中相应信息一致,否则将无法获取endpoint!
     即便如此,仍旧无法获得endpoint,经过跟踪调试,最终将错误定位于libcloud.storage.driver中cloudfiles.py文件中line. 141-142:        
 if PUBLIC_ENDPOINT_KEY in endpoint:
return endpoint[PUBLIC_ENDPOINT_KEY]
此处endpoint为OpenStackServiceCatalogEntryEndpoint类对象,此类中并未定义迭代方法,无法对一个不可迭代类进行迭代!将上面两行代码修改为:  
  if endpoint.url:
return endpoint.url
代码即可正常运行。
 
Bug 2:死循环(libcloud.storage.driver.cloudfiles line. 728-751)

 while True:
container_name_encoded = \
self._encode_container_name(container.name)
response = self.connection.request('/%s' %
(container_name_encoded),
params=params) if response.status == httplib.NO_CONTENT:
# Empty or non-existent container
break
elif response.status == httplib.OK:
objects = self._to_object_list(json.loads(response.body),
container) if len(objects) == 0:
break for obj in objects:
yield obj
params['marker'] = obj.name
     此循环,是为了列出一个container中符合要求的所有object,但在依照此代码对百度云存储进行封装时输出结果陷入死循环,在最后一行添加break语句后代码正常运行。
     在连接swift时尚未运行此段代码,不知其是否也会出现问题。
 
Bug 3:对上传文件进行二次迭代错误(libcloud.storage.base line. 622-637 734-782)
line 734:    
         generator = libcloud.utils.files.read_in_chunks(iterator, chunk_size)

         bytes_transferred = 0
try:
chunk = next(generator)
except StopIteration:
# Special case when StopIteration is thrown on the first iteration
# create a 0-byte long object
chunk = ''
     对文件的流式上传,每次均需要调用base.py中_upload_object()和_stream_data()函数。而我在对百度云存储封装流式上传函数时,每次上传文件均不成功,上面_stream_data()中代码每次都会进入StopIteration异常处理流程,上传一个空文件。
     后来我发现是因为百度云不支持文件分块编码上传,故supports_chunked_encoding =False。在_upload_object()中会执行一次read_in_chunks(),而上面代码再次执行read_in_chunks()时,文件迭代器iterator已经指向文件末尾,故chunk = next(generator)总是异常。
     仔细思考后,我在read_in_chunks()函数(libcloud.utils.file line. 36-94)开头添加如下两行代码:         
 if isinstance(iterator, file) and iterator.tell():
iterator.seek(0,os.SEEK_SET)
即如果迭代器类型为文件且文件当前位置不为起始位置,将其位置置于起始位置。后代码正常运行。
 
     开源代码也是人写的,也许在以后使用libcloud过程中,会发现更多bug。勿迷信他人代码,相信自己判断。

libcloud代码研究(三)——bugs的更多相关文章

  1. libcloud代码研究(一)——基本架构

    libcloud是apache下整合多种云服务接口的项目.最近,在研究libcloud代码的同时,将阿里云存储(Ali OSS)和百度云存储用libcloud storage driver规范进行封装 ...

  2. libcloud代码研究(二)——云服务封装

    对Ali OSS和百度云存储的封装      先在libcloud.storage.provider文件中添加Ali OSS provider和Baidu provider,在DRIVERS中添加如下 ...

  3. dedecms代码研究三

    上次,我们从dedecms的index.PHP文件中了解到了很多信息,也提出了一些问题: 1)加载了/include/common.inc.php,里面做了哪些工作? 2)/include/arc.p ...

  4. dedecms代码研究二

    dedecms代码研究(2)从index开始现在继续,今天讲的主要是dedecms的入口代码.先打开index.PHP看看里面是什么吧.打开根目录下的index.php嗯映入眼帘的是一个if语句.检查 ...

  5. 一段markdown编辑器代码研究

    一段markdown编辑器代码研究 说明 代码在 https://github.com/dukeofharen/markdown-editor 之所以选择这个来分析是一方面是因为它的代码结构比较简单, ...

  6. [转载]iOS6新特征:UICollectionView官方使用示例代码研究

    原文地址:iOS6新特征:UICollectionView官方使用示例代码研究作者:浪友dans 注:这里是iOS6新特征汇总贴链接 iOS6新特征:参考资料和示例汇总 这个链接可以学习到UIColl ...

  7. CWMP开源代码研究——git代码工程

    原创作品,转载请注明出处,严禁非法转载.如有错误,请留言! email:40879506@qq.com 声明:本系列涉及的开源程序代码学习和研究,严禁用于商业目的. 如有任何问题,欢迎和我交流.(企鹅 ...

  8. YbSoftwareFactory 代码生成插件【二十五】:Razor视图中以全局方式调用后台方法输出页面代码的三种方法

    上一篇介绍了 MVC中实现动态自定义路由 的实现,本篇将介绍Razor视图中以全局方式调用后台方法输出页面代码的三种方法. 框架最新的升级实现了一个页面部件功能,其实就是通过后台方法查询数据库内容,把 ...

  9. 关于Jenkins部署代码权限三种方案

    关于Jenkins部署代码权限三种方案 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.修改Jenkins进程用户为root [root@jenkins ~]# cat /etc ...

随机推荐

  1. PCB C# MongoDB 查询(SQL,NOSQL,C#对比)

    一.准备阶段 1.查询数据清单准备 2.这里先将SQL语句执行顺序列出来,方便后面语句对比更好理解 ()SELECT ()DISTINCT ()<Top Num> <select l ...

  2. hibernate基础学习---hierbnate2级缓存

    1:开启二级缓存sessionFactory需要安装jar包 2:在实体类配置文件添加(配置二级缓存).我的配置文件是Account.hbm.xml <?xml version="1. ...

  3. 元素类型以及overflow,white-space等属性

    1:预格式化标签:<pre></pre>2:overflow属性="visible/hidden(隐藏)"/scroll/auto(自动)/inherit; ...

  4. 北大zhw大神bzoj1756代码

    #include <cmath> #include <cstdio> #include <cstdlib> #include <iostream> #i ...

  5. 微信小程序获取地理位置

    小程序只支持获取当前位置的经纬度,并不能直接获取到地理名称,需要通过第三方来逆地址解析,这里我选择的是腾讯位置服务 在使用前需要去申请key,这里是地址:https://lbs.qq.com/cons ...

  6. VUE使用QRcode或者vue-qr生成二维码

    这里介绍两种vue生成二维码的方法 QRcode vue-qr vue-qr比QRcode功能多在可以在中间加logo 下面先介绍QRcode vue里安装qrcodejs的npm包 npm inst ...

  7. Unity学习-预制(四)

    预制即克隆 比如要模拟一个下雨的场景,天下掉下来一颗一颗的雨滴.如果此时,我们给每一个雨滴创建一个对象的话,那会很浪费资源,而且也没必要,因为所有的雨滴是相同的.这个时候就使用到了预制,一种可以被重复 ...

  8. AdminLTE介绍和zTree的简单使用

    一.AdminLTE介绍 1.介绍 ​ AdminLTE是一个开源的后台控制面板和仪表盘 WebApp 模板,是建立在Bootstrap3框架和JQuery之上的开源模板主题工具,它提供了一系列响应的 ...

  9. J2EE集群原理(摘录)

    J2EE集群原理 什么是集群呢?总的来说,集群包括两个概念:“负载均衡”(load balancing)和“失效备援”(failover)  图一:负载均衡 多个客户端同时发出请求,位于前端的负载均衡 ...

  10. vue-clickoutside d

    js文件 export default { bind(el, binding, vnode) { function documentHandler(e) { if (el.contains(e.tar ...