<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.openstack.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Romain.le-disez</id>
		<title>OpenStack - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.openstack.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Romain.le-disez"/>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/wiki/Special:Contributions/Romain.le-disez"/>
		<updated>2026-07-08T21:11:02Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.28.2</generator>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Meetings/Swift&amp;diff=174737</id>
		<title>Meetings/Swift</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Meetings/Swift&amp;diff=174737"/>
				<updated>2020-05-03T23:37:41Z</updated>
		
		<summary type="html">&lt;p&gt;Romain.le-disez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''2100 UTC Meeting'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Next meeting:''' May 6, 2020&lt;br /&gt;
|-&lt;br /&gt;
| '''Chair:''' timburke&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;!-- List 2100UTC meeting items below here --&amp;gt;&lt;br /&gt;
* How quickly can swift-get-nodes expect/require quoted by default&lt;br /&gt;
** https://review.opendev.org/#/c/724141/&lt;br /&gt;
* S3 MPU delete request amplification&lt;br /&gt;
* Virtual PTG&lt;br /&gt;
** https://etherpad.openstack.org/p/swift-ptg-victoria&lt;br /&gt;
* object-updater issues/strategy (rledisez)&lt;br /&gt;
** https://review.opendev.org/#/c/571917/&lt;br /&gt;
** https://review.opendev.org/#/c/724943/&lt;br /&gt;
* On-going work&lt;br /&gt;
** LOSF updates (alecuyer, rledisez)&lt;br /&gt;
*** https://wiki.openstack.org/wiki/Swift/ideas/small_files/implementation#LOSF_v2&lt;br /&gt;
** python-swiftclient py2 socket leak&lt;br /&gt;
*** http://lists.openstack.org/pipermail/openstack-discuss/2020-April/014221.html&lt;br /&gt;
*** https://bugs.launchpad.net/python-swiftclient/+bug/1873435&lt;br /&gt;
*** https://review.opendev.org/#/c/721051/&lt;br /&gt;
** s3api + versioning&lt;br /&gt;
*** https://review.opendev.org/#/c/722552/&lt;br /&gt;
** versioning + container ACLs&lt;br /&gt;
*** https://review.opendev.org/#/c/724393/&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
** jerasure support in libec&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- End 2100UTC meeting items --&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Meeting Logs''' || http://eavesdrop.openstack.org/meetings/swift/2020/&lt;br /&gt;
|-&lt;br /&gt;
|'''Useful Commands'''|| #link #info #agreed #topic and #startmeeting&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
When adding an item, please include your IRC nickname with it.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Category:ObjectStorage]]&lt;/div&gt;</summary>
		<author><name>Romain.le-disez</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Meetings/Swift&amp;diff=174342</id>
		<title>Meetings/Swift</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Meetings/Swift&amp;diff=174342"/>
				<updated>2020-03-25T20:28:48Z</updated>
		
		<summary type="html">&lt;p&gt;Romain.le-disez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''2100 UTC Meeting'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Next meeting:''' March 25, 2020&lt;br /&gt;
|-&lt;br /&gt;
| '''Chair:''' timburke&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;!-- List 2100UTC meeting items below here --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* User survey&lt;br /&gt;
** https://www.openstack.org/user-survey/survey-2020/&lt;br /&gt;
* 10 years of OpenStack survey&lt;br /&gt;
** http://lists.openstack.org/pipermail/openstack-discuss/2020-March/013577.html&lt;br /&gt;
* Virtual PTG&lt;br /&gt;
** https://etherpad.openstack.org/p/swift-ptg-victoria&lt;br /&gt;
* updates&lt;br /&gt;
** Object GET timings, EC, and concurrent GETs (clayg)&lt;br /&gt;
** LOSF updates (alecuyer, rledisez)&lt;br /&gt;
*** https://wiki.openstack.org/wiki/Swift/ideas/small_files/implementation#LOSF_v2&lt;br /&gt;
** CORS (timburke)&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
** jerasure support in libec&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- End 2100UTC meeting items --&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Meeting Logs''' || http://eavesdrop.openstack.org/meetings/swift/2020/&lt;br /&gt;
|-&lt;br /&gt;
|'''Useful Commands'''|| #link #info #agreed #topic and #startmeeting&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
When adding an item, please include your IRC nickname with it.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Category:ObjectStorage]]&lt;/div&gt;</summary>
		<author><name>Romain.le-disez</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Meetings/Swift&amp;diff=174237</id>
		<title>Meetings/Swift</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Meetings/Swift&amp;diff=174237"/>
				<updated>2020-03-18T18:37:05Z</updated>
		
		<summary type="html">&lt;p&gt;Romain.le-disez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''2100 UTC Meeting'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Next meeting:''' March 18, 2020&lt;br /&gt;
|-&lt;br /&gt;
| '''Chair:''' timburke&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;!-- List 2100UTC meeting items below here --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Object GET timings, EC, and concurrent GETs (clayg)&lt;br /&gt;
* LOSF updates (rledisez)&lt;br /&gt;
** https://wiki.openstack.org/wiki/Swift/ideas/small_files/implementation#LOSF_v2&lt;br /&gt;
* CORS (timburke)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- End 2100UTC meeting items --&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Meeting Logs''' || http://eavesdrop.openstack.org/meetings/swift/2020/&lt;br /&gt;
|-&lt;br /&gt;
|'''Useful Commands'''|| #link #info #agreed #topic and #startmeeting&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
When adding an item, please include your IRC nickname with it.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Category:ObjectStorage]]&lt;/div&gt;</summary>
		<author><name>Romain.le-disez</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Meetings/Swift&amp;diff=174120</id>
		<title>Meetings/Swift</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Meetings/Swift&amp;diff=174120"/>
				<updated>2020-03-04T17:23:20Z</updated>
		
		<summary type="html">&lt;p&gt;Romain.le-disez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''2100 UTC Meeting'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Next meeting:''' March 4, 2020&lt;br /&gt;
|-&lt;br /&gt;
| '''Chair:''' timburke&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;!-- List 2100UTC meeting items below here --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Vancouver PTG (June 8-11)&lt;br /&gt;
** https://www.openstack.org/events/opendev-ptg-2020/&lt;br /&gt;
* Object GET timings, EC, and concurrent GETs&lt;br /&gt;
* Should we add random delay when returning 503&lt;br /&gt;
* LOSF updates (rledisez)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- End 2100UTC meeting items --&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Meeting Logs''' || http://eavesdrop.openstack.org/meetings/swift/2020/&lt;br /&gt;
|-&lt;br /&gt;
|'''Useful Commands'''|| #link #info #agreed #topic and #startmeeting&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
When adding an item, please include your IRC nickname with it.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Category:ObjectStorage]]&lt;/div&gt;</summary>
		<author><name>Romain.le-disez</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Meetings/Swift&amp;diff=173394</id>
		<title>Meetings/Swift</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Meetings/Swift&amp;diff=173394"/>
				<updated>2019-12-11T14:51:44Z</updated>
		
		<summary type="html">&lt;p&gt;Romain.le-disez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''2100 UTC Meeting'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Next meeting:''' December 4, 2019&lt;br /&gt;
|-&lt;br /&gt;
| '''Chair:''' timburke&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;!-- List 2100UTC meeting items below here --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* updates&lt;br /&gt;
** versioning&lt;br /&gt;
*** https://etherpad.openstack.org/p/swift-object-versioning&lt;br /&gt;
*** https://etherpad.openstack.org/p/swift-null-namespace&lt;br /&gt;
** lots of &amp;lt;s&amp;gt;small&amp;lt;/s&amp;gt; files&lt;br /&gt;
** profiling -- [https://etherpad.openstack.org/p/swift-profiling etherpad] (rledisez)&lt;br /&gt;
** md5 optimisation -- [https://etherpad.openstack.org/p/swift-md5-optimisation etherpad] (rledisez)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- End 2100UTC meeting items --&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Meeting Logs''' || http://eavesdrop.openstack.org/meetings/swift/2019/&lt;br /&gt;
|-&lt;br /&gt;
|'''Useful Commands'''|| #link #info #agreed #topic and #startmeeting&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
When adding an item, please include your IRC nickname with it.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Category:ObjectStorage]]&lt;/div&gt;</summary>
		<author><name>Romain.le-disez</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Meetings/Swift&amp;diff=172926</id>
		<title>Meetings/Swift</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Meetings/Swift&amp;diff=172926"/>
				<updated>2019-10-30T14:07:30Z</updated>
		
		<summary type="html">&lt;p&gt;Romain.le-disez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''2100 UTC Meeting'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Next meeting:''' October 30, 2019&lt;br /&gt;
