def communicate(self):
        self.storlet_logger = StorletLogger(self.storlet_logger_path,
                                            'storlet_invoke')
        self.storlet_logger.open()

        self._prepare_invocation_descriptors()
        try:
            self._invoke()
        except Exception as e:
            raise e
        finally:
            self._close_remote_side_descriptors()
            self.storlet_logger.close()

        self._wait_for_write_with_timeout(self.input_data_write_fd)
        # We do the writing in a different thread.
        # Otherwise, we can run into the following deadlock
        # 1. middleware writes to Storlet
        # 2. Storlet reads and starts to write metadata and then data
        # 3. middleware continues writing
        # 4. Storlet continues writing and gets stuck as middleware
        #    is busy writing, but still not consuming the reader end
        #    of the Storlet writer.
        eventlet.spawn_n(self._write_input_data)
        out_md = self._read_metadata()
        self._wait_for_read_with_timeout(self.data_read_fd)

        return out_md, self.data_read_fd
    def communicate(self):
        self.storlet_logger = StorletLogger(self.storlet_logger_path,
                                            'storlet_invoke')
        self.storlet_logger.open()

        self._prepare_invocation_descriptors()
        try:
            self._invoke()
        except Exception as e:
            raise e
        finally:
            self._close_remote_side_descriptors()
            self.storlet_logger.close()

        out_md = self._read_metadata()
        os.close(self.metadata_read_fd)
        self._wait_for_read_with_timeout(self.data_read_fd)
        os.close(self.execution_str_read_fd)

        return out_md, self.data_read_fd