1
1

Merge pull request #1847 from rhc54/topic/updatepmix

Update pmix2x to track upstream changes
Этот коммит содержится в:
rhc54 2016-07-05 12:37:36 -07:00 коммит произвёл GitHub
родитель eac5b3c668 7e0af3f4f0
Коммит b7122963e1
15 изменённых файлов: 238 добавлений и 84 удалений

Просмотреть файл

@ -30,7 +30,7 @@ greek=
# command, or with the date (if "git describe" fails) in the form of
# "date<date>".
repo_rev=git4940b48
repo_rev=git92df386
# If tarball_version is not empty, it is used as the version string in
# the tarball filename, regardless of all other versions listed in
@ -44,7 +44,7 @@ tarball_version=
# The date when this release was created
date="Jun 29, 2016"
date="Jul 05, 2016"
# The shared library version of each of PMIx's public libraries.
# These versions are maintained in accordance with the "Library

Просмотреть файл

@ -2,7 +2,7 @@
#
# Copyright (c) 2009-2015 Cisco Systems, Inc. All rights reserved.
# Copyright (c) 2013 Los Alamos National Security, LLC. All rights reserved.
# Copyright (c) 2013-2015 Intel, Inc. All rights reserved
# Copyright (c) 2013-2016 Intel, Inc. All rights reserved
# $COPYRIGHT$
#
# Additional copyrights may follow

Просмотреть файл

@ -2,7 +2,7 @@
#
# Copyright (c) 2009-2015 Cisco Systems, Inc. All rights reserved.
# Copyright (c) 2013 Los Alamos National Security, LLC. All rights reserved.
# Copyright (c) 2013-2015 Intel, Inc. All rights reserved
# Copyright (c) 2013-2016 Intel, Inc. All rights reserved
# $COPYRIGHT$
#
# Additional copyrights may follow

Просмотреть файл

@ -206,12 +206,12 @@ BEGIN_C_DECLS
#define PMIX_EVENT_CUSTOM_RANGE "pmix.evrange" // (pmix_proc_t*) array of pmix_proc_t defining range of event notification
#define PMIX_EVENT_AFFECTED_PROCS "pmix.evaffected" // (pmix_proc_t*) array of pmix_proc_t defining affected procs
#define PMIX_EVENT_NON_DEFAULT "pmix.evnondef" // (bool) event is not to be delivered to default event handlers
/* fault tolerance-related events */
#define PMIX_EVENT_TERMINATE_SESSION "pmix.evterm.sess" // (bool) RM intends to terminate session
#define PMIX_EVENT_TERMINATE_JOB "pmix.evterm.job" // (bool) RM intends to terminate this job
#define PMIX_EVENT_TERMINATE_NODE "pmix.evterm.node" // (bool) RM intends to terminate all procs on this node
#define PMIX_EVENT_TERMINATE_PROC "pmix.evterm.proc" // (bool) RM intends to terminate just this process
#define PMIX_EVENT_ACTION_TIMEOUT "pmix.evtimeout" // (int) time in sec before RM will execute error response
/* fault tolerance-related events */
#define PMIX_EVENT_TERMINATE_SESSION "pmix.evterm.sess" // (bool) RM intends to terminate session
#define PMIX_EVENT_TERMINATE_JOB "pmix.evterm.job" // (bool) RM intends to terminate this job
#define PMIX_EVENT_TERMINATE_NODE "pmix.evterm.node" // (bool) RM intends to terminate all procs on this node
#define PMIX_EVENT_TERMINATE_PROC "pmix.evterm.proc" // (bool) RM intends to terminate just this process
#define PMIX_EVENT_ACTION_TIMEOUT "pmix.evtimeout" // (int) time in sec before RM will execute error response
/* attributes used to describe "spawn" attributes */
#define PMIX_PERSONALITY "pmix.pers" // (char*) name of personality to use

Просмотреть файл

@ -1,8 +1,6 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2014-2016 Intel, Inc. All rights reserved.
* Copyright (c) 2016 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow

Просмотреть файл

