Some deps to Makefile.
Fillup PS and ownerid in jobs.
ps_prefix:=jpps_
SRCS:= conf.c bones_server.c soap_ops.c soap_ps_calls.c \
- ws_ps_typeref.c ws_is_typeref.c db_ops.c context.c \
+ ws_ps_typeref.c ws_is_typeref.c db_ops.c context.c common_server.c \
${is_prefix}ServerLib.c \
${ps_prefix}ClientLib.c ${ps_prefix}C.c \
${is_prefix}ClientLib.c ${is_prefix}Client.c \
${is_prefix}Server.c ${is_prefix}ServerLib.c \
-${is_prefix}C.c ${is_prefix}H.h: JobProvenanceIS.xh
+${is_prefix}C.c ${is_prefix}H.h ${is_prefix}_Stub.h: JobProvenanceIS.xh
${gsoap_bin_prefix}/soapcpp2 -n -w -c -p ${is_prefix} JobProvenanceIS.xh
${ps_prefix}Client.c ${ps_prefix}ClientLib.c \
-${ps_prefix}C.c ${ps_prefix}H.h: JobProvenancePS.xh
+${ps_prefix}C.c ${ps_prefix}H.h ${ps_prefix}_Stub.h: JobProvenancePS.xh
${gsoap_bin_prefix}/soapcpp2 -n -w -c -p ${ps_prefix} JobProvenancePS.xh
#
# startup script for JP index server
#
-# environment:
-# GLITE_JPIS_PS - required JP PrimaryStorage server
-# (for example http://umbar.ics.muni.cz:8901)
-# GLITE_JPIS_PORT - used port (default 8902)
-# GLITE_JPIS_DB - connection string (default jpis/@localhost:jpis1)
-#
GLITE_LOCATION=${GLITE_LOCATION:-/opt/glite}
GLITE_LOCATION_VAR=${GLITE_LOCATION_VAR:-${GLITE_LOCATION}/var}
[ -f $GLITE_LOCATION/etc/jpis.conf ] && . $GLITE_LOCATION/etc/jpis.conf
[ -f $GLITE_LOCATION_VAR/etc/jpis.conf ] && . $GLITE_LOCATION_VAR/etc/jpis.conf
-[ -n "$GLITE_JPIS_SERVER_PIDFILE" ] && pidfile=$GLITE_JPIS_SERVER_PIDFILE ||
- pidfile=$GLITE_LOCATION_VAR/glite-jp-indexd.pid
+[ -n "$GLITE_JPIS_PIDFILE" ] || export GLITE_JPIS_PIDFILE=$GLITE_LOCATION_VAR/glite-jp-indexd.pid
+[ -n "$GLITE_JPIS_LOGFILE" ] || export GLITE_JPIS_LOGFILE=$GLITE_LOCATION_VAR/log/glite-jp-indexd.log
+pidfile="$GLITE_JPIS_PIDFILE"
+logfile="$GLITE_JPIS_LOGFILE"
unset creds port
start()
{
echo -n Starting glite-jp-indexd ...
- $GLITE_LOCATION/bin/glite-jp-indexd > $GLITE_LOCATION_VAR/log/glite-jp-index.log 2>&1 &
+ $GLITE_LOCATION/bin/glite-jp-indexd
echo " done"
}
echo " done"
rm -f $pidfile
else
- killall glite-jp-indexd
-# echo $pidfile does not exist - glite-jp-indexd not running? >&2
+ echo $pidfile does not exist - glite-jp-indexd not running? >&2
+ return 1
fi
echo done
}
echo glite-jp-indexd running as $pid
return 0
fi
- else
- ps xa | grep "glite-jp-indexd" > /dev/null
- if [ "$?" = 0 ]; then
- echo glite-jp-indexd running
- return 0
- fi
fi
echo glite-jp-indexd not running
GLITE_JPIS_DB - database connection string (default jpis/@localhost:jpis1)
+GLITE_JPIS_LOGFILE - log file
+
+GLITE_JPIS_PIDFILE - pid file
+
+GLITE_JPIS_DEBUG - don't daemonize
Other parameters will be configurable in close future. Its
current hard-coded values are in org.glite.jp.index/src/conf.[ch]
#include "db_ops.h"
#include "soap_ps_calls.h"
#include "context.h"
+#include "common_server.h"
#include "soap_version.h"
#include "jpis_H.h"
return 1;
}
+ /* daemonize */
+ if (!conf->debug) glite_jpis_daemonize("glite-jp-indexd", conf->pidfile, conf->logfile);
+
/* XXX preliminary support for plugins
for (i=0; conf->plugins[i]; i++)
glite_jp_typeplugin_load(ctx,conf->plugins[i]);
fprintf(stderr,"Server idenity: %s\n",mysubj);
else fputs("WARNING: Running unauthenticated\n",stderr);
- /* daemonise */
-
/* XXX: uncomment after testing phase
for (i=0; conf->PS_list[i]; i++); // count PS we need to contact
i += USER_QUERY_SLAVES_NUM; // add some slaves for user queries
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
+#include <stdarg.h>
#include <glite/jp/types.h>
#include <glite/jp/context.h>
int glite_jp_get_conf(int argc, char **argv, char *config_file, glite_jp_is_conf **configuration)
-{
+{
+ char *debug;
char *ps = NULL;
// read comman line options and configuration file
// configuration from environment
conf->cs = getenv("GLITE_JPIS_DB");
conf->port = getenv("GLITE_JPIS_PORT");
+ debug = getenv("GLITE_JPIS_DEBUG");
+ conf->debug = (debug != NULL) && (strcmp(debug, "0") != 0);
+ conf->pidfile = getenv("GLITE_JPIS_PIDFILE");
+ conf->logfile = getenv("GLITE_JPIS_LOGFILE");
// prefixes & attributes defined in:
// lb.server/build/jp_job_attrs.h (created when build plugin)
free(conf->feeds);
free(conf);
}
+
+
+void glite_jp_lprintf(const char *source, const char *fmt, ...) {
+ va_list ap;
+
+ printf("%s: ", source);
+ va_start(ap, fmt);
+ vprintf(fmt, ap);
+ va_end(ap);
+}
#define GLITE_JPIS_DEFAULT_PORT_STR "8902"
//#define lprintf
-#define lprintf printf
+#define lprintf(args...) glite_jp_lprintf(__FUNCTION__, ##args)
typedef struct _glite_jp_is_feed {
char *PS_URL; //URLs of Primary Storage servers
glite_jp_is_feed **feeds; // null terminated list of feeds
- char *cs, *port;
+ int debug;
+ char *cs, *port, *pidfile, *logfile;
} glite_jp_is_conf;
int glite_jp_get_conf(int argc, char **argv, char *config_file, glite_jp_is_conf **configuration);
void glite_jp_free_conf(glite_jp_is_conf *conf);
+void glite_jp_lprintf(const char *source, const char *fmt, ...);
+
#endif
// sql command: get info about the feed (via feedid)
glite_jp_db_create_params(&myparam, 1, GLITE_JP_DB_TYPE_CHAR, isctx->param_feedid, &isctx->param_feedid_len);
- glite_jp_db_create_results(&myres, 2,
+ glite_jp_db_create_results(&myres, 3,
GLITE_JP_DB_TYPE_INT, NULL, &isctx->param_uniqueid,
- GLITE_JP_DB_TYPE_INT, NULL, &isctx->param_state);
- if ((ret = glite_jp_db_prepare(jpctx, "SELECT uniqueid, state FROM feeds WHERE (feedid=?)", &isctx->select_info_feed_stmt, myparam, myres)) != 0) goto fail;
+ GLITE_JP_DB_TYPE_INT, NULL, &isctx->param_state,
+ GLITE_JP_DB_TYPE_VARCHAR, NULL, isctx->param_ps, sizeof(isctx->param_ps), &isctx->param_ps_len);
+ if ((ret = glite_jp_db_prepare(jpctx, "SELECT uniqueid, state, source FROM feeds WHERE (feedid=?)", &isctx->select_info_feed_stmt, myparam, myres)) != 0) goto fail;
// sql command: update state of the feed (via uniqueid)
glite_jp_db_create_params(&myparam, 2,
free(table);
free(value);
free(full_value);
- lprintf("%s(%s): sql=%s\n", __FUNCTION__, av->name, sql);
+ lprintf("(%s) sql=%s\n", av->name, sql);
if (glite_jp_db_execstmt(ctx->jpctx, sql, NULL) != 1) {
free(sql);
return ctx->jpctx->error->code;
}
-int glite_jpis_lazyInsertJob(glite_jpis_context_t ctx, const char *feedid, const char *jobid, const char *owner) {
+int glite_jpis_lazyInsertJob(glite_jpis_context_t ctx, const char *ps, const char *jobid, const char *owner) {
int ret;
char *md5_jobid = NULL, *md5_cert = NULL;
- lprintf("%s\n", __FUNCTION__);
+ lprintf("\n");
md5_jobid = str2md5(jobid);
+ md5_cert = str2md5(owner);
GLITE_JPIS_PARAM(ctx->param_jobid, ctx->param_jobid_len, md5_jobid);
-
switch (ret = glite_jp_db_execute(ctx->select_jobid_stmt)) {
case 1: lprintf("jobid '%s' found\n", jobid); goto ok0;
case 0:
- lprintf("%s:inserting jobid %s (%s)\n", __FUNCTION__, jobid, md5_jobid);
+ lprintf("inserting jobid %s (%s)\n", jobid, md5_jobid);
+
GLITE_JPIS_PARAM(ctx->param_dg_jobid, ctx->param_dg_jobid_len, jobid);
- GLITE_JPIS_PARAM(ctx->param_feedid, ctx->param_feedid_len, feedid);
+ GLITE_JPIS_PARAM(ctx->param_ownerid, ctx->param_ownerid_len, md5_cert);
+ GLITE_JPIS_PARAM(ctx->param_ps, ctx->param_ps_len, ps);
if (glite_jp_db_execute(ctx->insert_job_stmt) != 1) goto fail;
break;
default: assert(ret != 1); break;
}
ok0:
- md5_cert = str2md5(owner);
GLITE_JPIS_PARAM(ctx->param_ownerid, ctx->param_ownerid_len, md5_cert);
-
switch (ret = glite_jp_db_execute(ctx->select_user_stmt)) {
- case 1: lprintf("%s:jobid '%s' found\n", __FUNCTION__, jobid); goto ok;
+ case 1: lprintf("jobid '%s' found\n", jobid); goto ok;
case 0:
- lprintf("%s:inserting user %s (%s)\n", __FUNCTION__, owner, md5_cert);
+ lprintf("inserting user %s (%s)\n", owner, md5_cert);
GLITE_JPIS_PARAM(ctx->param_cert, ctx->param_cert_len, owner);
if (glite_jp_db_execute(ctx->insert_user_stmt) != 1) goto fail;
break;
int glite_jpis_insertAttrVal(glite_jpis_context_t ctx, const char *jobid, glite_jp_attrval_t *av);
-int glite_jpis_lazyInsertJob(glite_jpis_context_t ctx, const char *feedid, const char *jobid, const char *owner);
+int glite_jpis_lazyInsertJob(glite_jpis_context_t ctx, const char *ps, const char *jobid, const char *owner);
#endif
#define CONTEXT_FROM_SOAP(soap,ctx) glite_jpis_context_t ctx = (glite_jpis_context_t) ((slave_data_t *) (soap->user))->ctx
-static int updateJob(glite_jpis_context_t ctx, const char *feedid, struct jptype__jobRecord *jobAttrs) {
+static int updateJob(glite_jpis_context_t ctx, const char *ps, struct jptype__jobRecord *jobAttrs) {
glite_jp_attrval_t av;
struct jptype__attrValue *attr;
int ret, iattrs;
- lprintf("%s: jobid='%s', attrs=%d\n", __FUNCTION__, jobAttrs->jobid, jobAttrs->__sizeattributes);
+ lprintf("jobid='%s', attrs=%d\n", jobAttrs->jobid, jobAttrs->__sizeattributes);
if (jobAttrs->remove) assert(*(jobAttrs->remove) == 0);
- if ((ret = glite_jpis_lazyInsertJob(ctx, feedid, jobAttrs->jobid, jobAttrs->owner)) != 0) return ret;
+ if ((ret = glite_jpis_lazyInsertJob(ctx, ps, jobAttrs->jobid, jobAttrs->owner)) != 0) return ret;
for (iattrs = 0; iattrs < jobAttrs->__sizeattributes; iattrs++) {
attr = jobAttrs->attributes[iattrs];
glite_jpis_SoapToAttrVal(&av, attr);
struct _jpelem__UpdateJobsResponse *jpelem__UpdateJobsResponse)
{
int ret, ijobs;
- const char *feedid;
+ const char *feedid, *ps;
int status, done;
CONTEXT_FROM_SOAP(soap, ctx);
glite_jp_context_t jpctx = ctx->jpctx;
// XXX: test client in examples/jpis-test
// sends to this function some data for testing
puts(__FUNCTION__);
+ ps = NULL;
// get info about the feed
feedid = jpelem__UpdateJobs->feedId;
fprintf(stderr, "can't get info about '%s', returned %d records: %s (%s)\n", feedid, ret, jpctx->error->desc, jpctx->error->source);
goto fail;
}
+ ps = strdup(ctx->param_ps);
// update status, if needed (only oring)
status = ctx->param_state;
done = jpelem__UpdateJobs->feedDone ? GLITE_JP_IS_STATE_DONE : 0;
// insert all attributes
for (ijobs = 0; ijobs < jpelem__UpdateJobs->__sizejobAttributes; ijobs++) {
- if (updateJob(ctx, feedid, jpelem__UpdateJobs->jobAttributes[ijobs]) != 0) goto fail;
+ if (updateJob(ctx, ps, jpelem__UpdateJobs->jobAttributes[ijobs]) != 0) goto fail;
}
+ free(ps);
return SOAP_OK;
fail:
+ free(ps);
// TODO: bubble up
err = glite_jp_error_chain(ctx->jpctx);
fprintf(stderr, "%s:%s\n", __FUNCTION__, err);