3838import java .util .ArrayList ;
3939import java .util .List ;
4040import java .util .Properties ;
41+ import java .util .concurrent .TimeUnit ;
4142import java .util .stream .Stream ;
4243
4344import static org .apache .iotdb .it .env .cluster .ClusterConstant .AI_NODE_NAME ;
@@ -52,7 +53,8 @@ public class AINodeWrapper extends AbstractNodeWrapper {
5253 private final String seedConfigNode ;
5354 private final int clusterIngressPort ;
5455
55- private static final String SCRIPT_FILE = "start-ainode.sh" ;
56+ private static final String START_SCRIPT_FILE = "start-ainode.sh" ;
57+ private static final String STOP_SCRIPT_FILE = "stop-ainode.sh" ;
5658
5759 private static final String SHELL_COMMAND = "bash" ;
5860
@@ -165,8 +167,8 @@ public void start() {
165167 // start AINode
166168 List <String > startCommand = new ArrayList <>();
167169 startCommand .add (SHELL_COMMAND );
168- startCommand .add (filePrefix + File . separator + SCRIPT_PATH + File . separator + SCRIPT_FILE );
169- startCommand . add ( "-r" );
170+ startCommand .add (
171+ filePrefix + File . separator + SCRIPT_PATH + File . separator + START_SCRIPT_FILE );
170172
171173 ProcessBuilder processBuilder =
172174 new ProcessBuilder (startCommand )
@@ -179,6 +181,48 @@ public void start() {
179181 }
180182 }
181183
184+ @ Override
185+ public void stop () {
186+ if (this .instance == null ) {
187+ return ;
188+ }
189+ try {
190+ // stop AINode
191+ File stdoutFile = new File (getLogPath ());
192+ String filePrefix = getNodePath ();
193+ List <String > stopCommand = new ArrayList <>();
194+ stopCommand .add (SHELL_COMMAND );
195+ stopCommand .add (
196+ filePrefix + File .separator + SCRIPT_PATH + File .separator + STOP_SCRIPT_FILE );
197+ ProcessBuilder processBuilder =
198+ new ProcessBuilder (stopCommand )
199+ .redirectOutput (ProcessBuilder .Redirect .appendTo (stdoutFile ))
200+ .redirectError (ProcessBuilder .Redirect .appendTo (stdoutFile ));
201+ Process stopProcess = processBuilder .inheritIO ().start ();
202+ if (!stopProcess .waitFor (20 , TimeUnit .SECONDS )) {
203+ logger .warn ("Node {} does not exit within 20s, killing it" , getId ());
204+ if (!this .instance .destroyForcibly ().waitFor (10 , TimeUnit .SECONDS )) {
205+ logger .error ("Cannot forcibly stop node {}" , getId ());
206+ }
207+ }
208+ int exitCode = stopProcess .exitValue ();
209+ if (exitCode != 0 ) {
210+ logger .warn ("Node {}'s stop script exited with code {}" , getId (), exitCode );
211+ }
212+ } catch (InterruptedException e ) {
213+ Thread .currentThread ().interrupt ();
214+ logger .error ("Waiting node to shutdown error." , e );
215+ } catch (IOException e ) {
216+ logger .error ("Waiting node to shutdown error." , e );
217+ }
218+ logger .info ("In test {} {} stopped." , getTestLogDirName (), getId ());
219+ }
220+
221+ @ Override
222+ public void stopForcibly () {
223+ this .stop ();
224+ }
225+
182226 @ Override
183227 public int getMetricPort () {
184228 // no metric currently
0 commit comments