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. JSP-Runoob:JSP 点击量统计

    ylbtech-JSP-Runoob:JSP 点击量统计 1.返回顶部 1. JSP 点击量统计 有时候我们需要知道某个页面被访问的次数,这时我们就需要在页面上添加页面统计器,页面访问的统计一般在用户 ...

  2. openstack liberty aio nova 调试

  3. putty+Xmanager登陆Linux,实现图形界面操作.

  4. Filter,Interceptor和Aspect

    过滤器使用的主要是反射 :拦截器使用的主要是回调 :AOP使用的主要是动态代理. 一个请求过来 ,先进行过滤器处理,看程序是否受理该请求.过滤器放过后, 程序中的拦截器进行处理,处理完后进入被AOP动 ...

  5. P2533 [AHOI2012]信号塔

    传送门 据说是一个叫做随机增量法的东西 枚举\(i\),如果不在圆中将它设为圆心 枚举\(j\),如果不在圆中将\((i,j)\)成为新的圆的直径 枚举\(k\),如果不在圆中让\(i,j,k\)组成 ...

  6. [Swift通天遁地]五、高级扩展-(4)快速生成Invert、Mix、Tint、Shade颜色及调整饱和度阶

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  7. cocos2d-x 不规则碰撞检测 【转载】

    原文:http://www.2cto.com/kf/201401/272331.html //判断有没有点到有材质的部分, p_point相对, CCSprite坐标  (p_point是相对 Spr ...

  8. html5——动画案例(太阳系)

    太阳系主要利用定位,伪元素 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  9. jQuery——自定义动画

    动画方法:animate(json,1000, function (){}) 参数说明:json代表属性设置,1000是动画时间,最后一个是回调函数,其中动画时间可选 属性支持:http://www. ...

  10. 【技术累积】【点】【java】【29】MapUtils

    内容 是Apache组织下的commons-collections包中的工具类 <dependency> <groupId>commons-collections</gr ...