|-&lt;br /&gt;
| '''Chair:''' timburke&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;!-- List 2100UTC meeting items below here --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Shanghai&lt;br /&gt;
** [https://etherpad.openstack.org/p/swift-ptg-shanghai etherpad]&lt;br /&gt;
* [http://lists.openstack.org/pipermail/release-announce/2019-October/008047.html 2.23.1] (py3 fixes)&lt;br /&gt;
* More stable releases coming&lt;br /&gt;
* updates&lt;br /&gt;
** symlink-backed versioning&lt;br /&gt;
*** https://etherpad.openstack.org/p/swift-object-versioning&lt;br /&gt;
*** https://etherpad.openstack.org/p/swift-null-namespace&lt;br /&gt;
** lots of small files&lt;br /&gt;
** profiling ( https://etherpad.openstack.org/p/swift-profiling )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- End 2100UTC meeting items --&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Meeting Logs''' || http://eavesdrop.openstack.org/meetings/swift/2019/&lt;br /&gt;
|-&lt;br /&gt;
|'''Useful Commands'''|| #link #info #agreed #topic and #startmeeting&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
When adding an item, please include your IRC nickname with it.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Category:ObjectStorage]]&lt;/div&gt;</summary>
		<author><name>Romain.le-disez</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Meetings/Swift&amp;diff=168720</id>
		<title>Meetings/Swift</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Meetings/Swift&amp;diff=168720"/>
				<updated>2019-03-06T14:26:09Z</updated>
		
		<summary type="html">&lt;p&gt;Romain.le-disez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''2100 UTC Meeting'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Next meeting:''' March 13, 2019&lt;br /&gt;
|-&lt;br /&gt;
| '''Chair:''' notmyname&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;!-- List 2100UTC meeting items below here --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Follow-ups:&lt;br /&gt;
** status of devstack gate jobs on feature/lsof? (kota_)&lt;br /&gt;
** docs encouraging device names over labels or uuids? (rledisez)&lt;br /&gt;
* losf: replace grpc by http (alecuyer)&lt;br /&gt;
* updates (py3, lsof, etc)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- End 2100UTC meeting items --&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Meeting Logs''' || http://eavesdrop.openstack.org/meetings/swift/2019/&lt;br /&gt;
|-&lt;br /&gt;
|'''Useful Commands'''|| #link #info #agreed #topic and #startmeeting&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
When adding an item, please include your IRC nickname with it.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Category:ObjectStorage]]&lt;/div&gt;</summary>
		<author><name>Romain.le-disez</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Swift/PriorityReviews&amp;diff=168237</id>
		<title>Swift/PriorityReviews</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Swift/PriorityReviews&amp;diff=168237"/>
				<updated>2019-02-06T21:20:08Z</updated>
		
		<summary type="html">&lt;p&gt;Romain.le-disez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Swift Review Dashboard:''' http://not.mn/reviews.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Open patches that are running in production somewhere'''&lt;br /&gt;
&lt;br /&gt;
* https://review.openstack.org/#/c/333331/ (rledisez; need a rebase)&lt;br /&gt;
* https://review.openstack.org/#/c/337861/ (rledisez)&lt;br /&gt;
* https://review.openstack.org/#/c/548948/ (rledisez)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Priority reviews/bugs'''&lt;br /&gt;
&lt;br /&gt;
* '''Keymaster''' nice-to-have&lt;br /&gt;
** https://review.openstack.org/#/c/586903/ - Display crypto data/metadata details in swift-object-info&lt;br /&gt;
* '''General task queue''' work&lt;br /&gt;
** https://review.openstack.org/#/c/601950/&lt;br /&gt;
* '''Undelete accounts'''&lt;br /&gt;
** https://review.openstack.org/#/c/507808&lt;br /&gt;
&lt;br /&gt;
* '''Bugs'''&lt;br /&gt;
** Client may hold socket open after ChunkWriteTimeout&lt;br /&gt;
*** https://bugs.launchpad.net/swift/+bug/1572719 (high)&lt;br /&gt;
** Connection between client and proxy service does not close&lt;br /&gt;
*** https://bugs.launchpad.net/swift/+bug/1568650 (high)&lt;br /&gt;
*** Patch: https://review.openstack.org/#/c/575254/&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
'''Bug triage worksheet:''' https://etherpad.openstack.org/p/swift-bug-triage-list&lt;br /&gt;
&lt;br /&gt;
'''swiftclient bugs:''' https://goo.gl/uO4b7l  &amp;lt;-- bugs that are marked &amp;quot;New&amp;quot; and need triage&lt;br /&gt;
&lt;br /&gt;
'''swift bugs:''' https://goo.gl/LMiiDc  &amp;lt;-- bugs that are marked &amp;quot;New&amp;quot; and need triage&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
'''Swift Review Dashboard:''' http://not.mn/reviews.html&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Category:ObjectStorage]]&lt;/div&gt;</summary>
		<author><name>Romain.le-disez</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Swift/ideas&amp;diff=158922</id>
		<title>Swift/ideas</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Swift/ideas&amp;diff=158922"/>
				<updated>2018-01-15T08:39:23Z</updated>
		
		<summary type="html">&lt;p&gt;Romain.le-disez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Ideas for OpenStack Swift =&lt;br /&gt;
&lt;br /&gt;
This page is a collection of &amp;quot;brain dumps&amp;quot; for ideas about features in OpenStack Swift. If you're working on something, it's a very good idea to write down what you're thinking about. This lets others get up to speed, helps you collaborate, and serves as a great record for future reference. Write down your thoughts somewhere and put a link to it here. It doesn't matter what form your thoughts are in; use whatever is best for you. Your document should include why your idea is needed and your thoughts on particular design choices and tradeoffs. '''Please include some contact information''' (ideally, your IRC nick) so that people can collaborate with you.&lt;br /&gt;
&lt;br /&gt;
''Historic &amp;quot;specs&amp;quot; are available at https://specs.openstack.org/openstack/swift-specs/''&lt;br /&gt;
&lt;br /&gt;
== Ideas ==&lt;br /&gt;
&lt;br /&gt;
Format: '''Idea''' -- ''link to your brain dump''&lt;br /&gt;
&lt;br /&gt;
* '''Small file optimization''' -- [[Swift/ideas/small files]]&lt;br /&gt;
** '''Small files experimentations''' [[Swift/ideas/small files/experimentations]]&lt;br /&gt;
** '''Small files implementation''' [[Swift/ideas/small files/implementation]]&lt;br /&gt;
* '''Reduce memcache lookups''' -- [[Swift/ideas/memoize lookups]]&lt;br /&gt;
* '''Improve internal network security''' -- [[Swift/ideas/network_security]]&lt;br /&gt;
* '''Metrics around rate-limiting''' -- [[Swift/ideas/ratelimiting_metrics]]&lt;br /&gt;
* '''Hierarchical keymaster''' -- [[Swift/ideas/hierarchical_keymaster]]&lt;br /&gt;
* '''Container Sharding''' -- [https://docs.google.com/document/d/1-0wUnaRf2TTA0KQGk301BPR8-5wzuyA1r4tLSEh-cbw/edit?usp=sharing container-sharding.odt] [https://etherpad.openstack.org/p/container-sharding-SAT-2016 Etherpad notes] [https://trello.com/b/z6oKKI4Q/container-sharding trello] [https://docs.google.com/document/d/16rPdDrT-4G6hcen_6no8cr8KbxUqbcvsSkOfxxu0EBE/edit?usp=sharing Initial locking db shard approach idea] [https://docs.google.com/document/d/1dsROCHrgM0S_95bNp1BqD9DUUuQbkuoBxKkrhsNNeX0/edit?usp=sharing Sharder 2.0]&lt;br /&gt;
* '''High-latency media / Tape support for Swift''' -- [[Swift/HighLatencyMedia]]&lt;br /&gt;
* '''The Archival Storage extension to the Swift API''' -- [https://etherpad.openstack.org/p/high-latency-storage-policy]&lt;br /&gt;
* '''Symlinks''' -- https://etherpad.openstack.org/p/swift_symlinks&lt;br /&gt;
* '''Metadata index (Elasticsearch)''' -- [[Swift/ideas/metadata-sync]]&lt;br /&gt;
* '''Keymaster v2''' -- [[Swift/ideas/keymaster_v2]]&lt;br /&gt;
* '''oslo.config''' -- https://etherpad.openstack.org/p/swift_oslo-config&lt;br /&gt;
* '''Auto Tiering Basic Infra work''' -- https://etherpad.openstack.org/p/swift_tiering_foundational_work&lt;br /&gt;
* '''txt lookup middleware''' -- https://wiki.openstack.org/wiki/Swift/ideas/txt_lookup_middleware&lt;br /&gt;
* '''Tasks execution''' - [[Swift/ideas/task-execution]] [https://docs.google.com/document/d/11sBbB6pBvLYNeM9wjTdvvsJIu8Dl8i13UH2NfRVNOqg/edit?usp=sharing Expiring Objects - Task Queue]&lt;br /&gt;
* '''Moar Better Faster Rebalance (tsync)''' -- https://etherpad.openstack.org/p/swift-rebalance&lt;br /&gt;
* '''More disks in saio''' -- https://etherpad.openstack.org/p/more-disks-in-saio&lt;br /&gt;
* '''Update python-swiftclient with Keystone session support''' -- [[Swift/ideas/swiftclient-keystone-session]]&lt;br /&gt;
* '''Enable object path obfuscation in logs e.g. replace with hash''' - suggested here https://etherpad.openstack.org/p/BOS-Swift-ops-feedback-session&lt;br /&gt;
* '''Enable 'atime' for objects''' -- https://etherpad.openstack.org/p/atime_for_Swift&lt;br /&gt;
* '''Probe tests with more devices''' -- [[Swift/ideas/more-testing-devices]]&lt;br /&gt;
* '''Automatically set db_prealloc for account/containers based on if the drive is HDD or SDD'''&lt;br /&gt;
* '''Object copy directly between object-servers''' -- [[Swift/ideas/object-copy-between-object-servers]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Done:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;'''friendly tempurl timestamps''' -- https://blueprints.launchpad.net/swift/+spec/human-readable-tempurl-timestamp&lt;br /&gt;
* '''Composite Rings''' -- https://etherpad.openstack.org/p/composite_rings&lt;br /&gt;
&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Category:ObjectStorage]]&lt;/div&gt;</summary>
		<author><name>Romain.le-disez</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Swift/ideas/object-copy-between-object-servers&amp;diff=158921</id>
		<title>Swift/ideas/object-copy-between-object-servers</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Swift/ideas/object-copy-between-object-servers&amp;diff=158921"/>
				<updated>2018-01-15T08:38:08Z</updated>
		
		<summary type="html">&lt;p&gt;Romain.le-disez: Created page with &amp;quot;== Problem == When a proxy-server executes multiple COPY requests, its network interface bandwidth can easily saturate in case of replica policy. For an EC policy, it can cons...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Problem ==&lt;br /&gt;
When a proxy-server executes multiple COPY requests, its network interface bandwidth can easily saturate in case of replica policy. For an EC policy, it can consume a lot of CPU power.&lt;br /&gt;
&lt;br /&gt;
Example: with a 10Gbps NIC and a 3-replica policy, reading at 1Gbps, writing at 3Gbps, only 3 COPY can happens at the same time without contention.&lt;br /&gt;
&lt;br /&gt;
== Proposed solution ==&lt;br /&gt;
The object copy could take place directly between object-servers. I guess there is generally more network capacity at object-servers than at proxy-servers.&lt;br /&gt;
&lt;br /&gt;
For replica policy, each replica could be copied to the corresponding object-server. For EC policy, each fragment could be copied to the corresponding object-server&lt;br /&gt;
&lt;br /&gt;
Contact: rledisez on IRC&lt;/div&gt;</summary>
		<author><name>Romain.le-disez</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Meetings/Swift&amp;diff=154386</id>
		<title>Meetings/Swift</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Meetings/Swift&amp;diff=154386"/>
				<updated>2017-05-30T19:17:12Z</updated>
		
		<summary type="html">&lt;p&gt;Romain.le-disez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Meeting Time''' || Every Wednesday at 21:00 UTC in #openstack-meeting&lt;br /&gt;
|-&lt;br /&gt;
| '''Meeting Logs''' || http://eavesdrop.openstack.org/meetings/swift/2017/&lt;br /&gt;
|-&lt;br /&gt;
| '''Chair''' || notmyname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Meeting Time''' || Every Other Wednesday at 07:00 UTC in #openstack-meeting&lt;br /&gt;
|-&lt;br /&gt;
| '''Meeting Logs''' || http://eavesdrop.openstack.org/meetings/swift/2017/&lt;br /&gt;
|-&lt;br /&gt;
| '''Chair''' || mahatic, others&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Next meeting:''' May 31, 2017&lt;br /&gt;
&lt;br /&gt;
'''Agenda for 0700 meeting'''&lt;br /&gt;
* Rotating Chair&lt;br /&gt;
* Priority review patches that didn't have a turnaround in over a month&lt;br /&gt;
** https://review.openstack.org/#/c/289664/&lt;br /&gt;
** https://review.openstack.org/#/c/371150/&lt;br /&gt;
** https://review.openstack.org/#/c/456921/&lt;br /&gt;
&lt;br /&gt;
* Drop translation that's causing bugs&lt;br /&gt;
** https://bugs.launchpad.net/swift/+bug/1580678&lt;br /&gt;
** https://review.openstack.org/#/c/339360/1&lt;br /&gt;
&lt;br /&gt;
* Open Discussion&lt;br /&gt;
&lt;br /&gt;
'''Agenda for 2100UTC meeing'''&lt;br /&gt;
&lt;br /&gt;
* Deprecate the crappy stuff&lt;br /&gt;
** https://review.openstack.org/#/c/468105/ (bad ec policies - timburke, clayg)&lt;br /&gt;
&lt;br /&gt;
* Follow-up from last week&lt;br /&gt;
** TC goals&lt;br /&gt;
*** support wsgi -- https://governance.openstack.org/tc/goals/pike/deploy-api-in-wsgi.html&lt;br /&gt;
*** py3 -- https://governance.openstack.org/tc/goals/pike/python35.html&lt;br /&gt;
*** we need to write down any plans or blockers and track any progress for this&lt;br /&gt;
** LOSF memory usage tests (many vs few volumes/slabs/journals/logs)&lt;br /&gt;
*** https://etherpad.openstack.org/p/swift-losf-meta-storage&lt;br /&gt;
*** mailing list discussion started&lt;br /&gt;
** composite ring&lt;br /&gt;
** Swift on Containers update [cschwede_ tdasilva zaitcev patch 466255]&lt;br /&gt;
** comment from Christian on the lstat() call&lt;br /&gt;
* How was the first new meeting time?&lt;br /&gt;
** Wednesdays at 0700UTC, starting next week&lt;br /&gt;
** mahatic as initial chair, likely rotate&lt;br /&gt;
* Open Discussion&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Notes left from earlier'''&lt;br /&gt;
&lt;br /&gt;
* Things happening in Swift&lt;br /&gt;
** golang object server&lt;br /&gt;
** global ec&lt;br /&gt;
** composite rings&lt;br /&gt;
** policy migration&lt;br /&gt;
** policy auto tiering&lt;br /&gt;
** sync to elasticsearch&lt;br /&gt;
** container sharding&lt;br /&gt;
** symlinks&lt;br /&gt;
** increase part power&lt;br /&gt;
** container sharding&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When adding an item, please include your IRC nickname with it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Category:ObjectStorage]]&lt;/div&gt;</summary>
		<author><name>Romain.le-disez</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Meetings/Swift&amp;diff=154034</id>
		<title>Meetings/Swift</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Meetings/Swift&amp;diff=154034"/>
				<updated>2017-05-11T21:12:58Z</updated>
		
		<summary type="html">&lt;p&gt;Romain.le-disez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Meeting Time''' || Every Wednesday at 21:00 UTC in #openstack-meeting&lt;br /&gt;
|-&lt;br /&gt;
| '''Meeting Logs''' || http://eavesdrop.openstack.org/meetings/swift/2017/&lt;br /&gt;
|-&lt;br /&gt;
| '''Chair''' || notmyname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''skip May 10 in lieu of the summit'''&lt;br /&gt;
&lt;br /&gt;
'''Next meeting:''' May 17, 2017 2100 UTC (t-minus 1.5 wks to Boston)&lt;br /&gt;
&lt;br /&gt;
* Summit summary?&lt;br /&gt;
* Follow-up from last week&lt;br /&gt;
** TC goals&lt;br /&gt;
*** support wsgi -- https://governance.openstack.org/tc/goals/pike/deploy-api-in-wsgi.html&lt;br /&gt;
*** py3 -- https://governance.openstack.org/tc/goals/pike/python35.html&lt;br /&gt;
*** we need to write down any plans or blockers and track any progress for this&lt;br /&gt;
* In the LOSF optimization, where do we store the meta data, K/V or volume? (rledisez)&lt;br /&gt;
** https://etherpad.openstack.org/p/swift-losf-meta-storage &lt;br /&gt;
* Open Discussion&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Notes left from earlier'''&lt;br /&gt;
&lt;br /&gt;
* Things happening in Swift&lt;br /&gt;
** golang object server&lt;br /&gt;
** global ec&lt;br /&gt;
** composite rings&lt;br /&gt;
** policy migration&lt;br /&gt;
** policy auto tiering&lt;br /&gt;
** sync to elasticsearch&lt;br /&gt;
** container sharding&lt;br /&gt;
** symlinks&lt;br /&gt;
** increase part power&lt;br /&gt;
** container sharding&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When adding an item, please include your IRC nickname with it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Category:ObjectStorage]]&lt;/div&gt;</summary>
		<author><name>Romain.le-disez</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Meetings/Swift&amp;diff=152645</id>
		<title>Meetings/Swift</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Meetings/Swift&amp;diff=152645"/>
				<updated>2017-03-22T17:31:08Z</updated>
		
		<summary type="html">&lt;p&gt;Romain.le-disez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Meeting Time''' || Every Wednesday at 21:00 UTC in #openstack-meeting&lt;br /&gt;
|-&lt;br /&gt;
| '''Meeting Logs''' || http://eavesdrop.openstack.org/meetings/swift/2017/&lt;br /&gt;
|-&lt;br /&gt;
| '''Chair''' || notmyname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Next meeting:''' March 22, 2017 2100 UTC&lt;br /&gt;
&lt;br /&gt;
* Follow-up from last week&lt;br /&gt;
** object server tests scratch pad: done! https://etherpad.openstack.org/p/swift-object-server-tests&lt;br /&gt;
** Undelete accounts patch, needs eyes from a &amp;quot;new API&amp;quot; perspective. https://review.openstack.org/#/c/445160/&lt;br /&gt;
** https://review.openstack.org/#/c/444604/ closes critical bug https://bugs.launchpad.net/swift/+bug/1657246&lt;br /&gt;
*** done! (but notmyname will backport)&lt;br /&gt;
** Composite rings - how best to expose composite ring building as CLI?&lt;br /&gt;
*** https://etherpad.openstack.org/p/composite_rings&lt;br /&gt;
* FYI stuff&lt;br /&gt;
** nightly gate stable branch failures [timburke]&lt;br /&gt;
** assert:never-breaks-compat TC resolution&lt;br /&gt;
*** https://review.openstack.org/#/c/446561/&lt;br /&gt;
*** do we want to assert this for Swift?&lt;br /&gt;
** Boston Forum topics https://etherpad.openstack.org/p/BOS-Swift-brainstorming&lt;br /&gt;
*** need to be on the etherpad this week!&lt;br /&gt;
* Agnostic implementation for &amp;quot;object store&amp;quot; (a.k.a. diskfile) (alecuyer)&lt;br /&gt;
** Etherpad link : https://etherpad.openstack.org/p/swift-losf-base&lt;br /&gt;
* Idea: call your patches&lt;br /&gt;
* Open Discussion&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Notes left from earlier'''&lt;br /&gt;
&lt;br /&gt;
* Things happening in Swift&lt;br /&gt;
** golang object server&lt;br /&gt;
** global ec&lt;br /&gt;
** composite rings&lt;br /&gt;
** policy migration&lt;br /&gt;
** policy auto tiering&lt;br /&gt;
** sync to elasticsearch&lt;br /&gt;
** container sharding&lt;br /&gt;
** symlinks&lt;br /&gt;
** increase part power&lt;br /&gt;
** container sharding&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When adding an item, please include your IRC nickname with it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Category:ObjectStorage]]&lt;/div&gt;</summary>
		<author><name>Romain.le-disez</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Meetings/Swift&amp;diff=152523</id>
		<title>Meetings/Swift</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Meetings/Swift&amp;diff=152523"/>
				<updated>2017-03-21T09:34:08Z</updated>
		
		<summary type="html">&lt;p&gt;Romain.le-disez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Meeting Time''' || Every Wednesday at 21:00 UTC in #openstack-meeting&lt;br /&gt;
|-&lt;br /&gt;
| '''Meeting Logs''' || http://eavesdrop.openstack.org/meetings/swift/2017/&lt;br /&gt;
|-&lt;br /&gt;
| '''Chair''' || notmyname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Next meeting:''' March 22, 2017 2100 UTC&lt;br /&gt;
&lt;br /&gt;
* Follow-up from last week&lt;br /&gt;
** Undelete accounts patch, needs eyes from a &amp;quot;new API&amp;quot; perspective. https://review.openstack.org/#/c/445160/&lt;br /&gt;
** https://review.openstack.org/#/c/444604/ closes critical bug https://bugs.launchpad.net/swift/+bug/1657246&lt;br /&gt;
** Composite rings - how best to expose composite ring building as CLI?&lt;br /&gt;
*** etherpad https://etherpad.openstack.org/p/composite_rings&lt;br /&gt;
* Idea: call your patches&lt;br /&gt;
* FYI stuff&lt;br /&gt;
** nightly gate stable branch failures [timburke]&lt;br /&gt;
** assert:never-breaks-compat TC resolution&lt;br /&gt;
*** https://review.openstack.org/#/c/446561/&lt;br /&gt;
*** do we want to assert this for Swift?&lt;br /&gt;
* Agnostic implementation for &amp;quot;object store&amp;quot; (a.k.a. diskfile) (alecuyer)&lt;br /&gt;
** Patch: &amp;lt;url&amp;gt;&lt;br /&gt;
** Goal: having an agnostic interface for DiskFileManager&lt;br /&gt;
*** eg: _get_hashes(self, partition_path, ...) =&amp;gt; _get_hashes(self, device, policy, partition, ...)&lt;br /&gt;
** Goal is not to have a &amp;quot;supported&amp;quot; interface that must be stable. Goal is just to ease the implementation of non-filesystem based diskfile&lt;br /&gt;
** Naming idea: BaseObjectStoreManager -&amp;gt; provide an interface and very generic method&lt;br /&gt;
*** BaseDiskFileManager inherit from BaseObjectStoreManager&lt;br /&gt;
*** LOSF inherit from BaseObjectStoreManager&lt;br /&gt;
** Convert non-agnostic method from BaseDiskFileManager to agnostic method in BaseObjectStoreManager by replacing listdir(path) by list(device, policy, partition=None, sfx=None, ohash=None), list() would be implementation-specific&lt;br /&gt;
* Open Discussion&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Notes left from earlier'''&lt;br /&gt;
&lt;br /&gt;
* Things happening in Swift&lt;br /&gt;
** golang object server&lt;br /&gt;
** global ec&lt;br /&gt;
** composite rings&lt;br /&gt;
** policy migration&lt;br /&gt;
** policy auto tiering&lt;br /&gt;
** sync to elasticsearch&lt;br /&gt;
** container sharding&lt;br /&gt;
** symlinks&lt;br /&gt;
** increase part power&lt;br /&gt;
** container sharding&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When adding an item, please include your IRC nickname with it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Category:ObjectStorage]]&lt;/div&gt;</summary>
		<author><name>Romain.le-disez</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Swift/ideas/small_files/implementation&amp;diff=151470</id>
		<title>Swift/ideas/small files/implementation</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Swift/ideas/small_files/implementation&amp;diff=151470"/>
				<updated>2017-02-24T16:00:38Z</updated>
		
		<summary type="html">&lt;p&gt;Romain.le-disez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The purpose of this page is to describe the proposed implementation with some benchmarks. Please note the implementation is at early stage, as the benchmarks.&lt;br /&gt;
&lt;br /&gt;
Code: https://review.openstack.org/#/c/436406/&lt;br /&gt;
Slides: https://www.slideshare.net/rledisez/slide-smallfiles&lt;br /&gt;
&lt;br /&gt;
=== Problem we want to address ===&lt;br /&gt;
A swift object uses at least one inode on the filesystem. For clusters with many small files (say, 10 million objects per disk) the performance degradation is important, as the directory structure does not fit in memory. Replication / auditor operations trigger a lot of IO. Over 40% of disk activity may be caused by &amp;quot;listdir&amp;quot; operations. The goal is to serve listdir operations without any disk IO.&lt;br /&gt;
&lt;br /&gt;
=== Principle ===&lt;br /&gt;
Store swift objects in large files, as haystack does. We do not need all the information stored in an inode (owner, group..). Make the &amp;quot;inode&amp;quot; as small as possible so that listdir requests can be served from memory. These &amp;quot;inodes&amp;quot; will be stored in a key value store, per disk, to ease cluster maintenance.&lt;br /&gt;
The &amp;quot;volumes&amp;quot; (actual large files on disk) are currently tied to a partition, which makes moving a parition easy (but changing the partition bit count harder)&lt;br /&gt;
&lt;br /&gt;
=== Implementation ===&lt;br /&gt;
Two parts :&lt;br /&gt;
* swift patches, mostly to diskfile.py, which is patched to use the &amp;quot;vfile&amp;quot; module, providing file like semantics for &amp;quot;virtual files&amp;quot; within volumes.&lt;br /&gt;
* the key value store, based on leveldb, written in golang.&lt;br /&gt;
&lt;br /&gt;
Those two parts communicates over RPC on a socket (using gRPC)&lt;br /&gt;
&lt;br /&gt;
Volumes are always appended to, and data is fsync()ed. The key value store is written to asynchronously. In case of a crash, the end of the volume should be read and checked against the KV to update missing objects.&lt;br /&gt;
&lt;br /&gt;
When files are deleted, the corresponding hole in the volume is punched using fallocate(). 4k aligned blocks will be returned to the filesystem, which means we should not have to recreate/defragment a volume file very often. (on initial open(), XFS will need to read in all extents, so it will still be needed at some point).&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
serving a PUT request&lt;br /&gt;
instead of creating a temp file and renaming it :&lt;br /&gt;
* check in the partition directory if a volume already exists and is not locked. If needed, create one and register it in the KV&lt;br /&gt;
* lock the volume and write the object at the end of the volume. when swift closes the &amp;quot;file&amp;quot;, seek back and write the object header for which we have reserved space, and fsync() the volume.&lt;br /&gt;
* register the file in the KV&lt;br /&gt;
&lt;br /&gt;
serving a GET request&lt;br /&gt;
* get the object location (volume index, offset in the volume) from the KV&lt;br /&gt;
* open the partition directory, open the volume file, serve the object.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Preliminary test results ===&lt;br /&gt;
We have not yet tested the pathological case we see in production with replication.&lt;br /&gt;
Hardware setup :&lt;br /&gt;
Atom C2750 2.40Ghz&lt;br /&gt;
16GB RAM&lt;br /&gt;
Drives : HGST HUS726040ALA610 (4TB)&lt;br /&gt;
&lt;br /&gt;
3 drives per server, but the tests below exercise a single drive.&lt;br /&gt;
&lt;br /&gt;
==== Single threaded PUT from a machine to one patched object server, and an unpatched 2.12 server ====&lt;br /&gt;
(test using the object server API directly, no proxy server involved, objects are &amp;lt; 100 bytes)&lt;br /&gt;
&lt;br /&gt;
From zero to 4 millions objects, on one disk.&lt;br /&gt;
* 2.12 version : 3360 minutes (19,8 PUT/s)&lt;br /&gt;
* patched version : 2540 minutes (26,2 PUT/s) - About 42 bytes used in leveldb per object&lt;br /&gt;
&lt;br /&gt;
From 4 millions to 8 million objects&lt;br /&gt;
* 2.12 version : 3900 minutes (17 PUT/s)&lt;br /&gt;
* patched version : 1700 minutes (39,2 PUT/s) - faster, likely because most &amp;quot;volume files&amp;quot; have already been created (not measured, to be confirmed)&lt;br /&gt;
&lt;br /&gt;
The key value size for the disk at the end of the test is 320MB.&lt;br /&gt;
&lt;br /&gt;
==== Single threaded GET from a machine to one patched object server, and an unpatched 2.12 server. Both servers have 8 million objects on one disk. ====&lt;br /&gt;
* 2.12 version : 39 GET/s&lt;br /&gt;
* patched version : 93 GET/s&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Concurrent PUT requests, 20 per second, for 10 minutes, with &amp;quot;hot inode cache&amp;quot; ====&lt;br /&gt;
* 2.12 version response time distribution :&lt;br /&gt;
   Latencies     [mean, 50, 95, 99, max]  641.274117ms, 67.31248ms, 3.526835534s, 4.68917307s, 5.971909s&lt;br /&gt;
   100% success&lt;br /&gt;
&lt;br /&gt;
* patched version response time distribution :&lt;br /&gt;
   Latencies     [mean, 50, 95, 99, max]  82.581295ms, 50.487793ms, 261.475566ms, 615.565045ms, 1.245540101s&lt;br /&gt;
   success 100%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Concurrent PUT requests, 20 per second, for 10 minutes, after dropping vm cache ====&lt;br /&gt;
* 2.12 version response time distribution :&lt;br /&gt;
   Latencies     [mean, 50, 95, 99, max]  29.211369875s, 30.002788029s, 30.003025069s, 31.001143056s, 33.005231569s&lt;br /&gt;
   response below 30s: 6,11%&lt;br /&gt;
&lt;br /&gt;
* patched version response time distribution :&lt;br /&gt;
   Latencies     [mean, 50, 95, 99, max]  9.290393071s, 8.216053491s, 24.212567799s, 29.46094486s, 30.001358218s&lt;br /&gt;
   response below 30s: 99.26%&lt;/div&gt;</summary>
		<author><name>Romain.le-disez</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Swift/ideas/task-execution&amp;diff=151411</id>
		<title>Swift/ideas/task-execution</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Swift/ideas/task-execution&amp;diff=151411"/>
				<updated>2017-02-22T21:32:02Z</updated>
		
		<summary type="html">&lt;p&gt;Romain.le-disez: Created page with &amp;quot;== Goal == Scaling tasks execution to where data are (object-expirer, container-sync, auto-tiering, metadata-indexation, ...).   == Task Registration == Tasks is registered in...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Goal ==&lt;br /&gt;
Scaling tasks execution to where data are (object-expirer, container-sync, auto-tiering, metadata-indexation, ...). &lt;br /&gt;
&lt;br /&gt;
== Task Registration ==&lt;br /&gt;
Tasks is registered in containers of special accounts by the item-server. There is one account per couple (item, partition), so that each item-servers request only tasks for data they are holding. Containers names are feature dependents:&lt;br /&gt;
 .tasks-objects-42&lt;br /&gt;
   object-expirer-&amp;lt;timestamp&amp;gt;&lt;br /&gt;
   auto-tiering-&amp;lt;timestamp&amp;gt;&lt;br /&gt;
   metadata-indexation&lt;br /&gt;
&lt;br /&gt;
== Task execution ==&lt;br /&gt;
Each item-server fetch the tasks for the partition it is holding and execute them:&lt;br /&gt;
* account-server fetch tasks from .tasks-account-&amp;lt;part number&amp;gt;&lt;br /&gt;
* container-server fetch tasks from .tasks-container-&amp;lt;part number&amp;gt;&lt;br /&gt;
* object-server fetch tasks from .tasks-object-&amp;lt;part number&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Back filling ==&lt;br /&gt;
For feature that are enabled at account or container level (eg: metadata indexation), a task for backfilling is done at feature activation. eg: for metadata indexation, it creates a container task that ask for the creation of metadata-indexation tasks for rows N to M:&lt;br /&gt;
 .tasks-container-&amp;lt;container partition&amp;gt;&lt;br /&gt;
    metadata-indexation&lt;br /&gt;
        account/container/start_row-end_row&lt;br /&gt;
Once executed, we get a bunch of tasks:&lt;br /&gt;
 .tasks-object-&amp;lt;object partition&amp;gt;&lt;br /&gt;
    metadata-indexation&lt;br /&gt;
        account/container/object/timestamp&lt;br /&gt;
&lt;br /&gt;
Same applies to container-sync.&lt;/div&gt;</summary>
		<author><name>Romain.le-disez</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Swift/ideas&amp;diff=151410</id>
		<title>Swift/ideas</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Swift/ideas&amp;diff=151410"/>
				<updated>2017-02-22T21:30:19Z</updated>
		
		<summary type="html">&lt;p&gt;Romain.le-disez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Ideas for OpenStack Swift =&lt;br /&gt;
&lt;br /&gt;
This page is a collection of &amp;quot;brain dumps&amp;quot; for ideas about features in OpenStack Swift. If you're working on something, it's a very good idea to write down what you're thinking about. This lets others get up to speed, helps you collaborate, and serves as a great record for future reference. Write down your thoughts somewhere and put a link to it here. It doesn't matter what form your thoughts are in; use whatever is best for you. Your document should include why your idea is needed and your thoughts on particular design choices and tradeoffs. '''Please include some contact information''' (ideally, your IRC nick) so that people can collaborate with you.&lt;br /&gt;
&lt;br /&gt;
''Historic &amp;quot;specs&amp;quot; are available at https://specs.openstack.org/openstack/swift-specs/''&lt;br /&gt;
&lt;br /&gt;
== Ideas ==&lt;br /&gt;
&lt;br /&gt;
Format: '''Idea''' -- ''link to your brain dump''&lt;br /&gt;
&lt;br /&gt;
* '''Small file optimization''' -- [[Swift/ideas/small files]]&lt;br /&gt;
** '''Small files experimentations''' [[Swift/ideas/small files/experimentations]]&lt;br /&gt;
** '''Small files implementation''' [[Swift/ideas/small files/implementation]]&lt;br /&gt;
* '''Reduce memcache lookups''' -- [[Swift/ideas/memoize lookups]]&lt;br /&gt;
* '''Improve internal network security''' -- [[Swift/ideas/network_security]]&lt;br /&gt;
* '''Metrics around rate-limiting''' -- [[Swift/ideas/ratelimiting_metrics]]&lt;br /&gt;
* '''Hierarchical keymaster''' -- [[Swift/ideas/hierarchical_keymaster]]&lt;br /&gt;
* '''sync_method = repconn''' -- https://etherpad.openstack.org/p/hummingbird-replication-upgrade&lt;br /&gt;
* '''Container Sharding''' -- [https://docs.google.com/document/d/1-0wUnaRf2TTA0KQGk301BPR8-5wzuyA1r4tLSEh-cbw/edit?usp=sharing container-sharding.odt] [https://etherpad.openstack.org/p/container-sharding-SAT-2016 Etherpad notes] [https://trello.com/b/8p2iJ9RR/swift-container-sharding trello] [https://docs.google.com/document/d/16rPdDrT-4G6hcen_6no8cr8KbxUqbcvsSkOfxxu0EBE/edit?usp=sharing Initial locking db shard approach idea]&lt;br /&gt;
* '''High-latency media / Tape support for Swift''' -- [[Swift/HighLatencyMedia]]&lt;br /&gt;
* '''The Archival Storage extension to the Swift API''' -- [https://etherpad.openstack.org/p/high-latency-storage-policy]&lt;br /&gt;
* '''Symlinks''' -- https://etherpad.openstack.org/p/swift_symlinks&lt;br /&gt;
* '''Metadata index (Elasticsearch)''' -- [[Swift/ideas/metadata-sync]]&lt;br /&gt;
* '''Keymaster v2''' -- [[Swift/ideas/keymaster_v2]]&lt;br /&gt;
* '''oslo.config''' -- https://etherpad.openstack.org/p/swift_oslo-config&lt;br /&gt;
* '''Auto Tiering Basic Infra work''' -- https://etherpad.openstack.org/p/swift_tiering_foundational_work&lt;br /&gt;
* '''friendly tempurl timestamps''' -- https://blueprints.launchpad.net/swift/+spec/human-readable-tempurl-timestamp&lt;br /&gt;
* '''txt lookup middleware''' -- https://wiki.openstack.org/wiki/Swift/ideas/txt_lookup_middleware&lt;br /&gt;
* Tasks execution - [[Swift/ideas/task-execution]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Category:ObjectStorage]]&lt;/div&gt;</summary>
		<author><name>Romain.le-disez</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Swift/ideas/small_files/implementation&amp;diff=151367</id>
		<title>Swift/ideas/small files/implementation</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Swift/ideas/small_files/implementation&amp;diff=151367"/>
				<updated>2017-02-22T00:07:25Z</updated>
		
		<summary type="html">&lt;p&gt;Romain.le-disez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The purpose of this page is to describe the proposed implementation with some benchmarks. Please note the implementation is at early stage, as the benchmarks.&lt;br /&gt;
&lt;br /&gt;
Code: https://review.openstack.org/#/c/436406/&lt;br /&gt;
&lt;br /&gt;
=== Problem we want to address ===&lt;br /&gt;
A swift object uses at least one inode on the filesystem. For clusters with many small files (say, 10 million objects per disk) the performance degradation is important, as the directory structure does not fit in memory. Replication / auditor operations trigger a lot of IO. Over 40% of disk activity may be caused by &amp;quot;listdir&amp;quot; operations. The goal is to serve listdir operations without any disk IO.&lt;br /&gt;
&lt;br /&gt;
=== Principle ===&lt;br /&gt;
Store swift objects in large files, as haystack does. We do not need all the information stored in an inode (owner, group..). Make the &amp;quot;inode&amp;quot; as small as possible so that listdir requests can be served from memory. These &amp;quot;inodes&amp;quot; will be stored in a key value store, per disk, to ease cluster maintenance.&lt;br /&gt;
The &amp;quot;volumes&amp;quot; (actual large files on disk) are currently tied to a partition, which makes moving a parition easy (but changing the partition bit count harder)&lt;br /&gt;
&lt;br /&gt;
=== Implementation ===&lt;br /&gt;
Two parts :&lt;br /&gt;
* swift patches, mostly to diskfile.py, which is patched to use the &amp;quot;vfile&amp;quot; module, providing file like semantics for &amp;quot;virtual files&amp;quot; within volumes.&lt;br /&gt;
* the key value store, based on leveldb, written in golang.&lt;br /&gt;
&lt;br /&gt;
Those two parts communicates over RPC on a socket (using gRPC)&lt;br /&gt;
&lt;br /&gt;
Volumes are always appended to, and data is fsync()ed. The key value store is written to asynchronously. In case of a crash, the end of the volume should be read and checked against the KV to update missing objects.&lt;br /&gt;
&lt;br /&gt;
When files are deleted, the corresponding hole in the volume is punched using fallocate(). 4k aligned blocks will be returned to the filesystem, which means we should not have to recreate/defragment a volume file very often. (on initial open(), XFS will need to read in all extents, so it will still be needed at some point).&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
serving a PUT request&lt;br /&gt;
instead of creating a temp file and renaming it :&lt;br /&gt;
* check in the partition directory if a volume already exists and is not locked. If needed, create one and register it in the KV&lt;br /&gt;
* lock the volume and write the object at the end of the volume. when swift closes the &amp;quot;file&amp;quot;, seek back and write the object header for which we have reserved space, and fsync() the volume.&lt;br /&gt;
* register the file in the KV&lt;br /&gt;
&lt;br /&gt;
serving a GET request&lt;br /&gt;
* get the object location (volume index, offset in the volume) from the KV&lt;br /&gt;
* open the partition directory, open the volume file, serve the object.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Preliminary test results ===&lt;br /&gt;
We have not yet tested the pathological case we see in production with replication.&lt;br /&gt;
Hardware setup :&lt;br /&gt;
Atom C2750 2.40Ghz&lt;br /&gt;
16GB RAM&lt;br /&gt;
Drives : HGST HUS726040ALA610 (4TB)&lt;br /&gt;
&lt;br /&gt;
3 drives per server, but the tests below exercise a single drive.&lt;br /&gt;
&lt;br /&gt;
==== Single threaded PUT from a machine to one patched object server, and an unpatched 2.12 server ====&lt;br /&gt;
(test using the object server API directly, no proxy server involved, objects are &amp;lt; 100 bytes)&lt;br /&gt;
&lt;br /&gt;
From zero to 4 millions objects, on one disk.&lt;br /&gt;
* 2.12 version : 3360 minutes (19,8 PUT/s)&lt;br /&gt;
* patched version : 2540 minutes (26,2 PUT/s) - About 42 bytes used in leveldb per object&lt;br /&gt;
&lt;br /&gt;
From 4 millions to 8 million objects&lt;br /&gt;
* 2.12 version : 3900 minutes (17 PUT/s)&lt;br /&gt;
* patched version : 1700 minutes (39,2 PUT/s) - faster, likely because most &amp;quot;volume files&amp;quot; have already been created (not measured, to be confirmed)&lt;br /&gt;
&lt;br /&gt;
The key value size for the disk at the end of the test is 320MB.&lt;br /&gt;
&lt;br /&gt;
==== Single threaded GET from a machine to one patched object server, and an unpatched 2.12 server. Both servers have 8 million objects on one disk. ====&lt;br /&gt;
* 2.12 version : 39 GET/s&lt;br /&gt;
* patched version : 93 GET/s&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Concurrent PUT requests, 20 per second, for 10 minutes, with &amp;quot;hot inode cache&amp;quot; ====&lt;br /&gt;
* 2.12 version response time distribution :&lt;br /&gt;
   Latencies     [mean, 50, 95, 99, max]  641.274117ms, 67.31248ms, 3.526835534s, 4.68917307s, 5.971909s&lt;br /&gt;
   100% success&lt;br /&gt;
&lt;br /&gt;
* patched version response time distribution :&lt;br /&gt;
   Latencies     [mean, 50, 95, 99, max]  82.581295ms, 50.487793ms, 261.475566ms, 615.565045ms, 1.245540101s&lt;br /&gt;
   success 100%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Concurrent PUT requests, 20 per second, for 10 minutes, after dropping vm cache ====&lt;br /&gt;
* 2.12 version response time distribution :&lt;br /&gt;
   Latencies     [mean, 50, 95, 99, max]  29.211369875s, 30.002788029s, 30.003025069s, 31.001143056s, 33.005231569s&lt;br /&gt;
   response below 30s: 6,11%&lt;br /&gt;
&lt;br /&gt;
* patched version response time distribution :&lt;br /&gt;
   Latencies     [mean, 50, 95, 99, max]  9.290393071s, 8.216053491s, 24.212567799s, 29.46094486s, 30.001358218s&lt;br /&gt;
   response below 30s: 99.26%&lt;/div&gt;</summary>
		<author><name>Romain.le-disez</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Swift/ideas/small_files/implementation&amp;diff=151366</id>
		<title>Swift/ideas/small files/implementation</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Swift/ideas/small_files/implementation&amp;diff=151366"/>
				<updated>2017-02-21T23:52:23Z</updated>
		
		<summary type="html">&lt;p&gt;Romain.le-disez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The purpose of this page is to describe the proposed implementation with some benchmarks. Please note the implementation is at early stage, as the benchmarks.&lt;br /&gt;
&lt;br /&gt;
=== Problem we want to address ===&lt;br /&gt;
A swift object uses at least one inode on the filesystem. For clusters with many small files (say, 10 million objects per disk) the performance degradation is important, as the directory structure does not fit in memory. Replication / auditor operations trigger a lot of IO. Over 40% of disk activity may be caused by &amp;quot;listdir&amp;quot; operations. The goal is to serve listdir operations without any disk IO.&lt;br /&gt;
&lt;br /&gt;
=== Principle ===&lt;br /&gt;
Store swift objects in large files, as haystack does. We do not need all the information stored in an inode (owner, group..). Make the &amp;quot;inode&amp;quot; as small as possible so that listdir requests can be served from memory. These &amp;quot;inodes&amp;quot; will be stored in a key value store, per disk, to ease cluster maintenance.&lt;br /&gt;
The &amp;quot;volumes&amp;quot; (actual large files on disk) are currently tied to a partition, which makes moving a parition easy (but changing the partition bit count harder)&lt;br /&gt;
&lt;br /&gt;
=== Implementation ===&lt;br /&gt;
Two parts :&lt;br /&gt;
* swift patches, mostly to diskfile.py, which is patched to use the &amp;quot;vfile&amp;quot; module, providing file like semantics for &amp;quot;virtual files&amp;quot; within volumes.&lt;br /&gt;
* the key value store, based on leveldb, written in golang.&lt;br /&gt;
&lt;br /&gt;
Those two parts communicates over RPC on a socket (using gRPC)&lt;br /&gt;
&lt;br /&gt;
Volumes are always appended to, and data is fsync()ed. The key value store is written to asynchronously. In case of a crash, the end of the volume should be read and checked against the KV to update missing objects.&lt;br /&gt;
&lt;br /&gt;
When files are deleted, the corresponding hole in the volume is punched using fallocate(). 4k aligned blocks will be returned to the filesystem, which means we should not have to recreate/defragment a volume file very often. (on initial open(), XFS will need to read in all extents, so it will still be needed at some point).&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
serving a PUT request&lt;br /&gt;
instead of creating a temp file and renaming it :&lt;br /&gt;
* check in the partition directory if a volume already exists and is not locked. If needed, create one and register it in the KV&lt;br /&gt;
* lock the volume and write the object at the end of the volume. when swift closes the &amp;quot;file&amp;quot;, seek back and write the object header for which we have reserved space, and fsync() the volume.&lt;br /&gt;
* register the file in the KV&lt;br /&gt;
&lt;br /&gt;
serving a GET request&lt;br /&gt;
* get the object location (volume index, offset in the volume) from the KV&lt;br /&gt;
* open the partition directory, open the volume file, serve the object.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Preliminary test results ===&lt;br /&gt;
We have not yet tested the pathological case we see in production with replication.&lt;br /&gt;
Hardware setup :&lt;br /&gt;
Atom C2750 2.40Ghz&lt;br /&gt;
16GB RAM&lt;br /&gt;
Drives : HGST HUS726040ALA610 (4TB)&lt;br /&gt;
&lt;br /&gt;
3 drives per server, but the tests below exercise a single drive.&lt;br /&gt;
&lt;br /&gt;
==== Single threaded PUT from a machine to one patched object server, and an unpatched 2.12 server ====&lt;br /&gt;
(test using the object server API directly, no proxy server involved, objects are &amp;lt; 100 bytes)&lt;br /&gt;
&lt;br /&gt;
From zero to 4 millions objects, on one disk.&lt;br /&gt;
* 2.12 version : 3360 minutes (19,8 PUT/s)&lt;br /&gt;
* patched version : 2540 minutes (26,2 PUT/s) - About 42 bytes used in leveldb per object&lt;br /&gt;
&lt;br /&gt;
From 4 millions to 8 million objects&lt;br /&gt;
* 2.12 version : 3900 minutes (17 PUT/s)&lt;br /&gt;
* patched version : 1700 minutes (39,2 PUT/s) - faster, likely because most &amp;quot;volume files&amp;quot; have already been created (not measured, to be confirmed)&lt;br /&gt;
&lt;br /&gt;
The key value size for the disk at the end of the test is 320MB.&lt;br /&gt;
&lt;br /&gt;
==== Single threaded GET from a machine to one patched object server, and an unpatched 2.12 server. Both servers have 8 million objects on one disk. ====&lt;br /&gt;
* 2.12 version : 39 GET/s&lt;br /&gt;
* patched version : 93 GET/s&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Concurrent PUT requests, 20 per second, for 10 minutes, with &amp;quot;hot inode cache&amp;quot; ====&lt;br /&gt;
* 2.12 version response time distribution :&lt;br /&gt;
   Latencies     [mean, 50, 95, 99, max]  641.274117ms, 67.31248ms, 3.526835534s, 4.68917307s, 5.971909s&lt;br /&gt;
   100% success&lt;br /&gt;
&lt;br /&gt;
* patched version response time distribution :&lt;br /&gt;
   Latencies     [mean, 50, 95, 99, max]  82.581295ms, 50.487793ms, 261.475566ms, 615.565045ms, 1.245540101s&lt;br /&gt;
   success 100%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Concurrent PUT requests, 20 per second, for 10 minutes, after dropping vm cache ====&lt;br /&gt;
* 2.12 version response time distribution :&lt;br /&gt;
   Latencies     [mean, 50, 95, 99, max]  29.211369875s, 30.002788029s, 30.003025069s, 31.001143056s, 33.005231569s&lt;br /&gt;
   response below 30s: 6,11%&lt;br /&gt;
&lt;br /&gt;
* patched version response time distribution :&lt;br /&gt;
   Latencies     [mean, 50, 95, 99, max]  9.290393071s, 8.216053491s, 24.212567799s, 29.46094486s, 30.001358218s&lt;br /&gt;
   response below 30s: 99.26%&lt;/div&gt;</summary>
		<author><name>Romain.le-disez</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Swift/ideas/small_files/implementation&amp;diff=151316</id>
		<title>Swift/ideas/small files/implementation</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Swift/ideas/small_files/implementation&amp;diff=151316"/>
				<updated>2017-02-20T13:41:11Z</updated>
		
		<summary type="html">&lt;p&gt;Romain.le-disez: Created page with &amp;quot;The purpose of this page is to describe the proposed implementation with some benchmarks. Please note the implementation is at early stage, as the benchmarks.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The purpose of this page is to describe the proposed implementation with some benchmarks. Please note the implementation is at early stage, as the benchmarks.&lt;/div&gt;</summary>
		<author><name>Romain.le-disez</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Swift/ideas&amp;diff=151315</id>
		<title>Swift/ideas</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Swift/ideas&amp;diff=151315"/>
				<updated>2017-02-20T13:39:13Z</updated>
		
		<summary type="html">&lt;p&gt;Romain.le-disez: /* Ideas for OpenStack Swift */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Ideas for OpenStack Swift =&lt;br /&gt;
&lt;br /&gt;
This page is a collection of &amp;quot;brain dumps&amp;quot; for ideas about features in OpenStack Swift. If you're working on something, it's a very good idea to write down what you're thinking about. This lets others get up to speed, helps you collaborate, and serves as a great record for future reference. Write down your thoughts somewhere and put a link to it here. It doesn't matter what form your thoughts are in; use whatever is best for you. Your document should include why your idea is needed and your thoughts on particular design choices and tradeoffs. '''Please include some contact information''' (ideally, your IRC nick) so that people can collaborate with you.&lt;br /&gt;
&lt;br /&gt;
''Historic &amp;quot;specs&amp;quot; are available at https://specs.openstack.org/openstack/swift-specs/''&lt;br /&gt;
&lt;br /&gt;
== Ideas ==&lt;br /&gt;
&lt;br /&gt;
Format: '''Idea''' -- ''link to your brain dump''&lt;br /&gt;
&lt;br /&gt;
* '''Small file optimization''' -- [[Swift/ideas/small files]]&lt;br /&gt;
** '''Small files experimentations''' [[Swift/ideas/small files/experimentations]]&lt;br /&gt;
** '''Small files implementation''' [[Swift/ideas/small files/implementation]]&lt;br /&gt;
* '''Reduce memcache lookups''' -- [[Swift/ideas/memoize lookups]]&lt;br /&gt;
* '''Improve internal network security''' -- [[Swift/ideas/network_security]]&lt;br /&gt;
* '''Metrics around rate-limiting''' -- [[Swift/ideas/ratelimiting_metrics]]&lt;br /&gt;
* '''Hierarchical keymaster''' -- [[Swift/ideas/hierarchical_keymaster]]&lt;br /&gt;
* '''sync_method = repconn''' -- https://etherpad.openstack.org/p/hummingbird-replication-upgrade&lt;br /&gt;
* '''Container Sharding''' -- [https://docs.google.com/document/d/1-0wUnaRf2TTA0KQGk301BPR8-5wzuyA1r4tLSEh-cbw/edit?usp=sharing container-sharding.odt] [https://etherpad.openstack.org/p/container-sharding-SAT-2016 Etherpad notes] [https://trello.com/b/8p2iJ9RR/swift-container-sharding trello] [https://docs.google.com/document/d/16rPdDrT-4G6hcen_6no8cr8KbxUqbcvsSkOfxxu0EBE/edit?usp=sharing Initial locking db shard approach idea]&lt;br /&gt;
* '''High-latency media / Tape support for Swift''' -- [[Swift/HighLatencyMedia]]&lt;br /&gt;
* '''The Archival Storage extension to the Swift API''' -- [https://etherpad.openstack.org/p/high-latency-storage-policy]&lt;br /&gt;
* '''Symlinks''' -- https://etherpad.openstack.org/p/swift_symlinks&lt;br /&gt;
* '''Metadata index (Elasticsearch)''' -- [[Swift/ideas/metadata-sync]]&lt;br /&gt;
* '''Keymaster v2''' -- [[Swift/ideas/keymaster_v2]]&lt;br /&gt;
* '''oslo.config''' -- https://etherpad.openstack.org/p/swift_oslo-config&lt;br /&gt;
* '''Auto Tiering Basic Infra work''' -- https://etherpad.openstack.org/p/swift_tiering_foundational_work&lt;br /&gt;
* '''friendly tempurl timestamps''' -- https://blueprints.launchpad.net/swift/+spec/human-readable-tempurl-timestamp&lt;br /&gt;
* '''txt lookup middleware''' -- https://wiki.openstack.org/wiki/Swift/ideas/txt_lookup_middleware&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Category:ObjectStorage]]&lt;/div&gt;</summary>
		<author><name>Romain.le-disez</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Swift/ideas/small_files/experimentations&amp;diff=141373</id>
		<title>Swift/ideas/small files/experimentations</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Swift/ideas/small_files/experimentations&amp;diff=141373"/>
				<updated>2016-11-17T18:00:09Z</updated>
		
		<summary type="html">&lt;p&gt;Romain.le-disez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Experimentations on small files optimization in Swift =&lt;br /&gt;
(irc: rledisez)&lt;br /&gt;
&lt;br /&gt;
Note: Despite the official recommendation of the deployment guide (and the performances impact), at OVH we run Swift on XFS filesystems with barrier=on. So, this summary mainly focus on synchronous performances. The performance numbers are given for a 4TB SAS disk, C2750 CPU, 16GB of RAM. &amp;quot;Constrained memory environment&amp;quot; means that 12GB of memory are voluntarily consumed to reduce the available memory to 4GB.&lt;br /&gt;
&lt;br /&gt;
== Goals ==&lt;br /&gt;
* reduce IO needed to read FS metadata (inodes)&lt;br /&gt;
* Maintain (at least) the performances of XFS:&lt;br /&gt;
** object creation: 43/s&lt;br /&gt;
** object read in memory constraint environment: 40/s&lt;br /&gt;
&lt;br /&gt;
== Constraints ==&lt;br /&gt;
* concurrency: many process will need access to the small files store (object server, auditor, replicator, ...)&lt;br /&gt;
* allocation: must not waste to much space (saving space is not the goal, but could be nice)&lt;br /&gt;
* integrity: no data corruption nor store corruption&lt;br /&gt;
&lt;br /&gt;
== Ideas ==&lt;br /&gt;
Seems the easy way to meet the concurrency is to have an RPC serving data requests. There is some interesting RPC protocol that allow communications without needs for copying data (eg: cap'n proto). Also, side effect, an RPC server would transform the blocking IO call in a non blocking RPC call (nice for python :))&lt;br /&gt;
&lt;br /&gt;
As we will need an index, we should store all objects by their hash in a flat namespace. That would allow to increase/reduce the part power with no actions except updating the ring. With the correct structure, a range scan is very efficient and allows to simulate partitions for replication purpose.&lt;br /&gt;
&lt;br /&gt;
== Tries ==&lt;br /&gt;
&lt;br /&gt;
=== Developing a filesystem ===&lt;br /&gt;
We first tried to develop a filesystem, running on top of XFS (to benefit of all the caching done at the VFS layer). Specifications was the following:&lt;br /&gt;
* only contiguous allocation: no fragmentation so we don't need defragmentation or compaction logic&lt;br /&gt;
* having all necessary in index to run auditor/replicator/reconstructor: no need to access data to do a os.listdir()&lt;br /&gt;
* small footprint index so that it can fit in memory: an achievable target seems to be between 50 and 60 bytes per object (preference is to burn CPU to save memory)&lt;br /&gt;
&lt;br /&gt;
While we had a working POC in few days, the amount of work to go from POC to production (= reliability, performance) was considered enormous, so we tried looking at other solutions.&lt;br /&gt;
&lt;br /&gt;
=== Using a well-know key-value store ===&lt;br /&gt;
Idea is:&lt;br /&gt;
* For small files: store data in the key-value store&lt;br /&gt;
* For bigger files: store the filehandle of the file in the key-value store&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Storing the filehandles can save many IOs because it become unnecessary to do all the usual lookups to &amp;quot;reach&amp;quot; a file (reading the inodes of all parents directory before reading the file inode). Filehandles have a downside: they bypass all security, because the file is directly accessed without any check on parent directory. So, it should possible to disable the use of filehandles if Swift processes are not running in a safe environment (eg: inside of docker on a server running multiples services).&lt;br /&gt;
&lt;br /&gt;
Storing filehandles can also open a door to getting rid of the current files hierarchy (part/sfx/hash/ts), thus helping a lot for part power modifications. Because if the real information is in the DB, the way big files are stored in XFS does not matters anymore, so there is no more need to hardlink &amp;amp; co to change a part power.&lt;br /&gt;
&lt;br /&gt;
The key-value store tried were:&lt;br /&gt;
* kyotocabinet: unacceptable performances in synchronous mode&lt;br /&gt;
* boltdb: bad performances in random insertion, decreasing as the DB grow&lt;br /&gt;
* lmdb: same as boltdb&lt;br /&gt;
* leveldb: bad performances in random insertion&lt;br /&gt;
* forestdb: bad performances in random insertion&lt;br /&gt;
* rocksdb: good performances in random insertion, about 1.8x XFS, low disk overhead (it actually saves space compared to XFS). But very easy corruption with a basic example (the one from the doc). Project seems young and not really mature (there is recent reports of corruption on the github).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Positive points of this solution:&lt;br /&gt;
* small dev, pretty simple to implement (an RPC in front of a key-value store)&lt;br /&gt;
* no need for &amp;quot;part power increase&amp;quot; logic (flat namespaces)&lt;br /&gt;
* impact of double-lookup (db+fs) should be saved by filehandles (TODO: need to be benchmarked)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Downside:&lt;br /&gt;
* did not find any project that is fast/reliable enough&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== key-value store + transaction groups ===&lt;br /&gt;
The idea is to use a key value store (see previous point), but instead of commiting each objects individually, we group them in a transaction group (inspired from ZFS transaction groups) and commit them all together every N ms. This can easily double the objects creations per seconds. Downside is that to keep the synchronous behavior, we must wait for the transaction to be commited before answering the client. So, it can make the client to wait up to N ms before validating the upload. 10ms gives good results in term of creations per seconds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Using the DMU of ZFS ===&lt;br /&gt;
The Lustre team developed an OSD based on ZFS. Not ZFS as a filesystem (ZPL), but as an object store (DMU). This is an interesting approach as they benefit from all the ZFS cool features from the DMU (Copy On Write, Transactions, Snapshot, ...), but they don't get the overhead of the ZPL (inodes). Idea is to write the data in a DMU object, and index this object by an identifier (eg: hash) in the ZAP.&lt;br /&gt;
&lt;br /&gt;
Developing around ZFS code proven to be really easy, working code in a day or two.&lt;br /&gt;
&lt;br /&gt;
Positive points are:&lt;br /&gt;
* No need to prove it, ZFS is rock solid (it's a fact :))&lt;br /&gt;
* Random write performances are very good (compared to XFS, about 2.5x in synchronous mode, about 16x in asynchronous mode)&lt;br /&gt;
* Random read performance in constrained memory environment are a bit better than XFS. It would probably be better with a ZAP replacement (see Downside)&lt;br /&gt;
* It's maintained and active, no reason to think it won't be in the future&lt;br /&gt;
* Run on top of XFS in a file (about 5% performance lost) as directly on devices, so it could be an easy migration path&lt;br /&gt;
* Cool features that could be used in Swift in the future (zfs send to replicate? see https://www.ixsystems.com/blog/openzfs-devsummit-2016/ &amp;quot;Redacted send/receive&amp;quot; and &amp;quot;Compressed Send and Receive&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Downsides are:&lt;br /&gt;
* ZFS code is very low level (even if it runs in userland), developed in C. Even if it's clear and well written, it would require some effort to fully and correctly wrap our minds around it.&lt;br /&gt;
* (FIXED) Had some instabilities when running from golang/cgo while it's perfectly stable with C (todo: try runtime.LockOSThread())&lt;br /&gt;
* ZAP is not optimized for our use case, one record is about 258 bytes while we only really need around 50-60 bytes/. Also it does not allow range scan. So we would probably end up developing a replacement for ZAP, some kind of b-tree or equivalent on top of DMU (unless we find something compatible with our needs, maybe https://github.com/timtadh/fs2 ?)&lt;/div&gt;</summary>
		<author><name>Romain.le-disez</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Swift/ideas/small_files/experimentations&amp;diff=140530</id>
		<title>Swift/ideas/small files/experimentations</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Swift/ideas/small_files/experimentations&amp;diff=140530"/>
				<updated>2016-11-16T08:33:32Z</updated>
		
		<summary type="html">&lt;p&gt;Romain.le-disez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Experimentations on small files optimization in Swift =&lt;br /&gt;
(irc: rledisez)&lt;br /&gt;
&lt;br /&gt;
Note: Despite the official recommendation of the deployment guide (and the performances impact), at OVH we run Swift on XFS filesystems with barrier=on. So, this summary mainly focus on synchronous performances. The performance numbers are given for a 4TB SAS disk, C2750 CPU, 16GB of RAM. &amp;quot;Constrained memory environment&amp;quot; means that 12GB of memory are voluntarily consumed to reduce the available memory to 4GB.&lt;br /&gt;
&lt;br /&gt;
== Goals ==&lt;br /&gt;
* reduce IO needed to read FS metadata (inodes)&lt;br /&gt;
* Maintain (at least) the performances of XFS:&lt;br /&gt;
** object creation: 43/s&lt;br /&gt;
** object read in memory constraint environment: 40/s&lt;br /&gt;
&lt;br /&gt;
== Constraints ==&lt;br /&gt;
* concurrency: many process will need access to the small files store (object server, auditor, replicator, ...)&lt;br /&gt;
* allocation: must not waste to much space (saving space is not the goal, but could be nice)&lt;br /&gt;
* integrity: no data corruption nor store corruption&lt;br /&gt;
&lt;br /&gt;
== Ideas ==&lt;br /&gt;
Seems the easy way to meet the concurrency is to have an RPC serving data requests. There is some interesting RPC protocol that allow communications without needs for copying data (eg: cap'n proto). Also, side effect, an RPC server would transform the blocking IO call in a non blocking RPC call (nice for python :))&lt;br /&gt;
&lt;br /&gt;
As we will need an index, we should store all objects by their hash in a flat namespace. That would allow to increase/reduce the part power with no actions except updating the ring. With the correct structure, a range scan is very efficient and allows to simulate partitions for replication purpose.&lt;br /&gt;
&lt;br /&gt;
== Tries ==&lt;br /&gt;
&lt;br /&gt;
=== Developing a filesystem ===&lt;br /&gt;
We first tried to develop a filesystem, running on top of XFS (to benefit of all the caching done at the VFS layer). Specifications was the following:&lt;br /&gt;
* only contiguous allocation: no fragmentation so we don't need defragmentation or compaction logic&lt;br /&gt;
* having all necessary in index to run auditor/replicator/reconstructor: no need to access data to do a os.listdir()&lt;br /&gt;
* small footprint index so that it can fit in memory: an achievable target seems to be between 50 and 60 bytes per object (preference is to burn CPU to save memory)&lt;br /&gt;
&lt;br /&gt;
While we had a working POC in few days, the amount of work to go from POC to production (= reliability, performance) was considered enormous, so we tried looking at other solutions.&lt;br /&gt;
&lt;br /&gt;
=== Using a well-know key-value store ===&lt;br /&gt;
Idea is:&lt;br /&gt;
* For small files: store data in the key-value store&lt;br /&gt;
* For bigger files: store the filehandle of the file in the key-value store&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Storing the filehandles can save many IOs because it become unnecessary to do all the usual lookups to &amp;quot;reach&amp;quot; a file (reading the inodes of all parents directory before reading the file inode). Filehandles have a downside: they bypass all security, because the file is directly accessed without any check on parent directory. So, it should possible to disable the use of filehandles if Swift processes are not running in a safe environment (eg: inside of docker on a server running multiples services).&lt;br /&gt;
&lt;br /&gt;
Storing filehandles can also open a door to getting rid of the current files hierarchy (part/sfx/hash/ts), thus helping a lot for part power modifications. Because if the real information is in the DB, the way big files are stored in XFS does not matters anymore, so there is no more need to hardlink &amp;amp; co to change a part power.&lt;br /&gt;
&lt;br /&gt;
The key-value store tried were:&lt;br /&gt;
* kyotocabinet: unacceptable performances in synchronous mode&lt;br /&gt;
* boltdb: bad performances in random insertion, decreasing as the DB grow&lt;br /&gt;
* lmdb: same as boltdb&lt;br /&gt;
* leveldb: bad performances in random insertion&lt;br /&gt;
* forestdb: bad performances in random insertion&lt;br /&gt;
* rocksdb: good performances in random insertion, about 1.8x XFS, low disk overhead (it actually saves space compared to XFS). But very easy corruption with a basic example (the one from the doc). Project seems young and not really mature (there is recent reports of corruption on the github).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Positive points of this solution:&lt;br /&gt;
* small dev, pretty simple to implement (an RPC in front of a key-value store)&lt;br /&gt;
* no need for &amp;quot;part power increase&amp;quot; logic (flat namespaces)&lt;br /&gt;
* impact of double-lookup (db+fs) should be saved by filehandles (TODO: need to be benchmarked)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Downside:&lt;br /&gt;
* did not find any project that is fast/reliable enough&lt;br /&gt;
&lt;br /&gt;
=== Using the DMU of ZFS ===&lt;br /&gt;
The Lustre team developed an OSD based on ZFS. Not ZFS as a filesystem (ZPL), but as an object store (DMU). This is an interesting approach as they benefit from all the ZFS cool features from the DMU (Copy On Write, Transactions, Snapshot, ...), but they don't get the overhead of the ZPL (inodes). Idea is to write the data in a DMU object, and index this object by an identifier (eg: hash) in the ZAP.&lt;br /&gt;
&lt;br /&gt;
Developing around ZFS code proven to be really easy, working code in a day or two.&lt;br /&gt;
&lt;br /&gt;
Positive points are:&lt;br /&gt;
* No need to prove it, ZFS is rock solid (it's a fact :))&lt;br /&gt;
* Random write performances are very good (compared to XFS, about 2.5x in synchronous mode, about 16x in asynchronous mode)&lt;br /&gt;
* Random read performance in constrained memory environment are a bit better than XFS. It would probably be better with a ZAP replacement (see Downside)&lt;br /&gt;
* It's maintained and active, no reason to think it won't be in the future&lt;br /&gt;
* Run on top of XFS in a file (about 5% performance lost) as directly on devices, so it could be an easy migration path&lt;br /&gt;
* Cool features that could be used in Swift in the future (zfs send to replicate? see https://www.ixsystems.com/blog/openzfs-devsummit-2016/ &amp;quot;Redacted send/receive&amp;quot; and &amp;quot;Compressed Send and Receive&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Downsides are:&lt;br /&gt;
* ZFS code is very low level (even if it runs in userland), developed in C. Even if it's clear and well written, it would require some effort to fully and correctly wrap our minds around it.&lt;br /&gt;
* (FIXED) Had some instabilities when running from golang/cgo while it's perfectly stable with C (todo: try runtime.LockOSThread())&lt;br /&gt;
* ZAP is not optimized for our use case, one record is about 258 bytes while we only really need around 50-60 bytes/. Also it does not allow range scan. So we would probably end up developing a replacement for ZAP, some kind of b-tree or equivalent on top of DMU (unless we find something compatible with our needs, maybe https://github.com/timtadh/fs2 ?)&lt;/div&gt;</summary>
		<author><name>Romain.le-disez</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Swift/ideas&amp;diff=139797</id>
		<title>Swift/ideas</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Swift/ideas&amp;diff=139797"/>
				<updated>2016-11-15T09:47:33Z</updated>
		
		<summary type="html">&lt;p&gt;Romain.le-disez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Ideas for OpenStack Swift =&lt;br /&gt;
&lt;br /&gt;
This page is a collection of &amp;quot;brain dumps&amp;quot; for ideas about features in OpenStack Swift. If you're working on something, it's a very good idea to write down what you're thinking about. This lets others get up to speed, helps you collaborate, and serves as a great record for future reference. Write down your thoughts somewhere and put a link to it here. It doesn't matter what form your thoughts are in; use whatever is best for you. Your document should include why your idea is needed and your thoughts on particular design choices and tradeoffs. Please include some contact information (ideally, your IRC nick) so that people can collaborate with you.&lt;br /&gt;
&lt;br /&gt;
''Historic &amp;quot;specs&amp;quot; are available at https://specs.openstack.org/openstack/swift-specs/''&lt;br /&gt;
&lt;br /&gt;
== Ideas ==&lt;br /&gt;
&lt;br /&gt;
Format: '''Idea''' -- ''link to your brain dump''&lt;br /&gt;
&lt;br /&gt;
* '''Small file optimization''' -- [[Swift/ideas/small files]]&lt;br /&gt;
** '''Small files experimentations''' [[Swift/ideas/small files/experimentations]]&lt;br /&gt;
* '''Reduce memcache lookups''' -- [[Swift/ideas/memoize lookups]]&lt;br /&gt;
* '''Improve internal network security''' -- [[Swift/ideas/network_security]]&lt;br /&gt;
* '''Metrics around rate-limiting''' -- [[Swift/ideas/ratelimiting_metrics]]&lt;br /&gt;
* '''Hierarchical keymaster''' -- [[Swift/ideas/hierarchical_keymaster]]&lt;br /&gt;
* '''sync_method = repconn''' -- https://etherpad.openstack.org/p/hummingbird-replication-upgrade&lt;br /&gt;
* '''Container Sharding''' -- [https://docs.google.com/document/d/1-0wUnaRf2TTA0KQGk301BPR8-5wzuyA1r4tLSEh-cbw/edit?usp=sharing container-sharding.odt] [https://etherpad.openstack.org/p/container-sharding-SAT-2016 Etherpad notes] [https://trello.com/b/8p2iJ9RR/swift-container-sharding trello] [https://docs.google.com/document/d/16rPdDrT-4G6hcen_6no8cr8KbxUqbcvsSkOfxxu0EBE/edit?usp=sharing Initial locking db shard approach idea]&lt;br /&gt;
* '''High-latency media / Tape support for Swift''' -- [[Swift/HighLatencyMedia]]&lt;br /&gt;
* '''The Archival Storage extension to the Swift API''' -- [https://etherpad.openstack.org/p/high-latency-storage-policy]&lt;br /&gt;
* '''Symlinks''' -- https://etherpad.openstack.org/p/swift_symlinks&lt;br /&gt;
* '''Metadata index (Elasticsearch)''' -- [[Swift/ideas/metadata-sync]]&lt;br /&gt;
* '''Keymaster v2''' -- [[Swift/ideas/keymaster_v2]]&lt;br /&gt;
* '''oslo.config''' -- https://etherpad.openstack.org/p/swift_oslo-config&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Category:ObjectStorage]]&lt;/div&gt;</summary>
		<author><name>Romain.le-disez</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Swift/ideas/small_files/experimentations&amp;diff=139796</id>
		<title>Swift/ideas/small files/experimentations</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Swift/ideas/small_files/experimentations&amp;diff=139796"/>
				<updated>2016-11-15T09:46:01Z</updated>
		
		<summary type="html">&lt;p&gt;Romain.le-disez: Created page with &amp;quot;= Experimentations on small files optimization in Swift = (irc: rledisez)  Note: Despite the official recommendation of the deployment guide (and the performances impact), at...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Experimentations on small files optimization in Swift =&lt;br /&gt;
(irc: rledisez)&lt;br /&gt;
&lt;br /&gt;
Note: Despite the official recommendation of the deployment guide (and the performances impact), at OVH we run Swift on XFS filesystems with barrier=on. So, this summary mainly focus on synchronous performances. The performance numbers are given for a 4TB SAS disk, C2750 CPU, 16GB of RAM. &amp;quot;Constrained memory environment&amp;quot; means that 12GB of memory are voluntarily consumed to reduce the available memory to 4GB.&lt;br /&gt;
&lt;br /&gt;
== Goals ==&lt;br /&gt;
* reduce IO needed to read FS metadata (inodes)&lt;br /&gt;
* Maintain (at least) the performances of XFS:&lt;br /&gt;
** object creation: 43/s&lt;br /&gt;
** object read in memory constraint environment: 40/s&lt;br /&gt;
&lt;br /&gt;
== Constraints ==&lt;br /&gt;
* concurrency: many process will need access to the small files store (object server, auditor, replicator, ...)&lt;br /&gt;
* allocation: must not waste to much space (saving space is not the goal, but could be nice)&lt;br /&gt;
* integrity: no data corruption nor store corruption&lt;br /&gt;
&lt;br /&gt;
== Ideas ==&lt;br /&gt;
Seems the easy way to meet the concurrency is to have an RPC serving data requests. There is some interesting RPC protocol that allow communications without needs for copying data (eg: cap'n proto). Also, side effect, an RPC server would transform the blocking IO call in a non blocking RPC call (nice for python :))&lt;br /&gt;
&lt;br /&gt;
As we will need an index, we should store all objects by their hash in a flat namespace. That would allow to increase/reduce the part power with no actions except updating the ring. With the correct structure, a range scan is very efficient and allows to simulate partitions for replication purpose.&lt;br /&gt;
&lt;br /&gt;
== Tries ==&lt;br /&gt;
&lt;br /&gt;
=== Developing a filesystem ===&lt;br /&gt;
We first tried to develop a filesystem, running on top of XFS (to benefit of all the caching done at the VFS layer). Specifications was the following:&lt;br /&gt;
* only contiguous allocation: no fragmentation so we don't need defragmentation or compaction logic&lt;br /&gt;
* having all necessary in index to run auditor/replicator/reconstructor: no need to access data to do a os.listdir()&lt;br /&gt;
* small footprint index so that it can fit in memory: an achievable target seems to be between 50 and 60 bytes per object (preference is to burn CPU to save memory)&lt;br /&gt;
&lt;br /&gt;
While we had a working POC in few days, the amount of work to go from POC to production (= reliability, performance) was considered enormous, so we tried looking at other solutions.&lt;br /&gt;
&lt;br /&gt;
=== Using a well-know key-value store ===&lt;br /&gt;
Idea is:&lt;br /&gt;
* For small files: store data in the key-value store&lt;br /&gt;
* For bigger files: store the filehandle of the file in the key-value store&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Storing the filehandles can save many IOs because it become unnecessary to do all the usual lookups to &amp;quot;reach&amp;quot; a file (reading the inodes of all parents directory before reading the file inode). Filehandles have a downside: they bypass all security, because the file is directly accessed without any check on parent directory. So, it should possible to disable the use of filehandles if Swift processes are not running in a safe environment (eg: inside of docker on a server running multiples services).&lt;br /&gt;
&lt;br /&gt;
Storing filehandles can also open a door to getting rid of the current files hierarchy (part/sfx/hash/ts), thus helping a lot for part power modifications. Because if the real information is in the DB, the way big files are stored in XFS does not matters anymore, so there is no more need to hardlink &amp;amp; co to change a part power.&lt;br /&gt;
&lt;br /&gt;
The key-value store tried were:&lt;br /&gt;
* kyotocabinet: unacceptable performances in synchronous mode&lt;br /&gt;
* boltdb: bad performances in random insertion, decreasing as the DB grow&lt;br /&gt;
* lmdb: same as boltdb&lt;br /&gt;
* leveldb: bad performances in random insertion&lt;br /&gt;
* forestdb: bad performances in random insertion&lt;br /&gt;
* rocksdb: good performances in random insertion, about 1.8x XFS, low disk overhead (it actually saves space compared to XFS). But very easy corruption with a basic example (the one from the doc). Project seems young and not really mature (there is recent reports of corruption on the github).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Positive points of this solution:&lt;br /&gt;
* small dev, pretty simple to implement (an RPC in front of a key-value store)&lt;br /&gt;
* no need for &amp;quot;part power increase&amp;quot; logic (flat namespaces)&lt;br /&gt;
* impact of double-lookup (db+fs) should be saved by filehandles (TODO: need to be benchmarked)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Downside:&lt;br /&gt;
* did not find any project that is fast/reliable enough&lt;br /&gt;
&lt;br /&gt;
=== Using the DMU of ZFS ===&lt;br /&gt;
The Lustre team developed an OSD based on ZFS. Not ZFS as a filesystem (ZPL), but as an object store (DMU). This is an interesting approach as they benefit from all the ZFS cool features from the DMU (Copy On Write, Transactions, Snapshot, ...), but they don't get the overhead of the ZPL (inodes). Idea is to write the data in a DMU object, and index this object by an identifier (eg: hash) in the ZAP.&lt;br /&gt;
&lt;br /&gt;
Developing around ZFS code proven to be really easy, working code in a day or two.&lt;br /&gt;
&lt;br /&gt;
Positive points are:&lt;br /&gt;
* No need to prove it, ZFS is rock solid (it's a fact :))&lt;br /&gt;
* Random write performances are very good (compared to XFS, about 2.5x in synchronous mode, about 16x in asynchronous mode)&lt;br /&gt;
* Random read performance in constrained memory environment are a bit better than XFS. It would probably be better with a ZAP replacement (see Downside)&lt;br /&gt;
* It's maintained and active, no reason to think it won't be in the future&lt;br /&gt;
* Run on top of XFS in a file (about 5% performance lost) as directly on devices, so it could be an easy migration path&lt;br /&gt;
* Cool features that could be used in Swift in the future (zfs send to replicate? see https://www.ixsystems.com/blog/openzfs-devsummit-2016/ &amp;quot;Redacted send/receive&amp;quot; and &amp;quot;Compressed Send and Receive&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Downsides are:&lt;br /&gt;
* ZFS code is very low level (even if it runs in userland), developed in C. Even if it's clear and well written, it would require some effort to fully and correctly wrap our minds around it.&lt;br /&gt;
* Had some instabilities when running from golang/cgo while it's perfectly stable with C (todo: try runtime.LockOSThread())&lt;br /&gt;
* ZAP is not optimized for our use case, one record is about 258 bytes while we only really need around 50-60 bytes/. Also it does not allow range scan. So we would probably end up developing a replacement for ZAP, some kind of b-tree or equivalent on top of DMU (unless we find something compatible with our needs, maybe https://github.com/timtadh/fs2 ?)&lt;/div&gt;</summary>
		<author><name>Romain.le-disez</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Swift/ideas/small_files&amp;diff=134127</id>
		<title>Swift/ideas/small files</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Swift/ideas/small_files&amp;diff=134127"/>
				<updated>2016-09-30T09:43:02Z</updated>
		
		<summary type="html">&lt;p&gt;Romain.le-disez: /* Unexepected side benefits (?) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Small file optimization in Swift =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Influences:''' Haystack, bluestore, git pack files&lt;br /&gt;