@ -1,7 +1,7 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2014-2016 Intel, Inc. All rights reserved.
* Copyright (c) 2014-2015 Research Organization for Information Science
* Copyright (c) 2014-2016 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2014-2015 Artem Y. Polyakov <artpol84@gmail.com>.
* All rights reserved.
@ -227,7 +227,8 @@ PMIX_EXPORT pmix_status_t PMIx_server_init(pmix_server_module_t *module,
size_t n, m;
pmix_kval_t kv;
pmix_listener_t *lt;
int myhostnamelen = 10;
bool need_listener;
int myhostnamelen = 30;
char myhostname[myhostnamelen];
char *pmix_pid, *tdir;
char **protected = NULL;
@ -291,8 +292,10 @@ PMIX_EXPORT pmix_status_t PMIx_server_init(pmix_server_module_t *module,
pmix_listener_t *tl = PMIX_NEW(pmix_listener_t);
tl -> address.sun_family = AF_UNIX;
tl->protocol = PMIX_PROTOCOL_TOOL;
/* Get up to 10 chars of hostname.*/
/* Get up to 30 chars of hostname.*/
gethostname(myhostname, myhostnamelen);
/* ensure it is NULL terminated */
myhostname[myhostnamelen-1] = '\0';
/* need to put this in the global tmpdir as opposed to
* where the server tmpdir might be */
if (NULL == (tdir = getenv("TMPDIR"))) {
@ -328,8 +331,15 @@ PMIX_EXPORT pmix_status_t PMIx_server_init(pmix_server_module_t *module,
pmix_list_append(&pmix_usock_globals.posted_recvs, &req->super);
/* start listening */
need_listener = false;
PMIX_LIST_FOREACH(lt, &pmix_server_globals.listeners, pmix_listener_t) {
if (PMIX_SUCCESS != pmix_start_listening(lt)) {
if (PMIX_SUCCESS != pmix_prepare_listening(lt, &need_listener)) {
PMIx_server_finalize();
return PMIX_ERR_INIT;
}
}
if (need_listener) {
if (PMIX_SUCCESS != pmix_start_listening()) {
PMIx_server_finalize();
return PMIX_ERR_INIT;
}
@ -2007,6 +2017,7 @@ static void notifyerror_cbfunc (pmix_status_t status, void *cbdata)
PMIX_RELEASE(cd);
}
static void query_cbfunc(pmix_status_t status,
pmix_info_t *info, size_t ninfo,
void *cbdata,

Просмотреть файл

@ -53,6 +53,7 @@
#include "src/util/argv.h"
#include "src/util/error.h"
#include "src/util/fd.h"
#include "src/util/getid.h"
#include "src/util/output.h"
#include "src/util/pmix_environ.h"
#include "src/util/progress_threads.h"
@ -73,7 +74,7 @@ static pthread_t engine;
/*
* start listening on our rendezvous file
*/
pmix_status_t pmix_start_listening(pmix_listener_t *lt)
pmix_status_t pmix_prepare_listening(pmix_listener_t *lt, bool *need_listener)
{
int flags;
pmix_status_t rc;
@ -95,7 +96,6 @@ pmix_status_t pmix_start_listening(pmix_listener_t *lt)
}
addrlen = sizeof(struct sockaddr_un);
if (bind(lt->socket, (struct sockaddr*)address, addrlen) < 0) {
printf("%s:%d bind() failed\n", __FILE__, __LINE__);
@ -137,6 +137,7 @@ pmix_status_t pmix_start_listening(pmix_listener_t *lt)
goto sockerror;
}
if (NULL == myversion) {
/* setup my version for validating connections - we
* only check the major version numbers */
myversion = strdup(PMIX_VERSION);
@ -149,6 +150,7 @@ pmix_status_t pmix_start_listening(pmix_listener_t *lt)
*ptr = '\0';
}
}
}
/* if the server will listen for us, then ask it to do so now */
rc = PMIX_ERR_NOT_SUPPORTED;
@ -157,6 +159,18 @@ pmix_status_t pmix_start_listening(pmix_listener_t *lt)
}
if (PMIX_SUCCESS != rc && !pmix_server_globals.listen_thread_active) {
*need_listener = true;
}
return PMIX_SUCCESS;
sockerror:
(void)close(lt->socket);
lt->socket = -1;
return PMIX_ERROR;
}
pmix_status_t pmix_start_listening(void) {
/*** spawn internal listener thread */
if (0 > pipe(pmix_server_globals.stop_thread)) {
PMIX_ERROR_LOG(PMIX_ERR_IN_ERRNO);
@ -172,20 +186,13 @@ pmix_status_t pmix_start_listening(pmix_listener_t *lt)
return PMIX_ERR_OUT_OF_RESOURCE;
}
/* fork off the listener thread */
pmix_server_globals.listen_thread_active = true;
if (0 > pthread_create(&engine, NULL, listen_thread, NULL)) {
pmix_server_globals.listen_thread_active = false;
return PMIX_ERROR;
} else {
pmix_server_globals.listen_thread_active = true;
}
}
return PMIX_SUCCESS;
sockerror:
(void)close(lt->socket);
lt->socket = -1;
return PMIX_ERROR;
}
void pmix_stop_listening(void)
@ -533,6 +540,8 @@ static pmix_status_t pmix_server_authenticate(pmix_pending_connection_t *pnd,
pmix_peer_t *psave = NULL;
bool found;
pmix_proc_t proc;
uid_t uid;
gid_t gid;
pmix_output_verbose(2, pmix_globals.debug_output,
"RECV CONNECT ACK FROM PEER ON SOCKET %d",
@ -720,9 +729,24 @@ static pmix_status_t pmix_server_authenticate(pmix_pending_connection_t *pnd,
}
}
} else {
/* get the tool socket's uid and gid so we can pass them to
* the host RM for validation */
if (PMIX_SUCCESS != (rc = pmix_util_getid(pnd->sd, &uid, &gid))) {
return rc;
}
/* we pass this info in an array of pmix_info_t structs,
* so set that up here */
pnd->ninfo = 2;
PMIX_INFO_CREATE(pnd->info, pnd->ninfo);
(void)strncpy(pnd->info[0].key, PMIX_USERID, PMIX_MAX_KEYLEN);
pnd->info[0].value.type = PMIX_UINT32;
pnd->info[0].value.data.uint32 = uid;
(void)strncpy(pnd->info[1].key, PMIX_GRPID, PMIX_MAX_KEYLEN);
pnd->info[0].value.type = PMIX_UINT32;
pnd->info[0].value.data.uint32 = gid;
/* request an nspace for this requestor - it will
* automatically be assigned rank=0 */
pmix_host_server.tool_connected(NULL, 0, cnct_cbfunc, pnd);
pmix_host_server.tool_connected(pnd->info, pnd->ninfo, cnct_cbfunc, pnd);
return PMIX_ERR_OPERATION_IN_PROGRESS;
}
return rc;
@ -799,7 +823,6 @@ static void tool_handler(int sd, short flags, void* cbdata)
/* initiate the authentication handshake */
if (PMIX_ERR_OPERATION_IN_PROGRESS != pmix_server_authenticate(pnd, NULL, NULL)) {
pmix_output(0, "SHOOT");
CLOSE_THE_SOCKET(pnd->sd);
PMIX_RELEASE(pnd);
}

17
opal/mca/pmix/pmix2x/pmix/src/server/pmix_server_ops.c Исполняемый файл → Обычный файл
Просмотреть файл

@ -1118,7 +1118,7 @@ pmix_status_t pmix_server_register_events(pmix_peer_t *peer,
}
}
cleanup:
cleanup:
pmix_output_verbose(2, pmix_globals.debug_output,
"server register events: ninfo =%lu rc =%d", ninfo, rc);
/* be sure to execute the callback */
@ -1175,7 +1175,8 @@ void pmix_server_deregister_events(pmix_peer_t *peer,
{
int32_t cnt;
pmix_status_t rc, *codes = NULL, *cdptr, maxcode = PMIX_MAX_ERR_CONSTANT;
size_t ncodes, ncds, n;
pmix_info_t *info = NULL;
size_t ninfo=0, ncodes, ncds, n;
pmix_regevents_info_t *reginfo = NULL;
pmix_regevents_info_t *reginfo_next;
pmix_peer_events_info_t *prev;
@ -1230,11 +1231,13 @@ void pmix_server_deregister_events(pmix_peer_t *peer,
}
}
cleanup:
if (NULL != codes) {
free(codes);
}
if (NULL != info) {
PMIX_INFO_FREE(info, ninfo);
}
return;
}
@ -1384,7 +1387,6 @@ pmix_status_t pmix_server_query(pmix_peer_t *peer,
/***** INSTANCE SERVER LIBRARY CLASSES *****/
static void tcon(pmix_server_trkr_t *t)
{
@ -1520,13 +1522,14 @@ PMIX_CLASS_INSTANCE(pmix_dmdx_local_t,
static void pccon(pmix_pending_connection_t *p)
{
p->msg = NULL;
memset(p->nspace, 0, PMIX_MAX_NSLEN+1);
p->info = NULL;
p->ninfo = 0;
}
static void pcdes(pmix_pending_connection_t *p)
{
if (NULL != p->msg) {
free(p->msg);
if (NULL != p->info) {
PMIX_INFO_FREE(p->info, p->ninfo);
}
}
PMIX_CLASS_INSTANCE(pmix_pending_connection_t,

Просмотреть файл

@ -6,6 +6,8 @@
* Copyright (c) 2015 Mellanox Technologies, Inc.
* All rights reserved.
* Copyright (c) 2016 IBM Corporation. All rights reserved.
* Copyright (c) 2016 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* $COPYRIGHT$
*/
@ -97,7 +99,8 @@ typedef struct {
pmix_listener_protocol_t protocol;
int sd;
char nspace[PMIX_MAX_NSLEN+1];
char *msg;
pmix_info_t *info;
size_t ninfo;
pmix_status_t status;
struct sockaddr_storage addr;
} pmix_pending_connection_t;
@ -212,7 +215,8 @@ PMIX_CLASS_DECLARATION(pmix_usock_queue_t);
event_active(&queue->ev, EV_WRITE, 1); \
} while (0)
pmix_status_t pmix_start_listening(pmix_listener_t *lt);
pmix_status_t pmix_prepare_listening(pmix_listener_t *lt, bool *need_listener);
pmix_status_t pmix_start_listening(void);
void pmix_stop_listening(void);
bool pmix_server_trk_update(pmix_server_trkr_t *trk);
@ -279,15 +283,15 @@ pmix_status_t pmix_server_register_events(pmix_peer_t *peer,
void pmix_server_deregister_events(pmix_peer_t *peer,
pmix_buffer_t *buf);
pmix_status_t pmix_server_event_recvd_from_client(pmix_peer_t *peer,
pmix_buffer_t *buf,
pmix_op_cbfunc_t cbfunc,
void *cbdata);
pmix_status_t pmix_server_query(pmix_peer_t *peer,
pmix_buffer_t *buf,
pmix_info_cbfunc_t cbfunc,
void *cbdata);
pmix_status_t pmix_server_event_recvd_from_client(pmix_peer_t *peer,
pmix_buffer_t *buf,
pmix_op_cbfunc_t cbfunc,
void *cbdata);
void pmix_server_execute_collective(int sd, short args, void *cbdata);
void pmix_server_queue_message(int fd, short args, void *cbdata);

Просмотреть файл

@ -190,12 +190,11 @@ PMIX_EXPORT int PMIx_tool_init(pmix_proc_t *proc,
pmix_status_t rc;
pmix_nspace_t *nptr, *nsptr;
int server_pid = -1;
int hostnamelen = 10;
int hostnamelen = 30;
char hostname[hostnamelen];
DIR *cur_dirp = NULL;
struct dirent * dir_entry;
pmix_output(0, "TOOL INIT");
if (NULL == proc) {
return PMIX_ERR_BAD_PARAM;
}
@ -260,8 +259,10 @@ pmix_output(0, "TOOL INIT");
/* setup the path to the daemon rendezvous point */
memset(&address, 0, sizeof(struct sockaddr_un));
address.sun_family = AF_UNIX;
/* Get first 10 char's of hostname to match what the server is doing */
/* Get hostname to match what the server is doing */
gethostname(hostname, hostnamelen);
/* ensure it is NULL terminated */
hostname[hostnamelen-1] = '\0';
/* if they gave us a specific pid, then look for that
* particular server - otherwise, see if there is only
@ -787,7 +788,6 @@ static pmix_status_t recv_connect_ack(int sd)
if (sockopt) {
if (0 != setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, &save, sz)) {
pmix_output(0, "FAILURE");
return PMIX_ERR_UNREACH;
}
}

Просмотреть файл

@ -227,7 +227,7 @@ void pmix_usock_send_handler(int sd, short flags, void *cbdata)
pmix_output_verbose(2, pmix_globals.debug_output,
"sock:send_handler SENDING TO PEER %s:%d tag %d with %s msg",
peer->info->nptr->nspace, peer->info->rank,
(NULL == msg) ? -1 : msg->hdr.tag,
(NULL == msg) ? UINT_MAX : msg->hdr.tag,
(NULL == msg) ? "NULL" : "NON-NULL");
if (NULL != msg) {
if (!msg->hdr_sent) {

Просмотреть файл

@ -35,7 +35,8 @@ headers += \
src/util/os_path.h \
src/util/basename.h \
src/util/hash.h \
src/util/strnlen.h
src/util/strnlen.h \
src/util/getid.h
sources += \
src/util/argv.c \
@ -49,4 +50,5 @@ sources += \
src/util/timings.c \
src/util/os_path.c \
src/util/basename.c \
src/util/hash.c
src/util/hash.c \
src/util/getid.c

86
opal/mca/pmix/pmix2x/pmix/src/util/getid.c Обычный файл
Просмотреть файл

@ -0,0 +1,86 @@
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2013 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2007 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2015 Intel, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
/*
* Buffer safe printf functions for portability to archaic platforms.
*/
#include <src/include/pmix_config.h>
#include "include/pmix/pmix_common.h"
#include "src/include/pmix_socket_errno.h"
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#include "src/include/pmix_globals.h"
#include "src/util/error.h"
#include "src/util/output.h"
#include "src/util/getid.h"
pmix_status_t pmix_util_getid(int sd, uid_t *uid, gid_t *gid)
{
#if defined(SO_PEERCRED)
#ifdef HAVE_STRUCT_SOCKPEERCRED_UID
#define HAVE_STRUCT_UCRED_UID
struct sockpeercred ucred;
#else
struct ucred ucred;
#endif
socklen_t crlen = sizeof (ucred);
#endif
#if defined(SO_PEERCRED) && (defined(HAVE_STRUCT_UCRED_UID) || defined(HAVE_STRUCT_UCRED_CR_UID))
/* Ignore received 'cred' and validate ucred for socket instead. */
pmix_output_verbose(2, pmix_globals.debug_output,
"getid: checking getsockopt for peer credentials");
if (getsockopt(sd, SOL_SOCKET, SO_PEERCRED, &ucred, &crlen) < 0) {
pmix_output_verbose(2, pmix_globals.debug_output,
"getid: getsockopt SO_PEERCRED failed: %s",
strerror (pmix_socket_errno));
return PMIX_ERR_INVALID_CRED;
}
#if defined(HAVE_STRUCT_UCRED_UID)
*uid = ucred.uid;
*gid = ucred.gid;
#else
*uid = ucred.cr_uid;
*gid = ucred.cr_gid;
#endif
#elif defined(HAVE_GETPEEREID)
pmix_output_verbose(2, pmix_globals.debug_output,
"getid: checking getpeereid for peer credentials");
if (0 != getpeereid(sd, uid, gid)) {
pmix_output_verbose(2, pmix_globals.debug_output,
"getid: getsockopt getpeereid failed: %s",
strerror (pmix_socket_errno));
return PMIX_ERR_INVALID_CRED;
}
#else
return PMIX_ERR_NOT_SUPPORTED;
#endif
return PMIX_SUCCESS;
}

31
opal/mca/pmix/pmix2x/pmix/src/util/getid.h Обычный файл
Просмотреть файл

@ -0,0 +1,31 @@
/*
* Copyright (c) 2016 Intel, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#ifndef PMIX_GETID_H
#define PMIX_GETID_H
#include <src/include/pmix_config.h>
#include "include/pmix/pmix_common.h"
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
BEGIN_C_DECLS
/* lookup the effective uid and gid of a socket */
pmix_status_t pmix_util_getid(int sd, uid_t *uid, gid_t *gid);
END_C_DECLS
#endif /* PMIX_PRINTF_H */

Просмотреть файл

@ -83,7 +83,7 @@ static pmix_status_t disconnect_fn(const pmix_proc_t procs[], size_t nprocs,
static pmix_status_t register_event_fn(pmix_status_t *codes, size_t ncodes,
const pmix_info_t info[], size_t ninfo,
pmix_op_cbfunc_t cbfunc, void *cbdata);
static pmix_status_t deregister_event_fn(pmix_status_t *codes, size_t ncodes,
static pmix_status_t deregister_events(pmix_status_t *codes, size_t ncodes,
pmix_op_cbfunc_t cbfunc, void *cbdata);
static pmix_status_t notify_event(pmix_status_t code,
const pmix_proc_t *source,
@ -112,7 +112,7 @@ static pmix_server_module_t mymodule = {
.connect = connect_fn,
.disconnect = disconnect_fn,
.register_events = register_event_fn,
.deregister_events = deregister_event_fn,
.deregister_events = deregister_events,
.notify_event = notify_event,
.query = query_fn,
.tool_connected = tool_connect_fn
@ -687,13 +687,9 @@ static pmix_status_t register_event_fn(pmix_status_t *codes, size_t ncodes,
return PMIX_SUCCESS;
}
static pmix_status_t deregister_event_fn(pmix_status_t *codes, size_t ncodes,
static pmix_status_t deregister_events(pmix_status_t *codes, size_t ncodes,
pmix_op_cbfunc_t cbfunc, void *cbdata)
{
pmix_output(0, "SERVER: DEREGISTER EVENT");
if (NULL != cbfunc) {
cbfunc(PMIX_SUCCESS, cbdata);
}
return PMIX_SUCCESS;
}