)]}'
{"specs/in_progress/erasure_coding.rst":[{"author":{"_account_id":5189,"name":"Yuan Zhou","email":"dunk007@gmail.com","username":"yuan-zhou"},"change_message_id":"7087a255d29e9371b127832f9b061f0254840001","unresolved":false,"context_lines":[{"line_number":158,"context_line":"    #. Object servers store objects which are EC archives (their contents are the concatenation of erasure coded fragments)"},{"line_number":159,"context_line":"    #. Object metadata changes: for \u0027etag\u0027, we store the md5sum of the EC archive object, as opposed to the non-EC case     where we store md5sum of the entire object"},{"line_number":160,"context_line":"    #. Upon quorum of response and some minimal (2) number of commit confirmations, responds to client"},{"line_number":161,"context_line":"    #. Upon receipt of the commit message (part of a MIME conversation) storage nodes store 0 byte data file as timestamp.durable for respective object"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"**Proxy HTTP PUT request handling changes**"},{"line_number":164,"context_line":"    #. Intercept EC request based on policy type"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3a961159_5dca5c1b","line":161,"updated":"2014-12-26 05:39:44.000000000","message":"would there be any fallback operations if the 1st phase failed? like removing the last version data","commit_id":"ec78faeba4f1ff09a3b05ea1893e54f07e8f0050"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"2beb548446891b7a14fed25c5b96b086fa91ef1f","unresolved":false,"context_lines":[{"line_number":158,"context_line":"    #. Object servers store objects which are EC archives (their contents are the concatenation of erasure coded fragments)"},{"line_number":159,"context_line":"    #. Object metadata changes: for \u0027etag\u0027, we store the md5sum of the EC archive object, as opposed to the non-EC case     where we store md5sum of the entire object"},{"line_number":160,"context_line":"    #. Upon quorum of response and some minimal (2) number of commit confirmations, responds to client"},{"line_number":161,"context_line":"    #. Upon receipt of the commit message (part of a MIME conversation) storage nodes store 0 byte data file as timestamp.durable for respective object"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"**Proxy HTTP PUT request handling changes**"},{"line_number":164,"context_line":"    #. Intercept EC request based on policy type"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3a961159_656f3afd","line":161,"in_reply_to":"3a961159_5dca5c1b","updated":"2014-12-31 22:27:07.000000000","message":"I don\u0027t think I can answer that in this part of the spec, its sorta scattered throughout but maybe a \"example scenarios\" section would make sense after we\u0027re a little more baked.  The answer is \"it depends\".  If by 1st phase you mean the storing of the EC archives, what happens then is that the reconstructor will either reconstruct (if enough made it) and write out a durable file or the un-reconstructoable junk will get deleted by the reconstructor at some point in time.","commit_id":"ec78faeba4f1ff09a3b05ea1893e54f07e8f0050"},{"author":{"_account_id":5189,"name":"Yuan Zhou","email":"dunk007@gmail.com","username":"yuan-zhou"},"change_message_id":"7087a255d29e9371b127832f9b061f0254840001","unresolved":false,"context_lines":[{"line_number":354,"context_line":""},{"line_number":355,"context_line":"For EC we\u0027ll base the number on the quorum value which is available via a"},{"line_number":356,"context_line":"policy method. So, when its time to do account/container updates, only"},{"line_number":357,"context_line":"X \u003d (total - quorum) of the nodes participating in the EC scheme should actually"},{"line_number":358,"context_line":"perform the updates."},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"To start with just the first X would work however there are likely some"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3a961159_9e0d9beb","line":357,"updated":"2014-12-26 05:39:44.000000000","message":"I think the account-update should not be changed here since we still use 3 copy in container-server?\nTo use (K+M)-(K+1)\u003dM-1 object-servers to do the container-update seems fine.","commit_id":"ec78faeba4f1ff09a3b05ea1893e54f07e8f0050"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"2beb548446891b7a14fed25c5b96b086fa91ef1f","unresolved":false,"context_lines":[{"line_number":354,"context_line":""},{"line_number":355,"context_line":"For EC we\u0027ll base the number on the quorum value which is available via a"},{"line_number":356,"context_line":"policy method. So, when its time to do account/container updates, only"},{"line_number":357,"context_line":"X \u003d (total - quorum) of the nodes participating in the EC scheme should actually"},{"line_number":358,"context_line":"perform the updates."},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"To start with just the first X would work however there are likely some"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3a961159_857506ce","line":357,"in_reply_to":"3a961159_9e0d9beb","updated":"2014-12-31 22:27:07.000000000","message":"what we\u0027re trying to say here is that not all object servers will be doing DB updates - that would be too many.  We\u0027re not talking about how many DB copies there are.","commit_id":"ec78faeba4f1ff09a3b05ea1893e54f07e8f0050"},{"author":{"_account_id":5189,"name":"Yuan Zhou","email":"dunk007@gmail.com","username":"yuan-zhou"},"change_message_id":"9d520a2f61809467e5e8ac381069be1f4fabab28","unresolved":false,"context_lines":[{"line_number":422,"context_line":"is appended to the filename just before the .data extension.  An example filename for a fragment"},{"line_number":423,"context_line":"archive storing the 5th fragment would like this this::"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"    1418673556.92690-5.data"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"**New Hashes.pkl Format**"},{"line_number":428,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3a961159_1d9f9bb5","line":425,"updated":"2014-12-18 07:58:41.000000000","message":"if FA index was added to the path, all the corresponding hashes.pkl will be different. Then how does the update() figure out which suffix director to check?","commit_id":"ec78faeba4f1ff09a3b05ea1893e54f07e8f0050"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"2beb548446891b7a14fed25c5b96b086fa91ef1f","unresolved":false,"context_lines":[{"line_number":422,"context_line":"is appended to the filename just before the .data extension.  An example filename for a fragment"},{"line_number":423,"context_line":"archive storing the 5th fragment would like this this::"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"    1418673556.92690-5.data"},{"line_number":426,"context_line":""},{"line_number":427,"context_line":"**New Hashes.pkl Format**"},{"line_number":428,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"3a961159_c57f0eaa","line":425,"in_reply_to":"3a961159_1d9f9bb5","updated":"2014-12-31 22:27:07.000000000","message":"you are correct, see https://review.openstack.org/#/c/131872/ for the answers","commit_id":"ec78faeba4f1ff09a3b05ea1893e54f07e8f0050"},{"author":{"_account_id":5189,"name":"Yuan Zhou","email":"dunk007@gmail.com","username":"yuan-zhou"},"change_message_id":"9d520a2f61809467e5e8ac381069be1f4fabab28","unresolved":false,"context_lines":[{"line_number":498,"context_line":""},{"line_number":499,"context_line":"**Reconstructor handoff reversion**"},{"line_number":500,"context_line":""},{"line_number":501,"context_line":"Handoff reversion here means what is done as part of update_deleleted() - when the reconstructor"},{"line_number":502,"context_line":"has identified that it has a partition that doesn\u0027t belong there.  In order to get what may be a"},{"line_number":503,"context_line":"mixture of fragment archive indexes back to their \"preferred nodes\" (what is encoded in their"},{"line_number":504,"context_line":"filenames) udpate_deleted() uses a trailing filter w/diskfile when getting a list of available"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3a961159_4236a253","line":501,"updated":"2014-12-18 07:58:41.000000000","message":"so this only happens at handoff case, and if there\u0027s some mismatch on the chunks index with the primary nodes index, we\u0027ll always try to do the reconstruct, right?","commit_id":"ec78faeba4f1ff09a3b05ea1893e54f07e8f0050"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"2beb548446891b7a14fed25c5b96b086fa91ef1f","unresolved":false,"context_lines":[{"line_number":498,"context_line":""},{"line_number":499,"context_line":"**Reconstructor handoff reversion**"},{"line_number":500,"context_line":""},{"line_number":501,"context_line":"Handoff reversion here means what is done as part of update_deleleted() - when the reconstructor"},{"line_number":502,"context_line":"has identified that it has a partition that doesn\u0027t belong there.  In order to get what may be a"},{"line_number":503,"context_line":"mixture of fragment archive indexes back to their \"preferred nodes\" (what is encoded in their"},{"line_number":504,"context_line":"filenames) udpate_deleted() uses a trailing filter w/diskfile when getting a list of available"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3a961159_65465a7d","line":501,"in_reply_to":"3a961159_4236a253","updated":"2014-12-31 22:27:07.000000000","message":"I\u0027m not sure what you mean by \"this\" but the basic ideas of what udpate_deleted() and update() are the same for the recon as they are for the repl.  Thus section is about reverting data from a handoff meaning it covers the movement of a partition back to where it goes.  The extra complication here is that not all of the files in the partition may be going back to the same place","commit_id":"ec78faeba4f1ff09a3b05ea1893e54f07e8f0050"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"71d3a2ec2740685bb5ef1f89b4f958fc44b3b6e3","unresolved":false,"context_lines":[{"line_number":501,"context_line":"Handoff reversion here means what is done as part of update_deleleted() - when the reconstructor"},{"line_number":502,"context_line":"has identified that it has a partition that doesn\u0027t belong there.  In order to get what may be a"},{"line_number":503,"context_line":"mixture of fragment archive indexes back to their \"preferred nodes\" (what is encoded in their"},{"line_number":504,"context_line":"filenames) udpate_deleted() uses a trailing filter w/diskfile when getting a list of available"},{"line_number":505,"context_line":"files to send via ssync and then uses that same value (the fragment index) as an index into the"},{"line_number":506,"context_line":"primary node list to determine where to send it.  That\u0027s why the node/index pairing is critical"},{"line_number":507,"context_line":"to the reconstructor.  If the fragment index encoded in the filename doesn\u0027t consistently return"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3a961159_61450e42","line":504,"updated":"2014-12-22 04:29:31.000000000","message":"s/udpate_deleted/update_deleted/","commit_id":"ec78faeba4f1ff09a3b05ea1893e54f07e8f0050"},{"author":{"_account_id":7479,"name":"paul luse","email":"paul.e.luse@intel.com","username":"peluse"},"change_message_id":"2beb548446891b7a14fed25c5b96b086fa91ef1f","unresolved":false,"context_lines":[{"line_number":501,"context_line":"Handoff reversion here means what is done as part of update_deleleted() - when the reconstructor"},{"line_number":502,"context_line":"has identified that it has a partition that doesn\u0027t belong there.  In order to get what may be a"},{"line_number":503,"context_line":"mixture of fragment archive indexes back to their \"preferred nodes\" (what is encoded in their"},{"line_number":504,"context_line":"filenames) udpate_deleted() uses a trailing filter w/diskfile when getting a list of available"},{"line_number":505,"context_line":"files to send via ssync and then uses that same value (the fragment index) as an index into the"},{"line_number":506,"context_line":"primary node list to determine where to send it.  That\u0027s why the node/index pairing is critical"},{"line_number":507,"context_line":"to the reconstructor.  If the fragment index encoded in the filename doesn\u0027t consistently return"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3a961159_c5562e2a","line":504,"in_reply_to":"3a961159_61450e42","updated":"2014-12-31 22:27:07.000000000","message":"Done","commit_id":"ec78faeba4f1ff09a3b05ea1893e54f07e8f0050"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"e3a76b3d13dd7118405415923af86e3451ded210","unresolved":false,"context_lines":[{"line_number":89,"context_line":"* EC archive: A concatenation of EC fragments; to a storage node this looks like an object"},{"line_number":90,"context_line":"* ec_k: number of EC data fragments (k is commonly used in the EC community for this purpose)"},{"line_number":91,"context_line":"* ec_m: number of EC parity fragments (m is commonly used in the EC community for this purpose)"},{"line_number":92,"context_line":"* chunk: HTTP chunks received over wire (term not used to describe any EC specific operation)"},{"line_number":93,"context_line":"* durable: original data is available (either with or without reconstruction)"},{"line_number":94,"context_line":"* quorum: the minimum number of data + parity elements required to be able to guarantee the desired fault tolerance, which is the number of data elements supplemented by the minimum number of parity elements required by the chosen erasure coding scheme. For example,for Reed-Soloman, the minimum number parity elements required is 1, and thus the quorum_size requirement is ec_ndata + 1.  Given the number of parity elements required is not the same for every erasure coding scheme, consult PyECLib for min_parity_fragments_needed()"},{"line_number":95,"context_line":"* fully durable: all EC archives are written and available"}],"source_content_type":"text/x-rst","patch_set":3,"id":"da86d52c_20c0097c","line":92,"updated":"2015-02-07 21:10:30.000000000","message":"Nitpick: Should chuck come first, as a segment is a series of chucks?\n\nBut I am also probably just grumpy cause I\u0027ve been flying to too long :P","commit_id":"4cadf1977844d8116edc713ff1adcf05b9d15cc5"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"e3a76b3d13dd7118405415923af86e3451ded210","unresolved":false,"context_lines":[{"line_number":98,"context_line":"----------------"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"* EC is a Storage Policy with its own ring and configurable set of parameters.  The # of replicas for an EC ring is the total number of data plus parity elements configured for the chosen EC scheme."},{"line_number":101,"context_line":"* Proxy server buffers a configurable amount of incoming data and then encodes it via PyECLib we called this a \u0027segment\u0027 of an object."},{"line_number":102,"context_line":"* Proxy distributes the output of the encoding of a segment to the various object nodes it gets from the EC ring, we call these \u0027fragments\u0027 of the segment"},{"line_number":103,"context_line":"* Each fragment carries opaque metadata for use by the PyECLib"},{"line_number":104,"context_line":"* Object metadata is used to store meta about both the fragments and the objects"}],"source_content_type":"text/x-rst","patch_set":3,"id":"da86d52c_40bdfd01","line":101,"updated":"2015-02-07 21:10:30.000000000","message":"So it\u0027s a segment _before_ it\u0027s encoded, it doesn\u0027t quite read that way.\n\nYup today I\u0027m Mr Nitpick!","commit_id":"4cadf1977844d8116edc713ff1adcf05b9d15cc5"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"e3a76b3d13dd7118405415923af86e3451ded210","unresolved":false,"context_lines":[{"line_number":399,"context_line":"Each storage policy now must include a transformation function that diskfile will use to build the"},{"line_number":400,"context_line":"filename to store on disk.  This is required by the reconstructor for a few reasons.  For one, it"},{"line_number":401,"context_line":"allows us to store fragment archives of different indexes on the same storage node.  This is not"},{"line_number":402,"context_line":"hone in the happy path however is possible in some circumstances.  Without unique filenames for"},{"line_number":403,"context_line":"the different EC archive files in a set, we would be at risk of overwriting one archive of index"},{"line_number":404,"context_line":"n with another of index m in some scenarios."},{"line_number":405,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"da86d52c_60ba010c","line":402,"updated":"2015-02-07 21:10:30.000000000","message":"hone? did you mean done?","commit_id":"4cadf1977844d8116edc713ff1adcf05b9d15cc5"}]}