&lt;br /&gt;
One of the big problems with storing each file as a a separate file is that this creates a lot of inodes on the drive. If you have small objects in your cluster (common) and big drives (more common every day), then just the inodes and dentries for the XFS partition can exhaust your RAM. Swift tries to keep these things in page cache, but it's just too big. This means that:&lt;br /&gt;
* there's a lot fo FS metadata overhead for storage&lt;br /&gt;
* anything that has to iterate over each file is *slow*&lt;br /&gt;
* small erasure-coded objects can end up being relatively huge when considering the FS overhead&lt;br /&gt;
&lt;br /&gt;
== Idea ==&lt;br /&gt;
&lt;br /&gt;
In each suffix directory (or partition dir?) keep two FS trees. One is &amp;quot;normal&amp;quot;, ie the way things are now. The other is for small files and uses a slab file and index system. The slab file is one file on disk that is the concatenated data+metadata of small objects. The index file references each object in the slab by name or hash and it's offset in the slab.&lt;br /&gt;
&lt;br /&gt;
== Challenges ==&lt;br /&gt;
&lt;br /&gt;
* fragmentation or compaction&lt;br /&gt;
* chunked transfer encoding (where content-length isn't known up front)&lt;br /&gt;
** object server could spool eg 1MB (or whatever &amp;quot;small&amp;quot; is) and if it's in that first read, use a slab. otherwise, use the normal FS file&lt;br /&gt;
* extra disk seek to find slab or flat file&lt;br /&gt;
* finding the right spot in the slab file&lt;br /&gt;
** only append to the slab file and use a compaction process to deal with &amp;quot;holes&amp;quot; for deleted data&lt;br /&gt;
&lt;br /&gt;
== Unexepected side benefits (?) ==&lt;br /&gt;
* global replication might be faster (copy one slab file instead of lots of little files)&lt;br /&gt;
* faster ingestion of new drives&lt;br /&gt;
* small-file optimization in EC&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Worth to read/look at:&lt;br /&gt;
* https://www.usenix.org/legacy/event/osdi10/tech/full_papers/Beaver.pdf&lt;br /&gt;
* https://github.com/chrislusf/seaweedfs (Haystack implementation)&lt;br /&gt;
* http://www.ssrc.ucsc.edu/Papers/wang-mss04b.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Want to talk more? Find '''notmyname''' on IRC&lt;/div&gt;</summary>
		<author><name>Romain.le-disez</name></author>	</entry>

	</feed>