/* $Id$ */
/*
* FedStage DRMAA for PBS Pro
* Copyright (C) 2006-2007 FedStage Systems
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#ifdef HAVE_CONFIG_H
# include
#endif
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
static char* pbsdrmaa_pbs_submit( pbsdrmaa_pbs_conn_t *self, struct attropl *attrib, char *script, char *destination );
static struct batch_status* pbsdrmaa_pbs_statjob( pbsdrmaa_pbs_conn_t *self, char *job_id, struct attrl *attrib );
static void pbsdrmaa_pbs_statjob_free( pbsdrmaa_pbs_conn_t *self, struct batch_status* job_status );
static void pbsdrmaa_pbs_sigjob( pbsdrmaa_pbs_conn_t *self, char *job_id, char *signal );
static void pbsdrmaa_pbs_deljob( pbsdrmaa_pbs_conn_t *self, char *job_id );
static void pbsdrmaa_pbs_rlsjob( pbsdrmaa_pbs_conn_t *self, char *job_id );
static void pbsdrmaa_pbs_holdjob( pbsdrmaa_pbs_conn_t *self, char *job_id );
static void pbsdrmaa_pbs_reconnect_internal( pbsdrmaa_pbs_conn_t *self, bool reconnect);
pbsdrmaa_pbs_conn_t *
pbsdrmaa_pbs_conn_new( pbsdrmaa_session_t *session, char *server )
{
pbsdrmaa_pbs_conn_t *volatile self = NULL;
fsd_log_enter((""));
TRY
{
fsd_malloc(self, pbsdrmaa_pbs_conn_t );
self->session = session;
self->submit = pbsdrmaa_pbs_submit;
self->statjob = pbsdrmaa_pbs_statjob;
self->statjob_free = pbsdrmaa_pbs_statjob_free;
self->sigjob = pbsdrmaa_pbs_sigjob;
self->deljob = pbsdrmaa_pbs_deljob;
self->rlsjob = pbsdrmaa_pbs_rlsjob;
self->holdjob = pbsdrmaa_pbs_holdjob;
self->server = fsd_strdup(server);
self->connection_fd = -1;
self->last_usage = time(NULL);
/*ignore SIGPIPE - otheriwse pbs_disconnect cause the program to exit */
signal(SIGPIPE, SIG_IGN);
pbsdrmaa_pbs_reconnect_internal(self, false);
}
EXCEPT_DEFAULT
{
if( self != NULL)
{
fsd_free(self->server);
fsd_free(self);
if (self->connection_fd != -1)
pbs_disconnect(self->connection_fd);
}
fsd_exc_reraise();
}
END_TRY
fsd_log_return((""));
return self;
}
void
pbsdrmaa_pbs_conn_destroy ( pbsdrmaa_pbs_conn_t * self )
{
fsd_log_enter((""));
TRY
{
if(self != NULL)
{
fsd_free(self->server);
fsd_free(self);
if (self->connection_fd != -1)
pbs_disconnect(self->connection_fd);
}
}
EXCEPT_DEFAULT
{
fsd_exc_reraise();
}
END_TRY
fsd_log_return((""));
}
char*
pbsdrmaa_pbs_submit( pbsdrmaa_pbs_conn_t *self, struct attropl *attrib, char *script, char *destination )
{
}
struct batch_status*
pbsdrmaa_pbs_statjob( pbsdrmaa_pbs_conn_t *self, char *job_id, struct attrl *attrib )
{
}
void
pbsdrmaa_pbs_statjob_free( pbsdrmaa_pbs_conn_t *self, struct batch_status* job_status )
{
}
void
pbsdrmaa_pbs_sigjob( pbsdrmaa_pbs_conn_t *self, char *job_id, char *signal )
{
}
void
pbsdrmaa_pbs_deljob( pbsdrmaa_pbs_conn_t *self, char *job_id )
{
}
void
pbsdrmaa_pbs_rlsjob( pbsdrmaa_pbs_conn_t *self, char *job_id )
{
}
void
pbsdrmaa_pbs_holdjob( pbsdrmaa_pbs_conn_t *self, char *job_id )
{
}
void
pbsdrmaa_pbs_reconnect_internal( pbsdrmaa_pbs_conn_t *self, bool force_reconnect)
{
int tries_left = self->session->max_retries_count;
int sleep_time = 1;
fsd_log_enter(("(%d)", self->connection_fd));
if ( self->connection_fd != -1 )
{
if (!force_reconnect)
{
fsd_log_return(("(%d)", self->connection_fd));
return;
}
else
{
pbs_disconnect(self->connection_fd);
self->connection_fd = -1;
}
}
retry_connect: /* Life... */
self->connection_fd = pbs_connect( self->server );
fsd_log_info(( "pbs_connect(%s) =%d", self->server, self->connection_fd ));
if( self->connection_fd < 0 && tries_left-- )
{
sleep(sleep_time);
sleep_time *=2;
goto retry_connect;
}
if( self->connection_fd < 0 )
pbsdrmaa_exc_raise_pbs( "pbs_connect" );
fsd_log_return(("(%d)", self->connection_fd));
}