)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c6bc3d6311f60a4d28331cbf751456d7a33bc49","unresolved":false,"context_lines":[{"line_number":45,"context_line":"tempfile.gettempdir(). This will allow setting the TMPDIR envvar in"},{"line_number":46,"context_line":"test setup and getting an XFS filesystem instead of ext4 or tmpfs."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"THIS PATCH SIGNIFICANTLY CHANGES TESTING ENVIRONMENTS"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"With this patch, every test environment will require TMPDIR to be"},{"line_number":51,"context_line":"using a filesystem that supports at least 4k of extended attributes."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"3a71b18c_90543755","line":48,"updated":"2016-12-01 15:53:55.000000000","message":"hehe, .. the *patch* doesn\u0027t change them but it requires US to change them :)","commit_id":"5fa8e0c9b1553d2b601d68b77620a2fc34149d4c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c6bc3d6311f60a4d28331cbf751456d7a33bc49","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"The changes to test_recon.py were necessary since it hard-coded /tmp"},{"line_number":61,"context_line":"and GZip was using the full path name in the resulting compressed"},{"line_number":62,"context_line":"file. This meant that by changing the temprary working directory, the"},{"line_number":63,"context_line":"resulting md5sums changed. The full pathname being used was for Py26"},{"line_number":64,"context_line":"compatibility, so I dropped that and updated the expected md5sum"},{"line_number":65,"context_line":"results to match."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"3a71b18c_8d6d0435","line":62,"updated":"2016-12-01 15:53:55.000000000","message":"s/temprary/temporary/","commit_id":"5fa8e0c9b1553d2b601d68b77620a2fc34149d4c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c6bc3d6311f60a4d28331cbf751456d7a33bc49","unresolved":false,"context_lines":[{"line_number":62,"context_line":"file. This meant that by changing the temprary working directory, the"},{"line_number":63,"context_line":"resulting md5sums changed. The full pathname being used was for Py26"},{"line_number":64,"context_line":"compatibility, so I dropped that and updated the expected md5sum"},{"line_number":65,"context_line":"results to match."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"`test.unit.skip_if_no_xattrs()` is also imported into `test.functional`"},{"line_number":68,"context_line":"so that functional tests can import it from the functional test"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"3a71b18c_3009a396","line":65,"updated":"2016-12-01 15:53:55.000000000","message":"^^ this looks stale, perhaps since the changes were no longer necessary after basing on https://review.openstack.org/#/c/404500 ?","commit_id":"5fa8e0c9b1553d2b601d68b77620a2fc34149d4c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2dbf778cc43fd8aba18f73bc8b25b2a68009a12c","unresolved":false,"context_lines":[{"line_number":55,"context_line":"the tests to run on the base image for OpenStack\u0027s CI system. Since"},{"line_number":56,"context_line":"we were previously mocking out xattr, there wasn\u0027t a problem, but we"},{"line_number":57,"context_line":"also weren\u0027t actually testing anything. This patch adds functionality"},{"line_number":58,"context_line":"to validate xattr data, so we need to drop the mock."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"The changes to test_recon.py were necessary since it hard-coded /tmp"},{"line_number":61,"context_line":"and GZip was using the full path name in the resulting compressed"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":22,"id":"3f4b6375_18e5eaa8","line":58,"updated":"2017-10-20 16:10:40.000000000","message":"I wonder if this will cause headaches for any packagers...","commit_id":"bed2cec60e1ea1fde796147529dbe30d750212bb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2dbf778cc43fd8aba18f73bc8b25b2a68009a12c","unresolved":false,"context_lines":[{"line_number":61,"context_line":"and GZip was using the full path name in the resulting compressed"},{"line_number":62,"context_line":"file. This meant that by changing the temprary working directory, the"},{"line_number":63,"context_line":"resulting md5sums changed. The full pathname being used was for Py26"},{"line_number":64,"context_line":"compatibility, so I dropped that and updated the expected md5sum"},{"line_number":65,"context_line":"results to match."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"`test.unit.skip_if_no_xattrs()` is also imported into `test.functional`"},{"line_number":68,"context_line":"so that functional tests can import it from the functional test"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":22,"id":"3f4b6375_58db62ec","line":65,"range":{"start_line":64,"start_character":18,"end_line":65,"end_character":16},"updated":"2017-10-20 16:10:40.000000000","message":"The who in the what now?","commit_id":"bed2cec60e1ea1fde796147529dbe30d750212bb"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"94c715c5bb773eb9aa5b23ed56149c577e33ed85","unresolved":false,"context_lines":[{"line_number":61,"context_line":"and GZip was using the full path name in the resulting compressed"},{"line_number":62,"context_line":"file. This meant that by changing the temprary working directory, the"},{"line_number":63,"context_line":"resulting md5sums changed. The full pathname being used was for Py26"},{"line_number":64,"context_line":"compatibility, so I dropped that and updated the expected md5sum"},{"line_number":65,"context_line":"results to match."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"`test.unit.skip_if_no_xattrs()` is also imported into `test.functional`"},{"line_number":68,"context_line":"so that functional tests can import it from the functional test"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":22,"id":"3f4b6375_a717d245","line":65,"range":{"start_line":64,"start_character":18,"end_line":65,"end_character":16},"in_reply_to":"3f4b6375_44e7fce5","updated":"2017-10-20 18:15:08.000000000","message":"Looks like most of that has gone away in recent patch sets, along with the py26-isms. The simple answer is that this paragraph in the commit message could go away.\n\n@tburke but for a specific answer... see an earlier patch set (eg I saw it in patch set 10). The tests used to test a real md5 checksum. That\u0027s what I\u0027d changed","commit_id":"bed2cec60e1ea1fde796147529dbe30d750212bb"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"137dcd919bc70ba4e22e6aa22207a4d3b355e82f","unresolved":false,"context_lines":[{"line_number":61,"context_line":"and GZip was using the full path name in the resulting compressed"},{"line_number":62,"context_line":"file. This meant that by changing the temprary working directory, the"},{"line_number":63,"context_line":"resulting md5sums changed. The full pathname being used was for Py26"},{"line_number":64,"context_line":"compatibility, so I dropped that and updated the expected md5sum"},{"line_number":65,"context_line":"results to match."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"`test.unit.skip_if_no_xattrs()` is also imported into `test.functional`"},{"line_number":68,"context_line":"so that functional tests can import it from the functional test"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":22,"id":"3f4b6375_44e7fce5","line":65,"range":{"start_line":64,"start_character":18,"end_line":65,"end_character":16},"in_reply_to":"3f4b6375_58db62ec","updated":"2017-10-20 17:52:38.000000000","message":"@John Dickinson: want to chime in here? I think you wrote this part.","commit_id":"bed2cec60e1ea1fde796147529dbe30d750212bb"}],"doc/source/development_saio.rst":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e2ec6087fa17840a241b99f9a3d57937e10ab538","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        truncate -s 1GB xfs_file  # create 1GB fil for XFS in your home directory"},{"line_number":185,"context_line":"        mkfs.xfs xfs_file"},{"line_number":186,"context_line":"        sudo mount -o loop,noatime,nodiratime xfs_file /tmp"},{"line_number":187,"context_line":"        sudo chown -r 777 xfstmp"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"To persist this, edit and add the following to ``/etc/fstab``::"},{"line_number":190,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"5a74a57a_293eb529","line":187,"updated":"2016-11-30 16:55:09.000000000","message":"chown or chmod?\n\ns/xfstmp/xfs_file/ or s/xfstmp/tmp ?\n\ndoesn\u0027t work OMM:\n\n  $ sudo chown -r 777 xfstmp\nchown: invalid option -- \u0027r\u0027\n\n-R perhaps? (recursive) but then its empty so no need for that.","commit_id":"0e988544f11a7b6c0a8607080072567cb9df93c9"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"f12dd1baeb821f9577a54c8d168caf12ba58f221","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        truncate -s 1GB xfs_file  # create 1GB fil for XFS in your home directory"},{"line_number":185,"context_line":"        mkfs.xfs xfs_file"},{"line_number":186,"context_line":"        sudo mount -o loop,noatime,nodiratime xfs_file /tmp"},{"line_number":187,"context_line":"        sudo chown -r 777 xfstmp"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"To persist this, edit and add the following to ``/etc/fstab``::"},{"line_number":190,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"5a74a57a_4ca81fdc","line":187,"in_reply_to":"5a74a57a_293eb529","updated":"2016-11-30 19:05:00.000000000","message":"yep. done\n\nI added the -R just to be sure","commit_id":"0e988544f11a7b6c0a8607080072567cb9df93c9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e2ec6087fa17840a241b99f9a3d57937e10ab538","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"To persist this, edit and add the following to ``/etc/fstab``::"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        /home/swift/xfs_file /tmp xfs rw,noatime,nodiratime,attr2,inode64,noquota 0 0"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"----------------"},{"line_number":194,"context_line":"Getting the code"}],"source_content_type":"text/x-rst","patch_set":12,"id":"5a74a57a_3eab4dd8","line":191,"updated":"2016-11-30 16:55:09.000000000","message":"we also have notes about how to run tests in development_guildelines.rst. It would be nice to unify these, and those in the README, in one place. That could be a follow-up.","commit_id":"0e988544f11a7b6c0a8607080072567cb9df93c9"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"f12dd1baeb821f9577a54c8d168caf12ba58f221","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"To persist this, edit and add the following to ``/etc/fstab``::"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        /home/swift/xfs_file /tmp xfs rw,noatime,nodiratime,attr2,inode64,noquota 0 0"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"----------------"},{"line_number":194,"context_line":"Getting the code"}],"source_content_type":"text/x-rst","patch_set":12,"id":"5a74a57a_4c449f1a","line":191,"in_reply_to":"5a74a57a_3eab4dd8","updated":"2016-11-30 19:05:00.000000000","message":"Done","commit_id":"0e988544f11a7b6c0a8607080072567cb9df93c9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c6bc3d6311f60a4d28331cbf751456d7a33bc49","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        truncate -s 1GB xfs_file  # create 1GB fil for XFS in your home directory"},{"line_number":185,"context_line":"        mkfs.xfs xfs_file"},{"line_number":186,"context_line":"        sudo mount -o loop,noatime,nodiratime xfs_file /tmp"},{"line_number":187,"context_line":"        sudo chmod -R 777 xfstmp"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"To persist this, edit and add the following to ``/etc/fstab``::"},{"line_number":190,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"3a71b18c_5e22c2ba","line":187,"updated":"2016-12-01 15:53:55.000000000","message":"1. it\u0027s still saying xfstmp, should be /tmp (including the leading /)\n\n2. I mentioned -R on last patchset because I was trying to figure where the -r came from, didn\u0027t meant to suggest it was necessary :) NM","commit_id":"5fa8e0c9b1553d2b601d68b77620a2fc34149d4c"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"94155115c7bdefbe8ccc5d012b6618f27ad5384a","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        truncate -s 1GB xfs_file  # create 1GB fil for XFS in your home directory"},{"line_number":213,"context_line":"        mkfs.xfs xfs_file"},{"line_number":214,"context_line":"        sudo mount -o loop,noatime,nodiratime xfs_file /tmp"},{"line_number":215,"context_line":"        sudo chmod -R 777 xfstmp"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"To persist this, edit and add the following to ``/etc/fstab``::"},{"line_number":218,"context_line":""}],"source_content_type":"text/x-rst","patch_set":23,"id":"3f4b6375_5de43f0d","line":215,"range":{"start_line":215,"start_character":26,"end_line":215,"end_character":32},"updated":"2017-11-02 05:53:12.000000000","message":"This should be \u0027/tmp\u0027:\n\n  sudo chmod -R 777 /tmp\n\nWhile were at it, the temp usually has the sticky bit set, so should this be 1777?","commit_id":"62d75204d28eeed0029337c5e6ac3057b5a647ec"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f3fffcda53bbd09eac1fa7a0d2c18fa86e30e15a","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        truncate -s 1GB xfs_file  # create 1GB fil for XFS in your home directory"},{"line_number":213,"context_line":"        mkfs.xfs xfs_file"},{"line_number":214,"context_line":"        sudo mount -o loop,noatime,nodiratime xfs_file /tmp"},{"line_number":215,"context_line":"        sudo chmod -R 777 xfstmp"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"To persist this, edit and add the following to ``/etc/fstab``::"},{"line_number":218,"context_line":""}],"source_content_type":"text/x-rst","patch_set":23,"id":"3f4b6375_7bfff1aa","line":215,"range":{"start_line":215,"start_character":26,"end_line":215,"end_character":32},"in_reply_to":"3f4b6375_5de43f0d","updated":"2017-11-02 17:23:21.000000000","message":"Done","commit_id":"62d75204d28eeed0029337c5e6ac3057b5a647ec"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"da6377ea526317d8f3ce17fd98b1d612a8226d2b","unresolved":false,"context_lines":[{"line_number":216,"context_line":""},{"line_number":217,"context_line":"To persist this, edit and add the following to ``/etc/fstab``::"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"        /home/swift/xfs_file /tmp xfs rw,noatime,nodiratime,attr2,inode64,noquota 0 0"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"----------------"},{"line_number":222,"context_line":"Getting the code"}],"source_content_type":"text/x-rst","patch_set":23,"id":"3f4b6375_591473a0","line":219,"updated":"2017-11-01 07:30:23.000000000","message":"This is nice, but wouldn\u0027t it be easier to just use the existing XFS loopback or partition we\u0027ve already gone to the effort of creating?\nI.e make a tmp dir and export TMPDIR in our bashrc\u0027s:\n\n  mkdir /mnt/sdb1/tmp\n  chown ${USER}:${USER} /mnt/sdb1/tmp\n  echo \"export TMPDIR\u003d/mnt/sdb1/tmp\" \u003e\u003e ~/.bashrc\n  export TMPDIR\u003d/mnt/sdb1/tmp\n\nThen we don\u0027t need to worry about having to make an additional loopback XFS drive. If we\u0027re worried about size, maybe it\u0027s time to just up the swift-disk.\n\nEither way, this isn\u0027t a blocker, I\u0027ll try and throw it in an followup patch. But at least this way, it can just be included in the existing create folder structure etc and add stuff to bashrc with the other steps.","commit_id":"62d75204d28eeed0029337c5e6ac3057b5a647ec"}],"swift/common/manager.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c6bc3d6311f60a4d28331cbf751456d7a33bc49","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                \"Running as non-root?\"))"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    # Set PYTHON_EGG_CACHE if it isn\u0027t already set"},{"line_number":87,"context_line":"    os.environ.setdefault(\u0027PYTHON_EGG_CACHE\u0027, tempfile.gettempdir())"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"def command(func):"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a71b18c_c9c5375c","line":87,"updated":"2016-12-01 15:53:55.000000000","message":"docstring needs changing at line 63","commit_id":"5fa8e0c9b1553d2b601d68b77620a2fc34149d4c"}],"swift/obj/diskfile.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5a0563abddd78b09b38a9a5c3640a019e17662a2","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        # All the interesting errors were handled above; the only thing left"},{"line_number":142,"context_line":"        # here is ENODATA / ENOATTR to indicate that this attribute doesn\u0027t"},{"line_number":143,"context_line":"        # exist. This is fine; it just means that this object predates the"},{"line_number":144,"context_line":"        # introduction of metadata checksums."},{"line_number":145,"context_line":"        pass"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    if metadata_checksum:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_feed8d25","line":144,"updated":"2016-07-01 03:05:07.000000000","message":"rather than a comment, how about `if e.errno not in ...: raise`","commit_id":"a573c3066285f9b0f6a52edbf6685637742fe5cd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5a0563abddd78b09b38a9a5c3640a019e17662a2","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        pass"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    if metadata_checksum:"},{"line_number":148,"context_line":"        computed_checksum \u003d hashlib.md5(metadata).hexdigest()"},{"line_number":149,"context_line":"        if metadata_checksum !\u003d computed_checksum:"},{"line_number":150,"context_line":"            raise DiskFileBadMetadataChecksum("},{"line_number":151,"context_line":"                \"Metadata checksum mismatch for %s: \""}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_de01b1b0","line":148,"updated":"2016-07-01 03:05:07.000000000","message":"bah, md5 - when you have a hammer right!?\n\nshould we go-ahead and add a version indicator on there?\n\nI guess in the future we could always just make sure the first character isn\u0027t a hex char.\n\nSo instead of\n\n    \u003cundecorated-32-bytes-for-only-128-bits-of-checksum\u003e\n\nwe do\n\n    v2:\u003czlib.crc32\u003e\n\n... or whatever, leave it, I\u0027m probably just nuts coming off crypto to make everything a json dict because you never know ;)","commit_id":"a573c3066285f9b0f6a52edbf6685637742fe5cd"},{"author":{"_account_id":18838,"name":"Paul Dardeau","email":"paul.dardeau@intel.com","username":"pdardeau"},"change_message_id":"89658ae3257dd5219bea095fa8c95a97fc9dee41","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        pass"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    if metadata_checksum:"},{"line_number":148,"context_line":"        computed_checksum \u003d hashlib.md5(metadata).hexdigest()"},{"line_number":149,"context_line":"        if metadata_checksum !\u003d computed_checksum:"},{"line_number":150,"context_line":"            raise DiskFileBadMetadataChecksum("},{"line_number":151,"context_line":"                \"Metadata checksum mismatch for %s: \""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_06cdc965","line":148,"updated":"2016-09-16 03:09:38.000000000","message":"md5 feels a bit heavy","commit_id":"2169f56437e51d4957adec1508cd0fe2a9a8df51"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c6bc3d6311f60a4d28331cbf751456d7a33bc49","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    :param fd: file descriptor or filename to load the metadata from"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    :returns: dictionary of metadata"},{"line_number":124,"context_line":"    \"\"\""},{"line_number":125,"context_line":"    metadata \u003d b\u0027\u0027"},{"line_number":126,"context_line":"    key \u003d 0"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a71b18c_20115fad","line":123,"updated":"2016-12-01 15:53:55.000000000","message":"nit: add \"raises\" info to docstring - DiskFileXattrNotSupported, DiskFileNotExist and DiskFileBadMetadataChecksum","commit_id":"5fa8e0c9b1553d2b601d68b77620a2fc34149d4c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c6bc3d6311f60a4d28331cbf751456d7a33bc49","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        # introduction of metadata checksums."},{"line_number":152,"context_line":"        pass"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    if metadata_checksum:"},{"line_number":155,"context_line":"        computed_checksum \u003d hashlib.md5(metadata).hexdigest()"},{"line_number":156,"context_line":"        if metadata_checksum !\u003d computed_checksum:"},{"line_number":157,"context_line":"            raise DiskFileBadMetadataChecksum("}],"source_content_type":"text/x-python","patch_set":13,"id":"3a71b18c_c078abfb","line":154,"updated":"2016-12-01 15:53:55.000000000","message":"nit: this could be an else clause to the try","commit_id":"5fa8e0c9b1553d2b601d68b77620a2fc34149d4c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2b0bccb29bbeffcd054164f3413caed95167ced7","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        # All the interesting errors were handled above; the only thing left"},{"line_number":166,"context_line":"        # here is ENODATA / ENOATTR to indicate that this attribute doesn\u0027t"},{"line_number":167,"context_line":"        # exist. This is fine; it just means that this object predates the"},{"line_number":168,"context_line":"        # introduction of metadata checksums."},{"line_number":169,"context_line":"        pass"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    if metadata_checksum:"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f4e5783_c31045ab","line":168,"updated":"2017-10-13 22:41:37.000000000","message":"Should we have the auditor add missing metadata checksums?\n\nWould missing checksums get added during replication? Maybe only if using ssync?","commit_id":"3968428bd8fa73ceb8b1f3a9bd584b2fe86aabe9"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6e44a002deed3257472cae1509946f4aa566b0ed","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        # All the interesting errors were handled above; the only thing left"},{"line_number":166,"context_line":"        # here is ENODATA / ENOATTR to indicate that this attribute doesn\u0027t"},{"line_number":167,"context_line":"        # exist. This is fine; it just means that this object predates the"},{"line_number":168,"context_line":"        # introduction of metadata checksums."},{"line_number":169,"context_line":"        pass"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    if metadata_checksum:"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f4e5783_ede522dd","line":168,"in_reply_to":"5f4e5783_064d21c3","updated":"2017-10-17 19:02:28.000000000","message":"I\u0027m still a little worried here. It sounds like we *don\u0027t* want to go adding checksums to pre-existing data, but I\u0027ve confirmed that we *will* if we\u0027re using ssync for replication (and all reconstruction)...","commit_id":"3968428bd8fa73ceb8b1f3a9bd584b2fe86aabe9"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"3b1a34ed36f2d10ef1542ae682cf79146326c615","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        # All the interesting errors were handled above; the only thing left"},{"line_number":166,"context_line":"        # here is ENODATA / ENOATTR to indicate that this attribute doesn\u0027t"},{"line_number":167,"context_line":"        # exist. This is fine; it just means that this object predates the"},{"line_number":168,"context_line":"        # introduction of metadata checksums."},{"line_number":169,"context_line":"        pass"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    if metadata_checksum:"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f4e5783_064d21c3","line":168,"in_reply_to":"5f4e5783_067c2a70","updated":"2017-10-16 19:02:51.000000000","message":"I don\u0027t have plans for it. I\u0027d have to think long and hard about how to ensure that the data isn\u0027t already corrupt before tossing a checksum on it.","commit_id":"3968428bd8fa73ceb8b1f3a9bd584b2fe86aabe9"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"ab1e85686ba2141cc777bf3f0a5bba120b401d5c","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        # All the interesting errors were handled above; the only thing left"},{"line_number":166,"context_line":"        # here is ENODATA / ENOATTR to indicate that this attribute doesn\u0027t"},{"line_number":167,"context_line":"        # exist. This is fine; it just means that this object predates the"},{"line_number":168,"context_line":"        # introduction of metadata checksums."},{"line_number":169,"context_line":"        pass"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    if metadata_checksum:"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f4e5783_c342843e","line":168,"in_reply_to":"5f4e5783_c31045ab","updated":"2017-10-13 23:55:20.000000000","message":"It might be worth doing, but I think it\u0027s better as a subsequent change. Making the auditor modify existing objects is a significant change.","commit_id":"3968428bd8fa73ceb8b1f3a9bd584b2fe86aabe9"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6e712250b953ab765695214450937acda5347272","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        # All the interesting errors were handled above; the only thing left"},{"line_number":166,"context_line":"        # here is ENODATA / ENOATTR to indicate that this attribute doesn\u0027t"},{"line_number":167,"context_line":"        # exist. This is fine; it just means that this object predates the"},{"line_number":168,"context_line":"        # introduction of metadata checksums."},{"line_number":169,"context_line":"        pass"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    if metadata_checksum:"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f4e5783_067c2a70","line":168,"in_reply_to":"5f4e5783_c342843e","updated":"2017-10-14 00:25:33.000000000","message":"Still: Do we *ever* expect existing objects to pick up checksums?","commit_id":"3968428bd8fa73ceb8b1f3a9bd584b2fe86aabe9"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2b0bccb29bbeffcd054164f3413caed95167ced7","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        xattr.setxattr(fd, METADATA_CHECKSUM_KEY, metastr_md5)"},{"line_number":202,"context_line":"    except IOError as e:"},{"line_number":203,"context_line":"        for err in \u0027ENOTSUP\u0027, \u0027EOPNOTSUPP\u0027:"},{"line_number":204,"context_line":"            if hasattr(errno, err) and e.errno \u003d\u003d getattr(errno, err):"},{"line_number":205,"context_line":"                msg \u003d \"Filesystem at %s does not support xattr\" % \\"},{"line_number":206,"context_line":"                      _get_filename(fd)"},{"line_number":207,"context_line":"                logging.exception(msg)"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f4e5783_0369bd1f","line":204,"updated":"2017-10-13 22:41:37.000000000","message":"That\n\n errno.errorcode.get(e.errno)\n\nyou used in tests/unit/__init__.py seems rather appealing here...","commit_id":"3968428bd8fa73ceb8b1f3a9bd584b2fe86aabe9"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"3b1a34ed36f2d10ef1542ae682cf79146326c615","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        xattr.setxattr(fd, METADATA_CHECKSUM_KEY, metastr_md5)"},{"line_number":202,"context_line":"    except IOError as e:"},{"line_number":203,"context_line":"        for err in \u0027ENOTSUP\u0027, \u0027EOPNOTSUPP\u0027:"},{"line_number":204,"context_line":"            if hasattr(errno, err) and e.errno \u003d\u003d getattr(errno, err):"},{"line_number":205,"context_line":"                msg \u003d \"Filesystem at %s does not support xattr\" % \\"},{"line_number":206,"context_line":"                      _get_filename(fd)"},{"line_number":207,"context_line":"                logging.exception(msg)"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f4e5783_06fbe146","line":204,"in_reply_to":"5f4e5783_0369bd1f","updated":"2017-10-16 19:02:51.000000000","message":"Done","commit_id":"3968428bd8fa73ceb8b1f3a9bd584b2fe86aabe9"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"94155115c7bdefbe8ccc5d012b6618f27ad5384a","unresolved":false,"context_lines":[{"line_number":202,"context_line":"    except IOError as e:"},{"line_number":203,"context_line":"        # errno module doesn\u0027t always have both of these, hence the ugly"},{"line_number":204,"context_line":"        # check"},{"line_number":205,"context_line":"        if errno.errorcode.get(e.errno) in (\u0027ENOTSUP\u0027, \u0027EOPNOTSUPP\u0027):"},{"line_number":206,"context_line":"            msg \u003d \"Filesystem at %s does not support xattr\" % \\"},{"line_number":207,"context_line":"                  _get_filename(fd)"},{"line_number":208,"context_line":"            logging.exception(msg)"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f4b6375_7ad02120","line":205,"updated":"2017-11-02 05:53:12.000000000","message":"NIT: This is a better way, so maybe we should so the same up in  read_metadata too?","commit_id":"62d75204d28eeed0029337c5e6ac3057b5a647ec"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f3fffcda53bbd09eac1fa7a0d2c18fa86e30e15a","unresolved":false,"context_lines":[{"line_number":202,"context_line":"    except IOError as e:"},{"line_number":203,"context_line":"        # errno module doesn\u0027t always have both of these, hence the ugly"},{"line_number":204,"context_line":"        # check"},{"line_number":205,"context_line":"        if errno.errorcode.get(e.errno) in (\u0027ENOTSUP\u0027, \u0027EOPNOTSUPP\u0027):"},{"line_number":206,"context_line":"            msg \u003d \"Filesystem at %s does not support xattr\" % \\"},{"line_number":207,"context_line":"                  _get_filename(fd)"},{"line_number":208,"context_line":"            logging.exception(msg)"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f4b6375_1b347d92","line":205,"in_reply_to":"3f4b6375_7ad02120","updated":"2017-11-02 17:23:21.000000000","message":"Done","commit_id":"62d75204d28eeed0029337c5e6ac3057b5a647ec"}],"test/functional/__init__.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e2ec6087fa17840a241b99f9a3d57937e10ab538","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    ResponseError"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"from test.unit import debug_logger, FakeMemcache"},{"line_number":47,"context_line":"# importing skip_if_no_xattrs so that functioal tests can grab it from the"},{"line_number":48,"context_line":"# test.functional namespace. Importing SkipTest so this works under both"},{"line_number":49,"context_line":"# nose and testr test runners."},{"line_number":50,"context_line":"from test.unit import skip_if_no_xattrs  # noqa"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a74a57a_4f73f1e7","line":47,"updated":"2016-11-30 16:55:09.000000000","message":"nit: s/funtioal/functional/","commit_id":"0e988544f11a7b6c0a8607080072567cb9df93c9"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"f12dd1baeb821f9577a54c8d168caf12ba58f221","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    ResponseError"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"from test.unit import debug_logger, FakeMemcache"},{"line_number":47,"context_line":"# importing skip_if_no_xattrs so that functioal tests can grab it from the"},{"line_number":48,"context_line":"# test.functional namespace. Importing SkipTest so this works under both"},{"line_number":49,"context_line":"# nose and testr test runners."},{"line_number":50,"context_line":"from test.unit import skip_if_no_xattrs  # noqa"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a74a57a_2c5843fa","line":47,"in_reply_to":"5a74a57a_4f73f1e7","updated":"2016-11-30 19:05:00.000000000","message":"Done","commit_id":"0e988544f11a7b6c0a8607080072567cb9df93c9"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2b0bccb29bbeffcd054164f3413caed95167ced7","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"from test.unit import debug_logger, FakeMemcache"},{"line_number":48,"context_line":"# importing skip_if_no_xattrs so that functional tests can grab it from the"},{"line_number":49,"context_line":"# test.functional namespace. Importing SkipTest so this works under both"},{"line_number":50,"context_line":"# nose and testr test runners."},{"line_number":51,"context_line":"from test.unit import skip_if_no_xattrs  # noqa"},{"line_number":52,"context_line":"from test.unit import SkipTest"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f4e5783_030d3da0","line":49,"updated":"2017-10-13 22:41:37.000000000","message":"Wait, why do functional tests need this? Aren\u0027t they supposed to be black-box? I mean, sure, skip some stuff if we\u0027re *also running in-process* maybe...","commit_id":"3968428bd8fa73ceb8b1f3a9bd584b2fe86aabe9"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"ab1e85686ba2141cc777bf3f0a5bba120b401d5c","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"from test.unit import debug_logger, FakeMemcache"},{"line_number":48,"context_line":"# importing skip_if_no_xattrs so that functional tests can grab it from the"},{"line_number":49,"context_line":"# test.functional namespace. Importing SkipTest so this works under both"},{"line_number":50,"context_line":"# nose and testr test runners."},{"line_number":51,"context_line":"from test.unit import skip_if_no_xattrs  # noqa"},{"line_number":52,"context_line":"from test.unit import SkipTest"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f4e5783_4378d48e","line":49,"in_reply_to":"5f4e5783_030d3da0","updated":"2017-10-13 23:55:20.000000000","message":"Yep, that\u0027s why. It\u0027s all for the in-process ones.","commit_id":"3968428bd8fa73ceb8b1f3a9bd584b2fe86aabe9"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6e712250b953ab765695214450937acda5347272","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"from test.unit import debug_logger, FakeMemcache"},{"line_number":48,"context_line":"# importing skip_if_no_xattrs so that functional tests can grab it from the"},{"line_number":49,"context_line":"# test.functional namespace. Importing SkipTest so this works under both"},{"line_number":50,"context_line":"# nose and testr test runners."},{"line_number":51,"context_line":"from test.unit import skip_if_no_xattrs  # noqa"},{"line_number":52,"context_line":"from test.unit import SkipTest"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f4e5783_268ba66e","line":49,"in_reply_to":"5f4e5783_4378d48e","updated":"2017-10-14 00:25:33.000000000","message":"Can we peek at SWIFT_TEST_IN_PROCESS or something at least?","commit_id":"3968428bd8fa73ceb8b1f3a9bd584b2fe86aabe9"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6e44a002deed3257472cae1509946f4aa566b0ed","unresolved":false,"context_lines":[{"line_number":702,"context_line":"    if in_process:"},{"line_number":703,"context_line":"        in_mem_obj_env \u003d os.environ.get(\u0027SWIFT_TEST_IN_MEMORY_OBJ\u0027)"},{"line_number":704,"context_line":"        in_mem_obj \u003d utils.config_true_value(in_mem_obj_env)"},{"line_number":705,"context_line":"        skip_if_no_xattrs \u003d real_skip_if_no_xattrs"},{"line_number":706,"context_line":"        try:"},{"line_number":707,"context_line":"            in_process_setup(the_object_server\u003d("},{"line_number":708,"context_line":"                mem_object_server if in_mem_obj else object_server))"}],"source_content_type":"text/x-python","patch_set":20,"id":"5f4e5783_0d34fe91","line":705,"updated":"2017-10-17 19:02:28.000000000","message":"Thank you :-)","commit_id":"73ba85b072710cae6d1bd6d4e438ea375db487e6"}],"test/functional/test_object.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6e44a002deed3257472cae1509946f4aa566b0ed","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        if tf.skip or tf.skip2:"},{"line_number":44,"context_line":"            raise SkipTest"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        if tf.in_process:"},{"line_number":47,"context_line":"            tf.skip_if_no_xattrs()"},{"line_number":48,"context_line":"        self.container \u003d uuid4().hex"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"5f4e5783_0dd99e55","line":46,"updated":"2017-10-17 19:02:28.000000000","message":"With the change in test/functional/__init__.py, is this check still necessary?","commit_id":"73ba85b072710cae6d1bd6d4e438ea375db487e6"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"180045db1dbacc7865fd4ec1be96c01736669955","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        if tf.skip or tf.skip2:"},{"line_number":44,"context_line":"            raise SkipTest"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        if tf.in_process:"},{"line_number":47,"context_line":"            tf.skip_if_no_xattrs()"},{"line_number":48,"context_line":"        self.container \u003d uuid4().hex"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3f4b6375_53037943","line":46,"in_reply_to":"5f4e5783_0dd99e55","updated":"2017-10-18 23:18:36.000000000","message":"No, but I like that it\u0027s a reminder that the xattr stuff only affects the in-process tests.","commit_id":"73ba85b072710cae6d1bd6d4e438ea375db487e6"}],"test/unit/__init__.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e2ec6087fa17840a241b99f9a3d57937e10ab538","unresolved":false,"context_lines":[{"line_number":1102,"context_line":"def xattr_supported_check():"},{"line_number":1103,"context_line":"    \"\"\""},{"line_number":1104,"context_line":"    This check simply sets more than 4k of metadata on a tempfile and"},{"line_number":1105,"context_line":"    returns True if it worked and False of not."},{"line_number":1106,"context_line":""},{"line_number":1107,"context_line":"    We want to use *more* than 4k of metadata in this check is because"},{"line_number":1108,"context_line":"    some filesystems (eg ext4) only allow one blocksize worth of"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a74a57a_074b782c","line":1105,"updated":"2016-11-30 16:55:09.000000000","message":"nit s/of/if/","commit_id":"0e988544f11a7b6c0a8607080072567cb9df93c9"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"f12dd1baeb821f9577a54c8d168caf12ba58f221","unresolved":false,"context_lines":[{"line_number":1102,"context_line":"def xattr_supported_check():"},{"line_number":1103,"context_line":"    \"\"\""},{"line_number":1104,"context_line":"    This check simply sets more than 4k of metadata on a tempfile and"},{"line_number":1105,"context_line":"    returns True if it worked and False of not."},{"line_number":1106,"context_line":""},{"line_number":1107,"context_line":"    We want to use *more* than 4k of metadata in this check is because"},{"line_number":1108,"context_line":"    some filesystems (eg ext4) only allow one blocksize worth of"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a74a57a_0c08e7d8","line":1105,"in_reply_to":"5a74a57a_074b782c","updated":"2016-11-30 19:05:00.000000000","message":"Done","commit_id":"0e988544f11a7b6c0a8607080072567cb9df93c9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e2ec6087fa17840a241b99f9a3d57937e10ab538","unresolved":false,"context_lines":[{"line_number":1104,"context_line":"    This check simply sets more than 4k of metadata on a tempfile and"},{"line_number":1105,"context_line":"    returns True if it worked and False of not."},{"line_number":1106,"context_line":""},{"line_number":1107,"context_line":"    We want to use *more* than 4k of metadata in this check is because"},{"line_number":1108,"context_line":"    some filesystems (eg ext4) only allow one blocksize worth of"},{"line_number":1109,"context_line":"    metadata. That means we cannot simply set *any* metadata; we must"},{"line_number":1110,"context_line":"    test some known breakage. The XFS filesystem doesn\u0027t have this"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a74a57a_67698c8b","line":1107,"updated":"2016-11-30 16:55:09.000000000","message":"typo \"...check is because...\"","commit_id":"0e988544f11a7b6c0a8607080072567cb9df93c9"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"f12dd1baeb821f9577a54c8d168caf12ba58f221","unresolved":false,"context_lines":[{"line_number":1104,"context_line":"    This check simply sets more than 4k of metadata on a tempfile and"},{"line_number":1105,"context_line":"    returns True if it worked and False of not."},{"line_number":1106,"context_line":""},{"line_number":1107,"context_line":"    We want to use *more* than 4k of metadata in this check is because"},{"line_number":1108,"context_line":"    some filesystems (eg ext4) only allow one blocksize worth of"},{"line_number":1109,"context_line":"    metadata. That means we cannot simply set *any* metadata; we must"},{"line_number":1110,"context_line":"    test some known breakage. The XFS filesystem doesn\u0027t have this"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a74a57a_2c0f63e2","line":1107,"in_reply_to":"5a74a57a_67698c8b","updated":"2016-11-30 19:05:00.000000000","message":"Done","commit_id":"0e988544f11a7b6c0a8607080072567cb9df93c9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e2ec6087fa17840a241b99f9a3d57937e10ab538","unresolved":false,"context_lines":[{"line_number":1106,"context_line":""},{"line_number":1107,"context_line":"    We want to use *more* than 4k of metadata in this check is because"},{"line_number":1108,"context_line":"    some filesystems (eg ext4) only allow one blocksize worth of"},{"line_number":1109,"context_line":"    metadata. That means we cannot simply set *any* metadata; we must"},{"line_number":1110,"context_line":"    test some known breakage. The XFS filesystem doesn\u0027t have this"},{"line_number":1111,"context_line":"    limit, and so this check returns True when TMPDIR is  XFS. This"},{"line_number":1112,"context_line":"    check will return False under ext4 (which supports xattrs \u003c\u003d 4k)"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a74a57a_679c2c6a","line":1109,"updated":"2016-11-30 16:55:09.000000000","message":"This could perhaps be reworded - it implies but doesn\u0027t succinctly state that we require an FS that support \u003e4k xattrs for tests to succeed.","commit_id":"0e988544f11a7b6c0a8607080072567cb9df93c9"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"f12dd1baeb821f9577a54c8d168caf12ba58f221","unresolved":false,"context_lines":[{"line_number":1106,"context_line":""},{"line_number":1107,"context_line":"    We want to use *more* than 4k of metadata in this check is because"},{"line_number":1108,"context_line":"    some filesystems (eg ext4) only allow one blocksize worth of"},{"line_number":1109,"context_line":"    metadata. That means we cannot simply set *any* metadata; we must"},{"line_number":1110,"context_line":"    test some known breakage. The XFS filesystem doesn\u0027t have this"},{"line_number":1111,"context_line":"    limit, and so this check returns True when TMPDIR is  XFS. This"},{"line_number":1112,"context_line":"    check will return False under ext4 (which supports xattrs \u003c\u003d 4k)"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a74a57a_cc018f08","line":1109,"in_reply_to":"5a74a57a_679c2c6a","updated":"2016-11-30 19:05:00.000000000","message":"Done","commit_id":"0e988544f11a7b6c0a8607080072567cb9df93c9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e2ec6087fa17840a241b99f9a3d57937e10ab538","unresolved":false,"context_lines":[{"line_number":1109,"context_line":"    metadata. That means we cannot simply set *any* metadata; we must"},{"line_number":1110,"context_line":"    test some known breakage. The XFS filesystem doesn\u0027t have this"},{"line_number":1111,"context_line":"    limit, and so this check returns True when TMPDIR is  XFS. This"},{"line_number":1112,"context_line":"    check will return False under ext4 (which supports xattrs \u003c\u003d 4k)"},{"line_number":1113,"context_line":"    and tmpfs (which doesn\u0027t support xattrs at all)."},{"line_number":1114,"context_line":""},{"line_number":1115,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"5a74a57a_1d6e5bc9","line":1112,"updated":"2016-11-30 16:55:09.000000000","message":"see below, actually it returns None for ext4","commit_id":"0e988544f11a7b6c0a8607080072567cb9df93c9"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"f12dd1baeb821f9577a54c8d168caf12ba58f221","unresolved":false,"context_lines":[{"line_number":1109,"context_line":"    metadata. That means we cannot simply set *any* metadata; we must"},{"line_number":1110,"context_line":"    test some known breakage. The XFS filesystem doesn\u0027t have this"},{"line_number":1111,"context_line":"    limit, and so this check returns True when TMPDIR is  XFS. This"},{"line_number":1112,"context_line":"    check will return False under ext4 (which supports xattrs \u003c\u003d 4k)"},{"line_number":1113,"context_line":"    and tmpfs (which doesn\u0027t support xattrs at all)."},{"line_number":1114,"context_line":""},{"line_number":1115,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"5a74a57a_ac06131e","line":1112,"in_reply_to":"5a74a57a_1d6e5bc9","updated":"2016-11-30 19:05:00.000000000","message":"Done","commit_id":"0e988544f11a7b6c0a8607080072567cb9df93c9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e2ec6087fa17840a241b99f9a3d57937e10ab538","unresolved":false,"context_lines":[{"line_number":1121,"context_line":"    try:"},{"line_number":1122,"context_line":"        fd, tmppath \u003d mkstemp()"},{"line_number":1123,"context_line":"        xattr.setxattr(fd, \u0027user.swift.testing_key\u0027, big_val)"},{"line_number":1124,"context_line":"    except IOError as e:"},{"line_number":1125,"context_line":"        for err in \u0027ENOTSUP\u0027, \u0027EOPNOTSUPP\u0027:"},{"line_number":1126,"context_line":"            if hasattr(errno, err) and e.errno \u003d\u003d getattr(errno, err):"},{"line_number":1127,"context_line":"                # filesystem does not support xattr of this size"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a74a57a_c47251ad","line":1124,"updated":"2016-11-30 16:55:09.000000000","message":"On my ubuntu14.04 vm with ext4 I see errno 28 ENOSPC raised. Since this is not handled, and the tmp file is not cleaned up, then (a) the check gets repeated for every call to the method and (b) /tmp fills up with tmpfiles to the point where I see tests fail due to \"Too many open files\".\n\nWhen I mounted a tmpfs under /mnt then things are better - it does raise ENOTSUP - but there\u0027s still a single tmpfile not cleaned up.","commit_id":"0e988544f11a7b6c0a8607080072567cb9df93c9"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"f12dd1baeb821f9577a54c8d168caf12ba58f221","unresolved":false,"context_lines":[{"line_number":1121,"context_line":"    try:"},{"line_number":1122,"context_line":"        fd, tmppath \u003d mkstemp()"},{"line_number":1123,"context_line":"        xattr.setxattr(fd, \u0027user.swift.testing_key\u0027, big_val)"},{"line_number":1124,"context_line":"    except IOError as e:"},{"line_number":1125,"context_line":"        for err in \u0027ENOTSUP\u0027, \u0027EOPNOTSUPP\u0027:"},{"line_number":1126,"context_line":"            if hasattr(errno, err) and e.errno \u003d\u003d getattr(errno, err):"},{"line_number":1127,"context_line":"                # filesystem does not support xattr of this size"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a74a57a_6c0cfb42","line":1124,"in_reply_to":"5a74a57a_c47251ad","updated":"2016-11-30 19:05:00.000000000","message":"Done","commit_id":"0e988544f11a7b6c0a8607080072567cb9df93c9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e2ec6087fa17840a241b99f9a3d57937e10ab538","unresolved":false,"context_lines":[{"line_number":1122,"context_line":"        fd, tmppath \u003d mkstemp()"},{"line_number":1123,"context_line":"        xattr.setxattr(fd, \u0027user.swift.testing_key\u0027, big_val)"},{"line_number":1124,"context_line":"    except IOError as e:"},{"line_number":1125,"context_line":"        for err in \u0027ENOTSUP\u0027, \u0027EOPNOTSUPP\u0027:"},{"line_number":1126,"context_line":"            if hasattr(errno, err) and e.errno \u003d\u003d getattr(errno, err):"},{"line_number":1127,"context_line":"                # filesystem does not support xattr of this size"},{"line_number":1128,"context_line":"                supports_xattr_cached_val \u003d False"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a74a57a_106f2b93","line":1125,"updated":"2016-11-30 16:55:09.000000000","message":"I\u0027m guessing this is to cope with platforms that may not support one or other of the errcodes? What if neither are supported, supports_xattr_cached_val stays None which results in skipped tests but also repeated calls to this function.","commit_id":"0e988544f11a7b6c0a8607080072567cb9df93c9"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"f12dd1baeb821f9577a54c8d168caf12ba58f221","unresolved":false,"context_lines":[{"line_number":1122,"context_line":"        fd, tmppath \u003d mkstemp()"},{"line_number":1123,"context_line":"        xattr.setxattr(fd, \u0027user.swift.testing_key\u0027, big_val)"},{"line_number":1124,"context_line":"    except IOError as e:"},{"line_number":1125,"context_line":"        for err in \u0027ENOTSUP\u0027, \u0027EOPNOTSUPP\u0027:"},{"line_number":1126,"context_line":"            if hasattr(errno, err) and e.errno \u003d\u003d getattr(errno, err):"},{"line_number":1127,"context_line":"                # filesystem does not support xattr of this size"},{"line_number":1128,"context_line":"                supports_xattr_cached_val \u003d False"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a74a57a_4c381f3e","line":1125,"in_reply_to":"5a74a57a_106f2b93","updated":"2016-11-30 19:05:00.000000000","message":"Done\n\nI got this snippet from the diskfile module. Seems that should be updated too, to use the errno.errorcode{} pattern. That can be left as a follow-on","commit_id":"0e988544f11a7b6c0a8607080072567cb9df93c9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e2ec6087fa17840a241b99f9a3d57937e10ab538","unresolved":false,"context_lines":[{"line_number":1123,"context_line":"        xattr.setxattr(fd, \u0027user.swift.testing_key\u0027, big_val)"},{"line_number":1124,"context_line":"    except IOError as e:"},{"line_number":1125,"context_line":"        for err in \u0027ENOTSUP\u0027, \u0027EOPNOTSUPP\u0027:"},{"line_number":1126,"context_line":"            if hasattr(errno, err) and e.errno \u003d\u003d getattr(errno, err):"},{"line_number":1127,"context_line":"                # filesystem does not support xattr of this size"},{"line_number":1128,"context_line":"                supports_xattr_cached_val \u003d False"},{"line_number":1129,"context_line":"                return False"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a74a57a_7003ff76","line":1126,"updated":"2016-11-30 16:55:09.000000000","message":"can\u0027t errno.errcode be used? so something like:\n\n  if errno.errcode.get(e.errno) in (\u0027ENOTSUP\u0027, \u0027EOPNOTSUPP\u0027)","commit_id":"0e988544f11a7b6c0a8607080072567cb9df93c9"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"f12dd1baeb821f9577a54c8d168caf12ba58f221","unresolved":false,"context_lines":[{"line_number":1123,"context_line":"        xattr.setxattr(fd, \u0027user.swift.testing_key\u0027, big_val)"},{"line_number":1124,"context_line":"    except IOError as e:"},{"line_number":1125,"context_line":"        for err in \u0027ENOTSUP\u0027, \u0027EOPNOTSUPP\u0027:"},{"line_number":1126,"context_line":"            if hasattr(errno, err) and e.errno \u003d\u003d getattr(errno, err):"},{"line_number":1127,"context_line":"                # filesystem does not support xattr of this size"},{"line_number":1128,"context_line":"                supports_xattr_cached_val \u003d False"},{"line_number":1129,"context_line":"                return False"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a74a57a_17855458","line":1126,"in_reply_to":"5a74a57a_7003ff76","updated":"2016-11-30 19:05:00.000000000","message":"Done","commit_id":"0e988544f11a7b6c0a8607080072567cb9df93c9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e2ec6087fa17840a241b99f9a3d57937e10ab538","unresolved":false,"context_lines":[{"line_number":1126,"context_line":"            if hasattr(errno, err) and e.errno \u003d\u003d getattr(errno, err):"},{"line_number":1127,"context_line":"                # filesystem does not support xattr of this size"},{"line_number":1128,"context_line":"                supports_xattr_cached_val \u003d False"},{"line_number":1129,"context_line":"                return False"},{"line_number":1130,"context_line":"    else:"},{"line_number":1131,"context_line":"        supports_xattr_cached_val \u003d True"},{"line_number":1132,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a74a57a_90c09be2","line":1129,"updated":"2016-11-30 16:55:09.000000000","message":"should the IOError be re-raised if its not ENOTSUP or EOPNOTSUP?","commit_id":"0e988544f11a7b6c0a8607080072567cb9df93c9"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"f12dd1baeb821f9577a54c8d168caf12ba58f221","unresolved":false,"context_lines":[{"line_number":1126,"context_line":"            if hasattr(errno, err) and e.errno \u003d\u003d getattr(errno, err):"},{"line_number":1127,"context_line":"                # filesystem does not support xattr of this size"},{"line_number":1128,"context_line":"                supports_xattr_cached_val \u003d False"},{"line_number":1129,"context_line":"                return False"},{"line_number":1130,"context_line":"    else:"},{"line_number":1131,"context_line":"        supports_xattr_cached_val \u003d True"},{"line_number":1132,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a74a57a_cc726f11","line":1129,"in_reply_to":"5a74a57a_90c09be2","updated":"2016-11-30 19:05:00.000000000","message":"Done","commit_id":"0e988544f11a7b6c0a8607080072567cb9df93c9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e2ec6087fa17840a241b99f9a3d57937e10ab538","unresolved":false,"context_lines":[{"line_number":1129,"context_line":"                return False"},{"line_number":1130,"context_line":"    else:"},{"line_number":1131,"context_line":"        supports_xattr_cached_val \u003d True"},{"line_number":1132,"context_line":"        return True"},{"line_number":1133,"context_line":""},{"line_number":1134,"context_line":""},{"line_number":1135,"context_line":"def skip_if_no_xattrs():"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a74a57a_e66cb538","line":1132,"updated":"2016-11-30 16:55:09.000000000","message":"...and a finally clause to cleanup the temp file - on my ext4 FS the temp file are accumulating in /tmp :(","commit_id":"0e988544f11a7b6c0a8607080072567cb9df93c9"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"f12dd1baeb821f9577a54c8d168caf12ba58f221","unresolved":false,"context_lines":[{"line_number":1129,"context_line":"                return False"},{"line_number":1130,"context_line":"    else:"},{"line_number":1131,"context_line":"        supports_xattr_cached_val \u003d True"},{"line_number":1132,"context_line":"        return True"},{"line_number":1133,"context_line":""},{"line_number":1134,"context_line":""},{"line_number":1135,"context_line":"def skip_if_no_xattrs():"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a74a57a_37825001","line":1132,"in_reply_to":"5a74a57a_e66cb538","updated":"2016-11-30 19:05:00.000000000","message":"Done","commit_id":"0e988544f11a7b6c0a8607080072567cb9df93c9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c6bc3d6311f60a4d28331cbf751456d7a33bc49","unresolved":false,"context_lines":[{"line_number":1107,"context_line":"    We want to use *more* than 4k of metadata in this check because"},{"line_number":1108,"context_line":"    some filesystems (eg ext4) only allow one blocksize worth of"},{"line_number":1109,"context_line":"    metadata. The XFS filesystem doesn\u0027t have this limit, and so this"},{"line_number":1110,"context_line":"    check returns True when TMPDIR is XFS. This check will return"},{"line_number":1111,"context_line":"    False under ext4 (which supports xattrs \u003c\u003d 4k) and tmpfs (which"},{"line_number":1112,"context_line":"    doesn\u0027t support xattrs at all)."},{"line_number":1113,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"3a71b18c_205ddfe9","line":1110,"updated":"2016-12-01 15:53:55.000000000","message":"nit: reference to TMPDIR is specific to one case - in general its whether gettempdir() returns an xfs dir","commit_id":"5fa8e0c9b1553d2b601d68b77620a2fc34149d4c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c6bc3d6311f60a4d28331cbf751456d7a33bc49","unresolved":false,"context_lines":[{"line_number":1134,"context_line":"        return True"},{"line_number":1135,"context_line":"    finally:"},{"line_number":1136,"context_line":"        # clean up the tmpfile"},{"line_number":1137,"context_line":"        os.close(fd)"},{"line_number":1138,"context_line":"        os.unlink(tmppath)"},{"line_number":1139,"context_line":""},{"line_number":1140,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"3a71b18c_e0868764","line":1137,"updated":"2016-12-01 15:53:55.000000000","message":"nit: the OCD in me would prefer to see this be conditional on fd having been assigned, but it turns out you have to try pretty hard to get mkstemp to fail since it descends through a list of dirs including the current working dir in an attempt to make a file. So given this is in test code then it\u0027s only a nit.","commit_id":"5fa8e0c9b1553d2b601d68b77620a2fc34149d4c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2b0bccb29bbeffcd054164f3413caed95167ced7","unresolved":false,"context_lines":[{"line_number":1277,"context_line":"    returns True if it worked and False if not."},{"line_number":1278,"context_line":""},{"line_number":1279,"context_line":"    We want to use *more* than 4k of metadata in this check because"},{"line_number":1280,"context_line":"    some filesystems (eg ext4) only allow one blocksize worth of"},{"line_number":1281,"context_line":"    metadata. The XFS filesystem doesn\u0027t have this limit, and so this"},{"line_number":1282,"context_line":"    check returns True when TMPDIR is XFS. This check will return"},{"line_number":1283,"context_line":"    False under ext4 (which supports xattrs \u003c\u003d 4k) and tmpfs (which"},{"line_number":1284,"context_line":"    doesn\u0027t support xattrs at all)."}],"source_content_type":"text/x-python","patch_set":16,"id":"5f4e5783_0391bd4e","line":1281,"range":{"start_line":1280,"start_character":4,"end_line":1281,"end_character":13},"updated":"2017-10-13 22:41:37.000000000","message":"Could ext4 be configured with, say, 8k block sizes?","commit_id":"3968428bd8fa73ceb8b1f3a9bd584b2fe86aabe9"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"ab1e85686ba2141cc777bf3f0a5bba120b401d5c","unresolved":false,"context_lines":[{"line_number":1277,"context_line":"    returns True if it worked and False if not."},{"line_number":1278,"context_line":""},{"line_number":1279,"context_line":"    We want to use *more* than 4k of metadata in this check because"},{"line_number":1280,"context_line":"    some filesystems (eg ext4) only allow one blocksize worth of"},{"line_number":1281,"context_line":"    metadata. The XFS filesystem doesn\u0027t have this limit, and so this"},{"line_number":1282,"context_line":"    check returns True when TMPDIR is XFS. This check will return"},{"line_number":1283,"context_line":"    False under ext4 (which supports xattrs \u003c\u003d 4k) and tmpfs (which"},{"line_number":1284,"context_line":"    doesn\u0027t support xattrs at all)."}],"source_content_type":"text/x-python","patch_set":16,"id":"5f4e5783_e37220ad","line":1281,"range":{"start_line":1280,"start_character":4,"end_line":1281,"end_character":13},"in_reply_to":"5f4e5783_0391bd4e","updated":"2017-10-13 23:55:20.000000000","message":"mkfs.ext4\u0027s man page says 1024, 2048 and 4096 are the only valid block sizes.","commit_id":"3968428bd8fa73ceb8b1f3a9bd584b2fe86aabe9"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2b0bccb29bbeffcd054164f3413caed95167ced7","unresolved":false,"context_lines":[{"line_number":1292,"context_line":"    # assume the worst -- xattrs aren\u0027t supported"},{"line_number":1293,"context_line":"    supports_xattr_cached_val \u003d False"},{"line_number":1294,"context_line":""},{"line_number":1295,"context_line":"    big_val \u003d \u0027x\u0027 * (4096 + 1)  # more than 4k of metadata"},{"line_number":1296,"context_line":"    try:"},{"line_number":1297,"context_line":"        fd, tmppath \u003d mkstemp()"},{"line_number":1298,"context_line":"        xattr.setxattr(fd, \u0027user.swift.testing_key\u0027, big_val)"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f4e5783_4372154b","line":1295,"updated":"2017-10-13 22:41:37.000000000","message":"Don\u0027t we typically have\n\n MAX_META_OVERALL_SIZE \u003d 4096\n\ncoming out of constriants.py?\n\nDo we end up needing more just because of the serialization format, or what?\n\nWhat\u0027s up with the 64k chunk size we default to when writing? Should we just use 64k here?","commit_id":"3968428bd8fa73ceb8b1f3a9bd584b2fe86aabe9"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"ab1e85686ba2141cc777bf3f0a5bba120b401d5c","unresolved":false,"context_lines":[{"line_number":1292,"context_line":"    # assume the worst -- xattrs aren\u0027t supported"},{"line_number":1293,"context_line":"    supports_xattr_cached_val \u003d False"},{"line_number":1294,"context_line":""},{"line_number":1295,"context_line":"    big_val \u003d \u0027x\u0027 * (4096 + 1)  # more than 4k of metadata"},{"line_number":1296,"context_line":"    try:"},{"line_number":1297,"context_line":"        fd, tmppath \u003d mkstemp()"},{"line_number":1298,"context_line":"        xattr.setxattr(fd, \u0027user.swift.testing_key\u0027, big_val)"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f4e5783_43dfb40c","line":1295,"in_reply_to":"5f4e5783_4372154b","updated":"2017-10-13 23:55:20.000000000","message":"4 KiB is ext4\u0027s limit.\n\nMAX_META_OVERALL_SIZE is the pre-serialization limit, so pickle is going to add on some bytes.\n\n64 KiB is the maximum size of any *one* extended attribute under XFS, but you may write as many xattrs of that size as you want. 4 KiB is the maximum size of *all* extended attributes under ext4, including keys and values and possibly a couple extra bytes for ext4-internal stuff.","commit_id":"3968428bd8fa73ceb8b1f3a9bd584b2fe86aabe9"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6e712250b953ab765695214450937acda5347272","unresolved":false,"context_lines":[{"line_number":1292,"context_line":"    # assume the worst -- xattrs aren\u0027t supported"},{"line_number":1293,"context_line":"    supports_xattr_cached_val \u003d False"},{"line_number":1294,"context_line":""},{"line_number":1295,"context_line":"    big_val \u003d \u0027x\u0027 * (4096 + 1)  # more than 4k of metadata"},{"line_number":1296,"context_line":"    try:"},{"line_number":1297,"context_line":"        fd, tmppath \u003d mkstemp()"},{"line_number":1298,"context_line":"        xattr.setxattr(fd, \u0027user.swift.testing_key\u0027, big_val)"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f4e5783_a6967692","line":1295,"in_reply_to":"5f4e5783_43dfb40c","updated":"2017-10-14 00:25:33.000000000","message":"So when ext5 (or whatever) comes out supporting 8k or 16k xattrs... we just come back here and update the skip?","commit_id":"3968428bd8fa73ceb8b1f3a9bd584b2fe86aabe9"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"3b1a34ed36f2d10ef1542ae682cf79146326c615","unresolved":false,"context_lines":[{"line_number":1292,"context_line":"    # assume the worst -- xattrs aren\u0027t supported"},{"line_number":1293,"context_line":"    supports_xattr_cached_val \u003d False"},{"line_number":1294,"context_line":""},{"line_number":1295,"context_line":"    big_val \u003d \u0027x\u0027 * (4096 + 1)  # more than 4k of metadata"},{"line_number":1296,"context_line":"    try:"},{"line_number":1297,"context_line":"        fd, tmppath \u003d mkstemp()"},{"line_number":1298,"context_line":"        xattr.setxattr(fd, \u0027user.swift.testing_key\u0027, big_val)"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f4e5783_8696b13d","line":1295,"in_reply_to":"5f4e5783_a6967692","updated":"2017-10-16 19:02:51.000000000","message":"When a new supportable filesystem comes out, we\u0027ll have to revisit our xattr-packing strategy anyway.\n\nA hypothetical ext5 could have the same 1-block-total restriction, or it could allow you to use more than 1 block but len(name) + len(value) \u003c 4080 for each xattr, or it could be something completely different.\n\nMaybe distros will all wind up with btrfs or zfs by default; those support unlimited xattrs like xfs.\n\nAs an aside, apparently it\u0027s Linux\u0027s VFS layer that\u0027s responsible for the 64 KiB limit, not XFS. http://man7.org/linux/man-pages/man7/xattr.7.html Also, names are limited to 255 bytes, also by the VFS.","commit_id":"3968428bd8fa73ceb8b1f3a9bd584b2fe86aabe9"}],"test/unit/common/middleware/test_recon.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c6bc3d6311f60a4d28331cbf751456d7a33bc49","unresolved":false,"context_lines":[{"line_number":272,"context_line":"        # it in the header resulting in md5 file mismatch"},{"line_number":273,"context_line":"        with mock.patch(\"time.time\", fake_time):"},{"line_number":274,"context_line":"            ring.RingData(replica_map, devs, part_shift).save(ringpath,"},{"line_number":275,"context_line":"                                                              mtime\u003dNone)"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"    def _create_rings(self):"},{"line_number":278,"context_line":"        # make the rings unique so they have different md5 sums"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a71b18c_3a88a7e7","line":275,"updated":"2016-12-01 15:53:55.000000000","message":"is the basename mock no longer required because the tests no longer rely on the acual hash of the gzip ring file?","commit_id":"5fa8e0c9b1553d2b601d68b77620a2fc34149d4c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2b0bccb29bbeffcd054164f3413caed95167ced7","unresolved":false,"context_lines":[{"line_number":213,"context_line":"class TestReconSuccess(TestCase):"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    def setUp(self):"},{"line_number":216,"context_line":"        # can\u0027t use mkdtemp here as 2.6 gzip puts the filename in the header"},{"line_number":217,"context_line":"        # which will cause ring md5 checks to fail"},{"line_number":218,"context_line":"        self.tempdir \u003d \u0027%s/swift_recon_md5_test\u0027 % tempfile.gettempdir()"},{"line_number":219,"context_line":"        utils.mkdirs(self.tempdir)"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f4e5783_83a12d97","line":216,"range":{"start_line":216,"start_character":36,"end_line":216,"end_character":44},"updated":"2017-10-13 22:41:37.000000000","message":"I wonder if this means we could use mkdtemp now?\n\nReplacing\n\n self.tempdir \u003d \u0027%s/swift_recon_md5_test\u0027 % tempfile.gettempdir()\n utils.mkdirs(self.tempdir)\n\nwith\n\n self.tempdir \u003d tempfile.mkdtemp(prefix\u003d\u0027swift_recon_md5_test\u0027)\n\nhas tests passing for me...?","commit_id":"3968428bd8fa73ceb8b1f3a9bd584b2fe86aabe9"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2b0bccb29bbeffcd054164f3413caed95167ced7","unresolved":false,"context_lines":[{"line_number":275,"context_line":""},{"line_number":276,"context_line":"        # eliminate time from the equation as gzip includes"},{"line_number":277,"context_line":"        # it in the header resulting in md5 file mismatch"},{"line_number":278,"context_line":"        with mock.patch(\"time.time\", fake_time):"},{"line_number":279,"context_line":"            ring.RingData(replica_map, devs, part_shift).save(ringpath,"},{"line_number":280,"context_line":"                                                              mtime\u003dNone)"},{"line_number":281,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"5f4e5783_a3b30998","line":278,"updated":"2017-10-13 22:41:37.000000000","message":"I don\u0027t think the time patching is necessary any more -- at any rate, I\u0027ve got tests passing with\n\n def _create_ring(self, ringpath, replica_map, devs, part_shift):\n     ring.RingData(replica_map, devs, part_shift).save(ringpath,\n                                                       mtime\u003dNone)","commit_id":"3968428bd8fa73ceb8b1f3a9bd584b2fe86aabe9"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"15f67b611784e4669da35f7389ac623996257948","unresolved":false,"context_lines":[{"line_number":215,"context_line":"    def setUp(self):"},{"line_number":216,"context_line":"        # can\u0027t use mkdtemp here as 2.6 gzip puts the filename in the header"},{"line_number":217,"context_line":"        # which will cause ring md5 checks to fail"},{"line_number":218,"context_line":"        self.tempdir \u003d \u0027%s/swift_recon_md5_test\u0027 % tempfile.gettempdir()"},{"line_number":219,"context_line":"        utils.mkdirs(self.tempdir)"},{"line_number":220,"context_line":"        self.app \u003d self._get_app()"},{"line_number":221,"context_line":"        self.mockos \u003d MockOS()"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f4e5783_1769b1f7","line":218,"updated":"2017-10-17 18:07:58.000000000","message":"but we don\u0027t care about 2.6 any more","commit_id":"233bccd2b2ab9a6f9ca81d1c50ead7565c1482f0"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"aad180c537ffad5b732d8cc5098b1a1536a5e846","unresolved":false,"context_lines":[{"line_number":215,"context_line":"    def setUp(self):"},{"line_number":216,"context_line":"        # can\u0027t use mkdtemp here as 2.6 gzip puts the filename in the header"},{"line_number":217,"context_line":"        # which will cause ring md5 checks to fail"},{"line_number":218,"context_line":"        self.tempdir \u003d \u0027%s/swift_recon_md5_test\u0027 % tempfile.gettempdir()"},{"line_number":219,"context_line":"        utils.mkdirs(self.tempdir)"},{"line_number":220,"context_line":"        self.app \u003d self._get_app()"},{"line_number":221,"context_line":"        self.mockos \u003d MockOS()"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f4e5783_2d87ba64","line":218,"in_reply_to":"5f4e5783_1769b1f7","updated":"2017-10-17 18:10:47.000000000","message":"see commit 5438fe7d\n\nThat one started as cleanups to this patch, but it was an easy patch so it landed first.","commit_id":"233bccd2b2ab9a6f9ca81d1c50ead7565c1482f0"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ce81c9c66eb7246ed13856ef2dc38451c415566f","unresolved":false,"context_lines":[{"line_number":22,"context_line":"import tempfile"},{"line_number":23,"context_line":"import unittest"},{"line_number":24,"context_line":"from unittest import TestCase"},{"line_number":25,"context_line":"import tempfile"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from swift import __version__ as swiftver"},{"line_number":28,"context_line":"from swift.common import ring, utils"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f4b6375_7f59a1fc","line":25,"updated":"2017-10-18 17:02:43.000000000","message":"Don\u0027t need it -- got it on line 22 already","commit_id":"73ba85b072710cae6d1bd6d4e438ea375db487e6"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"180045db1dbacc7865fd4ec1be96c01736669955","unresolved":false,"context_lines":[{"line_number":22,"context_line":"import tempfile"},{"line_number":23,"context_line":"import unittest"},{"line_number":24,"context_line":"from unittest import TestCase"},{"line_number":25,"context_line":"import tempfile"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from swift import __version__ as swiftver"},{"line_number":28,"context_line":"from swift.common import ring, utils"}],"source_content_type":"text/x-python","patch_set":20,"id":"3f4b6375_33859dae","line":25,"in_reply_to":"3f4b6375_7f59a1fc","updated":"2017-10-18 23:18:36.000000000","message":"Done","commit_id":"73ba85b072710cae6d1bd6d4e438ea375db487e6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6e44a002deed3257472cae1509946f4aa566b0ed","unresolved":false,"context_lines":[{"line_number":274,"context_line":""},{"line_number":275,"context_line":"        # eliminate time from the equation as gzip includes"},{"line_number":276,"context_line":"        # it in the header resulting in md5 file mismatch"},{"line_number":277,"context_line":"        with mock.patch(\"time.time\", fake_time):"},{"line_number":278,"context_line":"            ring.RingData(replica_map, devs, part_shift).save(ringpath,"},{"line_number":279,"context_line":"                                                              mtime\u003dNone)"},{"line_number":280,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"5f4e5783_4dc31658","line":277,"updated":"2017-10-17 19:02:28.000000000","message":"...we\u0027re bringing it *back*?","commit_id":"73ba85b072710cae6d1bd6d4e438ea375db487e6"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"f94b378e12f74302c863415224c8122b5f112340","unresolved":false,"context_lines":[{"line_number":274,"context_line":""},{"line_number":275,"context_line":"        # eliminate time from the equation as gzip includes"},{"line_number":276,"context_line":"        # it in the header resulting in md5 file mismatch"},{"line_number":277,"context_line":"        with mock.patch(\"time.time\", fake_time):"},{"line_number":278,"context_line":"            ring.RingData(replica_map, devs, part_shift).save(ringpath,"},{"line_number":279,"context_line":"                                                              mtime\u003dNone)"},{"line_number":280,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"5f4e5783_5ec4de3f","line":277,"in_reply_to":"5f4e5783_4dc31658","updated":"2017-10-17 19:49:27.000000000","message":"oh this might have been me. I think I readded it when I changed the merge commit.\n\nWhat\u0027s the right answer?","commit_id":"73ba85b072710cae6d1bd6d4e438ea375db487e6"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"180045db1dbacc7865fd4ec1be96c01736669955","unresolved":false,"context_lines":[{"line_number":274,"context_line":""},{"line_number":275,"context_line":"        # eliminate time from the equation as gzip includes"},{"line_number":276,"context_line":"        # it in the header resulting in md5 file mismatch"},{"line_number":277,"context_line":"        with mock.patch(\"time.time\", fake_time):"},{"line_number":278,"context_line":"            ring.RingData(replica_map, devs, part_shift).save(ringpath,"},{"line_number":279,"context_line":"                                                              mtime\u003dNone)"},{"line_number":280,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3f4b6375_d3bd2969","line":277,"in_reply_to":"5f4e5783_5ec4de3f","updated":"2017-10-18 23:18:36.000000000","message":"The right answer is don\u0027t do it.\n\nPython 2.7+ lets you pass the mtime to GzipFile(), and Swift already does that, so you don\u0027t need any mocking. Check out RingData.save() to see the hardcoded value we\u0027re using.","commit_id":"73ba85b072710cae6d1bd6d4e438ea375db487e6"}],"test/unit/obj/test_diskfile.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5a0563abddd78b09b38a9a5c3640a019e17662a2","unresolved":false,"context_lines":[{"line_number":2634,"context_line":"            meta_xattr \u003d xattr.getxattr(data_files[0], \"user.swift.metadata\")"},{"line_number":2635,"context_line":"            wrong_checksum \u003d md5(meta_xattr + \"some extra stuff\").hexdigest()"},{"line_number":2636,"context_line":"            xattr.setxattr(data_files[0], \"user.swift.metadata_checksum\","},{"line_number":2637,"context_line":"                           wrong_checksum)"},{"line_number":2638,"context_line":"        elif invalid_type \u003d\u003d \u0027Truncated-Xattrs\u0027:"},{"line_number":2639,"context_line":"            meta_xattr \u003d xattr.getxattr(data_files[0], \"user.swift.metadata\")"},{"line_number":2640,"context_line":"            xattr.setxattr(data_files[0], \"user.swift.metadata\","}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaa91ec_ec568728","line":2637,"updated":"2016-07-01 03:05:07.000000000","message":"this is really more like \u0027Subtly-Corrupt-Xattrs-Checksum\u0027\n\nOTOH, a corrupt yet de-serializable pickle could be better demonstrated I think\n\n1. https://gist.github.com/clayg/d714d806d5d9a2c9e22c180347b75623","commit_id":"a573c3066285f9b0f6a52edbf6685637742fe5cd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c6bc3d6311f60a4d28331cbf751456d7a33bc49","unresolved":false,"context_lines":[{"line_number":2768,"context_line":""},{"line_number":2769,"context_line":"    def setUp(self):"},{"line_number":2770,"context_line":"        \"\"\"Set up for testing swift.obj.diskfile\"\"\""},{"line_number":2771,"context_line":"        skip_if_no_xattrs()"},{"line_number":2772,"context_line":"        self.tmpdir \u003d mkdtemp()"},{"line_number":2773,"context_line":"        self.testdir \u003d os.path.join("},{"line_number":2774,"context_line":"            self.tmpdir, \u0027tmp_test_obj_server_DiskFile\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a71b18c_60419039","line":2771,"updated":"2016-12-01 15:53:55.000000000","message":"follow-up: looks like there\u0027s a lot of common code w.r.t. DiskFileManagerMixin in these setUp methods","commit_id":"5fa8e0c9b1553d2b601d68b77620a2fc34149d4c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c6bc3d6311f60a4d28331cbf751456d7a33bc49","unresolved":false,"context_lines":[{"line_number":3393,"context_line":"            reader \u003d None"},{"line_number":3394,"context_line":"            quarantine_msgs \u003d []"},{"line_number":3395,"context_line":"            try:"},{"line_number":3396,"context_line":"                df \u003d self._get_open_disk_file(**kwargs)"},{"line_number":3397,"context_line":"                reader \u003d df.reader(_quarantine_hook\u003dquarantine_msgs.append)"},{"line_number":3398,"context_line":"            except DiskFileQuarantined as err:"},{"line_number":3399,"context_line":"                if not open_exc:"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a71b18c_5bce4584","line":3396,"updated":"2016-12-01 15:53:55.000000000","message":"this only creates a .data file, so there is no test that corrupt metadata in a .meta file will be detected","commit_id":"5fa8e0c9b1553d2b601d68b77620a2fc34149d4c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2b0bccb29bbeffcd054164f3413caed95167ced7","unresolved":false,"context_lines":[{"line_number":3393,"context_line":"            wrong_byte \u003d \u0027X\u0027 if meta_xattr[0] !\u003d \u0027X\u0027 else \u0027Y\u0027"},{"line_number":3394,"context_line":"            xattr.setxattr(data_files[0], \"user.swift.metadata\","},{"line_number":3395,"context_line":"                           wrong_byte + meta_xattr[1:])"},{"line_number":3396,"context_line":"        if invalid_type \u003d\u003d \u0027Subtly-Corrupt-Xattrs\u0027:"},{"line_number":3397,"context_line":"            # We have to go below read_metadata/write_metadata to get proper"},{"line_number":3398,"context_line":"            # corruption."},{"line_number":3399,"context_line":"            meta_xattr \u003d xattr.getxattr(data_files[0], \"user.swift.metadata\")"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f4e5783_c3116506","line":3396,"updated":"2017-10-13 22:41:37.000000000","message":"elif?\n\nAnd I feel like we ought to have an\n\n else:\n     raise Exception(\u0027Bad invalid_type: %r\u0027 % invalid_type)\n\nat the end... I know *I* don\u0027t trust myself to type the same string twice when writing tests :P","commit_id":"3968428bd8fa73ceb8b1f3a9bd584b2fe86aabe9"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"ab1e85686ba2141cc777bf3f0a5bba120b401d5c","unresolved":false,"context_lines":[{"line_number":3393,"context_line":"            wrong_byte \u003d \u0027X\u0027 if meta_xattr[0] !\u003d \u0027X\u0027 else \u0027Y\u0027"},{"line_number":3394,"context_line":"            xattr.setxattr(data_files[0], \"user.swift.metadata\","},{"line_number":3395,"context_line":"                           wrong_byte + meta_xattr[1:])"},{"line_number":3396,"context_line":"        if invalid_type \u003d\u003d \u0027Subtly-Corrupt-Xattrs\u0027:"},{"line_number":3397,"context_line":"            # We have to go below read_metadata/write_metadata to get proper"},{"line_number":3398,"context_line":"            # corruption."},{"line_number":3399,"context_line":"            meta_xattr \u003d xattr.getxattr(data_files[0], \"user.swift.metadata\")"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f4e5783_432d74fc","line":3396,"in_reply_to":"5f4e5783_c3116506","updated":"2017-10-13 23:55:20.000000000","message":"elif.\n\nIf we want the else clause at the end, we\u0027ll have to enumerate the other ones (ETag, Content-Length, etc.) so we can skip them.","commit_id":"3968428bd8fa73ceb8b1f3a9bd584b2fe86aabe9"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2b0bccb29bbeffcd054164f3413caed95167ced7","unresolved":false,"context_lines":[{"line_number":3630,"context_line":""},{"line_number":3631,"context_line":"        def bad_fstat(fd):"},{"line_number":3632,"context_line":"            invocations[0] +\u003d 1"},{"line_number":3633,"context_line":"            if invocations[0] \u003d\u003d 1:"},{"line_number":3634,"context_line":"                # FIXME - yes, this an icky way to get code coverage ... worth"},{"line_number":3635,"context_line":"                # it?"},{"line_number":3636,"context_line":"                raise OSError()"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f4e5783_a3754966","line":3633,"updated":"2017-10-13 22:41:37.000000000","message":"!?\n\nWhy were we doing 4 before? Why do we need to change now?","commit_id":"3968428bd8fa73ceb8b1f3a9bd584b2fe86aabe9"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"ab1e85686ba2141cc777bf3f0a5bba120b401d5c","unresolved":false,"context_lines":[{"line_number":3630,"context_line":""},{"line_number":3631,"context_line":"        def bad_fstat(fd):"},{"line_number":3632,"context_line":"            invocations[0] +\u003d 1"},{"line_number":3633,"context_line":"            if invocations[0] \u003d\u003d 1:"},{"line_number":3634,"context_line":"                # FIXME - yes, this an icky way to get code coverage ... worth"},{"line_number":3635,"context_line":"                # it?"},{"line_number":3636,"context_line":"                raise OSError()"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f4e5783_a3b0a88b","line":3633,"in_reply_to":"5f4e5783_a3754966","updated":"2017-10-13 23:55:20.000000000","message":"The first 3 were the xattr mock getting the inode number.\n\nNow that we\u0027re firing on first invocation, this test can be simplified quite a bit, so I\u0027ll clean that up.","commit_id":"3968428bd8fa73ceb8b1f3a9bd584b2fe86aabe9"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6e712250b953ab765695214450937acda5347272","unresolved":false,"context_lines":[{"line_number":3625,"context_line":"            invalid_type\u003d\u0027Bad-Content-Length\u0027)"},{"line_number":3626,"context_line":""},{"line_number":3627,"context_line":"    def test_quarantine_fstat_oserror(self):"},{"line_number":3628,"context_line":"        with mock.patch(\u0027os.fstat\u0027, side_effect\u003dOSError()):"},{"line_number":3629,"context_line":"            self.assertRaises("},{"line_number":3630,"context_line":"                DiskFileQuarantined,"},{"line_number":3631,"context_line":"                self._get_open_disk_file)"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f4e5783_668cfe7e","line":3628,"updated":"2017-10-14 00:25:33.000000000","message":"+1, loads better :-)","commit_id":"b7b1592aaea4f146296f65034b460faba0e87c10"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2dbf778cc43fd8aba18f73bc8b25b2a68009a12c","unresolved":false,"context_lines":[{"line_number":3015,"context_line":"        md \u003d df.read_metadata()"},{"line_number":3016,"context_line":"        self.assertEqual(md[\u0027X-Timestamp\u0027], timestamp)"},{"line_number":3017,"context_line":""},{"line_number":3018,"context_line":"    def test_read_metadata_no_xattr(self):"},{"line_number":3019,"context_line":"        def mock_getxattr(*args, **kargs):"},{"line_number":3020,"context_line":"            error_num \u003d errno.ENOTSUP if hasattr(errno, \u0027ENOTSUP\u0027) else \\"},{"line_number":3021,"context_line":"                errno.EOPNOTSUPP"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f4b6375_98579a03","line":3018,"updated":"2017-10-20 16:10:40.000000000","message":"It seems a little silly that this test gets skipped (instead of fairly trivially passing) when we really *don\u0027t* have xattr support. Oh well.","commit_id":"bed2cec60e1ea1fde796147529dbe30d750212bb"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"94c715c5bb773eb9aa5b23ed56149c577e33ed85","unresolved":false,"context_lines":[{"line_number":3015,"context_line":"        md \u003d df.read_metadata()"},{"line_number":3016,"context_line":"        self.assertEqual(md[\u0027X-Timestamp\u0027], timestamp)"},{"line_number":3017,"context_line":""},{"line_number":3018,"context_line":"    def test_read_metadata_no_xattr(self):"},{"line_number":3019,"context_line":"        def mock_getxattr(*args, **kargs):"},{"line_number":3020,"context_line":"            error_num \u003d errno.ENOTSUP if hasattr(errno, \u0027ENOTSUP\u0027) else \\"},{"line_number":3021,"context_line":"                errno.EOPNOTSUPP"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f4b6375_0741063a","line":3018,"in_reply_to":"3f4b6375_98579a03","updated":"2017-10-20 18:15:08.000000000","message":"Since so many of the object tests won\u0027t work without xattr support, I didn\u0027t spend the effort to specifically check each and every test case. My goal was to make it blindlingly obvious that something is wrong when you don\u0027t have xattr support in your test environment, but not blow up the whole thing.","commit_id":"bed2cec60e1ea1fde796147529dbe30d750212bb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2dbf778cc43fd8aba18f73bc8b25b2a68009a12c","unresolved":false,"context_lines":[{"line_number":3845,"context_line":"                DiskFileXattrNotSupported,"},{"line_number":3846,"context_line":"                diskfile.write_metadata, \u0027n/a\u0027, metadata)"},{"line_number":3847,"context_line":""},{"line_number":3848,"context_line":"    def test_write_metadata_disk_full(self):"},{"line_number":3849,"context_line":"        timestamp \u003d Timestamp.now().internal"},{"line_number":3850,"context_line":"        metadata \u003d {\u0027X-Timestamp\u0027: timestamp, \u0027X-Object-Meta-test\u0027: \u0027data\u0027}"},{"line_number":3851,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3f4b6375_d884f260","line":3848,"updated":"2017-10-20 16:10:40.000000000","message":"... or this one","commit_id":"bed2cec60e1ea1fde796147529dbe30d750212bb"}],"test/unit/obj/test_server.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2dbf778cc43fd8aba18f73bc8b25b2a68009a12c","unresolved":false,"context_lines":[{"line_number":1918,"context_line":"        wsgi_input \u003d req.environ[\u0027wsgi.input\u0027]"},{"line_number":1919,"context_line":"        self.assertEqual(wsgi_input.tell(), len(wsgi_input.getvalue()))"},{"line_number":1920,"context_line":""},{"line_number":1921,"context_line":"    def test_PUT_user_metadata_no_xattr(self):"},{"line_number":1922,"context_line":"        timestamp \u003d normalize_timestamp(time())"},{"line_number":1923,"context_line":"        req \u003d Request.blank("},{"line_number":1924,"context_line":"            \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f4b6375_7d173053","line":1921,"updated":"2017-10-20 16:10:40.000000000","message":"This test has more knowledge of xattrs than seems necessary...","commit_id":"bed2cec60e1ea1fde796147529dbe30d750212bb"}],"test/unit/obj/test_ssync.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c6bc3d6311f60a4d28331cbf751456d7a33bc49","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    about the final state of the sender and receiver diskfiles."},{"line_number":47,"context_line":"    \"\"\""},{"line_number":48,"context_line":"    def setUp(self):"},{"line_number":49,"context_line":"        skip_if_no_xattrs()"},{"line_number":50,"context_line":"        super(TestBaseSsync, self).setUp()"},{"line_number":51,"context_line":"        self.device \u003d \u0027dev\u0027"},{"line_number":52,"context_line":"        self.partition \u003d \u00279\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a71b18c_0d2654ba","line":49,"updated":"2016-12-01 15:53:55.000000000","message":"move this to BaseTest.setUp()","commit_id":"5fa8e0c9b1553d2b601d68b77620a2fc34149d4c"}],"test/unit/obj/test_ssync_receiver.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c6bc3d6311f60a4d28331cbf751456d7a33bc49","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        utils.HASH_PATH_SUFFIX \u003d \u0027endcap\u0027"},{"line_number":47,"context_line":"        utils.HASH_PATH_PREFIX \u003d \u0027startcap\u0027"},{"line_number":48,"context_line":"        # Not sure why the test.unit stuff isn\u0027t taking effect here; so I\u0027m"},{"line_number":49,"context_line":"        # reinforcing it."},{"line_number":50,"context_line":"        self.testdir \u003d os.path.join("},{"line_number":51,"context_line":"            tempfile.mkdtemp(), \u0027tmp_test_ssync_receiver\u0027)"},{"line_number":52,"context_line":"        utils.mkdirs(os.path.join(self.testdir, \u0027sda1\u0027, \u0027tmp\u0027))"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a71b18c_dbbb3574","line":49,"updated":"2016-12-01 15:53:55.000000000","message":"IIRC this comment refers to the xattr munging that has now been deleted, so comment can go too.","commit_id":"5fa8e0c9b1553d2b601d68b77620a2fc34149d4c"}],"test/unit/obj/test_ssync_sender.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c6bc3d6311f60a4d28331cbf751456d7a33bc49","unresolved":false,"context_lines":[{"line_number":83,"context_line":"class TestSender(BaseTest):"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def setUp(self):"},{"line_number":86,"context_line":"        skip_if_no_xattrs()"},{"line_number":87,"context_line":"        super(TestSender, self).setUp()"},{"line_number":88,"context_line":"        self.testdir \u003d os.path.join(self.tmpdir, \u0027tmp_test_ssync_sender\u0027)"},{"line_number":89,"context_line":"        utils.mkdirs(os.path.join(self.testdir, \u0027dev\u0027))"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a71b18c_2d04f013","line":86,"updated":"2016-12-01 15:53:55.000000000","message":"move this to BaseTest.setUp()","commit_id":"5fa8e0c9b1553d2b601d68b77620a2fc34149d4c"}]}
