class TransportDropViewAction extends TransportMasterNodeAction<DropViewRequest, DropViewResponse> {

    private final DDLClusterStateService ddlClusterStateService;

    @Inject
    public TransportDropViewAction(TransportService transportService,
                                   ClusterService clusterService,
                                   ThreadPool threadPool,
                                   DDLClusterStateService ddlClusterStateService) {
        super(
            "internal:crate:sql/views/drop",
            transportService,
            clusterService,
            threadPool,
            DropViewRequest::new
        );
        this.ddlClusterStateService = ddlClusterStateService;
    }

    @Override
    protected String executor() {
        return ThreadPool.Names.GENERIC;
    }

    @Override
    protected DropViewResponse read(StreamInput in) throws IOException {
        return new DropViewResponse(in);
    }

    @Override
    protected void masterOperation(DropViewRequest request,
                                   ClusterState state,
                                   ActionListener<DropViewResponse> listener) {<FILL_FUNCTION_BODY>}

    @Override
    protected ClusterBlockException checkBlock(DropViewRequest request, ClusterState state) {
        return state.blocks().globalBlockedException(ClusterBlockLevel.METADATA_WRITE);
    }
}

        clusterService.submitStateUpdateTask("views/drop",
            new AckedClusterStateUpdateTask<DropViewResponse>(Priority.HIGH, request, listener) {

                private List<RelationName> missing;

                @Override
                public ClusterState execute(ClusterState currentState) {
                    ViewsMetadata views = currentState.metadata().custom(ViewsMetadata.TYPE);
                    if (views == null) {
                        missing = request.names();
                        return currentState;
                    }
                    ViewsMetadata.RemoveResult removeResult = views.remove(request.names());
                    missing = removeResult.missing();
                    if (!removeResult.missing().isEmpty() && !request.ifExists()) {
                        // We missed a view -> This is an error case so we must not update the cluster state
                        return currentState;
                    }
                    currentState = ddlClusterStateService.onDropView(currentState, request.names());
                    return ClusterState.builder(currentState)
                        .metadata(
                            Metadata.builder(currentState.metadata())
                                .putCustom(ViewsMetadata.TYPE, removeResult.updatedViews())
                                .build()
                        )
                        .build();
                }

                @Override
                protected DropViewResponse newResponse(boolean acknowledged) {
                    return new DropViewResponse(missing);
                }
            });
    
<methods><variables>protected final non-sealed org.elasticsearch.cluster.service.ClusterService clusterService,private final non-sealed java.lang.String executor,protected final non-sealed org.elasticsearch.threadpool.ThreadPool threadPool,protected final non-sealed org.elasticsearch.transport.TransportService transportService