77
77
78
78
#define USE_STDERR JNI_TRUE /* we usually print to stderr */
79
79
#define USE_STDOUT JNI_FALSE
80
- #if defined(J9VM_OPT_CRAC_SUPPORT )
81
- /* The return codes indicating errors, successful execution, or specific conditions. */
82
- #define EXECVP_ERROR -1
83
- #define EXECVP_SUCCESS 0
84
- #define WAIT_INDEFINITELY 0
85
- #define MEMORY_ALLOCATION_ERROR 1
86
- #define OPTION_NAME_NOT_FOUND_ERROR 2
87
- #define OPTION_VALUE_NOT_FOUND_ERROR 3
88
- #define OPTION_VALUE_NOT_VALID_ERROR 4
89
- #define OPTION_VALUE_NOT_EXPECTED_ERROR 5
90
- #define COMMAND_OPTION_LENGTH_CALCULATION_ERROR 6
91
-
92
- /* The error messages. */
93
- #define OPTION_VALUE_NOT_FOUND_ERROR_MESSAGE "The value of the command line option %s was not found."
94
- #define OPTION_VALUE_NOT_VALID_ERROR_MESSAGE "The value of the command line option is not valid, option=%s, value=%s."
95
- #define OPTION_VALUE_NOT_EXPECTED_ERROR_MESSAGE "The value of the command line option is not expected, option=%s, value=%s."
96
- #define CHECKPOINT_DIRECTORY_ERROR_MESSAGE "Failed to get the CRIU checkpoint directory, error=%d."
97
- #define LOG_LEVEL_ERROR_MESSAGE "Failed to get the CRIU log level, error=%d."
98
- #define UNPRIVILEGED_MODE_ERROR_MESSAGE "Failed to get the CRIU unprivileged mode, error=%d."
99
- #define LOG_FILE_ERROR_MESSAGE "Failed to get the CRIU log file, error=%d."
100
- #define COMMAND_OPTION_LENGTH_CALCULATION_ERROR_MESSAGE "Failed to calculate the length of the command option, value=%s, format=%s."
101
- #define COMMAND_OPTION_MEMORY_ALLOCATION_ERROR_MESSAGE "Failed to allocate memory for the command option, value=%s, format=%s."
102
- #define RESTORE_FROM_CHECKPOINT_ERROR_MESSAGE "Failed to restore from checkpoint, error=%d."
103
- #define RESTORE_CHILD_PROCESS_FAILED_ERROR_MESSAGE "The CRIU restore child process failed."
104
-
105
- /* The option names. */
106
- #define CRAC_RESTORE_FROM_OPTION_NAME "-XX:CRaCRestoreFrom"
107
- #define LOG_LEVEL_OPTION_NAME "-Dopenj9.internal.criu.logLevel"
108
- #define UNPRIVILEGED_MODE_OPTION_NAME "-Dopenj9.internal.criu.unprivilegedMode"
109
- #define LOG_FILE_OPTION_NAME "-Dopenj9.internal.criu.logFile"
110
-
111
- /* The option formats. */
112
- #define LOG_LEVEL_OPTION_FORMAT "-v%d"
113
- #define LOG_FILE_OPTION_FORMAT "--log-file=%s"
114
-
115
- /* The CRIU command options. */
116
- #define CRIU_COMMAND "criu"
117
- #define CRIU_RESTORE_OPTION "restore"
118
- #define CRIU_CHECKPOINT_DIRECTORY_OPTION "-D"
119
- #define CRIU_SHELL_JOB_OPTION "--shell-job"
120
- #define CRIU_UNPRIVILEGED_MODE_OPTION "--unprivileged"
121
- #endif /* defined(J9VM_OPT_CRAC_SUPPORT) */
122
80
123
81
static jboolean printVersion = JNI_FALSE ; /* print and exit */
124
82
static jboolean showVersion = JNI_FALSE ; /* print but continue */
@@ -625,7 +583,7 @@ getCommandLineOptionValue(const char *optionName, int argc, char **argv, int *er
625
583
}
626
584
}
627
585
if (!optionNameFound ) {
628
- * error = OPTION_NAME_NOT_FOUND_ERROR ;
586
+ * error = -1 ;
629
587
}
630
588
return value ;
631
589
}
@@ -641,13 +599,13 @@ static const char *
641
599
getCheckpointDirectory (int argc , char * * argv , int * error )
642
600
{
643
601
const char * checkpointDirectory = NULL ;
644
- const char * checkpointDirectoryPropertyValue = getCommandLineOptionValue (CRAC_RESTORE_FROM_OPTION_NAME , argc , argv , error );
602
+ const char * checkpointDirectoryPropertyValue = getCommandLineOptionValue ("-XX:CRaCRestoreFrom" , argc , argv , error );
645
603
if (0 == * error ) {
646
604
if (NULL != checkpointDirectoryPropertyValue ) {
647
605
checkpointDirectory = checkpointDirectoryPropertyValue ;
648
606
} else {
649
- JLI_ReportErrorMessage (OPTION_VALUE_NOT_FOUND_ERROR_MESSAGE , CRAC_RESTORE_FROM_OPTION_NAME );
650
- * error = OPTION_VALUE_NOT_FOUND_ERROR ;
607
+ JLI_ReportErrorMessage ("The value of the command line option -XX:CRaCRestoreFrom was not found." );
608
+ * error = -2 ;
651
609
}
652
610
}
653
611
return checkpointDirectory ;
@@ -661,7 +619,7 @@ getCheckpointDirectory(int argc, char **argv, int *error)
661
619
static jboolean
662
620
isCommandLineOptionFoundWithError (int error )
663
621
{
664
- return (OPTION_NAME_NOT_FOUND_ERROR != error ) && (0 != error );
622
+ return (-1 != error ) && (0 != error );
665
623
}
666
624
667
625
/**
@@ -676,7 +634,7 @@ getLogLevel(int argc, char **argv, int *error)
676
634
{
677
635
int logLevelValue = 2 ; /* default */
678
636
const char * logLevelPropertyValue = NULL ;
679
- logLevelPropertyValue = getCommandLineOptionValue (LOG_LEVEL_OPTION_NAME , argc , argv , error );
637
+ logLevelPropertyValue = getCommandLineOptionValue ("-Dopenj9.internal.criu.logLevel" , argc , argv , error );
680
638
if (!isCommandLineOptionFoundWithError (* error )) {
681
639
const char * c = logLevelPropertyValue ;
682
640
if (NULL == c ) {
@@ -695,8 +653,8 @@ getLogLevel(int argc, char **argv, int *error)
695
653
}
696
654
}
697
655
setLogLevelOptionValueNotValidError :
698
- JLI_ReportErrorMessage (OPTION_VALUE_NOT_VALID_ERROR_MESSAGE , LOG_LEVEL_OPTION_NAME , logLevelPropertyValue );
699
- * error = OPTION_VALUE_NOT_VALID_ERROR ;
656
+ JLI_ReportErrorMessage ("The value of the command line option is not valid, option=-Dopenj9.internal.criu.logLevel, value=%s." , logLevelPropertyValue );
657
+ * error = -1 ;
700
658
done :
701
659
return logLevelValue ;
702
660
}
@@ -712,13 +670,13 @@ static jboolean
712
670
isUnprivilegedModeOn (int argc , char * * argv , int * error )
713
671
{
714
672
jboolean isUnprivilegedModeOn = JNI_FALSE ;
715
- const char * unprivilegedModePropertyValue = getCommandLineOptionValue (UNPRIVILEGED_MODE_OPTION_NAME , argc , argv , error );
673
+ const char * unprivilegedModePropertyValue = getCommandLineOptionValue ("-Dopenj9.internal.criu.unprivilegedMode" , argc , argv , error );
716
674
if (0 == * error ) {
717
675
if (NULL == unprivilegedModePropertyValue ) {
718
676
isUnprivilegedModeOn = JNI_TRUE ;
719
677
} else {
720
- JLI_ReportErrorMessage (OPTION_VALUE_NOT_EXPECTED_ERROR_MESSAGE , UNPRIVILEGED_MODE_OPTION_NAME , unprivilegedModePropertyValue );
721
- * error = OPTION_VALUE_NOT_EXPECTED_ERROR ;
678
+ JLI_ReportErrorMessage ("The value of the command line option is not expected, option=-Dopenj9.internal.criu.unprivilegedMode, value=%s." , unprivilegedModePropertyValue );
679
+ * error = -1 ;
722
680
}
723
681
}
724
682
return isUnprivilegedModeOn ;
@@ -735,13 +693,13 @@ static const char *
735
693
getLogFile (int argc , char * * argv , int * error )
736
694
{
737
695
const char * logFile = NULL ;
738
- const char * logFilePropertyValue = getCommandLineOptionValue (LOG_FILE_OPTION_NAME , argc , argv , error );
696
+ const char * logFilePropertyValue = getCommandLineOptionValue ("-Dopenj9.internal.criu.logFile" , argc , argv , error );
739
697
if (0 == * error ) {
740
698
if (NULL != logFilePropertyValue ) {
741
699
logFile = logFilePropertyValue ;
742
700
} else {
743
- JLI_ReportErrorMessage (OPTION_VALUE_NOT_FOUND_ERROR_MESSAGE , LOG_FILE_OPTION_NAME );
744
- * error = OPTION_VALUE_NOT_FOUND_ERROR ;
701
+ JLI_ReportErrorMessage ("The value of the command line option -Dopenj9.internal.criu.logFile was not found." );
702
+ * error = -1 ;
745
703
}
746
704
}
747
705
return logFile ;
@@ -753,73 +711,73 @@ getLogFile(int argc, char **argv, int *error)
753
711
* @param[in] logLevel The log level for CRIU logging
754
712
* @param[in] unprivilegedModeOn Indicates whether the unprivileged mode option is on
755
713
* @param[in] logFile The log file option for CRIU
756
- * @return EXECVP_SUCCESS if the execution of the 'criu restore' command succeeds, error code otherwise
714
+ * @return 0 if the execution of the 'criu restore' command succeeds, -1 otherwise
757
715
*/
758
716
static int
759
717
restoreFromCheckpoint (const char * checkpointDirectory , int logLevel , jboolean unprivilegedModeOn , const char * logFile )
760
718
{
761
- int restoreStatus = EXECVP_SUCCESS ;
719
+ int restoreStatus = 0 ;
762
720
int length = -1 ;
763
721
char * logLevelOption = NULL ;
764
722
char * logFileOption = NULL ;
765
723
int argc = 0 ;
766
724
const char * argv [9 ] = { NULL };
767
- argv [argc ++ ] = CRIU_COMMAND ;
768
- argv [argc ++ ] = CRIU_RESTORE_OPTION ;
769
- argv [argc ++ ] = CRIU_CHECKPOINT_DIRECTORY_OPTION ;
725
+ argv [argc ++ ] = "criu" ;
726
+ argv [argc ++ ] = "restore" ;
727
+ argv [argc ++ ] = "-D" ;
770
728
argv [argc ++ ] = checkpointDirectory ;
771
- length = snprintf (NULL , 0 , LOG_LEVEL_OPTION_FORMAT , logLevel );
729
+ length = snprintf (NULL , 0 , "-v%d" , logLevel );
772
730
if (length < 0 ) {
773
731
char logLevelString [2 ] = { 0 };
774
732
sprintf (logLevelString , "%d" , logLevel );
775
- JLI_ReportErrorMessage (COMMAND_OPTION_LENGTH_CALCULATION_ERROR_MESSAGE , logLevelString , LOG_LEVEL_OPTION_FORMAT );
776
- restoreStatus = MEMORY_ALLOCATION_ERROR ;
733
+ JLI_ReportErrorMessage ("Failed to calculate the length of the command option, value=%s, format=%s." , logLevelString , "-v%d" );
734
+ restoreStatus = -1 ;
777
735
goto done ;
778
736
}
779
737
logLevelOption = (char * )JLI_MemAlloc (length + 1 );
780
738
if (NULL == logLevelOption ) {
781
739
char logLevelString [2 ] = { 0 };
782
740
sprintf (logLevelString , "%d" , logLevel );
783
- JLI_ReportErrorMessage (COMMAND_OPTION_MEMORY_ALLOCATION_ERROR_MESSAGE , logLevelString , LOG_LEVEL_OPTION_FORMAT );
784
- restoreStatus = MEMORY_ALLOCATION_ERROR ;
741
+ JLI_ReportErrorMessage ("Failed to allocate memory for the command option, value=%s, format=%s." , logLevelString , "-v%d" );
742
+ restoreStatus = -1 ;
785
743
goto done ;
786
744
}
787
- if (snprintf (logLevelOption , length + 1 , LOG_LEVEL_OPTION_FORMAT , logLevel ) < 0 ) {
745
+ if (snprintf (logLevelOption , length + 1 , "-v%d" , logLevel ) < 0 ) {
788
746
char logLevelString [2 ] = { 0 };
789
747
sprintf (logLevelString , "%d" , logLevel );
790
- JLI_ReportErrorMessage (COMMAND_OPTION_MEMORY_ALLOCATION_ERROR_MESSAGE , logLevelString , LOG_LEVEL_OPTION_FORMAT );
791
- restoreStatus = MEMORY_ALLOCATION_ERROR ;
748
+ JLI_ReportErrorMessage ("Failed to allocate memory for the command option, value=%s, format=%s." , logLevelString , "-v%d" );
749
+ restoreStatus = -1 ;
792
750
goto freeLogLevelOption ;
793
751
}
794
752
argv [argc ++ ] = logLevelOption ;
795
- argv [argc ++ ] = CRIU_SHELL_JOB_OPTION ;
753
+ argv [argc ++ ] = "--shell-job" ;
796
754
if (unprivilegedModeOn ) {
797
- argv [argc ++ ] = CRIU_UNPRIVILEGED_MODE_OPTION ;
755
+ argv [argc ++ ] = "--unprivileged" ;
798
756
}
799
757
if (NULL != logFile ) {
800
- length = snprintf (NULL , 0 , LOG_FILE_OPTION_FORMAT , logFile );
758
+ length = snprintf (NULL , 0 , "--log-file=%s" , logFile );
801
759
if (length < 0 ) {
802
- JLI_ReportErrorMessage (COMMAND_OPTION_LENGTH_CALCULATION_ERROR_MESSAGE , logFile , LOG_FILE_OPTION_FORMAT );
803
- restoreStatus = MEMORY_ALLOCATION_ERROR ;
760
+ JLI_ReportErrorMessage ("Failed to calculate the length of the command option, value=%s, format=%s." , logFile , "--log-file=%s" );
761
+ restoreStatus = -1 ;
804
762
goto freeLogLevelOption ;
805
763
}
806
764
logFileOption = (char * )JLI_MemAlloc (length + 1 );
807
765
if (NULL == logFileOption ) {
808
- JLI_ReportErrorMessage (COMMAND_OPTION_MEMORY_ALLOCATION_ERROR_MESSAGE , logFile , LOG_FILE_OPTION_FORMAT );
809
- restoreStatus = MEMORY_ALLOCATION_ERROR ;
766
+ JLI_ReportErrorMessage ("Failed to allocate memory for the command option, value=%s, format=%s." , logFile , "--log-file=%s" );
767
+ restoreStatus = -1 ;
810
768
goto freeLogLevelOption ;
811
769
}
812
- if (snprintf (logFileOption , length + 1 , LOG_FILE_OPTION_FORMAT , logFile ) < 0 ) {
813
- JLI_ReportErrorMessage (COMMAND_OPTION_MEMORY_ALLOCATION_ERROR_MESSAGE , logFile , LOG_FILE_OPTION_FORMAT );
814
- restoreStatus = MEMORY_ALLOCATION_ERROR ;
770
+ if (snprintf (logFileOption , length + 1 , "--log-file=%s" , logFile ) < 0 ) {
771
+ JLI_ReportErrorMessage ("Failed to allocate memory for the command option, value=%s, format=%s." , logFile , "--log-file=%s" );
772
+ restoreStatus = -1 ;
815
773
goto freeLogFileOption ;
816
774
}
817
775
argv [argc ++ ] = logFileOption ;
818
776
}
819
777
argv [argc ] = NULL ;
820
778
execvp (argv [0 ], (char * const * )argv );
821
779
/* If execvp returns, there was an error. */
822
- restoreStatus = EXECVP_ERROR ;
780
+ restoreStatus = -1 ;
823
781
freeLogFileOption :
824
782
if (logFileOption != NULL ) {
825
783
JLI_MemFree ((void * )logFileOption );
@@ -853,11 +811,11 @@ handleCRaCRestore(int argc, char **argv)
853
811
int childProcessPidStatus = 0 ;
854
812
int childProcessPidExitStatus = 0 ;
855
813
checkpointDirectory = getCheckpointDirectory (argc , argv , & error );
856
- if (OPTION_NAME_NOT_FOUND_ERROR == error ) {
814
+ if (-1 == error ) {
857
815
return ;
858
816
}
859
- if (0 ! = error ) {
860
- JLI_ReportErrorMessage (CHECKPOINT_DIRECTORY_ERROR_MESSAGE , error );
817
+ if (-2 = = error ) {
818
+ JLI_ReportErrorMessage ("Failed to get the CRIU checkpoint directory, error=%d." , error );
861
819
parentProcessExitStatus = EXIT_FAILURE ;
862
820
goto doneParentProcess ;
863
821
}
@@ -869,35 +827,35 @@ handleCRaCRestore(int argc, char **argv)
869
827
if (0 == childProcessPid ) {
870
828
logLevel = getLogLevel (argc , argv , & error );
871
829
if (isCommandLineOptionFoundWithError (error )) {
872
- JLI_ReportErrorMessage (LOG_LEVEL_ERROR_MESSAGE , error );
830
+ JLI_ReportErrorMessage ("Failed to get the CRIU log level, error=%d." , error );
873
831
childProcessExitStatus = EXIT_FAILURE ;
874
832
goto doneChildProcess ;
875
833
}
876
834
unprivilegedModeOn = isUnprivilegedModeOn (argc , argv , & error );
877
835
if (isCommandLineOptionFoundWithError (error )) {
878
- JLI_ReportErrorMessage (UNPRIVILEGED_MODE_ERROR_MESSAGE , error );
836
+ JLI_ReportErrorMessage ("Failed to get the CRIU unprivileged mode, error=%d." , error );
879
837
childProcessExitStatus = EXIT_FAILURE ;
880
838
goto doneChildProcess ;
881
839
}
882
840
logFile = getLogFile (argc , argv , & error );
883
841
if (isCommandLineOptionFoundWithError (error )) {
884
- JLI_ReportErrorMessage (LOG_FILE_ERROR_MESSAGE , error );
842
+ JLI_ReportErrorMessage ("Failed to get the CRIU log file, error=%d." , error );
885
843
childProcessExitStatus = EXIT_FAILURE ;
886
844
goto doneChildProcess ;
887
845
}
888
846
childProcessExitStatus = restoreFromCheckpoint (checkpointDirectory , logLevel , unprivilegedModeOn , logFile );
889
847
doneChildProcess :
890
848
exit (childProcessExitStatus );
891
849
} else {
892
- waitpid (childProcessPid , & childProcessPidStatus , WAIT_INDEFINITELY );
850
+ waitpid (childProcessPid , & childProcessPidStatus , 0 );
893
851
if (WIFEXITED (childProcessPidStatus )) {
894
852
childProcessPidExitStatus = WEXITSTATUS (childProcessPidStatus );
895
853
if (EXIT_SUCCESS != childProcessPidExitStatus ) {
896
- JLI_ReportErrorMessage (RESTORE_FROM_CHECKPOINT_ERROR_MESSAGE , childProcessPidExitStatus );
854
+ JLI_ReportErrorMessage ("Failed to restore from checkpoint, error=%d." , childProcessPidExitStatus );
897
855
parentProcessExitStatus = EXIT_FAILURE ;
898
856
}
899
857
} else {
900
- JLI_ReportErrorMessage (RESTORE_CHILD_PROCESS_FAILED_ERROR_MESSAGE );
858
+ JLI_ReportErrorMessage ("The CRIU restore child process failed." );
901
859
parentProcessExitStatus = EXIT_FAILURE ;
902
860
}
903
861
}
0 commit comments