<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 12 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='color:#1F497D'>Forgot to put the [Swift] on the subject of this email – resubmitting so it doesn’t get missed.<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><div><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Pecoraro, Alex <br><b>Sent:</b> Wednesday, June 12, 2013 11:02 AM<br><b>To:</b> OpenStack Development Mailing List<br><b>Subject:</b> code changes feedback<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Hi, I’ve been working on some changes to Swift that I’m not quite done with, but I wanted to request some feedback on the path I’m taking to make sure it is correct/acceptable. My changes don’t add any new features per se, their purpose is to make the code a little more flexible so that it is easier to add custom behavior by subclassing base Swift classes and overriding key functions. The reason that I want to do this is so that I can create extensions to Swift either through monkey-patching or some other method that make it possible for Swift to work with Isilon storage devices. The main change that I needed to make was to how nodes are iterated in the proxy server, replicators, updaters, and the container synchronizer. So I created a class called NodeIterator and another class called NodeIteratorFactory, which are used for iterating the primary and handoff nodes rather than simply iterating the list of nodes returned by ring.get_nodes(), ring.get_more_nodes(), etc. So for example, the proxy server the code for iterating through nodes to satisfy a GET request  changes from this: <o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>def GETorHEAD_base(self, req, server_type, ring, partition, path):<o:p></o:p></p><p class=MsoNormal>…<o:p></o:p></p><p class=MsoNormal>for node in self.iter_nodes(ring, partition):<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>to (more or less) this:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>def GETorHEAD_base(self, req, server_type, ring, partition, path):<o:p></o:p></p><p class=MsoNormal>…<o:p></o:p></p><p class=MsoNormal>node_iter = self.node_iterator_factory.create(ring, part)<o:p></o:p></p><p class=MsoNormal>for node in node_iter:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>My plan is to create a subclass of NodeIteratorFactory and override the create function to have it return a subclass of NodeIterator that iterates the nodes in a way that is compatible with Isilon devices.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I’ve attached a patch file showing what I’ve done so far. Please take a look and let me know what you think.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Also, I’m not sure if I created the patch file correctly, it seems to show every change that I’ve committed rather than just my most recent changes (this is my first time using git). I’ve been committing locally and then pulling in changes from the origin/source as I go in order to lessen the chance of conflicts. Hopefully that’s not too confusing.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Thanks.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Alex<o:p></o:p></p></div></body></html>