OpenStack Swift 存储策略(openstack中的swift)
25-04-23
2
在本文中,我们将为您详细介绍OpenStackSwift存储策略的相关知识,并且为您解答关于openstack中的swift的疑问,此外,我们还会提供一些关于(九)OpenStack---M版---双
在本文中,我们将为您详细介绍OpenStack Swift 存储策略 的相关知识,并且为您解答关于openstack中的swift 的疑问,此外,我们还会提供一些关于(九) OpenStack---M 版 --- 双节点搭建 ---Swift (单节点) 安装和配置、iOS Swift 应用程序随机 EXC_BAD_ACCESS 崩溃:swift_bridgeObjectRetain swift_retain swift::RefCounts、memcached-session-manager 实现 Tomcat Session 存储策略、Openstack Image - 如何通过上次使用删除 openstack 映像? 的有用信息。
本文目录一览:
OpenStack Swift 存储策略(openstack中的swift)
OpenStack Swift 对象存储及其存储策略简介
Swift 2.0 于 2014 年 7 月 8 日发布,其中最重要的新特性是存储策略(Storage Policy),该特性改变了以往存储系统中存储策略由设计与实施方决定的做法,让用户能够以 Container 为粒度,为不同需求的数据指定不同的副本数量、不同参数的纠删码、不同性能的存储介质、不同地理位置、不同的后端存储设备。存储策略充分体现了 Swift"软件定义存储"(Software Defined Storage)的特点。
为了实现存储策略,Swift 在原先三个环(Ring)的架构基础上进行了改进。Swift 为账户、容器和对象分别定义了的环,通过环将虚拟节点(分区)映射到一组物理存储设备上。在 Swift 2.0 中,每个存储策略对应一个 Object Ring。
回页首
Swift 存储策略的配置与使用
配置存储策略
设置存储策略分为两步:编辑配置文件 swift.conf 文件,创建相应的 Object Ring。在配置文件中每个存储策略以[storage-policy:N]开头,其中 N 是策略的编号。对于该文件的解析遵循以下规则:
如果该文件中没有声明任何策略,Swift 会自己创建一个;
策略编号应当位非负整数;
如果没有声明默认策略,Swift 会把编号为 0 的策略设为默认策略;
策略编号必须唯一;
策略应当具有名字,策略命名区分大小且必须唯一;
策略名称只能包含字母、数字和连字符,"Policy-0"只能用于编号为 0 的策略;
定义策略之后,应当有一个且仅有一个策略被指定为默认策略;
"废弃"(Deprecated)策略不能同时为默认策略。
下面是一个 swift.conf 文件的示例:
[swift-hash]
# random unique strings that can never change (DO NOT LOSE)
swift_hash_path_prefix = changeme
swift_hash_path_suffix = changeme
[storage-policy:0]
name = apple
default = yes
[storage-policy:1]
name = orange
deprecated = yes
完成 swift.conf 文件的编辑,下一步是为每个存储策略创建相应的 Object Ring,方法和创建老版本 Object Ring 类似,只是要在 object 后面加上"-N",这里的 N 是存储策略的编号。例如,为上述编号为 0 和 1 的存储策略创建 Object Ring:
swift-ring-builder object-0.builder create 10 3 1
swift-ring-builder object-1.builder create 10 2 1
使用存储策略
存储策略的使用非常简单,只需要在创建 container 是指定存储策略即可,下面以 SAIO 部署为例加以说明:
curl -v -X PUT -H 'X-Auth-Token: <your auth token>' -H \
"X-Storage-Policy: orange" \
http://127.0.0.1:8080/v1/AUTH_test/myCont1
curl -X PUT -v -T file1.txt -H 'X-Auth-Token: <your auth token>' \
http://127.0.0.1:8080/v1/AUTH_test/myCont1/
然后执行:
curl -X GET –v \
http://127.0.0.1:8080/endpoints/AUTH_test/myCont1/file1.txt
例如,会看到如下结果:
["http://127.0.0.1:6010/sdb1/32/AUTH_test/myCont1/file1.txt","http://127.0.0.1:6040/sdb4/32/AUTH_test/myCont1/file1.txt"]
说明 Storage Policy 已经成功发挥作用。
存储策略的应用模式
上述提到副本数量的改变,只是存储策略的应用模式的一种,在实际应用中,可以有以下几种模式:
缩减或增加冗余 对于一些数据,它们不需要保证很高的数据持久性和可靠性,比较典型的是图像的缩略图,它们可以由原图降采样得到,在这种情况下,可以对原图采用三副本方案,对缩略图采用双副本方案,降低存储系统的开销。
图 1.为不同的 Container 指定不同的副本数量
性能分层 例如,对于一些数据用 HDD 保存,另一些用 SSD 保存。也可以应用于其他存储介质,甚至是不同的存储设备。
图 2.为不同的 Container 指定不同的存储介质
地理位置约束 在某些场景下,因为公司或者国家的政策的约束,某些数据必须存储在指定的地理位置,例如混合云场景。有些场景下,用户希望指定数据存放在距离访问客户端比较近的地方。
图 3.为不同的 Container 指定不同的存储位置
应用纠删码(Erasure Codes) 对于性能要求不高的场合,应用纠删码。纠删码,又称为删除码,将对象分割为m 个分片(fragments),并通过编码生成k 个校验分片,最后将这n =m +k 个分片放到 Swift 对象存储系统的不同位置(通常是 swift 的不同 zone 中)。对于将 m 个分片编码为 n 个分片的纠删码,记为EC (m ,n )。纠删码的示意图如下:
图 4.纠删码示意图 纠删码在提高存储空间利用率的同时,保持或增加数据的持久性(durability)和可靠性。但是由于编码、解码和恢复数据往往需要较大的计算量,可能导致性能的降低,所以比较适用于对持久性和可靠性要求比较高,但是访问量并不大的数据存储。
图 5 .应用纠删码保护数据
回页首
在某视频网站中的应用案例
在某视频网站中,采用 Swift 存储视频文件,并对其部分文件根据视频类型的不同应用不同的存储策略。
视频数据分为三类:1)源片;2)超清视频文件;3)其他不同清晰度的视频文件。源片体积较大,对持久性要求高,但是对访问速度要求较低,并发访问数量和访问频率较低;清晰度较低的视频由超清视频转码得到,针对上述需求,设计存储策略如下:
源片采用纠删码策略,编码参数为EC (7,4),即把一个视频文件分割为 4 块,并生成 3 块校验块,存储效率约为 57%;
超清视频三副本策略,存储效率约为 33%;
清晰度较低的视频采用双副本策略,存储效率为 50%。
假设设备损坏的概率为 2%,以上三种存储策略的数据持久性分别为:99.9995%,99.9992%和 99.96%。
表 1.存储策略的应用
数据类型
存储策略
存储效率
数据持久性
源片
纠删码EC (7,4)
57%
99.9995%
超清视频文件
三副本
33%
99.9992%
其他分辨率视频文件
双副本
50%
99.96%
Swift 集群的总结点数量为 54 个节点,总容量约为 2.3PB,集群的部署架构如下图所示,其中 Proxy Server 的数量可以根据需要增加或者减少。采用传统三副本方案,能够保存的视频总长度约为(同一段视频不同分辨率不进行重复统计)3.97×106 分钟。
采用上述存储策略后,保存的视频总长度为 5.89×106 分钟,存储效率提高了 48%。
图 6. 基于 Swift 的视频存储系统的部署架构
回页首
结束语
在大数据时代,随着文件数量和数据体量的增加,文件系统和 NAS 的瓶颈越来越明显,基于 RESTful Web API 的对象存储逐渐受到人们的广泛接受。作为最具代表性,应用最广泛的开源对象存储方案,OpenStack Swift 自诞生以来一直保持着技术上领先的地位,在 Swift 2.0 中推出的存储策略功能,能够让管理员根据自己系统的特点制定不同的存储策略;用户或租户根据自己数据的特点和业务需要,以 Container 为粒度选择存储策略,从而实现成本、数据可靠性、性能等维度上的综合权衡和优化,体现了软件定义存储的特点。本文只是对存储策略做了一个简要的介绍,让读者体会存储策略的用途,进一步深入探索可以查看参考资料了解有关 OpenStack Swift 的更多相关信息。
参考资料
学习
SwiftStack Blogs:https://www.swiftstack.com/blog/
Intel IDF13: OpenStack* Swift Erasure Code: A Smart Cloud Storage Solutionhttp://intelstudios.edgesuite.net/idf/2013/sf/aep/CLDS007/CLDS007.html?wapkw=swift
OpenStack Swift官方文档http://docs.openstack.org/developer/swift/index.html
基于纠删码保护分布式对象存储的数据http://www.iwccsp.org/CloudConnect20140918Microwise.pdf
原文链接:http://www.ibm.com/developerworks/cn/cloud/library/1411_limy_openstackswift/?cmp=dwskl&cpb=dw&ct=dwcon&cr=cn_CSDN_t10_1&ccy=cn
总结
以上是小编为你收集整理的OpenStack Swift 存储策略全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
(九) OpenStack---M 版 --- 双节点搭建 ---Swift (单节点) 安装和配置
↓↓↓↓↓↓↓↓视频已上线 B 站↓↓↓↓↓↓↓↓
》》》》》》传送门
本次搭建仅采用 Compute 单节点做 swift 组件
1.Controller 安装并配置控制节点
2.Compute 安装和配置存储节点
3.Compute 节点安装并配置组件
4.Controller 节点创建,分发并初始化 rings
5. 启动服务
6.Controller 执行验证操作
<h2 id="1">1.Controller 安装并配置控制节点 </h2>
1. 获得凭证并创建身份认证服务的凭证
# . /root/admin-openrc
# openstack user create --domain default --password 000000 swift
# openstack role add --project service --user swift admin
# openstack service create --name swift --description "OpenStack Object Storage" object-store
2. 创建对象存储服务 API 端点
# openstack endpoint create --region RegionOne object -store public http://controller:8080/v1/AUTH_%\(tenant_id\)s
# openstack endpoint create --region RegionOne object -store internal http://controller:8080/v1/AUTH_%\(tenant_id\)s
# openstack endpoint create --region RegionOne object -store admin http://controller:8080/v1
3. 安装并配置组件
[root@controller ~]# yum -y install openstack-swift-proxy python-swiftclient python-keystoneclient python-keystonemiddleware memcached
编辑文件 /etc/swift/proxy-server.conf, 删除原有内容
,直接添加如下内容
# vi /etc/swift/proxy-server.conf
[DEFAULT]
bind_port = 8080
swift_dir = /etc/swift
user = swift
[pipeline:main]
pipeline = catch_errors gatekeeper healthcheck proxy-logging cache container_sync bulk ratelimit authtoken keystoneauth container-quotas account-quotas slo dlo versioned_writes proxy-logging proxy-server
[app:proxy-server]
use = egg:swift#proxy
account_autocreate = True
[filter:tempauth]
use = egg:swift#tempauth
user_admin_admin = admin .admin .reseller_admin
user_test_tester = testing .admin
user_test2_tester2 = testing2 .admin
user_test_tester3 = testing3
user_test5_tester5 = testing5 service
[filter:authtoken]
paste.filter_factory = keystonemiddleware.auth_token:filter_factory
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = swift
password = 000000
delay_auth_decision = True
[filter:keystoneauth]
use = egg:swift#keystoneauth
operator_roles = admin,user
[filter:healthcheck]
use = egg:swift#healthcheck
[filter:cache]
memcache_servers = controller:11211
use = egg:swift#memcache
[filter:ratelimit]
use = egg:swift#ratelimit
[filter:domain_remap]
use = egg:swift#domain_remap
[filter:catch_errors]
use = egg:swift#catch_errors
[filter:cname_lookup]
use = egg:swift#cname_lookup
[filter:staticweb]
use = egg:swift#staticweb
[filter:tempurl]
use = egg:swift#tempurl
[filter:formpost]
use = egg:swift#formpost
[filter:name_check]
use = egg:swift#name_check
[filter:list-endpoints]
use = egg:swift#list_endpoints
[filter:proxy-logging]
use = egg:swift#proxy_logging
[filter:bulk]
use = egg:swift#bulk
[filter:slo]
use = egg:swift#slo
[filter:dlo]
use = egg:swift#dlo
[filter:container-quotas]
use = egg:swift#container_quotas
[filter:account-quotas]
use = egg:swift#account_quotas
[filter:gatekeeper]
use = egg:swift#gatekeeper
[filter:container_sync]
use = egg:swift#container_sync
[filter:xprofile]
use = egg:swift#xprofile
[filter:versioned_writes]
use = egg:swift#versioned_writes
编辑文件 /etc/swift/swift.conf 删除原有内容
,添加如下内容
# vi /etc/swift/swift.conf
[swift-hash]
swift_hash_path_suffix = changeme
swift_hash_path_prefix = changeme
[storage-policy:0]
name = Policy-0
default = yes
aliases = yellow, orange
[swift-constraints]
添加权限
# chown -R root:swift /etc/swift
<h2 id="2">2.Compute 安装和配置存储节点 </h2>
1. 安装软件包
[root@compute ~]# yum -y install xfsprogs rsync openstack-swift-account openstack-swift-container openstack-swift-object
2. 使用 XFS 格式化 /dev/sdc 设备
搭建 Swift 存储节点需要一块空盘,此处我们查看添加的空盘
# lsblk
创建分区
# fdisk /dev/sdc
# mkfs.xfs /dev/sdc1
3. 创建挂载点目录结构
[root@compute ~]# mkdir -p /swift/node
4. 编辑 /etc/fstab
文件并添加以下内容
# vi /etc/fstab
/dev/sdc1 /swift/node xfs noatime,nodiratime,nobarrier,logbufs=8 0 0
5. 挂载设备
[root@compute ~]# mount /dev/sdc1 /swift/node/
6. 编辑 /etc/rsyncd.conf
文件并添加以下内容
[root@compute ~]#vi /etc/rsyncd.conf
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
uid = swift
gid = swift
address = 127.0.0.1
[account]
path = /swift/node
read only = false
write only = no
list = yes
incoming chmod = 0644
outgoing chmod = 0644
max connections = 25
lock file = /var /lock /account.lock
[container ]
path = /swift/node
read only = false
write only = no
list = yes
incoming chmod = 0644
outgoing chmod = 0644
max connections = 25
lock file = /var /lock /container.lock
[object ]
path = /swift/node
read only = false
write only = no
list = yes
incoming chmod = 0644
outgoing chmod = 0644
max connections = 25
lock file = /var /lock /object.lock
[swift_server]
path = /etc/swift
read only = true
write only = no
list = yes
incoming chmod = 0644
outgoing chmod = 0644
max connections = 5
lock file = /var /lock /swift_server.lock
7. 启动 “rsyncd” 服务和配置它随系统启动
# systemctl start rsyncd.service
# systemctl enable rsyncd.service
<h2 id="3">3.Compute 节点安装并配置组件 </h2>
1. 编辑 /etc/swift/account-server.conf 文件,删除原有内容,直接添加以下内容
#vi /etc/swift/account-server.conf
[DEFAULT]
bind_port = 6002
user = swift
swift_dir = /etc/swift
devices = /swift/node
mount_check = false
[pipeline:main]
pipeline = healthcheck recon account-server
[app:account-server]
use = egg:swift#account
[filter:healthcheck]
use = egg:swift#healthcheck
[filter:recon]
use = egg:swift#recon
recon_cache_path = /var/cache/swift
[account-replicator]
[account-auditor]
[account-reaper]
[filter:xprofile]
use = egg:swift#xprofile
2. 编辑 /etc/swift/container-server.conf
文件,删除原有内容,直接添加以下内容:
# vi /etc/swift/container-server.conf
[DEFAULT]
bind_port = 6001
user = swift
swift_dir = /etc/swift
devices = /swift/node
mount_check = false
[pipeline:main]
pipeline = healthcheck recon container-server
[app:container-server]
use = egg:swift#container
[filter:healthcheck]
use = egg:swift#healthcheck
[filter:recon]
use = egg:swift#recon
recon_cache_path = /var/cache/swift
[container-replicator]
[container-updater]
[container-auditor]
[container-sync]
[filter:xprofile]
use = egg:swift#xprofile
3. 编辑 /etc/swift/object-server.conf
文件,删除原有内容,直接添加以下内容:
# vi /etc/swift/object-server.conf
[DEFAULT]
bind_port = 6000
user = swift
swift_dir = /etc/swift
devices = /swift/node
mount_check = false
[pipeline:main]
pipeline = healthcheck recon object-server
[app:object-server]
use = egg:swift#object
[filter:healthcheck]
use = egg:swift#healthcheck
[filter:recon]
use = egg:swift#recon
recon_cache_path = /var/cache/swift
recon_lock_path = /var/lock
[object-replicator]
[object-reconstructor]
[object-updater]
[object-auditor]
[filter:xprofile]
use = egg:swift#xprofile
4. 编辑文件 /etc/swift/swift.conf 删除原有内容,添加如下内容
# vi /etc/swift/swift.conf
[swift-hash]
swift_hash_path_suffix = changeme
swift_hash_path_prefix = changeme
[storage-policy:0]
name = Policy-0
default = yes
aliases = yellow, orange
[swift-constraints]
5. 确认挂载点目录结构是否有合适的所有权:
# chown -R swift:swift /swift/node
6. 创建 “recon” 目录和确保它有合适的所有权:
# mkdir -p /var/cache/swift
# chown -R root:swift /var/cache/swift
# chmod -R 775 /var/cache/swift
# chown -R root:swift /etc/swift
<h2 id="4">4.Controller 节点创建,分发并初始化 rings</h2>
1. 创建账户 ring
1 .切换到 ``/etc/swift``目录。创建基本 account.builder 文件:
# cd /etc/swift
# swift-ring-builder account.builder create 18 1 1
2 .添加每个节点到 ring 中:
# swift-ring-builder account.builder add --region 1 --zone 1 --ip 192.168.100.20 --port 6002 --device sdc1 --weight 100
3 .验证ring内容
# swift-ring-builder account.builder
4 .平衡ring
# swift-ring-builder account.builder rebalance
2. 创建 ring 容器
1 .切换到 `` /etc/swift`` 目录。创建基本`` container.builder`` 文件:
# cd /etc/swift
# swift-ring-builder container.builder create 10 1 1
2 .添加每个节点到 ring 中:
# swift-ring-builder container.builder add --region 1 --zone 1 --ip 192.168.100.20 --port 6001 --device sdc1 --weight 100
3 .验证 ring 的内容:
# swift-ring-builder container.builder
4 .平衡 ring:
# swift-ring-builder container.builder rebalance
3. 创建 Ring 对象
1 .切换到 `` /etc/swift`` 目录。创建基本`` object.builder`` 文件:
# swift-ring-builder object.builder create 10 1 1
2 .添加每个节点到 ring 中:
# swift-ring-builder object.builder add --region 1 --zone 1 --ip 192.168.100.20 --port 6000 --device sdc1 --weight 100
3 .验证 ring 的内容:
# swift-ring-builder object.builder
4 .平衡 ring:
# swift-ring-builder object.builder rebalance
4.Compute 节点复制 Controller 的配置文件
复制`` account.ring.gz`` ,container.ring.gz`` 和`` object.ring.gz 文件到每个存储节点和其他运行了代理服务的额外节点的 /etc/swift 目录。
[root@compute ~]# scp controller:/etc/swift/*.ring.gz /etc/swift/
<h2 id="5">5. 启动服务 </h2>
1. 在控制节点 Controller
上,启动对象存储代理服务及其依赖服务,并将它们配置为随系统启动:
# systemctl start openstack-swift-proxy .service memcached .service
# systemctl enable openstack-swift-proxy .service memcached .service
2. 在存储节点 Compute
上,启动对象存储服务,并将其设置为随系统启动
# systemctl start openstack-swift-account .service openstack-swift-account-auditor .service openstack-swift-account-reaper .service openstack-swift-account-replicator .service
# systemctl enable openstack-swift-account .service openstack-swift-account-auditor .service openstack-swift-account-reaper .service openstack-swift-account-replicator .service
# systemctl start openstack-swift-container .service openstack-swift-container-auditor .service openstack-swift-container-replicator .service openstack-swift-container-updater .service
# systemctl enable openstack-swift-container .service openstack-swift-container-auditor .service openstack-swift-container-replicator .service openstack-swift-container-updater .service
# systemctl start openstack-swift-object .service openstack-swift-object-auditor .service openstack-swift-object-replicator .service openstack-swift-object-updater .service
# systemctl enable openstack-swift-object .service openstack-swift-object-auditor .service openstack-swift-object-replicator .service openstack-swift-object-updater .service
<h2 id="6">6.Controller 执行验证操作 </h2>
1. 导入 demo 凭证
# . /root/demo-openrc
2. 显示服务状态:
# swift stat
3. 创建容器 container1
# openstack container create container1
4. 上传一个测试文件到 container1
容器
# openstack object create container1 /root/demo-openrc
5. 列出 container1
容器里的所有文件
# openstack object list container1
6. 从 container1
容器里下载一个测试文件
# openstack object save container1 /root/demo-openrc
iOS Swift 应用程序随机 EXC_BAD_ACCESS 崩溃:swift_bridgeObjectRetain swift_retain swift::RefCounts 如何解决iOS Swift 应用程序随机 EXC_BAD_ACCESS 崩溃:swift_bridgeObjectRetain swift_retain swift::RefCounts<swift::RefCountBitsT<(swift::RefCountInlinedness)1>
我不断收到来自随机用户的随机崩溃报告。不幸的是,我无法定期重现这一点。用户说崩溃是在 discussionViewController
中随机发生的。所有崩溃报告都有类似的内容:
0 libswiftCore.dylib 0x00000001a53face4 swift::RefCounts<swift::RefCountBitsT<(swift::RefCountInlinedness)1> >::incrementSlow(swift::RefCountBitsT<(swift::RefCountInlinedness)1>,unsigned int) + 60 (atomic:1003)
1 libswiftCore.dylib 0x00000001a53c59e0 swift_retain + 124 (RefCount.h:813)
2 libswiftCore.dylib 0x00000001a5401d60 swift_bridgeObjectRetain + 56 (SwiftObject.mm:585)
3 APPNAME 0x0000000102b59734 closure #1 in discussionViewController.fetchPostData() + 7916
这是完整的崩溃日志和崩溃的线程:
Hardware Model: iphone11,6
Process: APPNAME [11770]
Path: /private/var/containers/Bundle/Application/.../APPNAME.app/APPNAME
Identifier: ----
Version: 62 (62)
AppStoretools: 12E262
AppVariant: 1:iphone11,6:13
Code Type: ARM-64 (Native)
Role: Foreground
Parent Process: launchd [1]
Coalition: ---- [1824]
Date/Time: 2021-06-17 12:07:01.4346 +1000
Launch Time: 2021-06-17 12:06:56.4993 +1000
OS Version: iPhone OS 14.6 (18F72)
Release Type: User
Baseband Version: 3.04.01
Report Version: 104
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x8000000000000010 -> 0x0000000000000010 (possible pointer authentication failure)
VM Region Info: 0x10 is not in any region. Bytes before following region: 4339515376
REGION TYPE START - END [ VSIZE] PRT/MAX SHRMOD REGION DETAIL
UNUSED SPACE AT START
--->
__TEXT 102a7c000-102a94000 [ 96K] r-x/r-x SM=COW ...APPNAME.app/APPNAME
Termination Signal: Segmentation fault: 11
Termination Reason: Namespace SIGNAL,Code 0xb
Terminating Process: exc handler [11770]
Triggered by Thread: 3
Thread 3 name:
Thread 3 Crashed:
0 libswiftCore.dylib 0x00000001a53face4 swift::RefCounts<swift::RefCountBitsT<(swift::RefCountInlinedness)1> >::incrementSlow(swift::RefCountBitsT<(swift::RefCountInlinedness)1>,unsigned int) + 60 (atomic:1003)
1 libswiftCore.dylib 0x00000001a53c59e0 swift_retain + 124 (RefCount.h:813)
2 libswiftCore.dylib 0x00000001a5401d60 swift_bridgeObjectRetain + 56 (SwiftObject.mm:585)
3 APPNAME 0x0000000102b59734 closure #1 in discussionViewController.fetchPostData() + 7916
4 APPNAME 0x0000000102ad09d4 thunk for @escaping @callee_guaranteed (@guaranteed Data?,@guaranteed NSURLResponse?,@guaranteed Error?) -> () + 132 (<compiler-generated>:0)
5 CFNetwork 0x00000001a1b0a3dc __40-[__NSURLSessionLocal taskForClassInfo:]_block_invoke + 540 (LocalSession.mm:687)
6 CFNetwork 0x00000001a1b1c768 __49-[__NSCFLocalSessionTask _task_onqueue_didFinish]_block_invoke + 244 (LocalSessionTask.mm:584)
7 libdispatch.dylib 0x00000001a10d1a84 _dispatch_call_block_and_release + 32 (init.c:1466)
8 libdispatch.dylib 0x00000001a10d381c _dispatch_client_callout + 20 (object.m:559)
9 libdispatch.dylib 0x00000001a10db004 _dispatch_lane_serial_drain + 620 (inline_internal.h:2557)
10 libdispatch.dylib 0x00000001a10dbc34 _dispatch_lane_invoke + 456 (queue.c:3862)
11 libdispatch.dylib 0x00000001a10e64bc _dispatch_workloop_worker_thread + 764 (queue.c:6589)
12 libsystem_pthread.dylib 0x00000001ed04a7a4 0x1ed047000 + 14244
13 libsystem_pthread.dylib 0x00000001ed05174c 0x1ed047000 + 42828
我已验证 discussionViewController.fetchPostData()
不会强制解开任何可选选项,没有 try!
并且在任何地方都使用 [weak self]
和 self?
。该函数非常大,所以我很难缩小崩溃发生的范围。
memcached-session-manager 实现 Tomcat Session 存储策略
高春辉、王春生、朱峰:关于开源创业的 15 件小事
https://github.com/magro/memcached-session-manager
Openstack Image - 如何通过上次使用删除 openstack 映像? 如何解决Openstack Image - 如何通过上次使用删除 openstack 映像?
我正在编写一个 python 脚本来根据上次访问日期删除 openstack 图像。
但是从图像对象openstack.image.v2.image.Image 的文档中我只能得到图像的updated_at 和created_at 日期而不是上次访问的日期。
有没有其他方法可以获得图像的最后访问日期?
任何帮助/建议都会有所帮助。
谢谢。
解决方法
“上次访问日期图像”是指哪个正在运行的实例使用该图像?以及何时创建该实例?
今天关于OpenStack Swift 存储策略 和openstack中的swift 的分享就到这里,希望大家有所收获,若想了解更多关于(九) OpenStack---M 版 --- 双节点搭建 ---Swift (单节点) 安装和配置、iOS Swift 应用程序随机 EXC_BAD_ACCESS 崩溃:swift_bridgeObjectRetain swift_retain swift::RefCounts、memcached-session-manager 实现 Tomcat Session 存储策略、Openstack Image - 如何通过上次使用删除 openstack 映像? 等相关知识,可以在本站进行查询。