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. 简单动态规划——最长公共子序列&&最长回文子序列&&最长上升||下降子序列

    最长公共子序列,顾名思义当然是求两个字符串的最长公共子序列啦,当然,这只是一道非常菜的动规,所以直接附上代码: #include<iostream> #include<cstdio& ...

  2. Java系列学习(六)-数组

    1.方法: (1)定义: 完成特定功能块的代码,在有些语言中也叫函数 (2)格式: (3)方法的重载 [在同一个类中,方法名相同,参数列表不同,与返回值无关] 2.数组 (1)定义 存储同一种数据类型 ...

  3. C# 多线程系列(五)

    死锁 为了线程安全,我们在需要的是会使用”独占锁“,但过多的锁定也会有麻烦.多个线程因为竞争资源相互等待而造成的僵局,我们称为死锁.若无外力作用,这些进程将都无法推进.在死锁中,至少有两个线程被挂起, ...

  4. JS——缓慢动画封装

    在知道如何获取内嵌式和外链式的标签属性值之后,我们再次封装缓慢动画: 单个属性 <!DOCTYPE html> <html> <head lang="en&qu ...

  5. 一个例子理解ES6的yield关键字

    yield是什么 yield是ES6的新关键字,使函数暂停执行. 一个简单例子 function *countASb() { console.log('Show0:'); var a1 = yield ...

  6. 浏览器的 local storage

    浏览器 local storage      本地存储 session storage    会话存储 cookies                  本地存储 1.     local stora ...

  7. js获得子节点, 获得tab转json值

    //提取表格的值,JSON格式 function GetTableData(table) { var tableData = new Array(); //创建数组 alert("行数:&q ...

  8. C# 调用指定打印机 (并不是默认)

    this.printDocument1.PrinterSettings.PrinterName = "Microsoft XPS Document Writer"; this.pr ...

  9. VS2015编译ffmpeg的问题解决

    刚装了vs2015,打开一些ffmpeg项目,发现不能编译通过,包括stdio.h都无法找到,可能是vs2015的bug吧. 现在记录一下解决方法: 我的目录是这样定义的: C:\Program Fi ...

  10. kernel-内核抢占

    kernel-内核抢占 这里有两个概念,内核抢占与用户态抢占.什么是内核抢占?就是指程序执行系统调用的时候(也就是执行于内核态的时候)被其他内核线程抢占走了. 有2种情况是不会也不应该被抢占的: 内核 ...