code: def _do_fail_callback(
              self, reason, msg, reply_cb, inform_cb, user_data, timeout_handle):
          
          # this may also result in reply_cb being None if no
          # reply_cb was passed to the request method
  
          if reply_cb is None:
              # this happens if no reply_cb was passed in to the request
              return
  
          reason_msg = Message.reply(msg.name, "fail", reason, mid=msg.mid)
  
          try:
              if user_data is None:
                  reply_cb(reason_msg)
              else:
                  reply_cb(reason_msg, *user_data)
          except Exception:
              e_type, e_value, trace = sys.exc_info()
              exc_reason = "\n".join(traceback.format_exception(
                  e_type, e_value, trace, self._tb_limit))
              self._logger.error("Callback reply during failure %s, %s FAIL: %s" %
                                 (reason, msg.name, exc_reason))
docs: Do callback for a failed request.