# Buggy code
def _uploadStream(self, key, update=False, encrypt=True):
    readable_fh, writable_fh = os.pipe()
    with os.fdopen(readable_fh, "r") as readable:
        with os.fdopen(writable_fh, "w") as writable:

            def writer():
                headers = self.encryptedHeaders if encrypt else self.headerValues
                if update:
                    try:
                        key.set_contents_from_stream(readable, headers=headers)
                    except boto.exception.GSDataError:
                        if encrypt:
                            # https://github.com/boto/boto/issues/3518
                            # see self._writeFile for more
                            pass
                        else:
                            raise
                else:
                    try:
                        # The if_condition kwarg insures that the existing key matches given
                        # generation (version) before modifying anything. Setting
                        # if_generation=0 insures key does not exist remotely
                        key.set_contents_from_stream(
                            readable, headers=headers, if_generation=0
                        )
                    except (
                        boto.exception.GSResponseError,
                        boto.exception.GSDataError,
                    ) as e:
                        if isinstance(e, boto.exception.GSResponseError):
                            if e.status == 412:
                                raise ConcurrentFileModificationException(key.name)
                            else:
                                raise e
                        elif encrypt:
                            # https://github.com/boto/boto/issues/3518
                            # see self._writeFile for more
                            pass
                        else:
                            raise

            thread = ExceptionalThread(target=writer)
            thread.start()
            yield writable
        thread.join()


# Traceback (boto.exception.S3CreateError)
ubuntu@ip-172-31-24-34:~/common-workflow-language$ toil clean aws:us-west-2:peter-cwltoil-test
2016-04-13 15:36:32,632 INFO:toil.lib.bioio: Logging set at level: INFO
2016-04-13 15:36:32,632 INFO:toil.utils.toilClean: Parsed arguments
2016-04-13 15:36:32,633 INFO:toil.utils.toilClean: Checking if we have files for toil
Traceback (most recent call last):
File "/usr/local/bin/toil", line 9, in <module>
load_entry_point('toil==3.2.0a2.dev134', 'console_scripts', 'toil')()
File "/usr/local/lib/python2.7/dist-packages/toil/utils/toilMain.py", line 30, in main
module.main()
File "/usr/local/lib/python2.7/dist-packages/toil/utils/toilClean.py", line 53, in main
jobStore = Toil.loadOrCreateJobStore(options.jobStore)
File "/usr/local/lib/python2.7/dist-packages/toil/common.py", line 501, in loadOrCreateJobStore
return AWSJobStore.loadOrCreateJobStore(jobStoreArgs, config=config)
File "/usr/local/lib/python2.7/dist-packages/toil/jobStores/aws/jobStore.py", line 117, in loadOrCreateJobStore
return cls(region, namePrefix, config=config, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/toil/jobStores/aws/jobStore.py", line 174, in __init__
self.filesBucket = self._getOrCreateBucket(qualify('files'), versioning=True)
File "/usr/local/lib/python2.7/dist-packages/toil/jobStores/aws/jobStore.py", line 469, in _getOrCreateBucket
bucket = self.s3.create_bucket(bucket_name, location=self.region)
File "/usr/local/lib/python2.7/dist-packages/boto/s3/connection.py", line 616, in create_bucket
response.status, response.reason, body)
boto.exception.S3CreateError: S3CreateError: 409 Conflict
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>BucketAlreadyExists</Code><Message>The requested bucket name is not available. The bucket namespace is shared by all users of the system. Please select a different name and try again.</Message><BucketName>peter-cwltoil-test--files</BucketName><RequestId>DAF5D5E6B138F1AB</RequestId><HostId>t9Fz0/fKNcxA5q7gLBuk7FMu9AxCD4AdyXMIWhWOtJVyNS8ARDxnWDQOBZdeTmpkcVtXa9brMss=</HostId></Error>

# Fixed code
def _uploadStream(self, key, update=False, encrypt=True):
    store = self

    class UploadPipe(WritablePipe):
        def readFrom(self, readable):
            headers = store.encryptedHeaders if encrypt else store.headerValues
            if update:
                try:
                    key.set_contents_from_stream(readable, headers=headers)
                except boto.exception.GSDataError:
                    if encrypt:
                        # https://github.com/boto/boto/issues/3518
                        # see self._writeFile for more
                        pass
                    else:
                        raise
            else:
                try:
                    # The if_generation argument insures that the existing key matches the
                    # given generation, i.e. version, before modifying anything. Passing a
                    # generation of 0 insures that the key does not exist remotely.
                    key.set_contents_from_stream(
                        readable, headers=headers, if_generation=0
                    )
                except (
                    boto.exception.GSResponseError,
                    boto.exception.GSDataError,
                ) as e:
                    if isinstance(e, boto.exception.GSResponseError):
                        if e.status == 412:
                            raise ConcurrentFileModificationException(key.name)
                        else:
                            raise e
                    elif encrypt:
                        # https://github.com/boto/boto/issues/3518
                        # see self._writeFile for more
                        pass
                    else:
                        raise

    with UploadPipe() as writable:
        yield writable