@@ -68,6 +68,7 @@ opal_process_name_t pmix_name_invalid = {UINT32_MAX, UINT32_MAX};
68
68
* infrastructure that manages its structure (e.g., OpenPMIx). If we setup this
69
69
* session directory structure, then we shall cleanup after ourselves.
70
70
*/
71
+ static bool destroy_top_session_dir = false;
71
72
static bool destroy_job_session_dir = false;
72
73
static bool destroy_proc_session_dir = false;
73
74
@@ -983,22 +984,25 @@ int ompi_rte_finalize(void)
983
984
{
984
985
985
986
/* cleanup the session directory we created */
987
+ if (NULL != opal_process_info .top_session_dir && destroy_top_session_dir ) {
988
+ opal_os_dirpath_destroy (opal_process_info .top_session_dir ,
989
+ true, check_file );
990
+ free (opal_process_info .top_session_dir );
991
+ opal_process_info .top_session_dir = NULL ;
992
+ destroy_top_session_dir = false;
993
+ }
994
+
986
995
if (NULL != opal_process_info .job_session_dir && destroy_job_session_dir ) {
987
996
opal_os_dirpath_destroy (opal_process_info .job_session_dir ,
988
- false , check_file );
997
+ true , check_file );
989
998
free (opal_process_info .job_session_dir );
990
999
opal_process_info .job_session_dir = NULL ;
991
1000
destroy_job_session_dir = false;
992
1001
}
993
1002
994
- if (NULL != opal_process_info .top_session_dir ) {
995
- free (opal_process_info .top_session_dir );
996
- opal_process_info .top_session_dir = NULL ;
997
- }
998
-
999
1003
if (NULL != opal_process_info .proc_session_dir && destroy_proc_session_dir ) {
1000
1004
opal_os_dirpath_destroy (opal_process_info .proc_session_dir ,
1001
- false , check_file );
1005
+ true , check_file );
1002
1006
free (opal_process_info .proc_session_dir );
1003
1007
opal_process_info .proc_session_dir = NULL ;
1004
1008
destroy_proc_session_dir = false;
@@ -1165,27 +1169,45 @@ void ompi_rte_wait_for_debugger(void)
1165
1169
1166
1170
static int _setup_top_session_dir (char * * sdir )
1167
1171
{
1172
+ /*
1173
+ * Use a session directory structure similar to prrte (create only one
1174
+ * directory for the top session) so that it can be cleaned up correctly
1175
+ * when terminated.
1176
+ */
1168
1177
char * tmpdir ;
1178
+ int rc ;
1179
+ uid_t uid = geteuid ();
1180
+ pid_t pid = getpid ();
1169
1181
1170
1182
if ( NULL == (tmpdir = getenv ("TMPDIR" )) )
1171
1183
if ( NULL == (tmpdir = getenv ("TEMP" )) )
1172
1184
if ( NULL == (tmpdir = getenv ("TMP" )) )
1173
1185
tmpdir = "/tmp" ;
1174
1186
1175
- * sdir = strdup (tmpdir );
1187
+ if (0 > opal_asprintf (sdir , "%s/%s.%s.%lu.%lu" ,
1188
+ tmpdir , "ompi" ,
1189
+ opal_process_info .nodename ,
1190
+ (unsigned long )pid , (unsigned long ) uid )) {
1191
+ opal_process_info .top_session_dir = NULL ;
1192
+ return OPAL_ERR_OUT_OF_RESOURCE ;
1193
+ }
1194
+ rc = opal_os_dirpath_create (opal_process_info .top_session_dir , 0755 );
1195
+ if (OPAL_SUCCESS != rc ) {
1196
+ // could not create top session dir
1197
+ free (opal_process_info .top_session_dir );
1198
+ opal_process_info .top_session_dir = NULL ;
1199
+ return rc ;
1200
+ }
1201
+ destroy_top_session_dir = true;
1176
1202
return OPAL_SUCCESS ;
1177
1203
}
1178
1204
1179
1205
static int _setup_job_session_dir (char * * sdir )
1180
1206
{
1181
1207
int rc ;
1182
- /* get the effective uid */
1183
- uid_t uid = geteuid ();
1184
1208
1185
- if (0 > opal_asprintf (sdir , "%s/ompi.%s.%lu/jf.0/ %u" ,
1209
+ if (0 > opal_asprintf (sdir , "%s/%u" ,
1186
1210
opal_process_info .top_session_dir ,
1187
- opal_process_info .nodename ,
1188
- (unsigned long )uid ,
1189
1211
opal_process_info .my_name .jobid )) {
1190
1212
opal_process_info .job_session_dir = NULL ;
1191
1213
return OPAL_ERR_OUT_OF_RESOURCE ;
0 commit comments