nvharikrishna commented on code in PR #321:
URL: https://github.com/apache/cassandra-sidecar/pull/321#discussion_r2955220778


##########
server/src/main/java/org/apache/cassandra/sidecar/livemigration/DataCopyTaskManager.java:
##########
@@ -101,39 +103,83 @@ Future<LiveMigrationTask> 
createDataCopyTask(LiveMigrationDataCopyRequest reques
                                                  String source,
                                                  InstanceMetadata 
localInstanceMetadata)
     {
-        LiveMigrationTask newTask = createTask(request,
-                                               source,
-                                               
sidecarConfiguration.serviceConfiguration().port(),
-                                               localInstanceMetadata);
-
-        // It is possible to serve only one live migration data copy request 
per instance at a time.
-        // Checking if there is another migration is in progress before 
accepting new one.
-        boolean accepted = currentTasks.compute(localInstanceMetadata.id(), 
(integer, taskInMap) -> {
-            if (taskInMap == null)
-            {
-                return newTask;
-            }
+        // Fast local JMX check before creating task - prevents task creation 
if Cassandra is running
+        return verifyCassandraNotRunning(localInstanceMetadata)
+               .compose(v -> {
+                   LiveMigrationTask newTask = createTask(request,
+                                                          source,
+                                                          
sidecarConfiguration.serviceConfiguration().port(),
+                                                          
localInstanceMetadata);
+
+                   // It is possible to serve only one live migration data 
copy request per instance at a time.
+                   // Checking if there is another migration is in progress 
before accepting new one.
+                   boolean accepted = 
currentTasks.compute(localInstanceMetadata.id(), (integer, taskInMap) -> {
+                       if (taskInMap == null)
+                       {
+                           return newTask;
+                       }
+
+                       if (!taskInMap.isCompleted())
+                       {
+                           // Accept new task if and only if the existing task 
has completed.
+                           return taskInMap;
+                       }
+                       else
+                       {
+                           return newTask;
+                       }
+                   }) == newTask;
+
+                   if (!accepted)
+                   {
+                       return Future.failedFuture(
+                       new LiveMigrationDataCopyInProgressException("Another 
task is already under progress. Cannot accept new task."));
+                   }
+                   LOGGER.info("Starting data copy task with id={}, source={}, 
destination={}",
+                               newTask.id(), source, 
localInstanceMetadata.host());
+                   newTask.start();
+                   return Future.succeededFuture(newTask);
+               });
+    }
 
-            if (!taskInMap.isCompleted())
-            {
-                // Accept new task if and only if the existing task has 
completed.
-                return taskInMap;
-            }
-            else
+    /**
+     * Initiating data copy once a Cassandra instance starts is not 
acceptable. This method checks whether
+     * Cassandra is running or not at the moment on the destination instance 
by checking if Sidecar
+     * was able to connect to the Cassandra instance's JMX port. It returns a 
failed future if Sidecar
+     * is able to connect to the JMX port of Cassandra.
+     *
+     * @param localInstance metadata for the local Cassandra instance
+     * @return Future that succeeds if Cassandra is not running, fails if it 
is running
+     */
+    private Future<Void> verifyCassandraNotRunning(InstanceMetadata 
localInstance)
+    {
+        try
+        {
+            CassandraAdapterDelegate delegate = localInstance.delegate();
+
+            if (delegate.isJmxUp())

Review Comment:
   Makes sense, made the changes.



##########
CHANGES.txt:
##########
@@ -1,5 +1,6 @@
 0.3.0
 -----
+ * Adding gossip based safety check to Live Migration data copy task endpoint 
(CASSSIDECAR-409)

Review Comment:
   done



-- 
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: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to