'Perform the work of this work item and report the results.
Args:
thread_pool: An AdaptiveThreadPool instance.
Returns:
A tuple (status, instruction) of the work status and an instruction
for the ThreadGate.'

def PerformWork(self, thread_pool):

    status = adaptive_thread_pool.WorkItem.FAILURE
    instruction = adaptive_thread_pool.ThreadGate.DECREASE
    try:
        self.MarkAsTransferring()
        try:
            transfer_time = self._TransferItem(thread_pool)
            if (transfer_time is None):
                status = adaptive_thread_pool.WorkItem.RETRY
                instruction = adaptive_thread_pool.ThreadGate.HOLD
            else:
                logger.debug('[%s]    %s    Transferred    %d    entities    in    %0.1f    seconds', threading.currentThread().getName(), self, self.count, transfer_time)
                sys.stdout.write('.')
                sys.stdout.flush()
                status = adaptive_thread_pool.WorkItem.SUCCESS
                if (transfer_time <= MAXIMUM_INCREASE_DURATION):
                    instruction = adaptive_thread_pool.ThreadGate.INCREASE
                elif (transfer_time <= MAXIMUM_HOLD_DURATION):
                    instruction = adaptive_thread_pool.ThreadGate.HOLD
        except (db.InternalError, db.NotSavedError, db.Timeout, db.TransactionFailedError, apiproxy_errors.OverQuotaError, apiproxy_errors.DeadlineExceededError, apiproxy_errors.ApplicationError) as e:
            status = adaptive_thread_pool.WorkItem.RETRY
            logger.exception('Retrying    on    non-fatal    datastore    error:    %s', e)
        except urllib2.HTTPError as e:
            http_status = e.code
            if ((http_status >= 500) and (http_status < 600)):
                status = adaptive_thread_pool.WorkItem.RETRY
                logger.exception('Retrying    on    non-fatal    HTTP    error:    %d    %s', http_status, e.msg)
            else:
                self.SetError()
                status = adaptive_thread_pool.WorkItem.FAILURE
        except urllib2.URLError as e:
            if IsURLErrorFatal(e):
                self.SetError()
                status = adaptive_thread_pool.WorkItem.FAILURE
            else:
                status = adaptive_thread_pool.WorkItem.RETRY
                logger.exception('Retrying    on    non-fatal    URL    error:    %s', e.reason)
    finally:
        if (status == adaptive_thread_pool.WorkItem.SUCCESS):
            self.MarkAsTransferred()
        else:
            self.MarkAsError()
    return (status, instruction)
