frankgh commented on code in PR #198:
URL: https://github.com/apache/cassandra-sidecar/pull/198#discussion_r1987628220


##########
server/src/main/java/org/apache/cassandra/sidecar/routes/ReportSchemaHandler.java:
##########
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.sidecar.routes;
+
+import java.util.Collections;
+import java.util.Set;
+
+import com.datastax.driver.core.Metadata;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import io.vertx.core.http.HttpServerRequest;
+import io.vertx.core.net.SocketAddress;
+import io.vertx.ext.auth.authorization.Authorization;
+import io.vertx.ext.web.RoutingContext;
+import org.apache.cassandra.sidecar.acl.authorization.BasicPermissions;
+import org.apache.cassandra.sidecar.concurrent.ExecutorPools;
+import org.apache.cassandra.sidecar.datahub.SchemaReporter;
+import org.apache.cassandra.sidecar.utils.InstanceMetadataFetcher;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * An implementation of {@link AbstractHandler} used to trigger an immediate,
+ * synchronous conversion and report of the current schema
+ */
+@Singleton
+public class ReportSchemaHandler extends AbstractHandler<Void> implements 
AccessProtected
+{
+    @NotNull
+    private final SchemaReporter schemaReporter;
+
+    /**
+     * Constructs a new instance of {@link ReportSchemaHandler} using the 
provided instances
+     * of {@link InstanceMetadataFetcher}, {@link ExecutorPools}, and {@link 
SchemaReporter}
+     *
+     * @param metadata the metadata fetcher
+     * @param executor executor pools for blocking executions
+     * @param reporter schema reporter to use for the conversion
+     */
+    @Inject
+    public ReportSchemaHandler(@NotNull InstanceMetadataFetcher metadata,
+                               @NotNull ExecutorPools executor,
+                               @NotNull SchemaReporter reporter)
+    {
+        super(metadata, executor, null);
+
+        schemaReporter = reporter;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    @NotNull
+    public Set<Authorization> requiredAuthorizations()
+    {
+        return 
Collections.singleton(BasicPermissions.REPORT_SCHEMA.toAuthorization());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    @Nullable
+    protected Void extractParamsOrThrow(@NotNull RoutingContext context)
+    {
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected void handleInternal(@NotNull RoutingContext context,
+                                  @NotNull HttpServerRequest http,
+                                  @NotNull String host,
+                                  @NotNull SocketAddress address,
+                                  @Nullable Void request)
+    {
+        Metadata metadata = 
metadataFetcher.callOnFirstAvailableInstance(instance -> 
instance.delegate().metadata());
+
+        executorPools.service()
+                     .runBlocking(() -> schemaReporter.process(metadata))
+                     .onSuccess(ignored -> context.end())

Review Comment:
   can we respond with a JSON response here? The expectation is that all 
endpoints return a JSON payload (except for streaming endpoints). I think we 
can do OK_STATUS
   ```suggestion
                        .onSuccess(ignored -> context.json(OK_STATUS))
   ```



##########
CHANGES.txt:
##########


Review Comment:
   Looks like there is a merge conflict here.



##########
server/src/test/java/org/apache/cassandra/sidecar/utils/InstanceMetadataFetcherTest.java:
##########


Review Comment:
   this entire class should be reverted before merge. Changes are unrelated to 
the PR.



##########
client/src/main/java/org/apache/cassandra/sidecar/client/SidecarClient.java:
##########
@@ -567,6 +566,28 @@ public void streamCdcSegments(SidecarInstance 
sidecarInstance,
                 .build(), streamConsumer);
     }
 
+    /**
+     * Sends a request to trigger an immediate, synchronous schema
+     * conversion and report on the specified instance of the Sidecar
+     * regardless of the periodic task schedule or status
+     *
+     * @param instance the {@link SidecarInstance} to receive the request
+     * @return a {@link CompletableFuture} for the request
+     */
+    public CompletableFuture<Void> reportSchema(SidecarInstance instance)
+    {
+        // Create an instance of {@link RequestContext.Builder} using its
+        // constructor instead of the {@link this.requestBuilder()} method,
+        // since {@link NoRetryPolicy} is the preferred behavior here
+
+        RequestContext context = new RequestContext.Builder()
+                .singleInstanceSelectionPolicy(instance)
+                .reportSchemaRequest()
+                .build();
+
+        return executor.executeRequestAsync(context);

Review Comment:
   you can always override the policy like this:
   ```suggestion
           return executor.executeRequestAsync(requestBuilder()
                                               
.singleInstanceSelectionPolicy(instance)
                                               .retryPolicy(new NoRetryPolicy())
                                               .reportSchemaRequest()
                                               .build());
   ```



##########
client-common/src/main/java/org/apache/cassandra/sidecar/common/ApiEndpointsV1.java:
##########
@@ -121,13 +121,16 @@ public final class ApiEndpointsV1
     public static final String LIST_CDC_SEGMENTS_ROUTE = API_V1 + CDC_PATH + 
"/segments";
     public static final String STREAM_CDC_SEGMENTS_ROUTE = 
LIST_CDC_SEGMENTS_ROUTE + "/" + SEGMENT_PATH_PARAM;
 
+    // Schema Reporting
+    private static final String REPORT_SCHEMA = "/report-schema";
+    public static final String REPORT_SCHEMA_ROUTE = API_V1 + REPORT_SCHEMA;

Review Comment:
   I'm not 100% convinced about this route. What do you think about this?
   ```suggestion
       public static final String REPORT_SCHEMA_ROUTE = API_V1 + 
"/services/schema-reporting/ REPORT_SCHEMA;
   ```
   
   or something that scopes this feature to the schema reporting service.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: pr-unsubscr...@cassandra.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: pr-unsubscr...@cassandra.apache.org
For additional commands, e-mail: pr-h...@cassandra.apache.org

Reply via email to