From 138f80b52ccca18bb5ffbb6bdd74f8e3c941c610 Mon Sep 17 00:00:00 2001 From: cvs2svn Date: Mon, 28 Jan 2008 09:14:42 +0000 Subject: [PATCH] This commit was manufactured by cvs2svn to create tag 'merge_313_3_after'. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Sprout from lb_transactions_only 2008-01-28 09:14:41 UTC cvs2svn 'This commit was manufactured by cvs2svn to create branch' Cherrypick from master 2008-01-09 15:36:19 UTC MiloÅ¡ Mulač 'merge from branch_RC31_3 (merge_313_3_src - merge_313_2_src)': org.glite.lb.common/src/query_rec.c org.glite.lb.logger/src/queue_thread.c org.glite.lb.server/src/db_store.c org.glite.lb.server/src/jobstat.c org.glite.lb.server/src/lb_authz.c org.glite.lb.server/src/query.c org.glite.lb.server/src/store.c.T org.glite.lbjp-common.db/examples/db_expire.c org.glite.lbjp-common.db/examples/db_test.c org.glite.lbjp-common.db/src/db.c org.glite.security.gss/src/glite_gss.c Cherrypick from master 2008-01-11 16:23:47 UTC Daniel Kouřil 'merge from branch_RC31_3': org.glite.security.gss/interface/glite_gss.h Delete: org.glite.lb.doc/GGUS19469-reply.txt org.glite.lb.doc/LICENSE org.glite.lb.doc/Makefile org.glite.lb.doc/src/LBAG-Configuration.tex org.glite.lb.doc/src/LBAG-Installation.tex org.glite.lb.doc/src/LBAG-Introduction.tex org.glite.lb.doc/src/LBAG-Running.tex org.glite.lb.doc/src/LBAG-Troubleshooting.tex org.glite.lb.doc/src/LBAG.tex org.glite.lb.doc/src/LBDG-Common.tex org.glite.lb.doc/src/LBDG-Introduction.tex org.glite.lb.doc/src/LBDG.tex org.glite.lb.doc/src/LBUG-Appendix.tex org.glite.lb.doc/src/LBUG-Introduction.tex org.glite.lb.doc/src/LBUG-ReferenceGuide.tex org.glite.lb.doc/src/LBUG-Tools.tex org.glite.lb.doc/src/LBUG-UseCases.tex org.glite.lb.doc/src/LBUG.tex org.glite.lb.doc/src/README org.glite.lb.doc/src/change_acl.tex org.glite.lb.doc/src/components.tex org.glite.lb.doc/src/consumer_api.tex org.glite.lb.doc/src/copyright.tex org.glite.lb.doc/src/definitions.tex org.glite.lb.doc/src/doxygen.sty org.glite.lb.doc/src/doxyhack.tex org.glite.lb.doc/src/egee.cls org.glite.lb.doc/src/events.tex.T org.glite.lb.doc/src/frontmatter.tex org.glite.lb.doc/src/images/LB-components-gather.pdf org.glite.lb.doc/src/images/LB-components-query.pdf org.glite.lb.doc/src/images/egee.pdf org.glite.lb.doc/src/images/isi.pdf org.glite.lb.doc/src/images/seqtree.pdf org.glite.lb.doc/src/images/wms2-jobstat.pdf org.glite.lb.doc/src/lbjp.bib org.glite.lb.doc/src/log_usertag.tex org.glite.lb.doc/src/logevent.tex org.glite.lb.doc/src/notification_api.tex org.glite.lb.doc/src/producer_api.tex org.glite.lb.doc/src/status.tex.T org.glite.lb.doc/src/web_services.tex --- org.glite.lb.common/src/query_rec.c | 2 +- org.glite.lb.doc/GGUS19469-reply.txt | 145 ---- org.glite.lb.doc/LICENSE | 69 -- org.glite.lb.doc/Makefile | 58 -- org.glite.lb.doc/src/LBAG-Configuration.tex | 5 - org.glite.lb.doc/src/LBAG-Installation.tex | 46 -- org.glite.lb.doc/src/LBAG-Introduction.tex | 37 - org.glite.lb.doc/src/LBAG-Running.tex | 27 - org.glite.lb.doc/src/LBAG-Troubleshooting.tex | 6 - org.glite.lb.doc/src/LBAG.tex | 46 -- org.glite.lb.doc/src/LBDG-Common.tex | 2 - org.glite.lb.doc/src/LBDG-Introduction.tex | 2 - org.glite.lb.doc/src/LBDG.tex | 47 -- org.glite.lb.doc/src/LBUG-Appendix.tex | 17 - org.glite.lb.doc/src/LBUG-Introduction.tex | 890 --------------------- org.glite.lb.doc/src/LBUG-ReferenceGuide.tex | 31 - org.glite.lb.doc/src/LBUG-Tools.tex | 9 - org.glite.lb.doc/src/LBUG-UseCases.tex | 10 - org.glite.lb.doc/src/LBUG.tex | 44 - org.glite.lb.doc/src/README | 12 - org.glite.lb.doc/src/change_acl.tex | 75 -- org.glite.lb.doc/src/components.tex | 124 --- org.glite.lb.doc/src/consumer_api.tex | 810 ------------------- org.glite.lb.doc/src/copyright.tex | 24 - org.glite.lb.doc/src/definitions.tex | 17 - org.glite.lb.doc/src/doxygen.sty | 64 -- org.glite.lb.doc/src/doxyhack.tex | 31 - org.glite.lb.doc/src/egee.cls | 504 ------------ org.glite.lb.doc/src/events.tex.T | 31 - org.glite.lb.doc/src/frontmatter.tex | 40 - .../src/images/LB-components-gather.pdf | Bin 48193 -> 0 bytes .../src/images/LB-components-query.pdf | Bin 47744 -> 0 bytes org.glite.lb.doc/src/images/egee.pdf | Bin 8922 -> 0 bytes org.glite.lb.doc/src/images/isi.pdf | Bin 19672 -> 0 bytes org.glite.lb.doc/src/images/seqtree.pdf | Bin 5715 -> 0 bytes org.glite.lb.doc/src/images/wms2-jobstat.pdf | Bin 7328 -> 0 bytes org.glite.lb.doc/src/lbjp.bib | 709 ---------------- org.glite.lb.doc/src/log_usertag.tex | 71 -- org.glite.lb.doc/src/logevent.tex | 69 -- org.glite.lb.doc/src/notification_api.tex | 128 --- org.glite.lb.doc/src/producer_api.tex | 3 - org.glite.lb.doc/src/status.tex.T | 17 - org.glite.lb.doc/src/web_services.tex | 22 - org.glite.lb.logger/src/queue_thread.c | 2 +- org.glite.lb.server/src/db_store.c | 2 - org.glite.lb.server/src/jobstat.c | 7 +- org.glite.lb.server/src/lb_authz.c | 4 +- org.glite.lb.server/src/query.c | 7 +- org.glite.lb.server/src/store.c.T | 8 +- org.glite.lbjp-common.db/examples/db_expire.c | 49 +- org.glite.lbjp-common.db/examples/db_test.c | 5 +- org.glite.lbjp-common.db/src/db.c | 67 +- org.glite.security.gss/interface/glite_gss.h | 1 + org.glite.security.gss/src/glite_gss.c | 1 - 54 files changed, 45 insertions(+), 4352 deletions(-) delete mode 100644 org.glite.lb.doc/GGUS19469-reply.txt delete mode 100644 org.glite.lb.doc/LICENSE delete mode 100644 org.glite.lb.doc/Makefile delete mode 100644 org.glite.lb.doc/src/LBAG-Configuration.tex delete mode 100644 org.glite.lb.doc/src/LBAG-Installation.tex delete mode 100644 org.glite.lb.doc/src/LBAG-Introduction.tex delete mode 100644 org.glite.lb.doc/src/LBAG-Running.tex delete mode 100644 org.glite.lb.doc/src/LBAG-Troubleshooting.tex delete mode 100644 org.glite.lb.doc/src/LBAG.tex delete mode 100644 org.glite.lb.doc/src/LBDG-Common.tex delete mode 100644 org.glite.lb.doc/src/LBDG-Introduction.tex delete mode 100644 org.glite.lb.doc/src/LBDG.tex delete mode 100644 org.glite.lb.doc/src/LBUG-Appendix.tex delete mode 100644 org.glite.lb.doc/src/LBUG-Introduction.tex delete mode 100644 org.glite.lb.doc/src/LBUG-ReferenceGuide.tex delete mode 100644 org.glite.lb.doc/src/LBUG-Tools.tex delete mode 100644 org.glite.lb.doc/src/LBUG-UseCases.tex delete mode 100644 org.glite.lb.doc/src/LBUG.tex delete mode 100644 org.glite.lb.doc/src/README delete mode 100644 org.glite.lb.doc/src/change_acl.tex delete mode 100644 org.glite.lb.doc/src/components.tex delete mode 100644 org.glite.lb.doc/src/consumer_api.tex delete mode 100644 org.glite.lb.doc/src/copyright.tex delete mode 100644 org.glite.lb.doc/src/definitions.tex delete mode 100644 org.glite.lb.doc/src/doxygen.sty delete mode 100644 org.glite.lb.doc/src/doxyhack.tex delete mode 100644 org.glite.lb.doc/src/egee.cls delete mode 100644 org.glite.lb.doc/src/events.tex.T delete mode 100644 org.glite.lb.doc/src/frontmatter.tex delete mode 100644 org.glite.lb.doc/src/images/LB-components-gather.pdf delete mode 100644 org.glite.lb.doc/src/images/LB-components-query.pdf delete mode 100644 org.glite.lb.doc/src/images/egee.pdf delete mode 100644 org.glite.lb.doc/src/images/isi.pdf delete mode 100644 org.glite.lb.doc/src/images/seqtree.pdf delete mode 100644 org.glite.lb.doc/src/images/wms2-jobstat.pdf delete mode 100644 org.glite.lb.doc/src/lbjp.bib delete mode 100644 org.glite.lb.doc/src/log_usertag.tex delete mode 100644 org.glite.lb.doc/src/logevent.tex delete mode 100644 org.glite.lb.doc/src/notification_api.tex delete mode 100644 org.glite.lb.doc/src/producer_api.tex delete mode 100644 org.glite.lb.doc/src/status.tex.T delete mode 100644 org.glite.lb.doc/src/web_services.tex diff --git a/org.glite.lb.common/src/query_rec.c b/org.glite.lb.common/src/query_rec.c index 6c274ad..8e52b92 100644 --- a/org.glite.lb.common/src/query_rec.c +++ b/org.glite.lb.common/src/query_rec.c @@ -32,7 +32,7 @@ void edg_wll_QueryRecFree(edg_wll_QueryRec *prec) break; case EDG_WLL_QUERY_ATTR_JOBID: case EDG_WLL_QUERY_ATTR_PARENT: - edg_wlc_JobIdFree((glite_jobid_t) prec->value.j); + edg_wlc_JobIdFree(prec->value.j); break; case EDG_WLL_QUERY_ATTR_STATUS: case EDG_WLL_QUERY_ATTR_DONECODE: diff --git a/org.glite.lb.doc/GGUS19469-reply.txt b/org.glite.lb.doc/GGUS19469-reply.txt deleted file mode 100644 index f56e8cf..0000000 --- a/org.glite.lb.doc/GGUS19469-reply.txt +++ /dev/null @@ -1,145 +0,0 @@ -We are really sorry that it took us so long to reply to this GGUS -ticket, however we took all the comments and suggestions really -seriously and during the gLite restructuring we made all the required -changes and among others we now have a completely new documentation both -for Logging and Bookkeeping (LB) and Job Provenance (JP). - -We attach our comments inline to your initial review/request: - -> The available 'Logging and Bookkeeping User and Reference Guide' has -> several problems: -> -> General remarks : the link from the general glite doc page -> (http://glite.web.cern.ch/glite/documentation/default.asp) links to -> https://edms.cern.ch/file/571273/1/LB-guide.pdf while EDMS proposes -> https://edms.cern.ch/file/571273/2/LB-guide.pdf However both documents -> seem to be the same (even so says diff on the pdf files). Now the most -> surprising thing is that the proposed document is still a DRAFT dating -> almost 1.5 years now. Isn't that more than enough time to publish a -> final document? - -The LB documentation has been changed completely. It is now part of the -org.glite.lb.doc module and it contains three major documents: -- LB User's Guide (LBUG) -- LB Adminstrator's Guide (LBAG) -- LB Developer's Guide (LBDG) - -TODO: the official web location for these documents is now... and links -to these documents were updated on all the following webs: -http://egee.cesnet.cz/en/JRA1 -http://glite.web.cern.ch/glite/documentation/default.asp -https://edms.cern.ch/document/571273/2 -http://egee-jra1-wm.mi.infn.it/egee-jra1-wm - -TODO: The same holds also for the JP documentation that is now part of -the org.glite.jp.doc module. - -> At last, the guide mentions example code (quote from p. 14 : "You can -> found this example in client module, file job_status.c."). I found an -> 'examples' dir in the glite-lb-client package, however it does not -> contain C source code but rather useless executable files!! - -The source code of all the examples is now also included in the -glite-lb-client (RPM) together with a simple Makefile so that users -can make the examples on their machines. - -> I skip the "Introduction" section. -> -> 2/ Quickstart Guide -> 2.1/ Command Line Tools -> quite OK but is missing the (C) type of the values that can be given -> to a user tag: only a string or is an integer value possible? This has -> it's importance in the following. - -TODO: log_usertag.tex - -> I think the documentation misses a description of the equivalent API. -> At least some part of the code of the CLI interface should be -> available, as in a job this duty is probably better done by the code -> itself than by some external command. - -TODO: glite-lb-logevent is now in details described in LBUG, section -2.1, and the use-case of using this tool to log the user-tag is -described in the LBUG 3.1. The logging API is in details described in -LBDG together with the programming examples. - - -> 2.2/ L&B querying API -> General remarks: -> when compiling, of course header files and libraries are required. Why -> not indicate them ? what flavor of libglite_lb_client shall be used ? -> And to have some code querying an edg/lcg LB ? although stuff in this -> API is prefixed by edg_, it's not possible to query an edg/lcg LB with -> this API when linking against glite libs : error msg is 'Operation not -> supported (Protocol versions incompatible)'. I'm glad to know now but -> I would have preferred reading it in the docs. - -TODO: consumer_api.tex - -> Section 2.2.2, -> example 1 ("Job status", p. 13) -> It would be quite interesting to give some details about the -> edg_wll_JobStat data type and more generally about every data type -> used for returning results. Also I do not agree with "The code also -> shows a complete handling of returned errors": although it is claimed -> it uses errno values, errno variable is not used and the return codes -> do not always match the defined errno values. Hence the question : how -> to interpret these return codes, can't some details be given in the -> docs ? - -TODO: consumer_api.tex, see \label{JS} - -> example 2 ("All user's jobs" p. 14) does not work: it misses the -> calling of -> edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER, my_lb_srv); -> edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_SERVER_PORT, srv_port); -> for the soft to know which LB host to query. This is needed in also -> every following example where no explicit jobid is used. If there is a -> general/convenient way to set it through config files or environment -> vars, it is not mentioned. - -TODO: consumer_api.c, see \label{JQ-auj} - -> One more thing about this example : output can be HUGE! Better mention -> it... - -Mentioned :). - -> example "querying user tags", p. 17 -> I haven't managed to get it working and after quite a few tries I'm -> still unable to query user tags I did set myself (proved by the output -> of the 'glite-lb-logevent' command, which also shows that the tag -> could be capitalized by the m/w) from some successfully -> executing/executed job. -> -> Is this code really working ? Could it be a problem linked with the LB -> or VO I'm using (I tried under 'esr' and 'dteam' VOs)? - -TODO: consumer_api.c, see \label{JQ_ut} - -> I had no more chance with example "All jobs marked as red" p. 19 and -> the event query. Is there some available code somewhere that does -> successfully query some user tag? - -TODO: consumer_api.c, see \label{ASQ_allred} - - -> 3/ The reference -> Hey, is it really supposed to turn out as a reference? For now, it -> looks more like an index, except that an index helps locating -> occurrences. Has the function 'edg_wll_GetServerLimit' (mentioned on -> p. 97) disappeared from the library? No libglite_lb_whatever seems to -> contain it. - -The automatically generated documentation was really unreadeble, so we -removed it almost completely from the LBDG. - -TODO: Only a list of header files and important API functions can be -found there. - -> I can provide the full source code I used if requested. - -We would really appreciate if you could look at the documentation now -and tell us if you find it suitable and if all examples are working for -you without problems. - diff --git a/org.glite.lb.doc/LICENSE b/org.glite.lb.doc/LICENSE deleted file mode 100644 index 259a91f..0000000 --- a/org.glite.lb.doc/LICENSE +++ /dev/null @@ -1,69 +0,0 @@ -LICENSE file for EGEE Middleware -================================ - -Copyright (c) 2004 on behalf of the EU EGEE Project: -The European Organization for Nuclear Research (CERN), -Istituto Nazionale di Fisica Nucleare (INFN), Italy -Datamat Spa, Italy -Centre National de la Recherche Scientifique (CNRS), France -CS Systeme d'Information (CSSI), France -Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden -Universiteit van Amsterdam (UvA), Netherlands -University of Helsinki (UH.HIP), Finlan -University of Bergen (UiB), Norway -Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if -any, must include the following acknowledgment: "This product includes -software developed by The EU EGEE Project (http://cern.ch/eu-egee/)." -Alternatively, this acknowledgment may appear in the software itself, if -and wherever such third-party acknowledgments normally appear. - -4. The names EGEE and the EU EGEE Project must not be -used to endorse or promote products derived from this software without -prior written permission. For written permission, please contact -. - -5. You are under no obligation whatsoever to provide anyone with any -bug fixes, patches, or upgrades to the features, functionality or -performance of the Software ("Enhancements") that you may develop over -time; however, if you choose to provide your Enhancements to The EU -EGEE Project, or if you choose to otherwise publish or distribute your -Enhancements, in source code form without contemporaneously requiring -end users of The EU EGEE Proejct to enter into a separate written license -agreement for such Enhancements, then you hereby grant The EU EGEE Project -a non-exclusive, royalty-free perpetual license to install, use, copy, -modify, prepare derivative works, incorporate into the EGEE Middleware -or any other computer software, distribute, and sublicense your -Enhancements or derivative works thereof, in binary and source code -form (if any), whether developed by The EU EGEE Project or third parties. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -This software consists of voluntary contributions made by many -individuals on behalf of the EU EGEE Prject. For more information on The -EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on -EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/ - - diff --git a/org.glite.lb.doc/Makefile b/org.glite.lb.doc/Makefile deleted file mode 100644 index 556ceee..0000000 --- a/org.glite.lb.doc/Makefile +++ /dev/null @@ -1,58 +0,0 @@ -# Default values -top_srcdir=. -stagedir=. -globalprefix=glite -lbprefix=lb -package=glite-lb-doc -version=0.0.0 -PREFIX=/opt/glite - --include Makefile.inc - -VPATH = ${top_srcdir}/src -KPATH = TEXINPUTS=".:$(VPATH)//:" -KPATHBIB = BIBINPUTS=".:$(VPATH)//:" - -LATEX = $(KPATH) latex -PDFLATEX = $(KPATH) pdflatex -BIBTEX = $(KPATHBIB) bibtex -DVIPS = $(KPATH) dvips -AT3=${stagedir}/sbin/glite-lb-at3 -INSTALL=install - -default all: generate LBUG.pdf LBAG.pdf LBDG.pdf - -generate: events.tex status.tex - -# %.dvi: %.tex -# $(LATEX) $< -# $(BIBTEX) `basename $< .tex` -# $(LATEX) $< -# $(LATEX) $< -# -# %.ps: %.dvi -# $(DVIPS) -ta4 -o $@ $< - -%.pdf: %.tex - $(PDFLATEX) $< - $(BIBTEX) `basename $< .tex` - $(PDFLATEX) $< - $(PDFLATEX) $< - -%.tex: %.tex.T - rm -f $@ - ${AT3} $< >$@ || rm -f $@ - chmod -w $@ >/dev/null - -install: - -mkdir -p ${PREFIX}/share/doc/${package}-${version} - $(INSTALL) -m 644 ${top_srcdir}/LICENSE ${PREFIX}/share/doc/${package}-${version} - $(INSTALL) -m 644 ${top_srcdir}/src/README ${PREFIX}/share/doc/${package}-${version} - $(INSTALL) -m 644 LBUG.pdf ${PREFIX}/share/doc/${package}-${version} - $(INSTALL) -m 644 LBAG.pdf ${PREFIX}/share/doc/${package}-${version} - $(INSTALL) -m 644 LBDG.pdf ${PREFIX}/share/doc/${package}-${version} - -clean: - rm -rvf LBUG* LBAG* LBDG* events.tex status.tex - -.PHONY: all clean purge ps pdf diff --git a/org.glite.lb.doc/src/LBAG-Configuration.tex b/org.glite.lb.doc/src/LBAG-Configuration.tex deleted file mode 100644 index e08ce37..0000000 --- a/org.glite.lb.doc/src/LBAG-Configuration.tex +++ /dev/null @@ -1,5 +0,0 @@ -\section{Configuration} -\TODO{} - -\subsection{Setting up the MySQL database} - diff --git a/org.glite.lb.doc/src/LBAG-Installation.tex b/org.glite.lb.doc/src/LBAG-Installation.tex deleted file mode 100644 index fa46005..0000000 --- a/org.glite.lb.doc/src/LBAG-Installation.tex +++ /dev/null @@ -1,46 +0,0 @@ -\section{Installation and Configuration} -\TODO{} - -\subsection{Complete RPMs description} -%\subsection{Daemons description} -%\subsection{CLI tools description: purge/dump/load} - -\subsection{\LB server} - -\subsubsection{Standard installation} - -\TODO{salvet} - -\subsubsection{Migration from previous versions} - -\TODO{salvet} - -\subsubsection{Index configuration} - -\TODO{Initial YAIM way only, rest in Sect.~\ref{maintain:index}} - -\subsubsection{Notification delivery} - -\subsubsection{Exploiting paralelism} - -\subsubsection{Multiple server instances} - -\subsubsection{Tuning database engine} - -\TODO{Salvet} - -\subsubsection{Purging old data} - -\TODO{Setup cron job, refer to Sect.~\ref{maintain:purge}} - -\subsubsection{Export to Job Provenance} - - -\subsection{\LB proxy} - -\subsection{\LB logger} - - -\subsection{Smoke tests} - -\TODO{ljocha: get something from the old testing docs} diff --git a/org.glite.lb.doc/src/LBAG-Introduction.tex b/org.glite.lb.doc/src/LBAG-Introduction.tex deleted file mode 100644 index 1e83feb..0000000 --- a/org.glite.lb.doc/src/LBAG-Introduction.tex +++ /dev/null @@ -1,37 +0,0 @@ -\section{Introduction} -\TODO{This document should contain:} - -\subsection{Service overview} - -A~fairly complete overview of the \LB service is given in \LB User's Guide~\cite{lbug}. -This section is a~brief excerpt only, providing minimal information necessary for -understanding the rest of this document. - -The task of \LB is gathering \emph{\LB events} from various grid middleware components, -and delivering the events to \LB servers where users can query for them. -Figure~\ref{f:gather} shows all principal components involved in the event gathering. - -\begin{figure} -\centering -\includegraphics[width=.67\hsize]{LB-components-gather} -\caption{Components involved in gathering and transfering \LB events} -\end{figure} - -\begin{figure} -\centering -\includegraphics[width=.67\hsize]{LB-components-query} -\caption{\LB queries and notifications} -\end{figure} - -\TODO{revize vhodnosti textu wrt. include do AG i UG} -\input components - - -\subsection{Deployment scenarios} - -\subsubsection{Standalone \LB server} - -\subsubsection{Hybrid \LB server-proxy} - -\subsubsection{\LB server on WMS node} -Highly obsolete and inefficient \dots diff --git a/org.glite.lb.doc/src/LBAG-Running.tex b/org.glite.lb.doc/src/LBAG-Running.tex deleted file mode 100644 index bd2e671..0000000 --- a/org.glite.lb.doc/src/LBAG-Running.tex +++ /dev/null @@ -1,27 +0,0 @@ -\section{Maintenance} - -\subsection{\LB server} - -This section deals with several typical but more peculiar tasks -that need more verbose description. -It is complemented with the full commands reference that is provided -as standard manual pages installed with the \LB packages. - -\subsubsection{Changing index configuration} - -\TODO{ljocha} - -\subsubsection{Multiple server instances} - -\subsubsection{Backup dumps} - -\subsubsection{Purging old data} - -\TODO{salvet} - -\subsubsection{Export to Job Provenance} - - -\subsection{\LB proxy} - -\subsection{\LB logger} diff --git a/org.glite.lb.doc/src/LBAG-Troubleshooting.tex b/org.glite.lb.doc/src/LBAG-Troubleshooting.tex deleted file mode 100644 index c4397a4..0000000 --- a/org.glite.lb.doc/src/LBAG-Troubleshooting.tex +++ /dev/null @@ -1,6 +0,0 @@ -\section{Troubleshooting} -\TODO{} - -\subsection{Debugging} -\subsection{Fine tuning the performance} - diff --git a/org.glite.lb.doc/src/LBAG.tex b/org.glite.lb.doc/src/LBAG.tex deleted file mode 100644 index 6e7e9e1..0000000 --- a/org.glite.lb.doc/src/LBAG.tex +++ /dev/null @@ -1,46 +0,0 @@ -\documentclass{egee} -%\usepackage{doxygen} - -\input{definitions} - -\title{Logging and Bookkeeping} -\Subtitle{Administrator's Guide} -\author{CESNET EGEE II JRA1 team} -\DocIdentifier{EGEE-II....} -\Date{\today} -\Activity{JRA1: Middleware Engineering and Integration} -\DocStatus{DRAFT} -\Dissemination{PUBLIC} -\DocumentLink{http://...} - -\Abstract{ This administrator's guide explains how to administer the Logging -and Bookkeeping (\LB) service. Several deployment scenarios are described -together with the installation, configuration, running and troubleshooting -steps. } - -\begin{document} - -\input{frontmatter} -\newpage -\tableofcontents - -\newpage -\input{LBAG-Introduction} - -\newpage -\input{LBAG-Installation} - -%\newpage -%\input{LBAG-Configuration} - -\newpage -\input{LBAG-Running} - -%\newpage -%\input{LBAG-Troubleshooting} - -\nocite{jgc} -\bibliographystyle{unsrt} -\bibliography{lbjp} - -\end{document} diff --git a/org.glite.lb.doc/src/LBDG-Common.tex b/org.glite.lb.doc/src/LBDG-Common.tex deleted file mode 100644 index dff668c..0000000 --- a/org.glite.lb.doc/src/LBDG-Common.tex +++ /dev/null @@ -1,2 +0,0 @@ -\section{\LB\ Common} -\TODO{Add the information about LB common - list of header files, important functions and data types and their description, etc.} diff --git a/org.glite.lb.doc/src/LBDG-Introduction.tex b/org.glite.lb.doc/src/LBDG-Introduction.tex deleted file mode 100644 index 1ac1ed9..0000000 --- a/org.glite.lb.doc/src/LBDG-Introduction.tex +++ /dev/null @@ -1,2 +0,0 @@ -\section{Introduction} -\TODO{Add the information from the "Best practices" workshop, i.e. information how the whole LB is coded, why C, what were the general techniques - context, connection pool, .T templates description, etc.} diff --git a/org.glite.lb.doc/src/LBDG.tex b/org.glite.lb.doc/src/LBDG.tex deleted file mode 100644 index 6f0973d..0000000 --- a/org.glite.lb.doc/src/LBDG.tex +++ /dev/null @@ -1,47 +0,0 @@ -\documentclass{egee} - -\input{definitions} - -\title{Logging and Bookkeeping} -\Subtitle{Developer's Guide} -\author{CESNET EGEE II JRA1 team} -\DocIdentifier{EGEE-II....} -\Date{\today} -\Activity{JRA1: Middleware Engineering and Integration} -\DocStatus{DRAFT} -\Dissemination{PUBLIC} -\DocumentLink{http://...} - -\Abstract{This developer's guide explains how to use the Logging and Bookkeeping -(\LB) service API. Logging (producer), querying (consumer) and notification API as well as the Web Services -Interface is described in details together with programing examples. } - -\begin{document} - -\input{frontmatter} -\tableofcontents - -\newpage -\input{LBDG-Introduction} - -\newpage -\input{LBDG-Common} - -\newpage -\input{producer_api} - -\newpage -\input{consumer_api} - -\newpage -\input{notification_api} - -\newpage -\input{web_services} - -\newpage -\bibliographystyle{unsrt} -\bibliography{lbjp} - -\end{document} - diff --git a/org.glite.lb.doc/src/LBUG-Appendix.tex b/org.glite.lb.doc/src/LBUG-Appendix.tex deleted file mode 100644 index 42405da..0000000 --- a/org.glite.lb.doc/src/LBUG-Appendix.tex +++ /dev/null @@ -1,17 +0,0 @@ -\section*{Appendix} - -\section{\LB Event Types} -\label{a:events} -Complete list of all events' names together with their description follows. -% see events.tex.T -\TODO{Enable page break in the following table:} -\input{events} - -\newpage -\section{\LB Job States} -\label{a:jobstat} -Complete list of all job' states together with their description follows. -% see status.tex.T -\input{status} - - diff --git a/org.glite.lb.doc/src/LBUG-Introduction.tex b/org.glite.lb.doc/src/LBUG-Introduction.tex deleted file mode 100644 index 10312ed..0000000 --- a/org.glite.lb.doc/src/LBUG-Introduction.tex +++ /dev/null @@ -1,890 +0,0 @@ -\section{Introduction} - -%historie: vyrobeno pro WMS v EDG, 1. a 2. verze (seq. èísla, -%cache a dotazy na stavy), v EGEE gLite---ustabilnìní, proxy - -The Logging and Bookkeeping service (\LB\ for short) was initially -developed in the EU DataGrid -project\footnote{\url{http://eu-datagrid.web.cern.ch/eu-datagrid/}} -as a~part of the -Workload Management System (WMS). -The development continues in the EGEE and EGEE-II projects, -where \LB became an independent part of the gLite middleware~\cite{glite}. - -\LB's primary purpose is tracking WMS jobs as they are processed by -individual Grid components, not counting on the WMS to provide this data. -The information gathered from individual sources is collected, stored in -a database and made available at a single contact point. The user get a -complete view on her job without the need to inspect several service logs -(which she may not be authorized to see in the entirety or she may not be -even aware of their existence). - -While \LB keeps track of submitted and running jobs, the information is -kept by the \LB service also after the job has been finished (successfully -completed its execution, failed, or has been canceled for any reason). The -information is usually available several days after the last event -related to the job arrived, to give user an opportunity to check the job -final state and eventually evaluate failure reasons. - -As \LB collects also information provided by the WMS, the WMS services are -no longer required to provide job-state querying interface. Most of the -WMS services can be even designed as stateless---they process a~job and -pass it over to another service, not keeping state information about the job -anymore. During development and deployment of the first WMS version this -approach turned to be essential in order to scale the services to the -required extent~\cite{jgc}. - -\LB must collect information about all important events in the Grid job -life. These include transitions between components or services, results -of matching and brokerage, waiting in a queue systems or start and end of -actual execution. -We decided to achieve this -goal through provision of an API (and the associated library) and -instrumenting individual WMS services and other Grid components with direct -calls to this API. But as \LB is a centralized service (there exists -a single point where all information about a particular job must -eventually arrive), direct synchronous transfer of data could have -prohibiting impact on the WMS operation. -The temporary unavailability or overload of the remote \LB service -must not prevent (nor block) the instrumented service to perform as usual. -An asynchronous model with a clear \emph{asynchronous delivery -semantics}, see Sect.~\ref{gathering}, is used to address this issue. - -As individual Grid components has only local and transient view about a -job, they are able to send only information about individual events. This -raw, fairly complex information is not -a~suitable form to be presented to the user for frequent queries. It must -be processed at the central service and users are presented primarily this -processed form. This form derives its form from the \emph{job state} and its -transition, not from the job events themselves. The raw information is -still available, in case more detailed insight is necessary. - -While the removal of state information from (some of) the WMS services -helped to achieve the high scalability of the whole WMS, the state -information is still essential for the decisions made within the resource -broker or during the matchmaking process. -\Eg decision on job resubmission is usually affected by the number of -previous resubmission attempts. This kind of information is currently -available in the \LB only, so the next ``natural'' requirement has been -to provide an interface for WMS (and other) services to the \LB to query -for the state information. However, this requirement contains two -contradictions: (i)~due to the asynchronous event delivery model, the \LB -information may not be up to date and remote queries may lead to unexpected -results -(or even inconsistent one---some older information may not be available for -one query but may arrive before a subsequent query is issued), -and (ii)~the dependence on a~remote service to provide vital state information -may block the local service if the remote one is not responding. -These problems are addressed by providing \emph{local view} on the \LB data, -see Sect.~\ref{local}. - - - - -\subsection{Concepts} - -\subsubsection{Jobs and events} -To keep track of user jobs on the Grid, we first need some reliable -way to identify them. This is accomplished by assigning a unique -identifier, which we call \emph{jobid} (``Grid jobid''), to every job -before it enters the Grid. A~unique jobid is assigned, making it the -primary index to unambiguously identify any Grid job. This jobid is then -passed between Grid -components together with the job description as the job flows through -the Grid; the components themselves may have (and usually do) their -own job identifiers, which are unique only within these components. - -Every Grid component dealing with the job during its lifetime -may be a source of information about the job. The \LB gathers information -from all the -relevant components. This information is obtained in the form of -\LB events, pieces of data generated by Grid components, which mark -important points in the job lifetime (\eg passing of job control -between the Grid components are important milestones in job lifetime -independently on the actual Grid architecture); see Appendix~\ref{a:events} -for a~complete list. We collect those -events, store them into a database and simultaneously process them to -provide higher level view on the job's state. The \LB collects redundant -information---the event scheme has been designed to be as redundant as -possible---and this redundancy is used to improve resiliency in a -presence of component or network failures, which are omnipresent on any -Grid. - -The \LB events themselves are structured into \emph{attribute}~= -\emph{value} pairs, the set of required and optional attributes is defined by the -event \emph{type} (or scheme). For the purpose of tracking job status on -the Grid and with the knowledge of WMS Grid middleware structure we -defined an \LB schema with specific \LB event -types\footnote{\url{https://edms.cern.ch/document/571273/}}. -The schema contains a common base, the attributes that must be assigned -to every single event. The primary key is the jobid, which is also one of -the required attributes. The other common attributes are currently the -timestamp of the event origin, generating component name and the event -sequence code (see Sect.~\ref{evprocess}). - -While the necessary and sufficient condition for a global jobid is -to be Grid-wide unique, additional desired property relates to the -transport of events through the network: All events belonging to the same -job must be sent to the same \LB database. This must be done on a~per -message basis, as each message may be generated by a different component. -The same problem is encountered -by users when they look for information about their job---they need -to know where to find the appropriate \LB database too. -While it is possible to devise a global service where each job registers -its jobid together with the address of the appropriate database, such a -service could easily become a bottleneck. We opted for another solution, -to keep the address of the \LB database within the jobid. This way, -finding appropriate \LB database address becomes a local operation -(at most parsing the jobid) and users can use the same mechanism when -connecting to the \LB database to retrieve information about a particular -job (users know its jobid). To simplify the situation even further, -the jobid has the form of an URL, where the protocol part is -``https'', server and port identify the machine running the appropriate -\LB server -(database) and the path contains base64 encoded MD5 hash of random -number, timestamp, PID of the generating process and IP address of the -machine, where the jobid was generated. Jobid in this form can be -used even in the web browser to obtain information about the job, -provided the \LB database runs a web server interface. This jobid is -reasonably unique---while in theory two different job identifications can -have the same MD5 hash, the probability is low enough for this jobid to -represent a globally unique job identification. - -%zajímá nás job, globální id, v¹echna data vzta¾ena k~nìmu, syrové události -% -%více zdrojù dat pro jeden job, redundance, shromá¾dìní na jednom místì - -\subsubsection{Event gathering} -\label{gathering} -%zdroje událostí, lokální semantika logování, store-and-forward - -As described in the previous section, information about jobs are -gathered from all the Grid components processing the job in the form -of \LB events. The gathering is based on the \emph{push} model where -the components are actively producing and sending events. The push model -offers higher performance and scalability than the pull model, where the -components are to be queried by the server. In the push model, the \LB -server does not even have to know the event sources, it is sufficient -to listen for and accept events on defined interface. - -The event delivery to the destination \LB server is asynchronous and -based on the store--and--forward model to minimize the performance -impact on component processing. Only the local processing is synchronous, -the \LB event is sent synchronously only to the nearest \LB component -responsible for event delivery. This component -is at the worst located in the same local area network (LAN) and usually -it runs on the same host as -the producing component. The event is stored there (using persistent -storage -- disk file) and confirmation is sent back to the -producing component. From the component's point of view, the -send event operation is fast and reliable, but its success only means -the event was accepted for later delivery. The \LB delivery components -then handle the event asynchronously and ensure its delivery to the -\LB server even in the presence of network failures and host reloads. - -It is important to note that this transport system does not guarantee -ordered delivery of events to the \LB server; it \emph{does} guarantee -reliable and secure delivery, however. The guarantees are statistical -only, as the protocol is not resilient to permanent disk or node crashes -nor to the complete purge of the data from local disk. Being part of the -trusted infrastructure, even the local \LB components should run on -a trusted and maintained machine, where additional reliability may be -obtained \eg by a RAID disk subsystem. - -\subsubsection{Event processing}% -\label{evprocess} - -%diagram stavù, mapování událostí na hrany - -%uspoøádání událostí -- seq. èísla, vèetnì shallow vìtví - -% ! abstraktne, nemame jeste komponenty - -% prichazeji udalosti, vice zdroju, zmenene poradi (az ztraty) -% redundantni informace -% motivace: usetrit uzivatele, hlasit agregovany stav jobu -As described in the previous section, \LB gathers raw events from various -Grid middleware components and aggregates them on a~single server -on a per-job basis. -The events contain a very low level detailed information about the job -processing at individual Grid components. This level of detail is -valuable for tracking various problems with the job and/or the -components, and as complementary events are gathered (\eg each job control -transfer is logged independently by two components), the information is -highly redundant. Moreover, the events could arrive in wrong order, -making the interpretation of raw information difficult and not -straightforward. -Users, on the other hand, are interested in a much higher view, the -overall state of their job. - -For these reasons the raw events undergo complex processing, yielding -a~high level view, the \emph{job state}, that is the primary type of data -presented to the user. -Various job states form nodes of the job state diagram (Fig.~\ref{f:jobstat}). -See Appendix~\ref{a:jobstat} for a list of the individual states. - -% stavovy automat -% obrazek: stavovy diagram - -\begin{figure} -\centering -\includegraphics[width=.8\hsize]{images/wms2-jobstat} -\caption{\LB\ job state diagram} -\label{f:jobstat} -\end{figure} - -% typ udalosti -> zmeny typu stavu -\LB\ defines a~\emph{job state machine} that is responsible for updating -the job state on receiving a~new event. -The logic of this algorithm is non-trivial; the rest of this section deals -with its main features. - -Transitions between the job states happen on receiving events of particular -type coming from particular sources. -There may be more distinct events assigned to a~single edge of the state diagram. -For instance, the job becomes \emph{Scheduled} when it enters batch system -queue of a~Grid computing element. -The fact is witnessed by either \emph{Transfer/OK} event reported by -the job submission service or by \emph{Accept} event reported by the computing -element. Receiving any one of these events (in any order) triggers the -state change. - -% fault tolerance -This way, the state machine is highly fault-tolerant---it can cope with -delayed, reordered or even lost events. -For example, when a~job is in the \emph{Waiting} state and the \emph{Done} -event arrives, it is not treated as inconsistency but it is assumed that -the intermediate events are delayed or lost and the job state is switched -to the \emph{Done} state directly. - -% udalosti nesou atributy, promitaji se do stavu -The \LB events carry various common and event-type specific attributes, -\eg \emph{timestamp} (common) or \emph{destination} (\emph{Transfer} type). -The job state record contains, besides the major state identification, -similar attributes, \eg -an array of timestamps indicating when the job entered each state, -or \emph{location}---identification of the Grid component which is currently -handling the job. -Updating the job state attributes is also the task of the state machine, -employing the above mentioned fault tolerance---despite a~delayed event -cannot switch -the major job state back -it still may carry valuable information to update the job state attributes. - -\subsubsection{Event ordering}% -\label{evorder} - -As described above, the ability to correctly order arriving events is -essential for the job state computation. -As long as the job state diagram was acyclic (which was true for the -initial WMS release), each event had its unique place in the expected sequence -hence event ordering could always be done implicitly from the -context. -However, this approach is not applicable once job resubmission -yielding cycles in the job state diagram was introduced. - -Event ordering that would rely on timestamps assigned to events upon -their generation, assuming strict clock synchronization over the Grid, -turned to be a~naive approach. -Clocks on real machines are not precisely synchronized and there are no reliable -ways to enforce synchronization across administrative domains. - -To demonstrate a problem with desynchronized clocks, that may lead to -wrong event interpretation, let us consider a~simplified example -in Tab.~\ref{t:cefail}. -% -\iffalse %stare -% usporadani udalosti -- seq. cisla -% priklad problemu -So far we assumed that the state machine is able to detect a~delayed event. -As the state diagram contains cycles, delay cannot be detected from the type -of the event only. -The simplest approach is relying on the event timestamps. -However, in the Grid environment one cannot assume strictly synchronized clocks. -Table~\ref{t:cefail} shows a~simplified example of the problem caused by delayed -clocks. -\fi -% -We assume that the workload manager (WM) sends the job to a~computing element -(CE)~A, where it starts running but the job dies in the middle. -The failure is detected and the job is resubmitted back to the WM which sends it to CE~B then. -However, if A's clock is ahead in time and B's clock is correct (which -means behind the A's clock), the events in the right column are treated -as delayed. The state machine will interpret events incorrectly, assuming -the job has been run on B before sending it to A. -The job would always (assuming the A's events arrive before B's events to -the \LB) be reported as ``\emph{Running} at A'' despite -the real state should follow the \emph{Waiting} \dots \emph{Running} sequence. -Even the \emph{Done} event can be sent by B with a timestamp that says -this happened before the job has been submitted to A and the job state -will end with a discrepancy---it has been reported to finish on B while -still reported to run on A. - -\begin{table}[hb] -\begin{tabular}{rlrl} -1.&WM: Accept& -6.&WM: Accept\\ -2.&WM: Match $A$& -7.&WM: Match $B$\\ -3.&WM: Transfer to $A$& -8.&WM: Transfer to $B$\\ -4.&CE~$A$: Accept & -9.&CE~$B$: Accept \\ -5.&CE~$A$: Run & -10.&CE~$B$: Run \\ -\dots & $A$ dies\\ -\end{tabular} -\caption{Simplified \LB events in the CE failure scenario} -\label{t:cefail} -\end{table} - -Therefore we are looking for a~more robust and general solution. We can -discover severe clock bias if the timestamp on an event is in a future -with respect to the time on an \LB server, but this is generally a dangerous -approach (the \LB server clock could be severely behind the real time). -We decided not to rely on absolute time as reported by timestamps, but to -introduce a kind of \emph{logical time} that is associated with the logic -of event generation. -The principal idea is arranging the pass through the job state -diagram (corresponding to a~particular job life), that may include -loops, into an execution tree that represents the job history. -Closing a~loop in the pass through the state diagram corresponds -to forking a~branch in the execution tree. -The scenario in Tab.~\ref{t:cefail} is mapped to the tree in -Fig.~\ref{f:seqtree}. -The approach is quite general---any finite pass through any state -diagram (finite directed graph) can be encoded in this way. - -\begin{figure} -\centering -\includegraphics[scale=.833]{images/seqtree} -\caption{Job state sequence in the CE failure scenario, arranged into a~tree. -Solid lines form the tree, arrows show state transitions.} -\label{f:seqtree} -\end{figure} - -Our goal is augmenting \LB events with sufficient information that -\begin{itemize} - \item identifies uniquely a~branch on the execution tree, - \item determines the sequence of events on the branch, - \item orders the branches themselves, which means that it determines - which one is more recent. -\end{itemize} -If such information is available, the execution tree can be -reconstructed on the fly as the events arrive, and even delayed events -are sorted into the tree correctly. An incoming event is considered -for job state computation only if it belongs to the most recent -branch. - -The situation becomes even more complicated when -the \emph{shallow resubmission} WM advanced feature is enabled. -In this mode WM may resubmit the job before being sure the previous attempt -is really unsuccessful, potentially creating multiple parallel instances -of the job. -The situation maps to several branches of the execution tree that -evolve really in parallel. -However, only one of the job instances becomes active (really running) finally; -the others are aborted. -Because the choice of active instance is done later, -it may not correspond to the most recent execution branch. -Therefore, when an event indicating the choice of active instance arrives, -the job state must be recomputed, using the corresponding active branch -instead the most recent one. - -Section~\ref{seqcode} describes the current implementation of event -ordering mechanism based on ideas presented here. - -\subsubsection{Queries and notifications}\label{retrieve} - -According to the GMA classification the user retrieves data from -the infrastructure in two modes, called -\emph{queries} and \emph{notifications} in~\LB. - -Querying \LB is fairly straightforward---the user specifies query -conditions, connects to the querying infrastructure endpoint, and -receives the results. -For ``single job'' queries, where jobid is known, the endpoint (the -appropriate \LB server) is inhered from the jobid. -More general queries must specify the \LB server explicitely, -and their semantics is intentionally restricted -to ``all such jobs known here''. -We trade off generality for performance and reliability, -leaving the problem of finding the right query endpoint(s), the right -\LB servers, to higher level information and service-discovery services. - -If the user is interested in one or more jobs, frequent polling of the -\LB server may be cumbersome for the user and creates unnecessary overload -on the sever. A notification subscription is therefore available, -allowing users to subscribe to receive notification whenever a~job -starts matching user specified conditions. -Every subscription contains also the location of the user's -listener; -successful subscription returns time-limited \emph{notification handle}. -During the validity period of the subscription, the \LB infrastructure -is responsible for queuing and reliable delivery of the notifications. -The user may even re-subscribe (providing the original handle) with different -listener location (\eg moving from office to home), and \LB re-routes -the notifications generated in the meantime to the new destination. -The \LB event delivery infrastructure is reused for the notification -transport. - -\subsubsection{Local views}\label{local} -% motivace proxy - -%As outlined in Sect.~\ref{reqs} -WMS components are, besides logging -information into \LB, interested in querying this information back in order -to avoid the need of keeping per-job state information. -However, despite the required information is present in \LB, -the standard mode of \LB operation is not suitable for this purpose due -to the following reasons: -\begin{itemize} -\item Query interface is provided on the \LB component which gathers -events belonging to the same job but coming from different sources. -Typically, this is a~remote service with respect to the event sources (WMS components). -Therefore the query operation is sensitive to any network failure that may -occur, blocking the operation of the querying service for indefinite time. -\item Due to the asynchronous logging semantics, there is a~non-zero time -window between successful completion of the logging call and the point in -time when the logged event starts affecting the query result. -This semantics may yield unexpected, seemingly inconsistent outcome. -\end{itemize} - -The problem can be overcome by introducing \emph{local view} on job data. -Besides forwarding events to -the server where events belonging to a~job are gathered from multiple sources, -\LB infrastructure can store the logged events temporarily -on the event source, and perform the processing described -in Sect.~\ref{evprocess}. -In this setup, the logging vs.\ query semantics can be synchronous---it is -guaranteed that a~successfully logged event is reflected in the result of -an immediately following query, -because no network operations are involved. -Only events coming from this particular physical node (but potentially -from all services running there) are considered, thus the locality of the view. -On the other hand, certain \LB events are designed to contain redundant -information, therefore the local view on processed data (job state) -becomes virtually complete on a~reasonably rich \LB data source like -the Resource Broker node. - - -\subsection{Current \LB implementation} -The principal components of the \LB service and their interactions -are shown in Figures~\ref{f:comp-gather} (gathering and transferring -\LB events) and~\ref{f:comp-query} (\LB query and notification services). - -\begin{figure} -\centering -\includegraphics[scale=.5]{images/LB-components-gather} -\caption{\LB components involved in gathering and transferring the events} -\label{f:comp-gather} -\end{figure} - -\input components - -\subsubsection{Sequence codes for event ordering}% -\label{seqcode} - -As discussed in Sect.~\ref{evorder}, sequence codes are used as logical -timestamps to ensure proper event ordering on the \LB server. The -sequence code counter is incremented whenever an event is logged and the -sequence code must be passed between individual Grid components together -with the job control. -However, a single valued counter is not sufficient to support detection of -branch forks within the execution tree. -When considering again the Computing Element failure scenario described -in Sect.~\ref{evorder}, there is no way to know that the counter value of -the last event logged by the failed CE A is 5 (Tab.~\ref{t:cefail}). - -\begin{table}[b] -\begin{tabular}{rlrl} -1:x&WM: Accept& -4:x&WM: Accept\\ -2:x&WM: Match $A$& -5:x&WM: Match $B$\\ -3:x&WM: Transfer to $A$& -6:x&WM: Transfer to $B$\\ -3:1&CE~$A$: Accept & -6:1&CE~$B$: Accept \\ -3:2&CE~$A$: Run & -6:2&CE~$B$: Run \\ -\dots & $A$ dies\\ -\end{tabular} -\caption{The same CE failure scenario: hierarchical sequence codes. -``x'' denotes an undefined and unused value.} -\label{t:cefail2} -\end{table} - - -Therefore we define a~hierarchical \emph{sequence code}---an array of -counters, each corresponding to a~single Grid component class handling the job% -\footnote{Currently the following gLite components: Network Server, Workload -Manager, Job Controller, Log Monitor, Job Wrapper, and the application itself.}. -Table~\ref{t:cefail2} shows the same scenario with a~simplified two-counter -sequence code. The counters correspond to the WM and CE component classes -and they are incremented when each of the components logs an event. -When WM receives the job back for resubmission, -the CE counter becomes irrelevant (as the job control is on WM now), -and the WM counter is incremented again. - -%Events on a~branch are ordered following the lexicographical order -%of the sequence codes. -%Branches are identified according to the WM counter as WM is -%currently the only component where branching can occur. - -The state machine keeps the current (highest seen) code for the job, -being able to detect a~delayed event by simple lexicographic comparison -of the sequence codes. -Delayed events are not used for major state computation, then. -Using another two assumptions (that are true for the current -implementation): -\begin{itemize} - \item events coming from a~single component arrive in order, - \item the only branching point is WM, -\end{itemize} -it is safe to qualify events with lower WM counter (than the already -received one) to belong to inactive -branches, hence ignore them even for update of job state attributes. - -\subsection{User interaction} -\begin{figure} -\centering -\includegraphics[scale=.5]{images/LB-components-query} -\caption{\LB queries and notifications} -\label{f:comp-query} -\end{figure} - -So far we focused on the \LB internals and the interaction between its -components. -In this section we describe the interaction of users with the service. - -\subsubsection{Event submission} -%implicitní -- registrace jobu, systémové události na middlewarových komponentách -The event submission is mostly implicit, -\ie it is done transparently by the Grid middleware components -on behalf of the user. -Typically, whenever an important point in the job life is reached, -the involved middleware component logs an appropriate \LB event. -This process is not directly visible to the user. - -A specific case is the initial registration of the job. -This must be done synchronously, as otherwise subsequent events logged for -the same job may be refused with a ``no such job'' error report. -Therefore submission of a job to the WMS is the only synchronous event -logging that does not return until the job is successfully registered with -the \LB server. - -% explicitní -- user tagy, ACL -However, the user may also store information into the \LB explicitly -by logging user events---\emph{tags} (or annotations) of the -form ``name = value''. -Authorization information is also manipulated in this way, see -\LB User's Guide for details. - - -\subsubsection{Retrieving information} -From the user point of view, the information retrieval is the most -important interaction with the \LB service. - -%dotazy na stav -The typical \LB usage are queries on the high-level job state information. -\LB supports not only single job queries, it is also possible to -retrieve information about jobs matching a specific condition. -The conditions may refer to both the \LB system attributes -and the user annotations. Rather complex query semantics can be -supported, \eg -\emph{Which of my jobs annotated as ``apple'' or ``pear'' are already -scheduled for execution and are heading to the ``garden'' computing element?} -The \LB User's -Guide\footnote{\url{https://edms.cern.ch/file/571273/1/LB-guide.pdf}} provides a~series of similar examples of -complex queries. - -%dotazy na události -As another option, the user may retrieve raw \LB events. -Such queries are mostly used for debugging, identification of repeating -problems, and similar purposes. -The query construction refers to event attributes rather -than job state. - -The query language supports common comparison operators, and it allows -two-level nesting of conditions (logically \emph{and}-ed and \emph{or}-ed). -Our experience shows that it is sufficiently strong to cover most user -requirements while being simple enough to keep the query cost reasonable. -Complete reference of the query language can be found in~\LB User's Guide. - -\ludek{%notifikace -The other mode of user interactions are the \LB notifications -(Sect.~\ref{retrieve}).} - -\subsubsection{Caveats} -\LB is designed to perform well in the unreliable distributed Grid -environment. -An unwelcome but inevitable consequence of this design -are certain contra-intuitive features in the system behavior, -namely: -\begin{itemize} -\item -Asynchronous, possibly delayed event delivery may yield seemingly -inconsistent view on the job state \wrt\ information that is available -to the user via different channels. -\Eg the user may know that her job terminated because of monitoring the -application progress directly, but the \LB \emph{Done} events indicating -job termination are delayed so that \LB reports the job to be still -in the \emph{Running} state. - -\item -% sekvenèní èísla -- ¹patnì øazené události jsou ignorovány pro výpoèet stavu -Due to the reasons described in Sect.~\ref{evorder} \LB is rather sensitive -to event ordering based on sequence codes. -The situation becomes particularly complicated when there are multiple -branches of job execution. -Consequently the user may see an \LB event that is easily interpreted that -it should switch the job state, however, it has no effect in fact -because of being (correctly) sorted to an already inactive branch. - -\item -% purge -- data z~\LB\ zmizí -\LB is not a~permanent job data storage. The data get purged from the -server on timeout, unrelated to any user's action. -Therefore, the \LB query may return ``no such job'' error message (or not -include the job in a list of retrieved jobs) even if the same previous -\LB query had no such problems. - -\end{itemize} - -\subsection{Security issues} -The events passed between the \LB components as well as the results of -their processing provide detailed information about the corresponding job and -its life. Being used by the users to check status of their jobs and also by -other Grid components to control the job, the information on jobs has to be -reliable and reflect the real jobs' utilization of the Grid. Also, some user -communities (\eg biomedicine researchers) often process sensitive data and -require the information about their processing is kept private so that only the -job owner can access not only the result of the computation but also all -information about the job run. Last but not least, according to legislation of -some countries the information on users' jobs can be treated as the user -private data, which requires an increased level of protection. \LB therefore -must pay special attention to security aspects and access control to the data. - -All \LB components communicate solely over authenticated channels. The TLS -protocol~\cite{tls} is used as the authentication mechanism and each of the -\LB uses an X.509 public key certificate to establish a mutually -authenticated connection. The users usually use their proxy -certificates~\cite{proxycert} when accessing the \LB server and retrieving -information about jobs. -\ludek{Proxy certificates were introduced by the Grid Security -Infrastructure\~cite{gsi} from the Globus project and extend the concepts of -standard public key certificates and identity providers and allows a user to -issue a certificate for herself. Such a proxy certificate is used as a means -for Single Sign-On and rights delegation~\cite{delegation}.} -The proxy -certificate can also contain other information necessary to create a secure -connection, \eg information used for authorization. The \LB security layer is -implemented using the the Generic Security Service API~\cite{gssapi}, which -makes it easier to port the application to an environment using mechanism other -than PKI (\eg Kerberos). - -Apart from providing an authentication mechanism, the TLS protocol also allows -the communicating parties to exchange an encryption key that is used to encrypt -all subsequent communication. The \LB components encrypt all network -communication to keep the messages private. Therefore, together with the access control -rules implemented by the \LB server, the infrastructure provides very high -level of privacy protection. - -By default, access to a job information is only allowed to the user who -submitted the job (the job owner). The job owner can also assign an access -control list to her job in the \LB specifying other users who are allowed -to read the -data from \LB. The ACLs are represented in the GridSite GACL -format~\cite{gacl1,gacl2}, which is a simplified version of common Extensible -Access Control Markup Language (XACML)~\cite{xacml}. The ACLs are stored in -the \LB database along with the job information and are checked at each access to -the data. The GridSite XML policy engine is used for policy evaluation. The -ACLs are under control of the job owner, who can add and remove entries in the -ACL arbitrarily using the \LB API or command-line tools. Each entry of an ACL -can specify either a user subject name or a name of a VOMS group. The -VOMS~\cite{voms2} is a VO attribute provider service, which is maintained -by the EGEE project. It allows to assign a user with groups and roles -membership and issues to the users attribute certificates containing -information about their current attributes. These attribute certificate are -embedded in the user proxy certificate and checked by the \LB server at each -user request handling. - -%Only the Read semantics is implemented so far, for the -%future we consider more complex access control, \eg implementing the access -%control for Write operations (per event) so that particular events could be -%only logged by allowed components. That would allow to generate more -%trusted results since currently each components can log arbitrary events. -%Malicious component can make the \LB server produce inappropriate results. - -Besides of using the ACLs, the \LB administrator can also specify a~set of -privileged users with access to all job records on a particular \LB -server. These privileged users can \eg -collect information on usage and produce a monitoring data based on the \LB -information. - -%Data trustworthiness - the events aren't signed, no real non-reputability or -%traceability of the event sources. - -Since the hostname of the \LB server is part of the job identification, it is -easy for the user to check that the correct \LB server was contacted and no -server spoofing took place and thus the data received from the server can be -trusted. The \LB server on the other hand has no means of checking that the -logged events originated from an authorized component. Everyone on the Grid -possessing a valid certificate from a~trusted CA can send an event to the \LB and -let it store and process the event and possibly change the status of the -corresponding job. This way a malicious user or service can confuse the \LB -server by a forged events. This behavior is not a critical issue in the current -model and the way in which \LB is used, however, we are designing a solution -addressing this weakness. We plan to use the VOMS attributes issued to a -selected components. These VOMS attributes must be presented when critical -events are logged to the \LB server. - -\ludek{\subsection{Performance and scalability} -The \LB service was designed with performance and -scalability issues in mind. We have developed a series of tests of the -individual \LB components to measure the actual behavior under -stress conditions. These tests give us a good performance estimate of -the \LB service and help us identify and remove possible bottlenecks. - -The testing itself is done by feeding the \LB components with events -prepared beforehand, using whatever protocol appropriate for the given -component. The feeding program uses a set of predefined events of a -typical job which we have chosen from the production \LB server -database. Timestamp is taken before the first event is sent, then the -feeding program begins sending events of individual jobs (the jobs are -all the same, the only difference is the jobid; the number of jobs used is -configurable). The tested component is instrumented in the source code -to break normal event processing at selected points (\eg discard -events immediately after being read to measure the input channel -performance, or discard events instead of sending them to the next -component, etc.). This segmentation of event processing enables to -identify places in the code which may slow down the event transfer. -Optionally the events may be discarded by the next component in the -logical path. The last event of the last job is special termination -event, which is recognized when being discarded; then the second -timestamp is taken and the difference between the two gives us total -time necessary to pass given number of jobs through. - -Note that due to the asynchronous nature of the \LB service measuring for -example the time it takes to send given number of jobs does not give -us the required result, thus event (or job) throughput---when the -producer receives acknowledgment about successful send operation, it -is not guaranteed that the event passed through the component. - -The results shown in table~\ref{perf:results} give the overall -throughput components (events are discarded by the next component -on the path), with the exception of proxy, where the throughput to the -database is measured. It can be seen that the majority of code is fast -enough to handle even high event rates and that most components are up -to our goal to handle one million of jobs per day. The first line -indicates how fast we are able to ``generate'' events in the feeding -program. - -\begin{table}[hbt] -\begin{tabular}{l|r} -{\bf Component} & {\bf Job throughput (jobs/day)} \\ -\hline -Test producer & 153,600,000 \\ -Locallogger & 101,700 \\ -Interlogger & 5,335,100 \\ -Proxy & 1,267,110 \\ -\end{tabular} -\caption{Performance testing results} -\label{perf:results} -\end{table} - -During the performance testing we have identified two possible -bottlenecks: -\begin{itemize} -\item Opening connections and establishing SSL sessions is very -expensive operation. It hinders mainly the performance of locallogger, -because the current implementation uses one SSL session for -event. -\item Database operations. Storing events into database is expensive, -but inevitable; however we were able to optimize for example the -code checking for duplicated events. -\end{itemize} - -In the current work we are addressing the issue of SSL operations by -introducing concept of SSL connection pools, which enables components -to reuse existing connections transparently without need to tear-down -and setup new SSL contexts. } - -\subsection{Advanced use} - -The usability of the \LB service is not limited to the simple tasks -described earlier. It can be easily extended to support real-time job -monitoring (not only the notifications) and the aggregate information -collected in the \LB servers is a valuable source of data used for post-mortem -statistical analysis of jobs and also the Grid infrastructure behavior. -Moreover, \LB data can be used to improve scheduling decisions. - -\subsubsection{\LB and real time monitoring} -The \LB server is extended to provide quickly and without any substantial -load on the database engine the following data: -\begin{enumerate} -\item number of jobs in the system grouped by internal status -(\emph{Submitted}, \emph{Running}, \emph{Done},~\ldots), -\item number of jobs that reached final state in the last -hour, -\item associated statistics like average, maximum, and minimum time spent -by jobs in the system, -\item number of jobs that entered the WMS system in the last hour. -\end{enumerate} -\LB server can be regularly queried to provide this data to give an -overview about both jobs running on the Grid and also the behavior of the -Grid infrastructure as seen from the job (or end user) perspective. -Thus \LB\ becomes a~data source for various real-tim Grid monitoring tools. - -\subsubsection{R-GMA feed} -The \LB server also supports streaming the most important data---the job -state changes---to another monitoring system. It works as the -notification service, sending information about job state changes to -a~specific listener that is the interface to a monitoring interface. -As a~particular example of such a generic service, the R-GMA feed component -has been developed. It supports sending job state changes to -the R-GMA infrastructure that is part of the Grid monitoring -infrastructure used in the EGEE Grid. - -Currently, only basic information about job state changes is provided -this way, taking into account the security limitation of the R-GMA. - -\subsubsection{\LB Job Statistics} -Data collected within the \LB servers are regularly purged, complicating -thus any long term post-mortem statistical analysis. Without a Job -Provenance, the data from the \LB must be copied in a controlled way and -made available in an environment where even non-indexed queries can be -asked. - -Using the \LB Job Statistics tools, one dump file per job is created -when the job reaches a~terminal state. These dump files can be -further processed to provide and XML encoded Job History Record% -\footnote{\url{http://egee.cesnet.cz/en/Schema/LB/JobRecord}} that -contains all the relevant information from the job life. The Job History -Records are fed into a statistical tools to reveal interesting information -about the job behavior within the Grid. - -This functionality is being replaced by the direct download of all the -relevant data from the Job Provenance. - -\subsubsection{Computing Element reputability rank} -Production operation of the EGEE middleware showed -that misbehaving computing elements may have significant impact on -the overall Grid performance. -The most serious problem is the ``black hole'' effect---a~CE that -accepts jobs at a~high rate but they all fail there. -Such CE usually appears to be free in Grid information services -so the resource brokers keep to assign further jobs to it. - -\LB data contain sufficient information to identify similar problems. -By processing the incoming data the information -was made available as on-line auxiliary statistics like -rate of incoming jobs per CE, rate of job failure, average duration of job etc. -The implementation is lightweight, allowing very high query rate. -On the RB the statistics are available as ClassAd -functions, allowing the user to specify that similarly misbehaving -CE's should be penalized or completely avoided -when RB decides where jobs get submitted. - - diff --git a/org.glite.lb.doc/src/LBUG-ReferenceGuide.tex b/org.glite.lb.doc/src/LBUG-ReferenceGuide.tex deleted file mode 100644 index c32962b..0000000 --- a/org.glite.lb.doc/src/LBUG-ReferenceGuide.tex +++ /dev/null @@ -1,31 +0,0 @@ -\section{Reference Guide} - -%The reference guide should contain detailed descriptions of all -%provided CLIs and APIs. There should be two subsections for those. - -\subsection{Command-Line Interfaces} -\label{cmdln_interface} -\input{cmdln_interface} - -\newpage - -\subsection{\LB\ Web Service Interface} - -The \LB\ web service interface currently reflects the functionality of legacy -\LB\ query API (Sect.~\ref{query-C}). - -The following sections describe the operations defined in the \LB\ WSDL -file as well as its custom types. - -For the sake of readability this documentation does not follow the structure -of WSDL strictly, avoiding to duplicate information which is already present -here. -Conseqently, the SOAP messages are not documented, for example, as they -are derived from operation inputs and outputs mechanically. -The same holds for types: \eg\ we do not document defined elements -which correspond 1:1 to types but are required due to the literal SOAP -encoding. - -For exact definition of the operations and types see the WSDL file. - -\endinput diff --git a/org.glite.lb.doc/src/LBUG-Tools.tex b/org.glite.lb.doc/src/LBUG-Tools.tex deleted file mode 100644 index 52b2c3a..0000000 --- a/org.glite.lb.doc/src/LBUG-Tools.tex +++ /dev/null @@ -1,9 +0,0 @@ -\section{Tools description} - -In this section we give a description of the tools that are installed -together with the \verb'glite-lb-client'. These are the only \LB\ tools that a -regular grid user may need to use. - -\input{logevent} - -\TODO{Maybe add other tools: glite-lb-notify, glite-lb-job-log, glite-lb-job-status, ...?} diff --git a/org.glite.lb.doc/src/LBUG-UseCases.tex b/org.glite.lb.doc/src/LBUG-UseCases.tex deleted file mode 100644 index 82ce831..0000000 --- a/org.glite.lb.doc/src/LBUG-UseCases.tex +++ /dev/null @@ -1,10 +0,0 @@ -\section{Use Cases} - -This section describes usage of event-logging \LB\ command in the two -cases which are meant for the end-user: adding a~user description (tag) -to a~job, and changing a~job access control list. - -\input{log_usertag} -\input{change_acl} - -\TODO{Add User Query Use Cases and Notifications Use Cases} diff --git a/org.glite.lb.doc/src/LBUG.tex b/org.glite.lb.doc/src/LBUG.tex deleted file mode 100644 index 2468a6e..0000000 --- a/org.glite.lb.doc/src/LBUG.tex +++ /dev/null @@ -1,44 +0,0 @@ -\documentclass{egee} - -\input{definitions} - -\title{Logging and Bookkeeping} -\Subtitle{User's Guide} -\author{CESNET EGEE II JRA1 team} -\DocIdentifier{EGEE-II....} -\Date{\today} -\Activity{JRA1: Middleware Engineering and Integration} -\DocStatus{DRAFT} -\Dissemination{PUBLIC} -\DocumentLink{http://...} - -\Abstract{This user's guide explains how to use the Logging and Bookkeeping -(\LB) service from the user's point of view. The service architecture is -described thoroughly. Examples on using \LB\ event logging command to log -a~user tag and change job ACL are given, as well as \LB\ query and notification -use cases. } - -\begin{document} - -\input{frontmatter} -\tableofcontents - -\newpage -\input{LBUG-Introduction} - -\newpage -\input{LBUG-Tools} - -\newpage -\input{LBUG-UseCases} - -\appendix -\newpage -\input{LBUG-Appendix} - -\newpage -\bibliographystyle{unsrt} -\bibliography{lbjp} - -\end{document} - diff --git a/org.glite.lb.doc/src/README b/org.glite.lb.doc/src/README deleted file mode 100644 index 73a5567..0000000 --- a/org.glite.lb.doc/src/README +++ /dev/null @@ -1,12 +0,0 @@ -This is the official documentation for Logging and Bookkeeping Service. -It consists of the following documents: - -LBUG.pdf - Logging and Bookkeeping User's Guide -LBAG.pdf - Logging and Bookkeeping Admin's Guide -LBDG.pdf - Logging and Bookkeeping Developer's Guide - -Please, report all bugs to EU EGEE Bug Tracking System located at -https://savannah.cern.ch/bugs/?func=additem&group=jra1mdw - -Feel free to send us your non-bugs comments to email -egee-jra1@lindir.ics.muni.cz diff --git a/org.glite.lb.doc/src/change_acl.tex b/org.glite.lb.doc/src/change_acl.tex deleted file mode 100644 index 760b80b..0000000 --- a/org.glite.lb.doc/src/change_acl.tex +++ /dev/null @@ -1,75 +0,0 @@ -\subsection{Changing Job Access Control List} -\label{change_acl} -\TODO{Review if it is still correct - Dan?} - -In order to change ACL for a job a special event \verb'ChangeACL' is used. This -event can be logged by the job owner using the \verb'glite-lb-logevent' command -(see also Sect.~\ref{glite-lb-logevent}). General template for changing the ACL -is as follows: - -\begin{verbatim} -glite-lb-logevent -e ChangeACL -s UserInterface -p --permission 1 \ - -j \ - --user_id \ - --user_id_type \ - --permission_type --operation -\end{verbatim} - -where - -\begin{tabularx}{\textwidth}{lX} -\verb'' & specifies the job to change \\ -\verb'' & specifies the user to use, can be either an X.500 name - (subject name) or a VOMS group (of the form :)\\ -\verb'' & \verb'0' or \verb'1', indicating \verb'user_id' - specifies X.500 name or VOMS group, respectively \\ -\verb'' & \verb'0' or \verb'1', indicating the user is - \textit{allowed} or \textit{denied}, respectively \\ -\verb'' & \verb'0' or \verb'1' indicating the record carried in - the event shall be added or removed, respectively from - the ACL \\ -\end{tabularx} - -Adding a user specified by her subject name to the ACL (\verb'user_id' = -subject name, \verb'user_id_type' = 0, \verb'permission_type' = 0, -\verb'operation' = 0): - -\begin{verbatim} -glite-lb-logevent -e ChangeACL -s UserInterface -p --permission 1 \ - -j https://scientific.civ.zcu.cz:9000/PC8Y6jBitHt_fKMTEKFnVw \ - --user_id '/O=CESNET/O=Masaryk University/CN=Daniel Kouril' \ - --user_id_type 0 --permission_type 0 --operation 0 -\end{verbatim} - -Removing a user specified by her subject name from the ACL (\verb'user_id' = -subject name, \verb'user_id_type' = 0, \verb'permission_type' = 0, -\verb'operation' = 1): - -\begin{verbatim} -glite-lb-logevent -e ChangeACL -s UserInterface -p --permission 1 \ - -j https://scientific.civ.zcu.cz:9000/PC8Y6jBitHt_fKMTEKFnVw \ - --user_id '/O=CESNET/O=Masaryk University/CN=Daniel Kouril' \ - --user_id_type 0 --permission_type 0 --operation 1 -\end{verbatim} - -Adding a VOMS group to the ACL (\verb'user_id' = VOMS group, -\verb'user_id_type' = 1, \verb'permission_type' = 0, \verb'operation' = 0): - -\begin{verbatim} -glite-lb-logevent -e ChangeACL -s UserInterface -p --permission 1 \ - -j https://scientific.civ.zcu.cz:9000/PC8Y6jBitHt_fKMTEKFnVw \ - --user_id 'VOCE:/VOCE' \ - --user_id_type 1 --permission_type 0 --operation 0 -\end{verbatim} - -Denying a particular user from accessing information about the job, can be -combined e.g. with VOMS groups (\verb'user_id' = subject name, -\verb'user_id_type' = 0, \verb'permission_type' = 1, \verb'operation' = 0): - -\begin{verbatim} -glite-lb-logevent -e ChangeACL -s UserInterface -p --permission 1 \ - -j https://scientific.civ.zcu.cz:9000/PC8Y6jBitHt_fKMTEKFnVw \ - --user_id '/O=CESNET/O=Masaryk University/CN=Daniel Kouril' \ - --user_id_type 0 --permission_type 1 --operation 0 -\end{verbatim} - diff --git a/org.glite.lb.doc/src/components.tex b/org.glite.lb.doc/src/components.tex deleted file mode 100644 index 383361b..0000000 --- a/org.glite.lb.doc/src/components.tex +++ /dev/null @@ -1,124 +0,0 @@ -\subsubsection{\LB API and library} -Both logging events and querying the service are implemented via -calls to a~public \LB API. -The complete API (both logging and queries) -is available in ANSI~C binding, most of the querying capabilities also in C++. -These APIs are provided as sets of C/C++ header files and shared libraries. -The library implements communication protocol with other \LB components -(logger and server), including encryption, authentication etc. - -We do not describe the API here in detail; it is documented in~\LB User's -Guide\footnote{\url{https://edms.cern.ch/file/571273/1/LB-guide.pdf}}, -including complete reference and both simple and complex usage examples. - -Events can be also logged with a~standalone program (using the C~API in turn), -intended for usage in scripts. - -The query interface is also available as a~web-service provided by the -\LB server (Sect.~\ref{server}). - -\subsubsection{Logger} -The task of the \emph{logger} component is taking over the events from -the logging library, storing them reliably, and forwarding to the destination -server. -The component should be deployed very close to each source of events---on the -same machine ideally, or, in the case of computing elements with many -worker nodes, on the head node of the cluster% -\footnote{In this setup logger also serves as an application proxy, -overcoming networking issues like private address space of the worker nodes, -blocked outbound connectivity etc.}. - -Technically the functionality is realized with two daemons: -\begin{itemize} -\item \emph{Local-logger} accepts incoming events, -appends them in a~plain disk file (one file per Grid job), -and forwards to inter-logger. -It is kept as simple as possible in order to achieve -maximal reliability. -\item \emph{Inter-logger} accepts the events from the local-logger, -implements the event routing (currently trivial as the destination -address is a~part of the jobid), and manages -delivery queues (one per destination server). -It is also responsible for crash recovery---on startup, the queues are -populated with undelivered events read from the local-logger files. -Finally, the inter-logger purges the files when the events are delivered to -their final destination. -\end{itemize} - -\subsubsection{Server} -\label{server} -\emph{\LB server} is the destination component where the events are delivered, -stored and processed to be made available for user queries. -The server storage backend is implemented using MySQL database. - -Incoming events are parsed, checked for correctness, authorized (only the job -owner can store events belonging to a~particular job), and stored into the -database. -In addition, the current state of the job is retrieved from the database, -the event is fed -into the state machine (Sect.~\ref{evprocess}), and the job state updated -accordingly. - -On the other hand, the server exposes querying interface (Fig.~\ref{f:comp-query}, Sect.~\ref{retrieve}). -The incoming user queries are transformed into SQL queries on the underlying -database engine. -The query result is filtered, authorization rules applied, and the result -sent back to the user. - -While using the SQL database, its full query power is not made available -to end users. -In order to avoid either intentional or unintentional denial-of-service -attacks, the queries are restricted in such a~way that the transformed SQL -query must hit a~highly selective index on the database. -Otherwise the query is refused, as full database scan would yield unacceptable -load. -The set of indices is configurable, and it may involve both \LB system -attributes (\eg job owner, computing element, -timestamps of entering particular state,~\dots) and user defined ones. - -The server also maintains the active notification handles -(Sect.~\ref{retrieve}), providing the subscription interface to the user. -Whenever an event arrives and the updated job state is computed, -it is matched against the active handles% -\footnote{The current implementation enforces specifying an~actual jobid -in the subscription hence the matching has minimal performance impact.}. -Each match generates a~notification message, an extended \LB event -containing the job state data, notification handle, -and the current user's listener location. -The event is passed to the \emph{notification inter-logger} -via persistent disk file and directly (see Fig.~\ref{f:comp-query}). -The daemon delivers events in the standard way, using the specified -listener as destination. -In addition, the server generates control messages when the user re-subscribes, -changing the listener location. -Inter-logger recognizes these messages, and changes its routing of all -pending events belonging to this handle accordingly. - - -% asi nepotrebujeme \subsubsection{Clients} - -\subsubsection{Proxy} -\TODO{Proxy is now "integrated" into the server executable, update the text:} -\emph{\LB proxy} is the implementation of the local view concept -(Sect.~\ref{local}). -When deployed (on the Resource Broker node in the current gLite middleware) -it takes over the role of the local-logger daemon---it accepts the incoming -events, stores them in files, and forwards them to the inter-logger. - -In addition, the proxy provides the basic principal functionality of \LB server, -\ie processing events into job state and providing a~query interface, -with the following differences: -\begin{itemize} -\item only events coming from sources on this node are considered; hence -the job state may be incomplete, -\item proxy is accessed through local UNIX-domain socket instead of network -interface, -\item no authorization checks are performed---proxy is intended for -privileged access only (enforced by the file permissions on the socket), -\item aggressive purge strategy is applied---whenever a~job reaches -a~known terminal state (which means that no further events are expected), it is purged -from the local database immediately, -\item no index checks are applied---we both trust the privileged parties -and do not expect the database to grow due to the purge strategy. -\end{itemize} - diff --git a/org.glite.lb.doc/src/consumer_api.tex b/org.glite.lb.doc/src/consumer_api.tex deleted file mode 100644 index 9e1ea91..0000000 --- a/org.glite.lb.doc/src/consumer_api.tex +++ /dev/null @@ -1,810 +0,0 @@ -\section{\LB\ Querying (Consumer) API} -\TODO{Complete review; create really functional (buildable) examples and use verbatiminput of relevant part of the code; add list of header files, important functions and data types and their description, etc.} - -\def\partitle#1{\par{\textbf{#1}}\par} - -\label{ConsOview} -This section describes the aspects of principal use of the \LB\ consumer API. -It begins with the simplest examples how to query the bookkeeping -service, continues with various selection criteria and their combinations, and -through queries on user tags and timestamps it concludes with the discussion of -application specific queries. - -The document is intended for users interested in the \LB\ -consumer API or those interested in better understanding of the \LB\ service -capabilities. - -In the presented examples only the C \LB\ API (Sect.~\ref{query-C}) is considered. -The C++ API (Sect.~\ref{query-CPP}) covers the same functionality. - -\subsection{Returned results} - -\LB\ server returns errors which are classified as hard and soft errors. -The main difference between these categories is that in the case of soft -errors results may still be returned. -The authentication errors belong to -``soft error'' sort. Hard errors are typically all unrecoverable errors like ENOMEM. - -When the item count returned by \LB\ server exceeds the defined limits, the E2BIG error occur. -There are two limits\,---\,the server and the user limit. The user defined limit may be set in -the context at the client side in the following way: -\begin{verbatim} - #include - ... - edg_wll_Context ctx; - - edg_wll_InitContext(&ctx); - edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_JOBS_LIMIT, 10); - edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_EVENTS_LIMIT, 20); - edg_wll_SetParam(ctx, EDG_WLL_PARAM_QUERY_RESULTS, 30); - ... - edg_wll_FreeContext(ctx); -\end{verbatim} -This code sets the user query limits to the given maximal count of items. - -The E2BIG error may fall into both categories depending on the setting of -another context parameter, EDG\_WLL\_PARAM\_QUERY\_RESULTS. -It may take the following values: - -%The E2BIG error can be classified as hard or soft error too because this error can be affected -%by one more parameter which can make this error hard or soft. This parameter can be set like this:\\ -%\texttt{edg\_wll\_SetParam(ctx, EDG\_WLL\_PARAM\_QUERY\_RESULTS, EDG\_WLL\_QUERYRES\_ALL);} -%and possible values follows: -\begin{itemize} - \item{EDG\_WLL\_QUERYRES\_NONE}\,---\,No results are returned. - In this case an E2BIG error acts like a hard error. - \item{EDG\_WLL\_QUERYRES\_LIMITED}\,---\,A result contains at most ``limit'' item count. - In this case an E2BIG error acts like a soft error. - \item{EDG\_WLL\_QUERYRES\_ALL}\,---\,All results are returned and limits has no effect. - This option is available only in special cases such as ``user jobs query'' and - the ``job status query''. Otherwise the EINVAL error is returned. -\end{itemize} -Default value is EDG\_WLL\_QUERYRES\_NONE. - - -\subsection{Job queries} - -\partitle{Job status} -\label{JS} - -\TODO{Add edg\_wll\_JobStat description and error codes handling} - -The simplest case corresponds to the situation when an exact job ID -is known and the only information requested is the job status. The job ID -format is described in~\cite{djra1.4}. -The following example shows -all the relevant structures and API calls to retrieve status information -about a job with the ID\\ -\texttt{https://lhun.ics.muni.cz:9000/OirOgeWh\_F9sfMZjnIPYhQ}. - -\begin{verbatim} - #include - ... - edg_wll_Context ctx; - edg_wll_JobStat *statesOut = NULL; - edg_wll_QueryRec jc[2]; - ... - edg_wll_InitContext(&ctx); - ... - jc[0].attr = EDG_WLL_QUERY_ATTR_JOBID; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - if ( edg_wlc_JobIdParse( - "https://lhun.ics.muni.cz:9000/OirOgeWh_F9sfMZjnIPYhQ", - &jc[0].value.j) ) - { - edg_wll_FreeContext(ctx); - exit(1); - } - jc[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - if (edg_wll_QueryJobs(ctx, jc, 0, NULL, &statesOut)) { - char *err_text,*err_desc; - - edg_wll_Error(ctx,&err_text,&err_desc); - fprintf(stderr,"QueryJobs: %s (%s)\n",err_text,err_desc); - free(err_text); - free(err_desc); - } - else { - ... /* process the returned data */ - edg_wll_FreeStatus(statesOut); - free(statesOut); - } - edg_wlc_JobIdFree(jc[0].value.j); - edg_wll_FreeContext(ctx); -\end{verbatim} - -The first function call in this example initializes the \LB\ context\,---\,variable -\texttt{ctx}\,---\,which is necessary for later use. The most important part -of this code fragment is the \texttt{jc} variable setting. -Variable \texttt{jc} is a list of conditions terminated with the -\texttt{EDG\_WLL\_QUERY\_ATTR\_UNDEF} item. -In this example it contains the only data item\,---\,the job ID -(in its parsed form). - -If \texttt{edg\_wll\_QueryJobs()} is successful, returned results are available -in the \texttt{statesOut} variable. This variable contains an array of job states\,---\, -in this example state of a given job. - -The code also shows a~complete handling of returned errors as well as memory -management\,---\,deallocation of data that are not needed anymore. -\emph{For the sake of simplicity such code is not included in the examples -in the rest of this document.} - -\partitle{All user's jobs} -\label{JQ-auj} - -\TODO{Update the example so that it is really working} - -The simple query example is a request for all user's jobs. Another -condition type, \\ -\texttt{EDG\_WLL\_QUERY\_ATTR\_OWNER}, is used in this case, with the -value field filled with a user name. You can found this example in client module, file \texttt{job\_status.c}. - -\begin{verbatim} - #include - ... - edg_wll_Context ctx; - edg_wll_QueryRec jc[2]; - edg_wll_JobStat *statesOut = NULL; - edg_wlc_JobId *jobsOut = NULL; - ... - jc[0].attr = EDG_WLL_QUERY_ATTR_OWNER; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0].value.c = NULL; - jc[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - edg_wll_QueryJobs(ctx, jc, 0, &jobsOut, &statesOut); - ... -\end{verbatim} - -The value of the \texttt{attr} field which specifies job owner -could be set to \texttt{NULL} meaning the authenticated user. -Obtained results may differ according to the security level, e.g. with strong security -context only information about jobs of the specified user are returned -(in general info about all jobs a user is authorized to retrieve should be -returned). - -The query may return either a~list of job ID's or a~list of job states or both, -depending on the parameters \texttt{jobsOut} and \texttt{statesOut}. -If either is NULL the corresponding list is not retrieved. - -Developers should keep in mind that the output of such a query could be really huge. -\par - -The following examples demonstrates how \texttt{edg\_wll\_QueryJobs()} combines -the given conditions in a logical conjugation. - -\partitle{Running jobs} -\label{JQ-rj} - -If all (user's) running jobs are to be retrieved the following code can -be used. -\begin{verbatim} - #include - ... - edg_wll_Context ctx; - edg_wll_QueryRec jc[3]; - edg_wll_JobStat *statesOut = NULL; - edg_wlc_JobId *jobsOut = NULL; - ... - jc[0].attr = EDG_WLL_QUERY_ATTR_OWNER; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0].value.c = NULL; - jc[1].attr = EDG_WLL_QUERY_ATTR_STATUS; - jc[1].op = EDG_WLL_QUERY_OP_EQUAL; - jc[1].value.i = EDG_WLL_JOB_RUNNING; - jc[2].attr = EDG_WLL_QUERY_ATTR_UNDEF; - edg_wll_QueryJobs(ctx, jc, 0, &jobsOut, &statesOut); - ... -\end{verbatim} - -This example combines previous example with a new criteria. There are used two different attributes - - \texttt{EDG\_WLL\_QUERY\_ATTR\_OWNER} and \texttt{EDG\_WLL\_QUERY\_ATTR\_STATE}. -\texttt{edg\_wll\_QueryJobs()} connects them in the logical conjunction. -Examples using logical conjunction and logical disjunction are shown in the Sect.~\ref{JQ-AO}. - -\partitle{Jobs running at a given CE} -The following example gives description of all (user's) jobs running at CE XYZ. -\begin{verbatim} - #include - ... - edg_wll_Context ctx; - edg_wll_QueryRec jc[4]; - edg_wll_JobStat *statesOut = NULL; - edg_wlc_JobId *jobsOut = NULL; - ... - jc[0].attr = EDG_WLL_QUERY_ATTR_OWNER; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0].value.c = NULL; - jc[1].attr = EDG_WLL_QUERY_ATTR_STATUS; - jc[1].op = EDG_WLL_QUERY_OP_EQUAL; - jc[1].value.i = EDG_WLL_JOB_RUNNING; - jc[2].attr = EDG_WLL_QUERY_ATTR_DESTINATION; - jc[2].op = EDG_WLL_QUERY_OP_EQUAL; - jc[2].value.c = "XYZ"; - jc[3].attr = EDG_WLL_QUERY_ATTR_UNDEF; - edg_wll_QueryJobs(ctx, jc, 0, &jobsOut, &statesOut); - ... -\end{verbatim} - -In a case the job is not running the destination (attribute \texttt{EDG\_WLL\_QUERY\_ATTR\_DESTINATION}) -saves a CE name the job will be routed to. If location is needed use the \texttt{EDG\_WLL\_QUERY\_ATTR\_LOCATION} attribute. - - -\partitle{The WITHIN operator} -The \texttt{EDG\_WLL\_QUERY\_OP\_WITHIN} operator can be used in any condition with numeric values. -The following example shows a query on all user's jobs that have returned -an exit code from 2 to 7. -\begin{verbatim} - #include - ... - edg_wll_Context ctx; - edg_wll_QueryRec jc[4]; - edg_wll_JobStat *statesOut = NULL; - edg_wlc_JobId *jobsOut = NULL; - ... - jc[0].attr = EDG_WLL_QUERY_ATTR_OWNER; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0].value.c = NULL; - jc[1].attr = EDG_WLL_QUERY_ATTR_STATUS; - jc[1].op = EDG_WLL_QUERY_OP_EQUAL; - jc[1].value.i = EDG_WLL_JOB_DONE; - jc[2].attr = EDG_WLL_QUERY_ATTR_EXITCODE; - jc[2].op = EDG_WLL_QUERY_OP_WITHIN; - jc[2].value.i = 2; - jc[2].value2.i = 7; - jc[3].attr = EDG_WLL_QUERY_ATTR_UNDEF; - edg_wll_QueryJobs(ctx, jc, 0, &jobsOut, &statesOut); - ... -\end{verbatim} - -The second attribute type (``state'') selects jobs in state ``done'' because it doesn't -make sense to query running jobs on their return code. -The last attribute (``exit code'') uses the WITHIN operator. The WITHIN operator accepts an -interval\,---\,the lower bound of the interval is stored in the \texttt{value} union and the -upper bound is stored in the \texttt{value2} union. - -\partitle{Using AND, OR in query clauses} -\label{JQ-AO} -In many cases the basic logic using only conjunctions is not sufficient. -For example, if you need all your jobs running at the destination XXX or at -the destination YYY, the only way to do this with the \texttt{edg\_wll\_QueryJobs()} -call is to call it twice. The \texttt{edg\_wll\_QueryJobsExt()} call allows to make -such a~query in a single step. -The function accepts an array of condition lists. Conditions within a~single list are -OR-ed and the lists themselves are AND-ed. -%It is allowed to use only identical attributes in every standalone condition list. -%This is forced by an ``indexing'' definition, look at Sect.~\ref{ConsIndx} -%for further details. - -The next query example describes how to get all user's jobs running at -CE XXX or YYY. -\begin{verbatim} - #include - ... - edg_wll_Context ctx; - edg_wll_QueryRec *jc[4]; - edg_wll_JobStat *statesOut = NULL; - edg_wlc_JobId *jobsOut = NULL; - ... - jc[0] = (edg_wll_QueryRec *) malloc(2*sizeof(edg_wll_QueryRec)); - jc[0][0].attr = EDG_WLL_QUERY_ATTR_OWNER; - jc[0][0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0][0].value.c = NULL; - jc[0][1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - - jc[1] = (edg_wll_QueryRec *) malloc(2*sizeof(edg_wll_QueryRec)); - jc[1][0].attr = EDG_WLL_QUERY_ATTR_STATUS; - jc[1][0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[1][0].value.i = EDG_WLL_JOB_RUNNING; - jc[1][1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - - jc[2] = (edg_wll_QueryRec *) malloc(3*sizeof(edg_wll_QueryRec)); - jc[2][0].attr = EDG_WLL_QUERY_ATTR_DESTINATION; - jc[2][0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[2][0].value.c = "XXX"; - jc[2][1].attr = EDG_WLL_QUERY_ATTR_DESTINATION; - jc[2][1].op = EDG_WLL_QUERY_OP_EQUAL; - jc[2][1].value.c = "YYY"; - jc[2][2].attr = EDG_WLL_QUERY_ATTR_UNDEF; - - jc[3] = NULL; - edg_wll_QueryJobsExt(ctx, (const edg_wll_QueryRec **)jc, 0, &jobsOut, &statesOut); - free(jc[0]); free(jc[1]); free(jc[2]); - ... -\end{verbatim} - -As clearly seen, there are three lists supplied to -\texttt{edg\_wll\_QueryJobsExt()}. The first list specifies the owner of the -job, the second list provides the required status (\texttt{Running}) and -the last list specifies the two destinations. -The list of lists is terminated with \texttt{NULL}. -This query equals to the formula -\begin{quote} -\texttt{(user=NULL) and (state=Running) and (dest='XXX' or dest='YYY')}. -\end{quote} - -\partitle{User tags} -\label{JQ_ut} -\TODO{Is it really working?} -User tags can be used for marking (labelling) jobs. A user tag is -a pair of user defined \texttt{name} and \texttt{value}. - -\label{JQ_RedJobs} -For example, if all jobs marked with the user tag \texttt{color} and with its -value \texttt{red} should be retrieved, the following code can be used: -\begin{verbatim} - #include - ... - edg_wll_Context ctx; - edg_wll_QueryRec jc[2]; - edg_wll_JobStat *statesOut = NULL; - edg_wlc_JobId *jobsOut = NULL; - ... - jc[0].attr = EDG_WLL_QUERY_ATTR_USERTAG; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0].attr_id.tag = "color"; - jc[0].value.c = "red"; - jc[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - edg_wll_QueryJobs(ctx, jc, 0, &jobsOut, &statesOut); - ... -\end{verbatim} -The condition \texttt{EDG\_WLL\_QUERY\_ATTR\_USER\_TAG} in \texttt{jc[0]} -specifies that a user tag is set. Tag name is given in -\texttt{jc[0].attr\_id.tag} and the appropriate tag -value is given in \texttt{jc[0].value}. - - -Another example\,---\,jobs marked with red or green color: -\begin{verbatim} - #include - ... - edg_wll_Context ctx; - edg_wll_QueryRec jc[1][3]; - edg_wll_JobStat *statesOut = NULL; - edg_wlc_JobId *jobsOut = NULL; - ... - jc[0][0].attr = EDG_WLL_QUERY_ATTR_USERTAG; - jc[0][0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0][0].attr_id.tag = "color"; - jc[0][0].value.c = "red"; - jc[0][1].attr = EDG_WLL_QUERY_ATTR_USERTAG; - jc[0][1].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0][1].attr_id.tag = "color"; - jc[0][1].value.c = "green"; - jc[0][2].attr = EDG_WLL_QUERY_ATTR_UNDEF; - edg_wll_QueryJobsExt(ctx, (const edg_wll_QueryRec **)jc, 0, &jobsOut, &statesOut); - ... -\end{verbatim} - -And the last one (with two user tags)\,---\,jobs marked with red color and using the 'xyz' algorithm: -\begin{verbatim} - #include - ... - edg_wll_Context ctx; - edg_wll_QueryRec jc[2]; - edg_wll_JobStat *statesOut = NULL; - edg_wlc_JobId *jobsOut = NULL; - ... - jc[0].attr = EDG_WLL_QUERY_ATTR_USERTAG; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0].attr_id.tag = "color"; - jc[0].value.c = "red"; - jc[1].attr = EDG_WLL_QUERY_ATTR_USERTAG; - jc[1].op = EDG_WLL_QUERY_OP_EQUAL; - jc[1].attr_id.tag = "algorithm"; - jc[1].value.c = "xyz"; - jc[2].attr = EDG_WLL_QUERY_ATTR_UNDEF; - edg_wll_QueryJobs(ctx, jc, 0, &jobsOut, &statesOut); - ... -\end{verbatim} - -Due to performance reasons -it is not possible to make query with two tags of different type in one -or-clause. -% fakt nevim, co tahle veta znamena. ljocha -%That means that user tags are composed of two variable components -%and user tag indices depend on tag names. - -\partitle{Time attributes} - -%A time interval in which a particular state appears is attached to every job -%state. -Besides details on the job's current state the job status also carries -information when the job entered each of the distinguished states -(if ever). -This information is also queriable. - - -The following example shows how to get all jobs that were submitted in -the last 24 hours. -\begin{verbatim} - #include - ... - edg_wll_Context ctx; - edg_wll_QueryRec jc[2]; - edg_wll_JobStat *statesOut = NULL; - edg_wlc_JobId *jobsOut = NULL; - ... - jc[0].attr = EDG_WLL_QUERY_ATTR_TIME; - jc[0].op = EDG_WLL_QUERY_OP_GREATER; - jc[0].attr_id.state = EDG_WLL_JOB_SUBMITTED; - jc[0].value.t.tv_sec = time_now - (24 * 60 * 60); - jc[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - edg_wll_QueryJobs(ctx, jc, 0, &jobsOut, &statesOut); - ... -\end{verbatim} - -In this case, a record representing the necessary condition is quite -different. The \LB\ API allows to ask for jobs with a particular status at a -given time. When \LB\ server gets \texttt{EDG\_WLL\_QUERY\_ATTR\_TIME} -as a job condition, it checks \texttt{jc[0].attr\_id.state} for job state. -Note that \texttt{timenow} is a variable which contains current time in -seconds. - -It is easy to modify previous example and add another time boundary. It is then -possible to ask for all jobs with a specified state within a particular time -interval. -\begin{verbatim} - #include - ... - edg_wll_Context ctx; - edg_wll_QueryRec jc[3]; - edg_wll_JobStat *statesOut = NULL; - edg_wlc_JobId *jobsOut = NULL; - ... - jc[0].attr = EDG_WLL_QUERY_ATTR_OWNER; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0].value.c = NULL; - jc[1].attr = EDG_WLL_QUERY_ATTR_TIME; - jc[1].op = EDG_WLL_QUERY_OP_WITHIN; - jc[1].attr_id.state = EDG_WLL_JOB_SUBMITTED; - jc[1].value.t.tv_sec = time_now - (48 * 60 * 60); - jc[1].value2.t.tv_sec = time_now - (24 * 60 * 60); - jc[2].attr = EDG_WLL_QUERY_ATTR_UNDEF; - edg_wll_QueryJobs(ctx, jc, 0, &jobsOut, &statesOut); - ... -\end{verbatim} - - -\subsection{Event queries and application specific queries} -\label{ASQ} -Event queries and job queries are similar. -Obviously, the return type is different\Dash the \LB\ raw events. -There is one more input parameter -representing specific conditions on events (possibly empty) -in addition to conditions on jobs. -Some examples showing event queries -are considered in the following paragraph. - - -\partitle{All jobs marked as red} -\label{ASQ_allred} -This example shows how to select all user's jobs which were (at some time) -marked with the value red of user tag color. -\begin{verbatim} - #include - ... - edg_wll_Context ctx; - edg_wll_Event *eventsOut; - edg_wll_QueryRec jc[2]; - edg_wll_QueryRec ec[2]; - ... - jc[0].attr = EDG_WLL_QUERY_ATTR_OWNER; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0].value.c = NULL; - jc[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - ec[0].attr = EDG_WLL_QUERY_ATTR_USERTAG; - ec[0].op = EDG_WLL_QUERY_OP_EQUAL; - ec[0].attr_id.tag = "color"; - ec[0].value.c = "red"; - ec[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - edg_wll_QueryEvents(ctx, jc, ec, &eventsOut); - ... -\end{verbatim} - -This example uses \texttt{edg\_wll\_QueryEvents()} call. Two condition lists are -given to \texttt{edg\_wll\_QueryEvents()} call. One represents job conditions and -the second represents event conditions. These two lists are joined together with -logical and (both condition lists have to be satisfied). This is necessary as -events represent a state of a job in a particular moment and this changes in time. - -The \texttt{edg\_wll\_QueryEvents()} returns matched events and save them in the -\texttt{eventsOut} variable. Required job IDs are stored in the edg\_wll\_Event -structure. - -Due to the need of ``historic'' information it's impossible to address -this type of query with calling the function \texttt{edg\_wll\_QueryJobs()}, raw events has to -be retrieved instead. The example above retrieves all events marking -any user's job as ``red''. By gathering the jobid's from those events one -gets a~list of such jobs, not regarding whether their ``color'' was -changed afterwards or not (unlike straightforward \texttt{edg\_wll\_QueryJobs()} -which considers the ``current color'' only). The same applies on all -subsequent examples using the user's marking. - -\partitle{All red jobs at some time marked as green} -The next example shows how to select all jobs which are just now marked with -user tag color red, but at some time in the past they were marked as green. -\begin{verbatim} - #include - ... - edg_wll_Context ctx; - edg_wll_Event *eventsOut; - edg_wll_QueryRec jc[2]; - edg_wll_QueryRec ec[2]; - ... - jc[0].attr = EDG_WLL_QUERY_ATTR_USERTAG; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0].attr_id.tag = "color"; - jc[0].value.c = "red"; - jc[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - ec[0].attr = EDG_WLL_QUERY_ATTR_USERTAG; - ec[0].op = EDG_WLL_QUERY_OP_EQUAL; - ec[0].attr_id.tag = "color"; - ec[0].value.c = "green"; - ec[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - edg_wll_QueryEvents(ctx, jc, ec, &eventsOut); - ... -\end{verbatim} - -Jobs conditions selects all jobs with tag ``color = red'' (See example in paragraph -\ref{JQ_RedJobs}). Event conditions selects all jobs which were sometimes marked -as green\,---\,this is described in previous example \ref{ASQ_allred}. - -\partitle{All resubmitted jobs} -The next example shows how to get all (your) resubmitted jobs. -\begin{verbatim} - #include - ... - edg_wll_Context ctx; - edg_wll_Event *eventsOut; - edg_wll_QueryRec jc[2]; - edg_wll_QueryRec ec[2]; - ... - jc[0].attr = EDG_WLL_QUERY_ATTR_OWNER; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0].value.c = NULL; - jc[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - ec[0].attr = EDG_WLL_QUERY_ATTR_EVENT_TYPE; - ec[0].op = EDG_WLL_QUERY_OP_EQUAL; - ec[0].value.i = EDG_WLL_EVENT_RESUBMISSION; - ec[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - edg_wll_QueryEvents(ctx, jc, ec, &eventsOut); - ... -\end{verbatim} - -\partitle{Jobs resubmitted in the last two hours} -The next example shows how to get all user's jobs which were resubmitted in the last -2 hours. -\begin{verbatim} - #include - ... - edg_wll_Context ctx; - edg_wll_Event *eventsOut; - edg_wll_QueryRec jc[2]; - edg_wll_QueryRec ec[3]; - ... - jc[0].attr = EDG_WLL_QUERY_ATTR_OWNER; - jc[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0].value.c = NULL; - jc[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - ec[0].attr = EDG_WLL_QUERY_ATTR_EVENT_TYPE; - ec[0].op = EDG_WLL_QUERY_OP_EQUAL; - ec[0].value.i = EDG_WLL_EVENT_RESUBMISSION; - ec[1].attr = EDG_WLL_QUERY_ATTR_TIME; - ec[1].op = EDG_WLL_QUERY_OP_GREATER; - ec[1].value.t.tv_sec = time_now - (2 * 60 * 60); - ec[2].attr = EDG_WLL_QUERY_ATTR_UNDEF; - edg_wll_QueryEvents(ctx, jc, ec, &eventsOut); - ... -\end{verbatim} - - -\partitle{Complex query} -The last example illustrates the API usage on - a~meaningful but rather complex query ``which of my red jobs are heading -to a~destination that already encountered problems executing red jobs''. - -First we retrieve the information of red jobs failures. -This cannot be accomplished with a~job query because the job may -get resubmitted automatically to another computing element and terminate -successfully. Therefore we need to search for the ``historic'' -information\,---\,`Done' events with their minor status -equal to `Failed'. - -\begin{verbatim} - #include - ... - edg_wll_Context ctx; - edg_wll_QueryRec jc1[3],ec1[3]; - edg_wll_Event *failures; - - jc1[0].attr = EDG_WLL_QUERY_ATTR_OWNER; - jc1[0].op = EDG_WLL_QUERY_OP_EQUAL; - jc1[0].value.c = NULL; - jc1[1].attr = EDG_WLL_QUERY_ATTR_USERTAG; - jc1[1].attr_id.tag = "color"; - jc1[1].op = EDG_WLL_QUERY_OP_EQUAL; - jc1[1].value.c = "red"; - jc1[2].attr = EDG_WLL_QUERY_ATTR_DONECODE; - jc1[2].op = EDG_WLL_QUERY_OP_EQUAL; - jc1[2].value.i = EDG_WLL_DONE_FAILED; - jc1[3].attr = EDG_WLL_QUERY_ATTR_UNDEF; - - ec1[0].attr = EDG_WLL_QUERY_ATTR_EVENT_TYPE; - ec1[0].op = EDG_WLL_QUERY_OP_EQUAL; - ec1[0].value.i = EDG_WLL_EVENT_DONE; - ec1[1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - - edg_wll_QueryEvents(ctx,jc1,ec1,&failures); - ... -\end{verbatim} - -Unfortunately, the `Done' event itself does not contain a~complete -identification of the queue where the job was running. -This information is contained in the `Match' events. -Moreover, there may be more than one such events in the job's life cycle -as the job may have been resubmitted. -Therefore we loop over the job ID's extracted from the events returned -in the previous step, and retrieve their `Match' and `Done' events. -The \LB\ API returns sorted results therefore we can assume that `Done' -events immediately following a~`Match' belong to the same attempt to submit -the job\footnote{In reality events may get lost or delayed. -Therefore strict checking the Match-Done pairing would require analysis -of the hierarchical event sequence codes. -However, this falls beyond the scope of this document.}. - -Due to job resubmissions again -a~job may be represented several times in \verb'failures'. -Because of obvious performance reasons -it is desirable to avoid repeated queries on the same job. -On the other hand, we may rely on \LB\ queries returning data grouped -according to jobs. Therefore checking duplicities is easy. - -\begin{verbatim} - ... - edg_wll_QueryRec *jc2[2],*ec2[2]; - char *last_job = strdup(""),*this_job,**failed_sites = NULL; - edg_wll_Event *match_done; - char **failed_sites; - int n, i, j; - ... - jc2[0][0].attr = EDG_WLL_QUERY_ATTR_JOBID; - jc2[0][0].op = EDG_WLL_QUERY_OP_EQUAL; - jc2[0][1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - jc2[1] = NULL; - ec2[0][0].attr = EDG_WLL_QUERY_ATTR_EVENT_TYPE; - ec2[0][0].op = EDG_WLL_QUERY_OP_EQUAL; - ec2[0][0].value.i = EDG_WLL_EVENT_MATCH; - ec2[0][1].attr = EDG_WLL_QUERY_ATTR_EVENT_TYPE; - ec2[0][1].op = EDG_WLL_QUERY_OP_EQUAL; - ec2[0][1].value.i = EDG_WLL_EVENT_DONE; - ec2[0][2].attr = EDG_WLL_QUERY_ATTR_UNDEF; - ec2[1] = NULL; - - n = 0; - for (i=0; failures[i].type; i++) { - this_job = edg_wlc_JobIdUnparse(failures[i].any.jobId); - if (strcmp(last_job,this_job)) { - free(last_job); - last_job = this_job; - jc2[0][0].value.j = failures[i].any.jobId; - edg_wll_QueryEventsExt(ctx,(const edg_wll_QueryRec **)jc2, - (const edg_wll_QueryRec **)ec2,&match_done); - for (j=0; match_done[j].type; j++) { - if (match_done[j].type == EDG_WLL_EVENT_MATCH && - match_done[j+1].type == EDG_WLL_EVENT_DONE && - match_done[j+1].done.status_code == EDG_WLL_DONE_FAILED) - { - failed_sites = realloc(failed_sites,(n+1)*sizeof *failed_sites); - failed_sites[n++] = strdup(match_done[j].match.dest_id); - } - edg_wll_FreeEvent(&match_done[j]); - } - } - else free(this_job); - edg_wll_FreeEvent(&failures[i]); - } - free(failures); - ... -\end{verbatim} - -The API would allow to perform a~single query instead of the loop, -putting all the job ID's into a~list of OR-ed conditions. -However, as the query conditions are directly converted to a~SQL statement -we don't recommend more than approx. 10--20 atomic conditions per query. -This number can be easily exceeded in the case of this example. -On the other hand, queries containing a~``jobid equals'' clause are very -effective and the overhead of repeating them is not very high. - -Finally we can query the server for the jobs heading to one of the failing -sites. -A~job's destination is known starting from the `Ready' state, -and the query makes sense also in the `Scheduled' state (\ie\ the job reached -the LRMS queue but has not been started yet). - -\begin{verbatim} - ... - edg_wll_QueryRec *jc3[3]; - edg_wlc_JobId *unlucky_jobs; - ... /* remove duplicates from failed_sites */ - - for (i=0; i - ... - edg_wll_Context ctx; - edg_wll_Event *eventsOut; - edg_wll_JobStat *statesOut; - edg_wlc_JobId *jobsOut; - edg_wll_QueryRec **jc; - edg_wll_QueryRec **ec; - ... - jc[0][0].attr = EDG_WLL_QUERY_ATTR_USERTAG; - jc[0][0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[0][0].attr_id.tag = "color"; - jc[0][0].value.c = "red"; - jc[0][1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - jc[2][0].attr = EDG_WLL_QUERY_ATTR_STATUS; - jc[2][0].op = EDG_WLL_QUERY_OP_EQUAL; - jc[2][0].value.i = EDG_WLL_JOB_SUBMITTED; - jc[2][1].attr = EDG_WLL_QUERY_ATTR_STATUS; - jc[2][1].op = EDG_WLL_QUERY_OP_EQUAL; - jc[2][1].value.i = EDG_WLL_JOB_WAITING; - jc[2][2].attr = EDG_WLL_QUERY_ATTR_STATUS; - jc[2][2].op = EDG_WLL_QUERY_OP_EQUAL; - jc[2][2].value.i = EDG_WLL_JOB_READY; - jc[2][3].attr = EDG_WLL_QUERY_ATTR_STATUS; - jc[2][3].op = EDG_WLL_QUERY_OP_EQUAL; - jc[2][3].value.i = EDG_WLL_JOB_SCHEDULED; - jc[2][4].attr = EDG_WLL_QUERY_ATTR_UNDEF; - jc[3] = NULL; - edg_wll_QueryJobsExt(ctx, (const edg_wll_QueryRec **)jc, 0, &jobsOut, &statesOut); - - ec[0][0].attr = EDG_WLL_QUERY_ATTR_USERTAG; - ec[0][0].op = EDG_WLL_QUERY_OP_EQUAL; - ec[0][0].attr_id.tag = "color"; - ec[0][0].value.c = "red"; - ec[0][1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - ec[1][0].attr = EDG_WLL_QUERY_ATTR_USERTAG; - ec[1][0].op = EDG_WLL_QUERY_OP_EQUAL; - ec[1][0].attr_id.tag = "color"; - ec[1][0].value.c = "red"; - ec[1][1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - ec[2][0].attr = EDG_WLL_QUERY_ATTR_EVENT_TYPE; - ec[2][0].op = EDG_WLL_QUERY_OP_EQUAL; - ec[2][0].value.i = EDG_WLL_EVENT_DONE; - ec[2][1].attr = EDG_WLL_QUERY_ATTR_UNDEF; - ec[3] = NULL; - edg_wll_QueryEventsExt(ctx, (const edg_wll_QueryRec **)jc, (const edg_wll_QueryRec **)ec, &eventsOut); - ... -\end{verbatim} -\fi diff --git a/org.glite.lb.doc/src/copyright.tex b/org.glite.lb.doc/src/copyright.tex deleted file mode 100644 index 981ab62..0000000 --- a/org.glite.lb.doc/src/copyright.tex +++ /dev/null @@ -1,24 +0,0 @@ -% Taken from: -% https://twiki.cern.ch/twiki/bin/view/EGEE/EGEEgLiteSoftwareLicense -% -\vfill{} - -{\bf -Copyright} \copyright\ {\bf Members of the EGEE Collaboration. 2004. See -\href{http://www.eu-egee.org/partners/}{http://www.eu-egee.org/partners/} for -details on the copyright holders. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at - -\begin{center} -\href{http://www.apache.org/licenses/LICENSE-2.0}{http://www.apache.org/licenses/LICENSE-2.0} -\end{center} - -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. -} - diff --git a/org.glite.lb.doc/src/definitions.tex b/org.glite.lb.doc/src/definitions.tex deleted file mode 100644 index 34fcba3..0000000 --- a/org.glite.lb.doc/src/definitions.tex +++ /dev/null @@ -1,17 +0,0 @@ -\usepackage{xspace} -%\usepackage{doxygen} - -\def\LB{L\&B\xspace} -\def\JP{JP\xspace} -%\def\eg{e.\,g.} -\def\eg{for example\xspace} -\def\Eg{For example\xspace} -%\def\ie{i.\,e.} -\def\ie{that is\xspace} -\def\wrt{with respect to\xspace} -\def\Dash{---\penalty-1000} - -\long\def\TODO#1{\par\noindent\textbf{TODO:} {\sl#1}\par} -\long\def\ludek#1{} - -\hyphenation{plug-in} diff --git a/org.glite.lb.doc/src/doxygen.sty b/org.glite.lb.doc/src/doxygen.sty deleted file mode 100644 index 90f368b..0000000 --- a/org.glite.lb.doc/src/doxygen.sty +++ /dev/null @@ -1,64 +0,0 @@ -\NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{doxygen} -\RequirePackage{calc} -\RequirePackage{array} -%\pagestyle{fancyplain} -\newcommand{\clearemptydoublepage}{\newpage{\pagestyle{empty}\cleardoublepage}} -%\renewcommand{\chaptermark}[1]{\markboth{#1}{}} -%\renewcommand{\sectionmark}[1]{\markright{\thesection\ #1}} -%\lhead[\fancyplain{}{\bfseries\thepage}] -% {\fancyplain{}{\bfseries\rightmark}} -%\rhead[\fancyplain{}{\bfseries\leftmark}] -% {\fancyplain{}{\bfseries\thepage}} -%\rfoot[\fancyplain{}{\bfseries\scriptsize Generated on Tue Feb 22 11:20:54 2005 for Glite LB Client: C - Interface by Doxygen }]{} -%\lfoot[]{\fancyplain{}{\bfseries\scriptsize Generated on Tue Feb 22 11:20:54 2005 for Glite LB Client: C - Interface by Doxygen }} -%\cfoot{} -\newenvironment{CompactList} -{\begin{list}{}{ - \setlength{\leftmargin}{0.5cm} - \setlength{\itemsep}{0pt} - \setlength{\parsep}{0pt} - \setlength{\topsep}{0pt} - \renewcommand{\makelabel}{}}} -{\end{list}} -\newenvironment{CompactItemize} -{ - \begin{itemize} - \setlength{\itemsep}{-3pt} - \setlength{\parsep}{0pt} - \setlength{\topsep}{0pt} - \setlength{\partopsep}{0pt} -} -{\end{itemize}} -\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp} -\newlength{\tmplength} -\newenvironment{TabularC}[1] -{ -\setlength{\tmplength} - {\linewidth/(#1)-\tabcolsep*2-\arrayrulewidth*(#1+1)/(#1)} - \par\begin{tabular*}{\linewidth} - {*{#1}{|>{\PBS\raggedright\hspace{0pt}}p{\the\tmplength}}|} -} -{\end{tabular*}\par} -\newcommand{\entrylabel}[1]{ - {\parbox[b]{\labelwidth-4pt}{\makebox[0pt][l]{\textbf{#1}}\\}}} -\newenvironment{Desc} -{\begin{list}{} - { - \settowidth{\labelwidth}{40pt} - \setlength{\leftmargin}{\labelwidth} - \setlength{\parsep}{0pt} - \setlength{\itemsep}{-4pt} - \renewcommand{\makelabel}{\entrylabel} - } -} -{\end{list}} -\newenvironment{Indent} - {\begin{list}{}{\setlength{\leftmargin}{0.5cm}} - \item[]\ignorespaces} - {\unskip\end{list}} -\setlength{\parindent}{0cm} -\setlength{\parskip}{0.2cm} -\addtocounter{secnumdepth}{1} -\sloppy -\usepackage[T1]{fontenc} diff --git a/org.glite.lb.doc/src/doxyhack.tex b/org.glite.lb.doc/src/doxyhack.tex deleted file mode 100644 index b349b55..0000000 --- a/org.glite.lb.doc/src/doxyhack.tex +++ /dev/null @@ -1,31 +0,0 @@ -% save previous definitions for use in new macros -\let\dsection=\section -\let\dsubsection=\subsection -\let\dsubsubsection=\subsubsection - -% change the sections definition to reflect the actual hierarchy -% - section is just one in each included file -\renewcommand{\section}[1]{\dsubsubsection{#1}} -% - subsections are for member section headings (constructors, data, ...) -\renewcommand{\subsection}[2]{\ifx*#1 -\dsubsubsection*{#2}\def\zbytek{} -\else -\dsubsubsection*{#1}\def\zbytek{#2}\fi -\zbytek} -% - subsubsections are for particular class members -\def\eatbraces#1]{} -\def\dosubsubsection#1{\par - \vskip 10pt\framebox{\begin{minipage}{\linewidth}{\hangindent=20pt\noindent\bf #1\par}\end{minipage}}\vskip-2pt} -\renewcommand{\subsubsection}[2]{\ifx*#1 - \dosubsubsection{#2}\def\zbytek{} -\else\ifx[#1 - \def\zbytek{\expandafter\dosubsubsection\eatbraces} -\else - \dosubsubsection{#1}\def\zbytek{#2} -\fi\fi -\zbytek} - -%\let\ddescription=\description -%\let\denddescription=\enddescription -%\renewenvironment{description}{\list{}{\labelwidth 5cm\leftmargin 3cm}}{\endlist} - diff --git a/org.glite.lb.doc/src/egee.cls b/org.glite.lb.doc/src/egee.cls deleted file mode 100644 index 886a74a..0000000 --- a/org.glite.lb.doc/src/egee.cls +++ /dev/null @@ -1,504 +0,0 @@ -% egee.cls: -% -% $Id$ -% -% $Log$ -% Revision 1.13 2004/08/31 19:24:27 szamsu -% Fixing overfull problem in page headers. Saving the logo and reusing it later, instead of loading in again. -% -% Revision 1.12 2004/08/09 14:03:54 szamsu -% proper IST number -% -% Revision 1.11 2004/08/03 17:02:21 szamsu -% Information Society Infrastrcutures logo replacing the old IST logo -% -% Revision 1.10 2004/08/03 13:34:37 szamsu -% Removed 'compat2' option on geometry, because it has also specified -% 'scale{0.8,0.9}' for page size, which we define otherwise. Added the -% 'centering' and 'includeheadfoot' options, which were defined in -% 'compat2'. -% -% Revision 1.9 2004/07/09 16:06:52 leanne -% Removed the Lead partner which is not used in egee -% -% Revision 1.8 2004/06/03 09:56:11 leanne -% removed lead partner - -% Revision 1.8 2004/06/03 09:56:11 diana -% updated the front page -% -% Revision 1.7 2004/05/26 09:38:55 leanne -% Removed DocumentLink in pdfinfo - it was causing errors -% -% Revision 1.6 2004/05/26 08:36:58 leanne -% Updated IST number in template -% -% Revision 1.5 2004/05/24 13:25:04 diana -% added template for egee latex documents -% -% Revision 1.4 2004/05/17 10:56:51 diana -% added compat2 option to geometry and hypertex option to hyperref to get logo and links back on the page -% -% Revision 1.3 2004/02/18 18:08:48 leanne -% Modified Document identifiers to mauch the EGEE Word templates -% -% Revision 1.2 2004/02/18 17:23:21 leanne -% Changed Work Package to Activity. Included definition of Document Link. -% -% Revision 1.1.1.1 2004/02/18 11:17:44 leanne -% Initial version of EGGE LaTeX Style files based on the EDG LaTeX Style -% -% -% Revision 1.0 2004/02/17 leanne -% Took the datagrid.cls file and modified it for the EGEE project -% Original Authors: -% Frohner Akos -% Diana Bosio -% Paul Millar -% Thanks are due to Norman Gray -% -\NeedsTeXFormat{LaTeX2e} -\ProvidesClass{egee}[2002/06/20 EGEE LaTeX Class] -\typeout{EGEE LaTeX class -- 2002/06/13 Rock Lobster!} -% -%% Notes: This class file tries, as largely as possible, to copy the Microsoft -%% Word template document EDMS 2098656 v2.2. Differences and notes are listed -%% below: -%% o The Word Template uses 11pt for the main body, but 12 point -%% occasionally. Any such occurrence of 12pt is mapped into 11pt in this -%% class-file. -%% o This class inherits 11pt article. In that class Huge=30pt and -%% LARGE=22pt, which matches the required point-size for the title page. -%% o The parskip in the Word doc is exactly 1.4mm (0.7mm above and below). -%% Here we've taken the liberty of adding some glue to make things fit -%% better. -%% o The Word Template shows all the (sub)sections on the contents page in -%% capitals and subsubsections in italics. The LateX class doesn't. - -%% Interface - example of an option, should we want to use these later. -%\newif\ifmonotitle\monotitlefalse - -%\DeclareOption{mono}{\monotitletrue} - -\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}} -\ProcessOptions - - -% Inherit! -\LoadClass[11pt]{article} - -% Necessary packages: -\RequirePackage{lastpage} -\RequirePackage{tabularx} -\RequirePackage{pslatex} -\RequirePackage{times} -\RequirePackage{verbatim} -\RequirePackage{geometry} -\RequirePackage{url} - -\usepackage[hang,bf,small]{caption} - -% -% We now define a new \if command to test for PDF being enabled. -% It is important because loading graphicx overrides the definition -% of \pdfoutput and sets it to true even when PDF is not enabled. -% Use \ifpdf instead of \ifx\pdfoutput\undefined hereafter. -% - -\newif\ifpdf -\ifx\pdfoutput\undefined - \pdffalse - % \typeout{PDF _not_ defined} -\else - \pdfoutput=1 - \pdftrue - % \typeout{PDF _is_ defined} -\fi - -\ifpdf - \usepackage[pdftex, - pdfpagemode={UseOutlines},bookmarks=true,bookmarksopen=true, - bookmarksopenlevel=0,bookmarksnumbered=true, - hypertexnames=false,colorlinks,linkcolor={blue}, - citecolor={blue},urlcolor={red}, - pdfstartview={FitV}]{hyperref} -\else - \usepackage[hypertex]{hyperref} -\fi - -\ifpdf - \usepackage[pdftex]{graphicx} - \pdfcompresslevel 9 - \pdfadjustspacing 1 -\else - \usepackage[dvips]{graphicx} -\fi - -\usepackage{color} - -\def\footsize{5mm} - -%% -%% PAGE GEOMETRY DEFINITIONS -%% -% From Template file -\geometry{centering,includeheadfoot} -\geometry{a4paper,top=12.5mm,headheight=12.5mm,headsep=5mm,foot=\footsize,footskip=13.3mm,bottom=12.5mm} -\geometry{right=25mm,left=25mm} - - -% APM -- I don't think these are right, my impression is above is correct -%\geometry{a4paper,margin=0.98in,headheight=0.72in} - - -%% -%% PAGE COLOUR DEFINITIONS -%% -\definecolor{blue}{rgb}{0.1,0.1,0.5} -\definecolor{lightgrey}{gray}{0.65} - - -% paulm's prefered name ... -\def\bibname{References} - -\setlength{\parindent}{0pt} -\setlength{\parskip}{1.4mm plus 0.4mm minus 0.2mm} - -\def\@defaultfooter{ - \def\@oddfoot{\vbox to \footsize {% - {\color{blue}\hrule width \textwidth height 1pt depth 0pt}% - \vfil - \small\hbox to \textwidth{\ISTNumber% - \hfil - \hbox{\colorbox{yellow}{\MakeUppercase{\@Dissemination}}}% - \hfil - \hbox{\thepage/\pageref{LastPage}}}% - }% - }% -} - - -\def\ps@title{% - \@defaultfooter - \def\@oddhead{\hbox to \textwidth{\LargeEGEELogo\hfil\ISTLogo}} -} - -\def\ps@headings{% - \@defaultfooter - \def\@oddhead{\vbox to \headheight{% -%\hrule width \textwidth height 1pt\relax - \vbox to 0.75\headheight{% - \hbox to \textwidth{% - \hbox to 0pt{\EGEELogo\hss}% - \hfil - \hbox to 8cm{% - \vbox to 0.75\headheight{% - \vfil - \parbox{8cm}{% - \centering\color{blue}% - \textbf{\MakeUppercase{\@title}}% -\ifx\@Subtitle\@empty\else - \par\textbf{\scriptsize\@Subtitle}% -\fi - }% - \vfil - }% - \hss}% - \hfil -%\hbox to 0pt{\vrule width 1pt height 10pt depth 0pt \hss}% -%% {\scriptsize\setlength{\parskip}{0pt}\setlength{\topsep}{0pt}% -%% % \vbox to 0.75\headheight{% -%% \parbox{4cm}{x% -%% \begin{flushright}% -%% \textit{Doc. Identifier}:\\ -%% \textbf{\@DocIdentifier}\\ -%% \vfil -%% \textit{Date}: \textbf{\@Date} -%% \end{flushright}% -%% }% -%% % }% -%% }% -\hbox to 0pt{\hss\vbox to 0.75\headheight{%\hrule -\tiny%\scriptsize -\parfillskip0pt -\leftskip 0pt plus 1fil -\parskip0ex -\textit{Doc.\ Identifier}: -\par -\textbf{\@DocIdentifier} -\vfil -\textit{Date}: \textbf{\@Date} -%\hrule -}}% -% \hbox to 4cm{\scriptsize -% \vbox to 0.75\headheight{% -% \parbox{4cm}{ -% \halign{\hfill####\cr -% \textit{Doc. Identifier}:\cr -% \textbf{\@DocIdentifier}\cr -% % \noalign{\vfil} -% \textit{Date}: \textbf{\@Date}\cr -% }}% -% \vfil -% }% -% }% - }% - }% -%\hrule width \textwidth height 1pt\relax - \vfil\vskip 2.5mm\relax - {\color{blue}\hrule width \textwidth height 1pt depth 0pt}% - }% - }% -} - -\pagestyle{headings} - -\setlength{\captionmargin}{1cm} - -% image file extensions respective to the output format -\ifpdf - \DeclareGraphicsExtensions{.jpg,.pdf,.png} - \pdfcompresslevel=9 -% \pdfinfo{ /Title (\@DocumentLink) } - \pdfinfo{ /Title (EGEE) } -\else - \DeclareGraphicsExtensions{.eps} -\fi - -\def\frontboxwidth{10.6cm}% - - - -%% -%% Define our title page -%% -\AtBeginDocument{ -\pagestyle{title}% -\hbox{}% Force top of page -\vfill -{\centering - \Huge\bf\textsf{\textcolor{blue}{EGEE}}\\[20mm]% - \LARGE\sc\textsf{\bf \@title}\\[5mm]% - \ifx\@Subtitle\@empty\else - \normalsize\textsf{\@Subtitle}\\[10mm]% - \fi - \ifx\@DeliverableId\@empty\else - \LARGE\sc\textsf{\bf \@DeliverableId}\\[5mm]% - \fi -}% -\vfill -\hbox to \textwidth{ - \hfil - \vbox{ - {\color{blue}\hrule width \frontboxwidth height 1mm depth 0pt} - \hbox to \frontboxwidth{\sf - \begin{tabularx}{\frontboxwidth}{l>{\raggedright\arraybackslash}X} - Document identifier: & \textbf{\@DocIdentifier}\\[3mm] - Date: & \textbf{\@Date}\\[3mm] - Activity:& \textbf{\@Activity}\\[3mm] - Document status: & \textbf{\@DocStatus}\\[3mm] - Document link:& \textbf{\@DocumentLink}\\[3mm] - \end{tabularx} - } - {\color{blue}\hrule width \frontboxwidth height 1mm depth 0pt} - } -} -\vfill -{\sf\underline{Abstract}: \@Abstract} -\vfill -\newpage % end of the first page -\pagestyle{headings} -\setcounter{tocdepth}{3} -} % End of AtBeginningDocument - - -% -% EGEE style small-capital section titles. -% -% The numbering is aligned with the WinWord style, -% although it is not common in the english typography... -% -\newcommand{\sectionbreak}{\newpage} -\renewcommand{\thesection}{\arabic{section}.} -\renewcommand{\thesubsection}{\thesection\arabic{subsection}.} -\renewcommand{\thesubsubsection}{\thesubsection\arabic{subsubsection}.} - -\renewcommand\section{\@startsection {section}{1}{\z@}% - {-3.5ex \@plus -1ex \@minus -.2ex}% - {2.3ex \@plus.2ex}% - {\normalfont\Large\bfseries\sffamily\scshape}} - -\renewcommand\subsection{\@startsection{subsection}{2}{\z@}% - {-3.25ex\@plus -1ex \@minus -.2ex}% - {1.5ex \@plus .2ex}% - {\normalfont\large\bfseries\sffamily\scshape}} -\renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}% - {-3.25ex\@plus -1ex \@minus -.2ex}% - {1.5ex \@plus .2ex}% - {\normalfont\normalsize\bfseries\sffamily\scshape}} - - - -%% APM NEED TO REDEFINE section -%\titleformat{\section}{\Large\bfseries\sffamily\scshape}{\thesection}{1em}{} -%\titlecontents{section} [2em] {\vspace*{4pt}} -% {\large \sc \bfseries \contentslabel{2em}} -% {\large \sc \bfseries \hspace*{-2em}} -% {\large \textbf{\titlerule*[1ex]{.}\contentspage}} [\vspace*{4pt}] - -%\titleformat{\subsection}{\large\bfseries\sffamily\scshape}{\thesubsection}{1em}{} -%\titlecontents{subsection} [5em] {} -% {\sc \contentslabel{3em}} -% {\sc \hspace*{-3em}} -% {\titlerule*[1ex]{.}\contentspage} - - -% -% common constants -% -\def\ISTNumber{INFSO-RI-508833} -\newsavebox{\@EGEELogo} -\savebox{\@EGEELogo}{\includegraphics[height=0.75\headheight]{egee}} -\def\EGEELogo{\usebox{\@EGEELogo}} -\def\LargeEGEELogo{\includegraphics[height=\headheight]{egee}} -\def\ISTLogo{\includegraphics[height=\headheight]{isi}} - -% -% parameters to be supplied by the author -% -\def\Subtitle#1{\gdef\@Subtitle{#1}} -\gdef\@Subtitle{\@latex@warning@no@line{No \noexpand\Subtitle given}} - -\def\DeliverableId#1{\gdef\@DeliverableId{#1}} -\gdef\@DeliverableId{\@latex@warning@no@line{No \noexpand\DeliverableId given}} - -\def\DocIdentifier#1{\gdef\@DocIdentifier{#1}} -\gdef\@DocIdentifier{\@latex@warning@no@line{No \noexpand\DocIdentifier given % - (e.g. EGEE-JRA1-TEC-edmsId-v0-1)}} - -\def\Date#1{\gdef\@Date{#1}} -\gdef\@Date{\@latex@warning@no@line{No \noexpand\Date given % - (e.g. 01/01/2004)}} - -\def\Activity#1{\gdef\@Activity{#1}} -\gdef\@Activity{\@latex@warning@no@line{No \noexpand\Activity given % - (e.g. JRA1 Middleware Engineering and Integration )}} - -\def\DocStatus#1{\gdef\@DocStatus{#1}} -\gdef\@DocStatus{\@latex@warning@no@line{No \noexpand\DocStatus given % - (e.g. DRAFT, WORKING, DELIVERED)}} - -\def\Dissemination#1{\gdef\@Dissemination{#1}} -\gdef\@Dissemination{\@latex@warning@no@line{No \noexpand\Dissemination given % - (e.g. PUBLIC, INTERNAL, ...)}} - -\def\DocumentLink#1{\gdef\@DocumentLink{#1}} -\gdef\@DocumentLink{\@latex@warning@no@line{No \noexpand\DocumentLink given % - (e.g. http://cern.ch)}} - -\long\def\Abstract#1{\gdef\@Abstract{#1}} -\gdef\@Abstract{\@latex@warning@no@line{No \noexpand\Abstract given}} - -%% -%% Define the abstract using an environment abstract - -% -% This will produce the mailto link in the PDF file -% -% -% We use the URL package, which does this nicely. The old way (\HTTP) was -% a bit buggy as it had problems with '~'s and '_'s -% -\urlstyle{sf} -\ifpdf - \newcommand{\Email}[1]{\href{mailto:#1}{<{#1}>}} - \newcommand{\HTTP}[1]{\href{#1}{\url{#1}}} -\else - \newcommand{\Email}[1]{\textsf{<{#1}>}} - \newcommand{\HTTP}[1]{\url{#1}} -\fi - - -% -% We now redifine \part and \section so that the table of contents -% has the sections/parts in upper case. -% -% Note: need to use \uppercase because \MakeUppercase is not robust -% -\def\@part[#1]#2{% - \ifnum \c@secnumdepth >\m@ne - \refstepcounter{part}% - \addcontentsline{toc}{part}{\thepart\hspace{1em}\uppercase{#1}}% - \else - \addcontentsline{toc}{part}{\uppercase{#1}}% - \fi - {\parindent \z@ \raggedright - \interlinepenalty \@M - \normalfont - \ifnum \c@secnumdepth >\m@ne - \Large\bfseries \partname\nobreakspace\thepart - \par\nobreak - \fi - \huge \bfseries #2% - \markboth{}{}\par}% - \nobreak - \vskip 3ex - \@afterheading} - -\def\@sect#1#2#3#4#5#6[#7]#8{% - \ifnum #2>\c@secnumdepth - \let\@svsec\@empty - \else - \refstepcounter{#1}% - \protected@edef\@svsec{\@seccntformat{#1}\relax}% - \fi - \@tempskipa #5\relax - \ifdim \@tempskipa>\z@ - \begingroup - #6{% - \@hangfrom{\hskip #3\relax\@svsec}% - \interlinepenalty \@M #8\@@par}% - \endgroup - \csname #1mark\endcsname{\uppercase{#7}}% - \addcontentsline{toc}{#1}{% - \ifnum #2>\c@secnumdepth \else - \protect\numberline{\csname the#1\endcsname}% - \fi - \texorpdfstring{\uppercase{#7}}{#7}}% - \else - \def\@svsechd{% - #6{\hskip #3\relax - \@svsec #8}% - \csname #1mark\endcsname{\uppercase{#7}}% - \addcontentsline{toc}{#1}{% - \ifnum #2>\c@secnumdepth \else - \protect\numberline{\csname the#1\endcsname}% - \fi - \texorpdfstring{\uppercase{#7}}{#7}}}% - \fi - \@xsect{#5}} - -% \addcontentsline{toc} expands to \contentsline{NAME} -% which in turn expands to \l@NAME. So, to specify -% the table of contents, we must define \l@chapter, \l@section, -% \l@subsection, ... ; to specify the list of figures, we must define -% \l@figure; and so on. Most of these can be defined with the -% \@dottedtocline command, which produces a contents line with dots -% between the title and the page number. It works as follows: -% -% \@dottedtocline{LEVEL}{INDENT}{NUMWIDTH} -% LEVEL : An entry is produced only if LEVEL < or = value of -% 'tocdepth' counter. Note, \chapter is level 0, \section -% is level 1, etc. -% INDENT : The indentation from the outer left margin of the start of -% the contents line. -% NUMWIDTH : The width of a box in which the section number is to go, -% if TITLE includes a \numberline command. -% - -\def\l@part{\@dottedtocline{1}{4em}{2.0em}} -\def\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} -\def\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} -\def\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} -\def\l@subparagraph{\@dottedtocline{5}{10em}{5em}} - diff --git a/org.glite.lb.doc/src/events.tex.T b/org.glite.lb.doc/src/events.tex.T deleted file mode 100644 index 6fe5c52..0000000 --- a/org.glite.lb.doc/src/events.tex.T +++ /dev/null @@ -1,31 +0,0 @@ -@@@{ -gen qq{ -% !! Automatically generated file. Do not edit. -% !! Change the corresponding template file $ARGV -}; -@@@} - -\begin{tabularx}{\textwidth}{l>{\bfseries}lX} -@@@{ -my $flesh = 'gLite'; #XXX -my $fleshno = 0; -my $eventno = $fleshno; -for my $e (sort { $event->{order}->{$a} <=> $event->{order}->{$b} } - $event->getTypes) { - my $u = uc $e; - my $c = getTypeComment $event $e; - - if ($flesh ne $event->{flesh}->{$e}) { - $flesh = $event->{flesh}->{$e}; - gen "% new flesh $flesh \n"; - $fleshno += 100; - $eventno = $fleshno; - } - $eventno++; - gen "$eventno. \& $e: \& $c \\\\ \n"; -} -@@@} -\end{tabularx} - -\endinput - diff --git a/org.glite.lb.doc/src/frontmatter.tex b/org.glite.lb.doc/src/frontmatter.tex deleted file mode 100644 index 732dcec..0000000 --- a/org.glite.lb.doc/src/frontmatter.tex +++ /dev/null @@ -1,40 +0,0 @@ -\begin{center} -{\bf Delivery Slip} -\end{center} -\begin{tabularx}{\textwidth}{|l|l|l|X|X|} -\hline - & {\bf Name} & {\bf Partner} & {\bf Date} & {\bf Signature} \\ -\hline -{\bf From} & & & & \\ -\hline -{\bf Reviewed by} & & & & \\ - -\hline -{\bf Approved by} & & & & \\ -\hline -\end{tabularx} - -\begin{center} -{\bf Document Change Log} -\end{center} - -\begin{tabularx}{\textwidth}{|l|l|X|X|} -\hline -{\bf Issue } & {\bf Date } & {\bf Comment } & {\bf Author } \\ \hline - -\hline -\end{tabularx} - -\begin{center} -{\bf Document Change Record} -\end{center} - -\begin{tabularx}{\textwidth}{|l|l|X|} -\hline -{\bf Issue } & {\bf Item } & {\bf Reason for Change } \\ \hline - -\hline -\end{tabularx} - -\input{copyright} -\clearpage diff --git a/org.glite.lb.doc/src/images/LB-components-gather.pdf b/org.glite.lb.doc/src/images/LB-components-gather.pdf deleted file mode 100644 index 479548860df6aa808d48cc23d6c989064044f7c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48193 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

mx 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 diff --git a/org.glite.lb.doc/src/images/isi.pdf b/org.glite.lb.doc/src/images/isi.pdf deleted file mode 100644 index 4ff331cbe7bf18fb7ded3fc20ca7e25c9d9ca6ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19672 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 F!e4Asw7LKQ diff --git a/org.glite.lb.doc/src/images/seqtree.pdf b/org.glite.lb.doc/src/images/seqtree.pdf deleted file mode 100644 index 33ea80248b0aeb7757fc150e6c22a6d5ce2d68b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5715 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 Dp0uyF diff --git a/org.glite.lb.doc/src/images/wms2-jobstat.pdf b/org.glite.lb.doc/src/images/wms2-jobstat.pdf deleted file mode 100644 index fb3464807c597633804ac29c6f9a35a1e34a40fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7328 zcmbVR2{e`4+pmNiWF}*Wl#Iuj&GV2r#xiDh%p8tmCR3%%Q$$gQZir;e7?BK_37JFY zsp3i*zW2CvyZ8TJ>s#M<)_U!|pJ_k)+53H;{d-*0R#Fj$ioih^TUKJTKq#;%7-!`O zl9GaGU|sD9_FyzX(S@iuI1{jVFhs@Kl7LmhTH|c6GBO|!0v>DW0`hrOXrvy?fuw!C zU9@1Gpg8k&w54+m#B)1(Sc8$f@#JUuQ`Xv34U^Bf*22f7?`E)eTDH3kZGSW${ao_X zsfcWWX|Mg@=UCwCYu~cHq9AYCCwYD|1xp^P_glL1Uy4>P4F|4)?I)LMb2Eo~9Scqt zS(cE*74B|68cEz9wc9&Cu2uJCulw#^W@*^+!Qztx1)0pDcfM~iH?Qz3^K;Ex$- zeY#-MgT0LIHka1N@tR%9Y&vnZhO~LLvuSnjeF|m56UFth9S$8DGB>Lq?zZD~ew9Jn zv;7eBnDer={>JsGkt!r&MQ&n|y|u6R*7nyr@rV(NF!ejxg)Oh>M?dZE_#+vkl%8y? z-YC&Uh&Tp|o=$y-%%{lQK-pgnvRT89Fizv4x57J=MMU6a;E2a7{8kHH!?u#H3}@ znHuYLmzYwzuT!bh`BKF>?>6STYR!h__KC&{nA9yw8Qy4C4Blk^L(E43X?OKPv3POc5~G$XX9Xzm!+aq|Xv zMlIi%lHrA5HC~Ym2Tsd~A%v0(=YF^_c@he;3`_*{X??@87DG!1&>YTVD~$zn_d~q% z^To;J8k(3%>9WJH_Y3J!5(cyn1+Xq5%iQ<=_%N%+-a|c6J|+d1+`Mci|o>AG6$@aPoI5N(GR6_>%%zi4Cf_49Re2RB)+g(9V5p}Jf(xzyz3h_Dc-t_RdD{9Qvy zLh+3kJ_+%fW6vKLo}6XAsm8%MBt|hr{e^ex{>GmUDW_hRX1b6jeJyEgRX^44S>QYv zP=1?VJmvay0{T($LCQ_~AG#wwxW&f?!@{LGv~9*2VB~gytT(bXUEtm2lRT09(37m4 z&VulF)V?BLY)mTXmkldW1DzATB%U^uu8}U>13TcKIr4;L(@^#p3PJU;3x=wcH;uPv z*x9qm`tD!{#4?lLO6WhQ_CzX7SlIi^m0Cny6+Y0d7i?U+mZZxiwJ6pZdJ3x)kjvn# zLA_{bhvl*sMn}K|_s-@cS`(4sYYSZ#XQ& zhlUfA-B*}`GL5%#b~-${TDz2ne>gCIfxgzbQ2g|Mv7aBVZ~v{v^wW8!`MQ-0L!Q|| z9&2fF_|BJB$yLQR86Fdqa$aVV;#2I5AbsakZ8_4|+g1{aJ)+Xl4;OEb$+xEeF+AO9 zM`o~|&Y)?Q&EofY@KGdtb?I)mq2Fl({S1qZD4|Oj3-0)5FMZz;y!viq+^06P;;{;C zPAdvA>ekJMMKAXD{rg2Ui?cpc(IkCheAB9Ol`nA2rjB3DFe_07f$upn^|1f6<QvKu0v>-+A+zuNxMkZE1&vV6Zk0mI^o@u!$(ZMu?)pa3sPM1kuG2 zfGi3Y1*Gs;R{|JLOtAnN>w)vcTVp+dz!~q6mxuiymNN9@hl{q$B@`B7fy|z#8Bn_|QWSFht$K#sh2uBKofj zG6e$`Jc%ZMQ-%IgJ4JsmA|TgvA!;^&n+^nD zh?X`6429@nz@j3eu)qBk|CbTsLY1%{)_4au0uB!$4iBwq=&NJ2^#!jvxL`emb#X41 zu7^AYAnGQY8o zL7)J(qP-;^*u%>ZH{v!sV{Hk4_3*@*Ao36eh$2J@q6|@mT!E-TG$0s=CPWLO3(C)_J;TM%{H&hr$zBB_k}Q-8Yyk1Xf=}7Ne2gh@~3JJ zY*>6ULI$dnyfDVh_4tzdeOE0tbsYgFfyId6`+emyGB}^amJv)}T+?ESMzerJ#IAOP z)J2mE(J6day`Q~Ln0~tW$PE~BLvuiDydQ9M6lc2X zl0A_%s9mHz%71?8x+D1(+t#J>P`_AX)xw-Xy&^sN0WyIHU!Mi!?Ia17M==KDGqZ9_ zrL-nK_^y5H2r#&L_Tb)o*Oczlqo;*81^kjItc-^{SMCaSdnPUq1RU(#Ax$8y15#Th zNMKw{&TETe?Ox!QSN-a@uC7sTuzYSOd>k2@eJdIbv6_6kw}m937fF}b(_c<^9E>3! z=!oWtJnLd@r^uQ~;?nQ17iol4tf1+!dt*L@@;LL68-MGk3nlK-n8=8^1B`F7fobge zHU}GD7n|3oAu8WqESKZm5_qq8@{4y@oywJAWG_y=?7d(X-9AE<^Gz*@a+ipX#3|3lx5e8wuL=;xWjOZ zqxSh9dS!=)@NDVI*=e83);2Y+h>mSATJ)&Rf9>s5IU9~(MIaR@-5Vt%hVkU_n5?1?1s8=0sAt&eWB#Se_4Nxx%v8#_Hk*Qd4Lr`~K6 zA@dQ*ec59HbHu|i__sgq1X6d0SnR$tI3L||OMNbPra&kvzIyHA3G3Tw8JA^^gG=J_ zhU1Ew-xs%Y76ofq>-FjkOogNsZUr)3Z;fJ$iQ_qM0JnQzP;I_}v!pod(XvlvYzNy( zid!8?UI)b&KG<7`c{ zV}(BT_4r{jB>bAAaPj9?3rmUGqLJsJr97I#4ePm!dacHy98FzhaD}bt_}7I~=nln(uXdM3ZY0qNghYtwerCmM%k=3xI%TEtEL+8$|B9hJJIX9%61^c+ zR&BReCH=T|+u&pOnbQmN#ceo4%(uaY^u^b$7tXA@++zo^Yx&;_?r!W_f5T+9=cC~1 zW;mAOs5d-mJzlBZKM!6fv5jjfJY}x4De3;z)Sf0{IXS3+RY1xN)z-*s>h@tE{bP#E zxly(d9-SzaWctJ>R7y96n9a>;I%3ff5>MSIT$6xK)9TF@-ZUjn(0hsGC%Npi`*v|R zBIZyeo#8=U-y=56Y8mT8t?PaUbk#$u7&lF)72hiG3X$@^-507q|K~m4g>TVeX1DZ3 ztnD@65By~EhuA-nUcOc@&Br4PN5ds0#eM59aWrS`b+*;fS)Z5UMl1E3#%g6)YCU4Z z)dUZV59V@?1wNBIujzrXmefQn==I1G#lbJ0GIzLul zQcB9S)XLXV6*p#AnqnsT3%dENGGs*P|JXteL`zksrQr1g{3l!eZt>rm=W`AaoZJ4o zO}$L(-y_GkNJbME{cUAtFZJ?gP#*8ivxYws>b!G5I3}PYAHvu$s&u2SIM?%1ZqD9r zl`xcIg8LJ2UI4>#iXV%4c6@y=t#+g18!PKwfoST5OO!(m(Z05wXT^~CQqn=1yvO1M zk!_M%Vcnki2NCZZ-_t$M$<_|=v~+RD8j(n}p9=lZVQSNF67bQh$F~1A#YN+6&BxC# z-{p?DL7hr4z+j%8Gs~j5JyNDRX(5|)``J~?DvJtr%)!!feYKy+ypL_@*kt;~#AC8L zhKYW7hF5$6tVL+Og+hDgW@lf&Pi^V?gFRk}FwI3y*71Uk!Mh#X54P1C`zuW_lR~2G zI$+6~=qt%ck}O2@CW?$9(>BNEQ z;iy@jq7v~8>ZWI%4Y=Dw;q$|n0y`exyLG_)NrE~szpS{dxFOj*F?!mtHbjkDhioc3 zLr$@k#x#hPlO;CBd~uhd`tG|Ade12a znv&7aZ~J8XUgeWjPU&y38IA3oAZR6@X{oAHx+YM~J8Iu?F?CM=^B`vlSH8Nk`-0pW z`PW$lMk+$?p~`ls`hw?2rN;0Qzrb=3wpd}cCcb#zDNH2TBuDHabIkUXjXZnc+X?$} z?#4&-{-5H!DlH!5Chn|tO|IWDZC=w$NP#rRW_??^ov3J_`S=%$Ib$Uk;cbw7ElEE~KiO{}RUlFu`tY&24ej%C@T*>Of&P^*^Doi2YP`KQ z_rA0ndZ&jMwj0auW_R70A#C3JdWSwok#t8QJ){hW_U=mI&x>Q7C0(EQ&0!In7wI#$ zU8z;=-{{tnA-|D*27^Y8BNJE39p}7s`YmVMtonw%7~8-0-S4gGt9T;E_#sm&dr^?^ zM9b(q{_IXsdMizSs-*I1-ymjl?8YE&*8;xbdUkj5R^^P%-nr_ns4dO*Q3^67p(*~| z1sl);eA$Y(l$C1aSwA@w17j5GQf|A23X9+%9MMs(RP}9d45%)FD$lj(^8p|ED z`mIS1?jXj`OH|FqZ*5tORWHi5LUqOpSH+~x+0k5N4t($LbWPh!UDIFHN!{eSucvQe zPQmNivmZ**16`VC(!T~y(~=dP?GnD5SlqZyGryoK;{&zdY?xiRvivruQXvx3GdCYGQ+bAFKt1;KWw|0MiFOm!|2g<*KAAVD~iERSNh?FpB6~(lQdn!d~8dy zFv)wMhvzrKH&DINrP3`N)_Rj?cS9SP-cW{f)r+UQp|XXuy5r{eJ+=W`C z_Ei%GtXXHSYJq%$Visw>yCwUy3@&U&DHew;CrHzIDH|>r?reOBU$746(`A1+h7Qa> zr#;b8ZMzHF3*EP@8ufj;e6@ROOTEBElagiPl%+7Cd-o@$-x9M(?PRSRo$?;Uq$FRD zh+_YV!4IJe5%0iZFw`-~Jw(MvAV?PhA_CFh5Yiz`KITG2K~N$n|D8`9|2GH)QLyyD z5)milzo5-Sw13F_3*ACR4>8)`SQSi!vcv*9-h)6ygkU%fqG5T|hasVmL-^=n0s;Ue z7!HR6bpkOkQdIQt5d+3(wAdk?$Rj?7JQRWmI1k6f7KRoB9qasWEg(yj2O|L+#}5L5 z0Exq(U^EN{MxoG$&tV^kGZKk9q!Y)7K8T6`B?s`tj`{!(bSy{IC-zYQpQuB8#1V*J zeIlJ`hv);bMWDoqYXTki0Xd@ofIq)lBK>$xzkCN|h<##gj(ES;Pn3rPejTpyD2_xQ zj%^TaBg6oG;ygf$L_iP0`(Yf3vHbr%hx_;c)crO8?`wq;<9Ou%aSH|fJ&w)cI*G9X zVhucp^B>C*+hbo4NFW|ZXXSA1N3n&90z!v>h>`&3*9knf{NGxl>@ofKK0pKBsNbeN zp8o&P9y&lgQinQd)UPER+c-W_L>V~n{vOkh+CzQf@%slII3mBsN5|#pIGFxcpEQ^#3@D@hiw1@Nha6N4^&fJgqEMiE_fK7@7~((V zfFJ;0#DB`cpyI&i>7O*Dm^e^O`Zw)A=Rk_Vfhyy_4!Cl07D62FOHh?=V{4*XXs6R2c)5G?V8!>FRf(W0P>7nQYCK>q_Io)r!N diff --git a/org.glite.lb.doc/src/lbjp.bib b/org.glite.lb.doc/src/lbjp.bib deleted file mode 100644 index dd164b4..0000000 --- a/org.glite.lb.doc/src/lbjp.bib +++ /dev/null @@ -1,709 +0,0 @@ - -@InProceedings{ condor, - author = "Michael Litzkow and Miron Livny and Matthew Mutka", - title = "{C}ondor - A Hunter of Idle Workstations", - booktitle = "Proceedings of the 8th International Conference of - Distributed Computing Systems", - year = "1988", - month = "June" -} - -@InProceedings{ gram, - author = "K. Czajkowski and I. Foster and N. Karonis and C. - Kesselman and Martin S. Smith and S. Tuecke", - title = "A resource management architecture for metacomputing - systems.", - booktitle = "Proceedings of the IPPS/SPDP Workshop on Job Scheduling - Strategies for Parallel Processing", - year = "1988", - pages = "62-82" -} - -@InProceedings{ lsf, - author = "S. Zhou", - title = "LSF: Load sharing in large-scale heterogenous distributed - systems", - booktitle = "Proceedings of the Workshop on Cluster Computing", - year = "1992" -} - -@Misc{ dce, - author = "Open Group CAE Specification", - title = "DCE: Remote Procedure Call", - howpublished = "ISBN 1-85912-041-5", - year = "1994" -} - -@Misc{ pbs, - author = "Henderson, R. and Tweten, D", - title = "Portable Batch System: External reference Specification", - howpublished = "NASA, Ames Research Center", - year = "1996" -} - -@Article{ globus, - author = "I. Foster and C. Kesselman", - title = "Globus: a metacomputing infrastructure toolkit.", - journal = "International Journal of Supercomputer Applications", - year = "1997", - volume = "11", - number = "2", - pages = "115-128" -} - -@Misc{ ulm, - author = "J. Abela and T. Debeaupuis", - title = "Universal Format for Logger Messages", - howpublished = "IETF Internet Draft", - year = "1997" -} - -@InProceedings{ autopilot, - author = "R.L. Ribler and J.S. Vetter and H. Simitci and D.A. Reed", - title = "Autopilot: adaptive control of distributed applications", - booktitle = "Proceedings of the Seventh IEEE Symposium on - High-Performance Distributed Computing", - year = "1998", - pages = "172-179" -} - -@InProceedings{ gsi, - author = "I. Foster and C. Kesselman and G. Tsudik and S. Tuecke", - title = "{A Security Architecture for Computational Grids}", - booktitle = "Proceedings of the 5th ACM Conference on Computer and - Communications Security Conference", - year = 1998, - pages = "83-92" -} - -@InProceedings{ classad, - author = "Rajesh Raman and Miron Livny and Marvin Solomon", - title = "Matchmaking: Distributed Resource Management for High - Throughput Computing", - booktitle = "Proceedings of the Seventh IEEE International Symposium on - High Performance Distributed Computing", - year = "1998" -} - -@Article{ nws, - author = "R.Wolski and N. Spring and J. Hayes", - title = "The network weather service: a distributed resource - performance forecasting service for metacomputing", - journal = "J. Future Generation Comput. Syst.", - year = "1999", - volume = "15", - number = "(5/6)", - pages = "757-768" -} - -@Misc{ tls, - author = "T. Dierks and C. Allen", - title = "The {TLS} {P}rotocol {V}ersion 1.0", - howpublished = "IETF RFC 2246 (Standards Track)", - year = 1999, - month = "January" -} - -@Misc{ gssapi, - author = "{J. Linn}", - title = "{Generic Security Service Application Program Interface - Version 2, Update 1}", - howpublished = "IETF RFC 2743", - year = "2000", - month = "January" -} - -@TechReport{ lbdraft, - author = {M. Ruda and A. Krenek and L. Matyska and J. Pospisil and - M. Vocu and J. Sitera}, - title = {Logging and bookkeeping architecture}, - institution = {EU DataGrid}, - year = {2001}, - note = {Part of Deliverable D1.1 WP1 Report on current - technology} -} - -@InProceedings{ mds2, - author = "K. Czajkowski and S. Fitzgerald and I. Foster and C. - Kesselman.", - title = "Grid Information Services for Distributed Resource - Sharing.", - booktitle = " Proceedings of the Tenth IEEE International Symposium on - High-Performance Distributed Computing (HPDC-10)", - year = "2001", - month = "August", - publisher = "IEEE Press" -} - -@Misc{ gma, - author = "B. Tierney and R. Aydt and D. Gunter and W. Smith and - Valerie Taylor and R. Wolski and M. Swany.", - title = "A Grid Monitoring Service Architecture.", - howpublished = "Global Grid Forum Performance Working Group", - year = "2001" -} - -@Misc{ rgma, - author = "S. Fisher", - title = "Relational Model for Information and Monitoring", - howpublished = "Technical Report GWD-Perf-7-1, GGF", - year = "2001" -} - -@InProceedings{ mercury, - author = "Zoltan Balaton and Peter Kacsuk and Norbert Podhorszki and - Ferenc Vajda.", - title = "From Cluster Monitoring to Grid Monitoring Based on GRM", - booktitle = "In proceedings 7th EuroPar2001 Parallel Processings, - Manchester, UK.", - year = "2001", - pages = "874-881" -} - -@Article{ siena, - author = "Antonio Carzaniga and others", - title = "Design and evaluation of a wide-area event notification - service", - journal = "ACM Transactions on Computer Systems", - year = "2001", - volume = "19", - number = "3", - pages = "332-383" -} - -@InProceedings{ maui, - author = "D. Jackson and Q. Snell and M. Clement", - title = "Core algorithms of the Maui scheduler", - booktitle = "Proceedings of the 7th Workshop on Job Scheduling - Strategies for Parallel Processing", - year = "2001" -} - -@Misc{ ggfxml, - author = "W. Smith and D. Gunther and D. Quesnel", - title = "A simple xml producer-consumer protocol", - howpublished = "Grid Working Document GWD-Perf-8-2, Global Grid Forum, - Performance Working Group", - year = "2001" -} - -@TechReport{ lbdraft2, - author = {M. Ruda and A. Krenek and L. Matyska and J. Pospisil and - M. Vocu and J. Sitera}, - title = {Logging and bookkeeping architecture for {D}ata{G}rid - {R}elease 2}, - institution = {EU DataGrid}, - year = {2002}, - note = {Part of Deliverable D1.2 Definition of architecture, - technical plan and evaluation criteria for scheduling, - resource management, security and job description} -} - -@InProceedings{ code, - author = "W. Smith", - title = "A System for Monitoring and Management of Computational - Grids.", - booktitle = "In Proceedings of the 2002 International Conference on - Parallel Processing", - year = "2002" -} - -@Misc{ hawkeye, - title = "HawkEye: A Monitoring and Management Tool for Distributed - Systems", - howpublished = "\url{http://www.cs.wisc.edu/condor/hawkeye}", - year = "2002" -} - -@InProceedings{ chep03, - author = {G. Avellino et.al.}, - title = {{The first deployment of workload management services on - the EU DataGrid testbed: feedback on design and - implementation}}, - booktitle = {Computing in High Energy and Nuclear Physics (CHEP03)}, - year = {2003}, - note = {La Jolla, Ca, USA, March 2003}, - fauthor = {G. Avellino, S. Beco, B. Cantalupo, F. Pacini, A. - Terracina, A. Maraschini, D. Colling, S. Monforte, M. - Pappalardo, L. Salconi, F. Giacomini, E. Ronchieri, D. - Kouril, A. Krenek, L. Matyska, M. Mulac, J. Pospisil, M. - Ruda, Z. Salvet, J. Sitera, M. Vocu, M. Mezzadri, F. Prelz, - A. Gianelle, R. Peluso, M. Sgaravatto, S. Barale, A. - Guarise, A. Werbrouck} -} - -@Article{ alien, - author = "P. Saiz and others", - title = "{AliEn - ALICE environment on the GRID}", - journal = "{Nuclear Instruments and Methods in Physics Research, - Section A}", - year = "2003", - volume = "502", - number = "2-3", - pages = "437-440", - fauthor = { P. Saiz, L. Aphecetche, P. Buncic, R. Piskac, J.E. - Revsbech, V. Sego} -} - -@InProceedings{ rgma2, - author = "A. Cooke and others", - title = "R-GMA: An information integration system for grid - monitoring", - booktitle = "Proc. of the 11th International Conference on Cooperative - Information Systems", - year = "2003" -} - -@InProceedings{ netlogger, - author = "B. Tierney and D. Gunter", - title = "NetLogger: a toolkit for distributed system performance - tuning and debugging", - booktitle = "Proceedings of the IFIP/IEEE Eighth International - Symposium on Integrated Network Management (IM 2003)", - year = "2003", - pages = "97-100", - publisher = "Kluwer", - bolume = "246 of IFIP Conference Proceedings" -} - -@InProceedings{ monalisa, - author = "H.B. Newman and I.C. Legrand and P. Galvez and R. Voicu - and C. Cirstoiu", - title = "MonALISA: a distributed monitoring service architecture", - booktitle = "Computing in High Energy and Nuclear Physics (CHEP03), La - Jolla, CA", - year = "2003" -} - -@InProceedings{ gridrm, - author = "M.A. Baker and G.C. Smith", - title = "GridRM: an extensible resource monitoring system", - booktitle = "Proceedings of the IEEE International Cluster Computing - Conference", - year = "2003", - pages = "207-214" -} - -@InProceedings{ gridlab, - author = "Zoltan Balaton and Gabor Gombas", - title = "Resource and Job Monitoring in the Grid", - booktitle = "Proc. of the Euro-Par 2003 International Conference, - Klagenfurt", - year = 2003 -} - -@Misc{ rgmacms, - author = "D. Bonacorsi and D. Colling and L. Field and S. Fisher and - C. Grandi and P. R. Hobson and P. Kyberd and B. MacEvoy and - J. J. Nebrensky and H. Tallini and S. Traylen", - title = "Scalability Tests of R-GMA Based Grid Job Monitoring - System for CMS Monte Carlo Data Production", - howpublished = "IEEE NSS Conference, Oregon, USA", - year = "2003", - month = "21-24 October" -} - -@Misc{ xacml, - author = "{OASIS Standard}", - title = "{eXtensible Access Control Markup Language (XACML), - Version 1.0}", - year = 2003, - month = "February" -} - -@InProceedings{ gacl1, - author = "L. Cornwall and J. Jensen and D. Kelsey and A. McNab", - title = "{EU DataGrid and GridPP authorization and access control}", - booktitle = "Proceedings of the UK e-Science All Hands Meeting", - year = "2003", - pages = "382--384" -} - -@Misc{ glue, - author = "S. Andreozzi and M. Sgaravatto and C. Vistoli", - title = "Sharing a conceptual model of Grid resources and services", - howpublished = "Proceedings of the Conference for Computing in High Energy - and Nuclear Physics (CHEP03)", - year = "2003" -} - -@InProceedings{ perf, - author = "Xuehai Zhang and Jeffrey L. Freschl and Jennifer M. - Schopf", - title = "A Performance Study of Monitoring and Information Services - for Distributed Systems", - booktitle = "12th IEEE International Symposium on High Performance - Distributed Computing (HPDC-12 '03)", - year = "2003" -} - -@InProceedings{ glite, - author = "E. Laure and F. Hemmer and F. Prelz and S. Beco and S. - Fisher and M. Livny and L. Guy and M. Barroso and P. Buncic - and P. Kunszt and A. {Di Meglio} and A. Aimar and A. Edlund - and D. Groep and F. Pacini and M. Sgaravatto and O. Mulmo", - title = "Middleware for the next generation Grid infrastructure", - booktitle = "Computing in High Energy Physics and Nuclear Physics (CHEP - 2004)", - year = 2004 -} - -@Article{ jgc, - author = {G. Avellino and others}, - title = {{The DataGrid Workload Management System: Challenges and - Results}}, - journal = {Journal of Grid Computing}, - year = {Dec 2004}, - volume = {2}, - number = {4}, - pages = {353--367}, - fauthor = { G. Avellino, S. Beco, B. Cantalupo, A. Maraschini, F. - Pacini, M. Sottilaro, A. Terracina, D. Colling, F. - Giacomini, E. Ronchieri, A. Gianelle, M. Mazzucato, R. - Peluso, M. Sgaravatto, A. Guarise, R. Piro, A. Werbrouck, - D. Kouøil, A. Køenek, L. Matyska, M. Mulaè, J. Pospí¹il, M. - Ruda, Z. Salvet, J. Sitera, J. ©krabal, M. Vocù, M. - Mezzadri, F. Prelz, S. Monforte, M. Pappalardo} -} - -@Misc{ apart, - author = "M. Gerndt and others", - title = "Performance Tools for the {Grid}: State of the Art and - Future", - howpublished = "Tech. Rep. Lehrstuhl fuer Rechnertechnik und - Rechnerorganisation, Technische Universitaet Muenchen - (LRR-TUM). - \url{http://www.lpds.sztaki.hu/~zsnemeth/apart/}", - year = "2004" -} - -@InProceedings{ ahm04194, - author = {Shrija Rajbhandari and David W. Walker}, - title = "{Support for Provenance in a Service-based Computing - Grid}", - booktitle = "{Proceedings of the third UK e-Science All Hands Meeting, - Nottingham, UK}", - year = {2004} -} - -@TechReport{ gro04, - author = {Paul T. Groth}, - title = "{Recording provenance in service-oriented architectures}", - institution = "{University of Southampton; Faculty of Engineering, - Science and Mathematics; School of Electronics and Computer - Science}", - year = {2004} -} - -@InProceedings{ glm04b, - author = {Paul Groth and Michael Luck and Luc Moreau}, - title = "{A protocol for recording provenance in service-oriented - grids}", - booktitle = "{Proceedings of the 8th International Conference on - Principles of Distributed Systems (OPODIS04)}", - year = {2004} -} - -@Article{ ganglia, - author = "M.L. Massie and B.N. Chun and D.E. Culler", - title = "Ganglia Distributed Monitoring System: Design, - Implementation, and Experience", - journal = "Parallel Computing", - year = "2004", - volume = "30", - pages = "817-840" -} - -@Misc{ gae, - author = "Arshad Ali and Ashiq Anjum and Julian Bunn and Richard - Cavanaugh and Frank van Lingen and Richard McClatchey and - Harvey Newman and Waqas ur Rehman and Conrad Steenberg and - Michael Thomas and Ian Willers", - title = "Job Monitoring in an Interactive Grid Analysis - Environment", - howpublished = "Computing in High Energy Physics 2004", - year = "2004" -} - -@InProceedings{ voms1, - author = "R. Alfieri and R. Cecchini and V. Ciaschini and L. - dell'Agnello and \'{A}. Frohner and A. Gianoli and K. - L\H{o}rentey and F. Spataro", - title = "{VOMS}, an {A}uthorization {S}ystem for {V}irtual - {O}rganizations", - booktitle = "Grid Computing: First European Across Grids Conference", - year = "2004" -} - -@InProceedings{ delegation, - author = "V. Welch and I. Foster and C. Kesselman and O. Mulmo and - L. Pearlman and S. Tuecke and J. Gawor and S. Meder and F. - Siebenlist", - title = "{X.509 Proxy Certificates for Dynamic Delegation}", - booktitle = "Proceedings of the 3rd Annual PKI R\&D Workshop", - year = 2004, - month = "April" -} - -@Misc{ proxycert, - author = "S. Tuecke and V. Welch and D. Engert and L. Pearlman and - M. Thompson", - title = "Internet {X}.509 {P}ublic {K}ey {I}nfrastructure ({PKI}) - proxy certificate profile", - howpublished = "IETF RFC 3820", - year = 2004, - month = "June" -} - -@InProceedings{ chep, - author = "D. Kouøil and others", - title = "Distributed Tracking, Storage, and Re-use of Job State - Information on the Grid", - booktitle = "Computing in High Energy and Nuclear Physics (CHEP04)", - year = "2004" -} - -@Misc{ genericlb, - author = "{CESNET JRA1 team}", - title = "Current and Foreseen {\LB}\ Design", - howpublished = "3rd EGEE Conference, Athens, - \url{http://indico.cern.ch/contributionDisplay.py?contribId=201&sessionId=73&confId=0513}" - , - year = 2005 -} - -@InProceedings{ eup1, - author = "Liming Chen and Victor Tan and Fenglian Xu and Alexis - Biller and Paul Groth and Simon Miles and John Ibbotson and - Michael Luck and Luc Moreau", - title = "{A proof of concept: Provenance in a Service Oriented - Architecture}", - booktitle = "{Proceedings of the fourth UK e-Science All Hands Meeting, - Nottingham, UK}", - year = {2005} -} - -@InProceedings{ tgx05, - author = {Paul Townend and Paul Groth and Jie Xu}, - title = "{A provenance-aware weighted fault tolerance scheme for - service-based applications}", - booktitle = "{Proceedings of the $8^{th}$ IEEE International Symposium - on Object-oriented Real-time distributed Computing (ISORC - 2005)}", - year = {2005} -} - -@InProceedings{ mygrid, - author = "M. Nedim Alpdemir and Arijit Mukherjee and Norman W. Paton - and Alvaro A.A. Fernandes and Paul Watson and Kevin Glover - and Chris Greenhalgh and Tom Oinn and Hannah Tipney", - title = "Contextualised Workflow Execution in myGrid", - booktitle = " Proc European Grid Conference , Springer-Verlag LNCS - 3470", - year = 2005, - pages = "444-453" -} - -@Article{ condor2, - author = "Douglas Thain and Todd Tannenbaum and Miron Livny", - title = "Distributed computing in practice: the Condor experience.", - journal = "Concurrency - Practice and Experience", - year = "2005", - volume = "17", - number = "2-4", - pages = "323-356" -} - -@InProceedings{ globus4, - author = "I. Foster", - title = "Globus Toolkit Version 4: Software for Service-Oriented - Systems.", - booktitle = "IFIP International Conference on Network and Parallel - Computing, Springer-Verlag LNCS 3779,", - year = "2005", - pages = "2-13" -} - -@InProceedings{ cgmapisa, - author = "Andrea Ceccanti and Ond\v{r}ej Kraj\'{\i}\v{c}ek and - Ale\v{s} K\v{r}enek and Lud\v{e}k Matyska and Miroslav - Ruda.", - title = "Towards Scalable and Interoperable Grid Monitoring - Infrastructure.", - booktitle = "Proceedings of the first CoreGRID Integration Workshop", - year = "2005", - pages = "10-18" -} - -@InProceedings{ cgma, - author = "Ondøej Krajíèek and Ale¹ Køenek and Ludìk Matyska and - Miroslav Ruda and Jiøí Sitera", - title = "Capability Languages in C-GMA", - booktitle = "Proceedings of Cracow Grid Workshop (CGW05)", - year = "2005" -} - -@Article{ taxonomy, - author = {Serafeim Zanikolas and Rizos Sakellariou}, - title = {A taxonomy of grid monitoring systems}, - journal = {Future Gener. Comput. Syst.}, - year = {2005}, - volume = {21}, - number = {1}, - pages = {163--188}, - issn = {0167-739X}, - doi = {http://dx.doi.org/10.1016/j.future.2004.07.002}, - publisher = {Elsevier Science Publishers B. V.}, - address = {Amsterdam, The Netherlands, The Netherlands} -} - -@Article{ unicore, - author = "Achim Streit and Dietmar Erwin and Thomas Lippert and - Daniel Mallmann and Roger Menday and Michael Rambadt and - Morris Riedel and Mathilde Romberg and Bernd Schuller and - Philipp Wieder", - title = "UNICORE - From Project Results to Production Grids", - journal = "Grid Computing : New Frontiers of High Performance - Computing", - year = "2005", - pages = "357 - 376" -} - -@Article{ voms2, - author = "R. Alfieri and R. Cecchini and V. Ciaschini and L. - dell'Agnello and \'{A}. Frohner and K. L\H{o}rentey and F. - Spataro", - title = "{From gridmap-file to VOMS: managing authorization in a - Grid environment}", - journal = "Future Generation Computer Systems", - year = "2005", - pages = "549-558", - month = "April" -} - -@InProceedings{ cgw05, - author = "F. Dvoøák and D. Kouøil and A. Køenek and L. Matyska and - M. Mulaè and J.Pospi¹il and M. Ruda and Z. Salvet and J. - Sitera and J. ©krabal and M. Vocù ", - title = "Services for Tracking and Archival of Grid Job - Information", - booktitle = "Proceeding of Cracow Grid Workshop", - year = "2005" -} - -@Misc{ rfc4122, - author = "P. Leach and M. Mealling and R. Salz", - title = "A Universally Unique IDentifier (UUID) URN Namespace", - howpublished = "IETF RFC 4122", - year = "2005" -} - -@Misc{ euprovenance, - title = "{EU FP6 Programme Enabling and Supporting Provenance in - Grids for Complex Problems}", - howpublished = "\url{http://twiki.gridprovenance.org/bin/view/Provenance/ProjectInformation}" - , - year = 2006 -} - -@Misc{ atlas, - author = "TODO - predelat na neco poradneho", - title = "{The ATLAS Experiment}", - howpublished = "\url{http://atlas.ch/}", - year = 2006 -} - -@Misc{ ami, - author = "TODO - predelat na neco poradneho", - title = "{The Atlas Metadata Interface}", - howpublished = "\url{https://atlastagcollector.in2p3.fr:8443/AMI/}", - year = 2006 -} - -@Misc{ alice, - author = "TODO - predelat na neco poradneho", - title = "{A Large Ion Collider Experiment}", - howpublished = "\url{http://aliceinfo.cern.ch/Public}", - year = 2006 -} - -@Misc{ sam, - author = "TODO - predelat na neco poradneho", - title = "{SAM (Sequential data Access via Meta-data)}", - howpublished = "\url{http://d0db.fnal.gov/sam/}", - year = 2006 -} - -@InProceedings{ gacl2, - author = "A. McNab and S. Kaushal", - title = "Web services with gridsite and C/C++/scripts", - booktitle = "Computing in High Energy and Nuclear Physics (CHEP 2006)", - year = "2006" -} - -@Misc{ crossgrid, - author = "CrossGrid", - title = "{CrossGrid Project}", - howpublished = "\url{http://www.crossgrid.org}" -} - -@Misc{ dgas, - author = "DGAS", - title = "{The Distributed Grid Accounting System}", - howpublished = "\url{http://www.to.infn.it/grid/accounting/main.html}" -} - -@Misc{ egee, - author = "EGEE", - title = "{Enabling Grids for E-sciencE (EGEE) Project}", - howpublished = "\url{http://lcg.web.cern.ch/LCG/}" -} - -@Misc{ gridice, - author = "EGEE", - title = "{GridIce, the eyes of the Grid}", - howpublished = "\url{http://gridice2.cnaf.infn.it:50080/gridice/}" -} - -@Misc{ djra1.2, - author = {{EGEE JRA1}}, - title = {{EGEE Middleware Design---Release 1}}, - howpublished = {\url{https://edms.cern.ch/document/487871/}} -} - -@Misc{ djra1.3, - author = {{EGEE JRA1}}, - title = {{EGEE Middleware Release 1}}, - howpublished = {\url{https://edms.cern.ch/document/567624/}} -} - -@Misc{ djra1.4, - author = {{EGEE JRA1}}, - title = {{EGEE Middleware Architecture---Release 2}}, - howpublished = {\url{https://edms.cern.ch/document/594698/}} -} - -@Misc{ jra2jobmetrics, - author = "EGEE JRA2", - title = "{Job Metrics}", - howpublished = "\url{http://egee-jra2.web.cern.ch/EGEE-JRA2/QoS/JobsMetrics/JobMetrics.htm}" - -} - -@Misc{ lbug, - author = "A. K\v{r}enek and others", - title = "{L\&B Users Guide}", - howpublished = "\url{https://edms.cern.ch/file/571273/1/LB-guide.pdf}" -} - -@Misc{ lcg, - author = "LCG", - title = "{LHC Computing Project (LCG)}", - howpublished = "\url{http://lcg.web.cern.ch/LCG/}" -} - -@Misc{ pasoa, - title = "{PASOA: Provenance Aware Service Oriented Architecture}", - howpublished = "\url{http://twiki.pasoa.ecs.soton.ac.uk/bin/view/PASOA/AboutPasoa}" - -} diff --git a/org.glite.lb.doc/src/log_usertag.tex b/org.glite.lb.doc/src/log_usertag.tex deleted file mode 100644 index 588cf60..0000000 --- a/org.glite.lb.doc/src/log_usertag.tex +++ /dev/null @@ -1,71 +0,0 @@ -\subsection{Logging a UserTag event} -\label{log_usertag} - -User tag is an arbitrary ``name=value'' pair with which the user can assign -additional information to a job. Further on, LB can be queried based also on -values of user tags. % (see Sect.~\ref{tag-query}). - -In order to add user tag for a job a special event \verb'UserTag' is used. This -event can be logged by the job owner using the glite-lb-logevent command (see -also sec.\ref{glite-lb-logevent}). Here we suppose the command is used from -user's running application because a correct setting of environment variables -needed by the command is assured. - -General template for adding user tag is as follows: - -\begin{verbatim} -glite-lb-logevent -s Application -e UserTag \ - -j \ - -c \ - --name \ - --value -\end{verbatim} - -where - -\begin{tabularx}{\textwidth}{lX} -\verb'' & specifies the job to change \\ -\verb'' & specifies the sequence code returned by previous call - of verb 'glite-lb-logevent' \\ -\verb'' & specifies the name of user tag \\ -\verb'' & specifies the value of user tag \\ -\end{tabularx} - -The user application is always executed from within a JobWrapper script (part -of Workload Management System \cite{jgc}). The wrapper sets the appropriate -\verb'JobId' in the environment variable \verb'GLITE_WMS_JOBID'. The user -should pass this value to the \verb'-j' option of \verb'glite-lb-logevent'. -Similarly, the wrapper sets an initial value of the event sequence code in the -environment variable \verb'GLITE_WMS_SEQUENCE_CODE'. - -If the user application calls \verb'glite-lb-logevent' just once, it is -sufficient to pass this value to the \verb'-c' option. However, if there are -more subsequent calls, the user is responsible for capturing an updated -sequence code from the stdout of \verb'glite-lb-logevent' and using it in -subsequent calls. The \LB\ design requires the sequence codes in order to be -able to sort events correctly while not relying on strictly synchronized -clocks. - -\TODO{What are the possible values/types of the tag? String/Integer/Float/Double?} - -The example bellow is a job consisting of 100 phases. A user tag phase is used -to log the phase currently being executed. Subsequently, the user may monitor -execution of the job phases as a part of the job status returned by \LB. - -\begin{verbatim} - #!/bin/sh - - for p in `seq 1 100`; do - - # log the UserTag event - GLITE_WMS_SEQUENCE_CODE=`glite-lb-logevent -s Application - -e UserTag - -j $GLITE_WMS_JOBID -c $GLITE_WMS_SEQUENCE_CODE - --name=phase --value=$p` - - # do the actual computation here - done -\end{verbatim} - -\TODO{Add more examples.} - diff --git a/org.glite.lb.doc/src/logevent.tex b/org.glite.lb.doc/src/logevent.tex deleted file mode 100644 index 28d3dcc..0000000 --- a/org.glite.lb.doc/src/logevent.tex +++ /dev/null @@ -1,69 +0,0 @@ -\subsection{glite-lb-logevent} -\label{glite-lb-logevent} - -Besides the API's \LB\ offers its users a simple command-line interface for -logging events. The command \verb'glite-lb-logevent' is used for this purpose. -However, it is intended for internal WMS debugging tests in the first place and -should not be used for common event logging because of possibility of confusing -\LB\ server job state automaton. - -The command \verb'glite-lb-logevent' is a complex logging tool and the complete -list of parameters can be obtained using the \verb'-h' option. However, -the only legal user usage is for logging \verb'UserTag' and \verb'ChangeACL' -events. The following description is therefore concentrating only on options -dealing with these two events. - -Command usage is: - -\begin{verbatim} - glite-lb-logevent [-h] [-p] [-c seq_code] \ - -j -s Application -e [key=value ...] -\end{verbatim} - -where - -\begin{tabularx}{\textwidth}{lX} -\texttt{ -h -{}-help} & this help message\\ -\texttt{ -p -{}-priority} & send a priority event\\ -\texttt{ -c -{}-sequence} & event sequence code\\ -\texttt{ -j -{}-jobid} & JobId\\ -\texttt{ -e -{}-event} & select event type (see -e help)\\ -\end{tabularx} - -\medskip - -Each event specified after \verb'-e' option has different sub-options enabling -to set event specific values. - -Sub-options usable with \verb'UserTag' event are: - - -\begin{tabularx}{\textwidth}{lX} -\texttt{ -{}-name} & tag name\\ -\texttt{ -{}-value} & tag value\\ -\end{tabularx} - -\medskip - -Sub-options usable with \verb'ChangeACL' event are: - -\begin{tabularx}{\textwidth}{lX} -\texttt{ -{}-operation} & operation requested to perform with ACL (add, remove)\\ -\texttt{ -{}-permission} & ACL permission to change (currently only READ)\\ -\texttt{ -{}-permission\_type} & type of permission requested (0 = 'allow', 1 = 'deny')\\ -\texttt{ -{}-user\_id} & DN or VOMS parameter (in format VO:group)\\ -\texttt{ -{}-user\_id\_type} & type of information given in \verb'user_id' (DN or VOMS)\\ -\end{tabularx} - -\bigskip - -To be able to use this command several environmental variables must be set -properly. User must specify where the event should be sent. This is address and -port of glite-lb-logd daemon. It is done using environmental variable -\verb'EDG_WL_LOG_DESTINATION' in a form \verb'address:port'. - -Because user is allowed to change ACL or add user tags only for her jobs, paths -to valid X509 user credentials has to be set to authorise her. This is done -using two environmental variables \verb'EDG_WL_X509_KEY' and -\verb'EDG_WL_X509_CERT' in a form \verb'path_to_cred'. - diff --git a/org.glite.lb.doc/src/notification_api.tex b/org.glite.lb.doc/src/notification_api.tex deleted file mode 100644 index d95f60f..0000000 --- a/org.glite.lb.doc/src/notification_api.tex +++ /dev/null @@ -1,128 +0,0 @@ -\section{\LB\ Notification API} - -The purpose of this section is demonstrating the usage of the \LB\ notification API. Two examples of basic API usage are given. - - -\subsection{Registering and receiving notification} - -The following example registers on \LB\ server to receive notifications triggered by events belonging to job with \verb'jobid' and waits for notification until \verb'timeout'. -The code assumes the user to prepare a~reasonable value in \verb'jobid' -(\ie\ identifying an existing job). - -%The glite-lb-bkserverd and glite-lb-notif-interlogd daemons have to be running. The first one user registers to, the second one delivers notifications to the example program (as described in \ref{notification}). - -\begin{verbatim} - #include - #include - #include - #include - #include - - #include "glite/lb/context.h" - #include "glite/lb/lb_gss.h" - #include "glite/lb/notification.h" - - /* jobid magically appears here */ - char *jobid; - - edg_wll_Context ctx; - edg_wll_QueryRec **conditions; - edg_wll_NotifId notif_id = NULL, recv_notif_id = NULL; - edg_wlc_JobId my_jobId = NULL; - edg_wll_JobStat stat; - time_t valid; - struct timeval timeout = {220, 0}; - ... - - edg_wll_InitContext(&ctx); - - memset(&stat, 0, sizeof(stat)); - - conditions = (edg_wll_QueryRec **)calloc(2,sizeof(edg_wll_QueryRec *)); - conditions[0] = (edg_wll_QueryRec *)calloc(2,sizeof(edg_wll_QueryRec)); - - edg_wlc_JobIdParse(jobid, &my_jobId); - - conditions[0][0].attr = EDG_WLL_QUERY_ATTR_JOBID; - conditions[0][0].op = EDG_WLL_QUERY_OP_EQUAL; - conditions[0][0].value.j = my_jobId; - - /* register notification on BK server */ - if (edg_wll_NotifNew(ctx, conditions, -1, NULL, ¬if_id, &validity)) - goto error; - - /* the ID string my be used to receive notifications */ - /* from another computer later on */ - printf("notification ID: %s\n", edg_wll_NotifIdUnparse(notif_id)); - - if (edg_wll_NotifReceive(ctx, -1, &timeout, &status, &recv_notif_id)) - /* timeout or error */ - goto error; - else { - /* notification arrived */ - /* check recv_notif_id if you have registered more notifications */ - /* to know which one you received. If you have just this one */ - /* do not bother. */ - - printf("Status of my job is: %s\n", edg_wll_StatToString(stat.state)); - edg_wll_FreeStatus(&stat); - edg_wll_NotifIdFree(recv_notif_id); - } - - /* Release registration on BK server. Don't do this if notif_id is reused. */ - edg_wll_NotifDrop(ctx, notif_id); - - edg_wll_NotifIdFree(notif_id); - edg_wll_NotifCloseFd(ctx); - - ... - -error: - /* clean-up */ - ... - -\end{verbatim} - -First of all the context is initialised. During this procedure user's credentials are loaded. %(see \ref{cmdln_interface} for information on environmental variables pointing to user's X509 credentials). - -Then conditions under which notifications are sent are set. In this example, user is notified every time when event with given jobId is logged to \LB\ server. For more complicated conditions, please, consider the conditions limitations mentioned in \ref{notification}. - -Afterwards, a new registration is created and a unique notification ID is -returned. -Notifications are recieved with the \verb'edg_wll_NotifReceive' call. -If no notification is ready for -delivery, the call waits until some notification arrival or timeout. - -If user does not want to receive notifications any more, \verb'edg_wll_NotifDrop' call removes the registration for notifications from \LB server. - - -\subsection{Changing destination for notifications} - -The second example illustrates how to receive notifications from different host or different application. - -Let us suppose that user is registered for receiving notifications on \LB\ server. She obtained a notification ID and information how long this registration will be valid as described in the previous example but she did not delete registration with \verb'edg_wll_NotifDrop'. - -If the registration is still valid, she can start new client for receiving notifications, even from different machine, using notification ID returned during registration in previous step. - -The sequence of function calls (without catching errors) would be as follows: - -\begin{verbatim} - edg_wll_NotifId nid; - char *ns; // notification ID string returned - // in previous example - ... - edg_wll_NotifIdParse(ns, &nid); - edg_wll_NotifBind(ctx, nid, -1, NULL, &valid); - - /* prolong the registration validity if necessary */ - if (...validity close to expire...) - edg_wll_NotifRefresh(ctx, nid, &valid); - - edg_wll_NotifReceive(ctx, -1, &timeout, &status, &recv_notif_id); - ... -\end{verbatim} - -The call \verb'edg_wll_NotifReceive' will return any notification -that was generated while there was no listening client for it. -If there are none, it will wait for new notifications as in the previous -example. diff --git a/org.glite.lb.doc/src/producer_api.tex b/org.glite.lb.doc/src/producer_api.tex deleted file mode 100644 index 6e21829..0000000 --- a/org.glite.lb.doc/src/producer_api.tex +++ /dev/null @@ -1,3 +0,0 @@ -\section{\LB\ Logging (Producer) API} -\TODO{Add the list of header files, important functions and data types and their description; add fully working (buildable) programing examples and use verbatiminput to include the important parts of the code.} - diff --git a/org.glite.lb.doc/src/status.tex.T b/org.glite.lb.doc/src/status.tex.T deleted file mode 100644 index 4a19701..0000000 --- a/org.glite.lb.doc/src/status.tex.T +++ /dev/null @@ -1,17 +0,0 @@ -@@@{ -gen qq{ -% !! Automatically generated file. Do not edit. -% !! Change the corresponding template file $ARGV -}; -@@@} - -\begin{tabularx}{\textwidth}{>{\bfseries}lX} -@@@{ -for my $stat ($status->getTypesOrdered) { - my $c = getTypeComment $status $stat; - - gen "$stat: \& $c \\\\ \n"; - } -@@@} -\end{tabularx} -\endinput diff --git a/org.glite.lb.doc/src/web_services.tex b/org.glite.lb.doc/src/web_services.tex deleted file mode 100644 index b322e96..0000000 --- a/org.glite.lb.doc/src/web_services.tex +++ /dev/null @@ -1,22 +0,0 @@ -\section{Using \LB\ Web Service} - -\TODO{Complete review, list of all relevant (WSDL) files, their location, etc.} - -The \LB\ web service interface currently reflects the functionality of legacy -\LB\ query API (Sect.~\ref{query-C}). - -The following sections describe the operations defined in the \LB\ WSDL -file as well as its custom types. - -For the sake of readability this documentation does not follow the structure -of WSDL strictly, avoiding to duplicate information which is already present -here. -Consequently, the SOAP messages are not documented, for example, as they -are derived from operation inputs and outputs mechanically. -The same holds for types: \eg\ we do not document defined elements -which correspond 1:1 to types but are required due to the literal SOAP -encoding. - -For exact definition of the operations and types see the WSDL file. - -\TODO{Add fully functional WS examples - in Java, Python, C?} diff --git a/org.glite.lb.logger/src/queue_thread.c b/org.glite.lb.logger/src/queue_thread.c index 20c25e7..b75c501 100644 --- a/org.glite.lb.logger/src/queue_thread.c +++ b/org.glite.lb.logger/src/queue_thread.c @@ -34,7 +34,7 @@ int cmp_expires(struct server_msg *msg, void *data) { time_t *t = (time_t*)data; - return (msg->expires > 0) && (msg->expires < *t); + return msg->expires < *t; } static diff --git a/org.glite.lb.server/src/db_store.c b/org.glite.lb.server/src/db_store.c index 36ec72e..6102b4f 100644 --- a/org.glite.lb.server/src/db_store.c +++ b/org.glite.lb.server/src/db_store.c @@ -81,8 +81,6 @@ db_store(edg_wll_Context ctx,char *ucs, char *event) */ if (ctx->isProxy && local_job) { if (ev->any.priority & EDG_WLL_LOGFLAG_DIRECT) { - edg_wll_FreeEvent(ev); - free(ev); return 0; } else { diff --git a/org.glite.lb.server/src/jobstat.c b/org.glite.lb.server/src/jobstat.c index 0908119..b67a91f 100644 --- a/org.glite.lb.server/src/jobstat.c +++ b/org.glite.lb.server/src/jobstat.c @@ -131,6 +131,7 @@ int edg_wll_JobStatus( } } } + free(jobstat.pub.owner); intErr = edg_wll_LoadIntState(ctx, job, -1 /*all events*/, &ijsp); if (!intErr) { @@ -557,14 +558,12 @@ edg_wll_ErrorCode edg_wll_StoreIntState(edg_wll_Context ctx, if (EEXIST == edg_wll_Error(ctx, NULL, NULL)) { /* XXX: this should not happen */ edg_wll_ResetError(ctx); - free(stmt); stmt = NULL; tagp++; continue; } else goto cleanup; } - free(stmt); stmt = NULL; tagp++; } } @@ -586,7 +585,6 @@ edg_wll_ErrorCode edg_wll_StoreIntState(edg_wll_Context ctx, free(icvalues); if ((dbret = edg_wll_ExecSQL(ctx,stmt,NULL)) < 0) goto cleanup; - free(stmt); stmt = NULL; if (dbret == 0) { edg_wll_IColumnsSQLPart(ctx, ctx->job_index_cols, &stat->pub, 1, &icnames, &icvalues); @@ -601,7 +599,6 @@ edg_wll_ErrorCode edg_wll_StoreIntState(edg_wll_Context ctx, free(icnames); free(icvalues); if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) goto cleanup; - free(stmt); stmt = NULL; } if (update) { @@ -609,13 +606,11 @@ edg_wll_ErrorCode edg_wll_StoreIntState(edg_wll_Context ctx, "where jobid ='%|Ss' and ( seq<%d or version !='%|Ss')", jobid_md5, seq, INTSTAT_VERSION); if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) goto cleanup; - free(stmt); stmt = NULL; } if (update) { trio_asprintf(&stmt, "delete from status_tags " "where jobid ='%|Ss' and seq<%d", jobid_md5, seq); if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) goto cleanup; - free(stmt); stmt = NULL; } cleanup: diff --git a/org.glite.lb.server/src/lb_authz.c b/org.glite.lb.server/src/lb_authz.c index 74d0e2d..82d9dea 100644 --- a/org.glite.lb.server/src/lb_authz.c +++ b/org.glite.lb.server/src/lb_authz.c @@ -28,7 +28,7 @@ get_fqans(edg_wll_Context ctx, struct vomsdata *voms_info, { struct voms **voms_cert = NULL; char **f, **attrs, **tmp; - int num; + int ret, num; attrs = NULL; num = 0; @@ -112,6 +112,8 @@ get_groups(edg_wll_Context ctx, struct vomsdata *voms_info, int edg_wll_SetVomsGroups(edg_wll_Context ctx, edg_wll_GssConnection *gss, char *server_cert, char *server_key, char *voms_dir, char *ca_dir) { + STACK_OF(X509) *p_chain = NULL; + X509 *cert = NULL; int ret; int err = 0; struct vomsdata *voms_info = NULL; diff --git a/org.glite.lb.server/src/query.c b/org.glite.lb.server/src/query.c index 0c9f5be..ce9bd38 100644 --- a/org.glite.lb.server/src/query.c +++ b/org.glite.lb.server/src/query.c @@ -698,6 +698,7 @@ static char *ec_to_head_where(edg_wll_Context ctx,const edg_wll_QueryRec **ec) free(dbt); glite_lbu_TimeToDB(ec[m][n].value2.t.tv_sec, &dbt); trio_asprintf(&out, "%s OR (e.time_stamp >= %s AND e.time_stamp <= %s)", conds, aux, dbt); + free(dbt); free(aux); } else if (ec[m][n].op == EDG_WLL_QUERY_OP_EQUAL) { @@ -715,16 +716,15 @@ static char *ec_to_head_where(edg_wll_Context ctx,const edg_wll_QueryRec **ec) free(dbt); glite_lbu_TimeToDB(ec[m][n].value2.t.tv_sec, &dbt); trio_asprintf(&conds, "(e.time_stamp >= %s AND e.time_stamp <= %s)", aux, dbt); + free(dbt); free(aux); } else if (ec[m][n].op == EDG_WLL_QUERY_OP_EQUAL) { trio_asprintf(&conds, "(e.time_stamp = %s AND e.usec = %d)", dbt, ec[m][n].value.t.tv_usec); } - else { + else trio_asprintf(&conds, "e.time_stamp %s %s", opToString(ec[m][n].op), dbt); - } - free(dbt); break; case EDG_WLL_QUERY_ATTR_LEVEL: @@ -1260,6 +1260,7 @@ int convert_event_head(edg_wll_Context ctx,char **f,edg_wll_Event *e) edg_wll_SetError(ctx,-ret,"edg_wlc_JobIdParse()"); goto err; } + free(f[0]); e->type = atoi(f[1]); free(f[1]); f[1] = NULL; diff --git a/org.glite.lb.server/src/store.c.T b/org.glite.lb.server/src/store.c.T index 404f1f5..ae5fec6 100644 --- a/org.glite.lb.server/src/store.c.T +++ b/org.glite.lb.server/src/store.c.T @@ -101,7 +101,6 @@ int edg_wll_StoreEvent(edg_wll_Context ctx,edg_wll_Event *e,int *seq) if (edg_wll_ExecSQL(ctx,stmt,&sh) < 0 || edg_wll_FetchRow(ctx,sh,1,NULL,&userid) < 0) goto clean; if (sh) glite_lbu_FreeStmt(&sh); - free(stmt); stmt = NULL; /* obtain next event sequence number */ @@ -147,7 +146,6 @@ int edg_wll_StoreEvent(edg_wll_Context ctx,edg_wll_Event *e,int *seq) ssrc,e->any.host, stamp,e->any.timestamp.tv_usec, now_s, e->any.level,userid); - free(stamp); if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) { if ((err = edg_wll_Error(ctx,NULL,NULL)) != EEXIST) @@ -473,10 +471,8 @@ int store_job_server_proxy(edg_wll_Context ctx, edg_wll_Event *event) if (event->any.type == EDG_WLL_EVENT_REGJOB) { trio_asprintf(&q,"select cert_subj from jobs,users where jobs.jobid='%|Ss'" " AND jobs.userid=users.userid",unique); - if ( (nar = edg_wll_ExecSQL(ctx,q,&stmt)) < 0 || edg_wll_FetchRow(ctx,stmt,1,NULL,&owner) < 0 ) { + if ( (nar = edg_wll_ExecSQL(ctx,q,&stmt)) < 0 || edg_wll_FetchRow(ctx,stmt,1,NULL,&owner) < 0 ) goto err; - } - free(q); q = NULL; if (nar) { /* job is already registered */ @@ -867,7 +863,7 @@ static edg_wll_ErrorCode states_values_embryonic( if (jobid_md5 == NULL || parent_md5 == NULL || stat_enc == NULL) goto err; - if (edg_wll_IColumnsSQLPart(ctx, ctx->job_index_cols, &stat->pub, 1, icnames, &icvalues)) goto err; + if (edg_wll_IColumnsSQLPart(ctx, ctx->job_index_cols, stat->pub, 1, icnames, &icvalues)) goto err; trio_asprintf(&stmt, "'%|Ss',%d,%d,'%|Ss','%|Ss','%|Ss'%s", jobid_md5, stat->pub.state, 1, stat_enc, diff --git a/org.glite.lbjp-common.db/examples/db_expire.c b/org.glite.lbjp-common.db/examples/db_expire.c index 67fee31..8ca3c1b 100644 --- a/org.glite.lbjp-common.db/examples/db_expire.c +++ b/org.glite.lbjp-common.db/examples/db_expire.c @@ -8,11 +8,7 @@ * mysql -u root -p -e 'GRANT ALL on test.* to testuser@localhost' * ./db_test * - * Then you can launch: - * - * ./db_expire - * - * Use CS environment variable for different user/pwd@machine:dbname. + * Use CS environment variable when using different user/pwd@machine:dbname. */ #include @@ -53,24 +49,12 @@ static void print_free_result(const char *name, unsigned long *lens, char **res) } -static void print_error(glite_lbu_DBContext ctx) { - if (ctx) { - char *t, *d; - - if (glite_lbu_DBError(ctx, &t, &d)) { - printf("Error %s: %s\n", t, d); - free(t); free(d); - } - } -} - - int main(int argn, char *argv[]) { char *name, *user; const char *cs; glite_lbu_DBContext ctx; glite_lbu_Statement stmt; - int caps, nr, c; + int caps, i, nr, c; unsigned long lens[3]; char *res[3]; @@ -80,41 +64,25 @@ int main(int argn, char *argv[]) { // init dprintf(("connecting to %s...\n", cs)); - if (glite_lbu_InitDBContext(&ctx) != 0) { - print_error(ctx); - goto failctx; - } - if (glite_lbu_DBConnect(ctx, cs) != 0) { - print_error(ctx); - goto failctx; - } - if ((caps = glite_lbu_DBQueryCaps(ctx)) == -1) { - print_error(ctx); - goto failcon; - } + if (glite_lbu_InitDBContext(&ctx) != 0) goto fail; + if (glite_lbu_DBConnect(ctx, cs) != 0) goto failctx; + if ((caps = glite_lbu_DBQueryCaps(ctx)) == -1) goto failcon; if ((caps & GLITE_LBU_DB_CAP_PREPARED) == 0) { - print_error(ctx); dprintf(("can't do prepared commands, exiting.")); goto failcon; } // caps - glite_lbu_DBSetCaps(ctx, caps | GLITE_LBU_DB_CAP_ERRORS); + glite_lbu_DBSetCaps(ctx, caps); dprintf(("capabilities: %d\n", caps)); user = NULL; dprintf(("preparing '%s'...\n", user)); - if ((glite_lbu_PrepareStmt(ctx, SELECT_CMD, &stmt)) != 0) { - print_error(ctx); - goto failcon; - } + if ((glite_lbu_PrepareStmt(ctx, SELECT_CMD, &stmt)) != 0) goto failcon; do { user = "cicomexocitl.civ"; dprintf(("executing '%s'...\n", user)); - if (glite_lbu_ExecPreparedStmt(stmt, 1, GLITE_LBU_DB_TYPE_VARCHAR, user) == -1) { - print_error(ctx); - goto failstmt; - } + if (glite_lbu_ExecPreparedStmt(stmt, 1, GLITE_LBU_DB_TYPE_VARCHAR, user) == -1) goto failstmt; dprintf(("fetching '%s'...\n", user)); while ((nr = glite_lbu_FetchRow(stmt, 3, lens, res)) > 0) { dprintf(("Result: n=%d, res=%p\n", nr, res)); @@ -142,6 +110,7 @@ failcon: glite_lbu_DBClose(ctx); failctx: glite_lbu_FreeDBContext(ctx); +fail: dprintf(("failed\n")); return 1; } diff --git a/org.glite.lbjp-common.db/examples/db_test.c b/org.glite.lbjp-common.db/examples/db_test.c index c9d1ca9..d32e4a3 100644 --- a/org.glite.lbjp-common.db/examples/db_test.c +++ b/org.glite.lbjp-common.db/examples/db_test.c @@ -79,7 +79,7 @@ int main(int argn, char *argv[]) { // init dprintf(("connecting to %s...\n", cs)); - if (glite_lbu_InitDBContext(&ctx) != 0) goto failctx; + if (glite_lbu_InitDBContext(&ctx) != 0) goto fail; if (glite_lbu_DBConnect(ctx, cs) != 0) goto failctx; if ((caps = glite_lbu_DBQueryCaps(ctx)) == -1) goto failcon; if ((caps & GLITE_LBU_DB_CAP_PREPARED) == 0) { @@ -189,7 +189,7 @@ failcon: dprintf(("closing...\n")); glite_lbu_DBClose(ctx); failctx: - if (ctx) { + { char *t, *d; glite_lbu_DBError(ctx, &t, &d); @@ -197,6 +197,7 @@ failctx: free(t); free(d); } glite_lbu_FreeDBContext(ctx); +fail: free(cmd); dprintf(("failed\n")); return 1; diff --git a/org.glite.lbjp-common.db/src/db.c b/org.glite.lbjp-common.db/src/db.c index a45a16c..9d9de63 100644 --- a/org.glite.lbjp-common.db/src/db.c +++ b/org.glite.lbjp-common.db/src/db.c @@ -64,7 +64,6 @@ struct glite_lbu_Statement_s { /* for prepared commands */ MYSQL_STMT *stmt; unsigned long nrfields; - char *sql; }; @@ -161,7 +160,6 @@ static int FetchRowSimple(glite_lbu_DBContext ctx, MYSQL_RES *result, unsigned l static int FetchRowPrepared(glite_lbu_DBContext ctx, glite_lbu_Statement stmt, unsigned int n, unsigned long *lengths, char **results); static void set_time(MYSQL_TIME *mtime, const time_t time); static void glite_lbu_DBCleanup(void); -static void glite_lbu_FreeStmt_int(glite_lbu_Statement stmt); /* ---- common ---- */ @@ -339,19 +337,13 @@ int glite_lbu_FetchRow(glite_lbu_Statement stmt, unsigned int n, unsigned long * } -static void glite_lbu_FreeStmt_int(glite_lbu_Statement stmt) { - if (stmt) { - if (stmt->result) db_handle.mysql_free_result(stmt->result); - if (stmt->stmt) db_handle.mysql_stmt_close(stmt->stmt); - free(stmt->sql); - } -} - - void glite_lbu_FreeStmt(glite_lbu_Statement *stmt) { - glite_lbu_FreeStmt_int(*stmt); - free(*stmt); - *stmt = NULL; + if (*stmt) { + if ((*stmt)->result) db_handle.mysql_free_result((*stmt)->result); + if ((*stmt)->stmt) db_handle.mysql_stmt_close((*stmt)->stmt); + free(*stmt); + *stmt = NULL; + } } @@ -597,9 +589,6 @@ int glite_lbu_PrepareStmt(glite_lbu_DBContext ctx, const char *sql, glite_lbu_St } else (*stmt)->nrfields = 0; - // remember the command - (*stmt)->sql = strdup(sql); - return CLR_ERR(ctx); failed: @@ -609,7 +598,7 @@ failed: int glite_lbu_ExecPreparedStmt_v(glite_lbu_Statement stmt, int n, va_list ap) { - int i, prepare_retry; + int i; glite_lbu_DBType type; char *pchar; long int *plint; @@ -619,7 +608,6 @@ int glite_lbu_ExecPreparedStmt_v(glite_lbu_Statement stmt, int n, va_list ap) { MYSQL_BIND *binds = NULL; void **data = NULL; unsigned long *lens; - glite_lbu_Statement newstmt; // gather parameters if (n) { @@ -678,36 +666,21 @@ int glite_lbu_ExecPreparedStmt_v(glite_lbu_Statement stmt, int n, va_list ap) { binds[i].buffer_type = glite_type_to_mysql[type]; } - prepare_retry = 2; - do { - // bind parameters - if (n) { - if (db_handle.mysql_stmt_bind_param(stmt->stmt, binds) != 0) { - MY_ERRSTMT(stmt); - ret = -1; - goto statement_failed; - } + // bind parameters + if (n) + if (db_handle.mysql_stmt_bind_param(stmt->stmt, binds) != 0) { + MY_ERRSTMT(stmt); + goto failed; } - // run - ctx = stmt->ctx; - retry = 1; - do { - db_handle.mysql_stmt_execute(stmt->stmt); - ret = MY_ISOKSTMT(stmt, &retry); - } while (ret == 0); - statement_failed: - if (ret == -1) { - if (db_handle.mysql_stmt_errno(stmt->stmt) == ER_UNKNOWN_STMT_HANDLER) { - // expired the prepared command ==> restore it - if (glite_lbu_PrepareStmt(stmt->ctx, stmt->sql, &newstmt) == -1) goto failed; - glite_lbu_FreeStmt_int(stmt); - memcpy(stmt, newstmt, sizeof(struct glite_lbu_Statement_s)); - prepare_retry--; - ret = 0; - } else goto failed; - } - } while (ret == 0 && prepare_retry > 0); + // run + ctx = stmt->ctx; + retry = 1; + do { + db_handle.mysql_stmt_execute(stmt->stmt); + ret = MY_ISOKSTMT(stmt, &retry); + } while (ret == 0); + if (ret == -1) goto failed; // result retry = 1; diff --git a/org.glite.security.gss/interface/glite_gss.h b/org.glite.security.gss/interface/glite_gss.h index 4b62c17..27aa4da 100644 --- a/org.glite.security.gss/interface/glite_gss.h +++ b/org.glite.security.gss/interface/glite_gss.h @@ -8,6 +8,7 @@ extern "C" { #endif #include +#include enum { EDG_WLL_GSS_OK = 0, /* no GSS errors */ diff --git a/org.glite.security.gss/src/glite_gss.c b/org.glite.security.gss/src/glite_gss.c index 165c2df..7f3ddea 100644 --- a/org.glite.security.gss/src/glite_gss.c +++ b/org.glite.security.gss/src/glite_gss.c @@ -17,7 +17,6 @@ #include #include -#include #include "glite_gss.h" -- 1.8.2.3