@Override
  protected void doExecute(
      final UpdateRequest request, final ActionListener<UpdateResponse> listener) {
    // if we don't have a master, we don't have metadata, that's fine, let it find a master using
    // create index API
    if (autoCreateIndex.shouldAutoCreate(request.index(), clusterService.state())) {
      request.beforeLocalFork(); // we fork on another thread...
      createIndexAction.execute(
          new CreateIndexRequest(request.index())
              .cause("auto(update api)")
              .masterNodeTimeout(request.timeout()),
          new ActionListener<CreateIndexResponse>() {
            @Override
            public void onResponse(CreateIndexResponse result) {
              innerExecute(request, listener);
            }

            @Override
            public void onFailure(Throwable e) {
              if (ExceptionsHelper.unwrapCause(e) instanceof IndexAlreadyExistsException) {
                // we have the index, do it
                try {
                  innerExecute(request, listener);
                } catch (Exception e1) {
                  listener.onFailure(e1);
                }
              } else {
                listener.onFailure(e);
              }
            }
          });
    } else {
      innerExecute(request, listener);
    }
  }