Commit 0dbfb40a authored by Steven Murray's avatar Steven Murray
Browse files

Two developers now need to work on the new non-blocking version of the tape

aggregator.  For this reason we are creating the following new svn directory:

trunk/castor/tape/aggregator_non_blocking

This directory will be merged with the aggregator directory and deleted when the
work is over (sometime next year).
parent 5b8a5145
/******************************************************************************
* castor/tape/aggregator/AggregatorDaemon.cpp
*
* This file is part of the Castor project.
* See http://castor.web.cern.ch/castor
*
* Copyright (C) 2003 CERN
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*
*
* @author Nicola.Bessone@cern.ch Steven.Murray@cern.ch
*****************************************************************************/
#include "castor/PortNumbers.hpp"
#include "castor/exception/Internal.hpp"
#include "castor/exception/InvalidArgument.hpp"
#include "castor/server/TCPListenerThreadPool.hpp"
#include "castor/tape/aggregator/AggregatorDlfMessageConstants.hpp"
#include "castor/tape/aggregator/AggregatorDaemon.hpp"
#include "castor/tape/aggregator/Constants.hpp"
#include "castor/tape/utils/utils.hpp"
#include "castor/tape/aggregator/VdqmRequestHandler.hpp"
#include "h/Cgetopt.h"
#include "h/common.h"
#include <memory>
//------------------------------------------------------------------------------
// constructor
//------------------------------------------------------------------------------
castor::tape::aggregator::AggregatorDaemon::AggregatorDaemon()
throw(castor::exception::Exception) :
castor::server::BaseDaemon("aggregatord") {
}
//------------------------------------------------------------------------------
// destructor
//------------------------------------------------------------------------------
castor::tape::aggregator::AggregatorDaemon::~AggregatorDaemon() throw() {
}
//------------------------------------------------------------------------------
// main
//------------------------------------------------------------------------------
int castor::tape::aggregator::AggregatorDaemon::main(const int argc,
char **argv) {
try {
// Initialize the DLF logging
castor::server::BaseServer::dlfInit(s_dlfMessages);
// Log the start of the daemon
logStart(argc, argv);
// Parse the command line
try {
parseCommandLine(argc, argv);
// Pass the foreground option to the super class BaseDaemon
m_foreground = m_parsedCommandLine.foregroundOptionSet;
// Display usage message and exit if help option found on command-line
if(m_parsedCommandLine.helpOptionSet) {
std::cout << std::endl;
castor::tape::aggregator::AggregatorDaemon::usage(std::cout,
AGGREGATORPROGRAMNAME);
std::cout << std::endl;
return 0;
}
} catch (castor::exception::Exception &ex) {
std::cerr << std::endl << "Failed to parse the command-line: "
<< ex.getMessage().str() << std::endl;
castor::tape::aggregator::AggregatorDaemon::usage(std::cerr,
AGGREGATORPROGRAMNAME);
std::cerr << std::endl;
return 1;
}
createVdqmRequestHandlerPool();
// Start the threads
start();
} catch (castor::exception::Exception &ex) {
std::cerr << std::endl << "Failed to start daemon: "
<< ex.getMessage().str() << std::endl << std::endl;
usage(std::cerr, AGGREGATORPROGRAMNAME);
std::cerr << std::endl;
return 1;
}
return 0;
}
//------------------------------------------------------------------------------
// usage
//------------------------------------------------------------------------------
void castor::tape::aggregator::AggregatorDaemon::usage(std::ostream &os,
const char *const programName) throw() {
os << "\nUsage: "<< programName << " [options]\n"
"\n"
"where options can be:\n"
"\n"
"\t-f, --foreground Remain in the Foreground\n"
"\t-c, --config config-file Configuration file\n"
"\t-h, --help Print this help and exit\n"
"\n"
"Comments to: Castor.Support@cern.ch" << std::endl;
}
//------------------------------------------------------------------------------
// logStart
//------------------------------------------------------------------------------
void castor::tape::aggregator::AggregatorDaemon::logStart(const int argc,
const char *const *const argv) throw() {
std::string concatenatedArgs;
// Concatenate all of the command-line arguments into one string
for(int i=0; i < argc; i++) {
if(i != 0) {
concatenatedArgs += " ";
}
concatenatedArgs += argv[i];
}
castor::dlf::Param params[] = {
castor::dlf::Param("argv" , concatenatedArgs)};
castor::dlf::dlf_writep(nullCuuid, DLF_LVL_SYSTEM, AGGREGATOR_STARTED,
params);
}
//------------------------------------------------------------------------------
// parseCommandLine
//------------------------------------------------------------------------------
void castor::tape::aggregator::AggregatorDaemon::parseCommandLine(
const int argc, char **argv) throw(castor::exception::Exception) {
static struct Coptions longopts[] = {
{"foreground", NO_ARGUMENT, NULL, 'f'},
{"help" , NO_ARGUMENT, NULL, 'h'},
{NULL , 0 , NULL, 0 }
};
Coptind = 1;
Copterr = 0;
char c;
while ((c = Cgetopt_long(argc, argv, "fc:p:h", longopts, NULL)) != -1) {
switch (c) {
case 'f':
m_parsedCommandLine.foregroundOptionSet = true;
break;
case 'h':
m_parsedCommandLine.helpOptionSet = true;
break;
case '?':
{
std::stringstream oss;
oss << "Unknown command-line option: " << (char)Coptopt;
// Log and throw an exception
castor::dlf::Param params[] = {
castor::dlf::Param("Function", __FUNCTION__),
castor::dlf::Param("Reason" , oss.str())};
castor::dlf::dlf_writep(nullCuuid, DLF_LVL_USER_ERROR,
AGGREGATOR_FAILED_TO_PARSE_COMMAND_LINE, params);
TAPE_THROW_EX(castor::exception::InvalidArgument,
": " << oss.str());
}
break;
case ':':
{
std::stringstream oss;
oss << "An option is missing a parameter";
// Log and throw an exception
castor::dlf::Param params[] = {
castor::dlf::Param("Function", __FUNCTION__),
castor::dlf::Param("Reason" , oss.str())};
castor::dlf::dlf_writep(nullCuuid, DLF_LVL_USER_ERROR,
AGGREGATOR_FAILED_TO_PARSE_COMMAND_LINE, params);
TAPE_THROW_EX(castor::exception::InvalidArgument,
": " << oss.str());
}
break;
default:
{
std::stringstream oss;
oss << "Cgetopt_long returned the following unknown value: 0x"
<< std::hex << (int)c;
// Log and throw an exception
castor::dlf::Param params[] = {
castor::dlf::Param("Function", __FUNCTION__),
castor::dlf::Param("Reason" , oss.str())};
CASTOR_DLF_WRITEPC(nullCuuid, DLF_LVL_ERROR,
AGGREGATOR_FAILED_TO_PARSE_COMMAND_LINE, params);
TAPE_THROW_EX(castor::exception::Internal,
": " << oss.str());
}
}
}
if(Coptind > argc) {
std::stringstream oss;
oss << "Internal error. Invalid value for Coptind: " << Coptind;
// Log and throw an exception
castor::dlf::Param params[] = {
castor::dlf::Param("Function", __FUNCTION__),
castor::dlf::Param("Reason", oss.str())};
CASTOR_DLF_WRITEPC(nullCuuid, DLF_LVL_ERROR,
AGGREGATOR_FAILED_TO_PARSE_COMMAND_LINE, params);
TAPE_THROW_EX(castor::exception::Internal,
": " << oss.str());
}
// If there is some extra text on the command-line which has not been parsed
if(Coptind < argc)
{
std::stringstream oss;
oss << "Unexpected command-line argument: " << argv[Coptind]
<< std::endl;
// Log and throw an exception
castor::dlf::Param params[] = {
castor::dlf::Param("Function", __FUNCTION__),
castor::dlf::Param("Reason" , oss.str())};
castor::dlf::dlf_writep(nullCuuid, DLF_LVL_USER_ERROR,
AGGREGATOR_FAILED_TO_PARSE_COMMAND_LINE, params);
TAPE_THROW_EX(castor::exception::InvalidArgument,
": " << oss.str());
}
}
//------------------------------------------------------------------------------
// createVdqmRequestHandlerPool
//------------------------------------------------------------------------------
void castor::tape::aggregator::AggregatorDaemon::
createVdqmRequestHandlerPool() throw(castor::exception::Exception) {
const int vdqmListenPort = utils::getPortFromConfig("AGGREGATOR", "VDQMPORT",
AGGREGATOR_VDQMPORT);
std::auto_ptr<server::IThread>
thread(new castor::tape::aggregator::VdqmRequestHandler());
std::auto_ptr<server::BaseThreadPool>
threadPool(new castor::server::TCPListenerThreadPool(
"VdqmRequestHandlerPool", thread.release(), vdqmListenPort));
addThreadPool(threadPool.release());
m_vdqmRequestHandlerThreadPool = getThreadPool('V');
if(m_vdqmRequestHandlerThreadPool == NULL) {
TAPE_THROW_EX(castor::exception::Internal,
": Failed to get VdqmRequestHandlerPool");
}
m_vdqmRequestHandlerThreadPool->setNbThreads(MAXDRIVES);
}
/******************************************************************************
* castor/tape/aggregator/AggregatorDaemon.hpp
*
* This file is part of the Castor project.
* See http://castor.web.cern.ch/castor
*
* Copyright (C) 2003 CERN
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*
*
* @author Nicola.Bessone@cern.ch Steven.Murray@cern.ch
*****************************************************************************/
#ifndef CASTOR_TAPE_AGGREGATOR_AGGREGATORDAEMON_HPP
#define CASTOR_TAPE_AGGREGATOR_AGGREGATORDAEMON_HPP 1
#include "castor/exception/Exception.hpp"
#include "castor/exception/InvalidConfigEntry.hpp"
#include "castor/server/BaseDaemon.hpp"
#include "castor/server/BaseThreadPool.hpp"
#include <iostream>
namespace castor {
namespace tape {
namespace aggregator {
/**
* The aggregator daemon.
*/
class AggregatorDaemon : public castor::server::BaseDaemon {
public:
/**
* Constructor.
*
* @param daemonName The name of the daemon.
*/
AggregatorDaemon() throw(castor::exception::Exception);
/**
* Destructor.
*/
~AggregatorDaemon() throw();
/**
* The main entry function of the aggregator daemon.
*/
int main(const int argc, char **argv);
private:
/**
* Logs the start of the daemon.
*/
void logStart(const int argc, const char *const *const argv) throw();
/**
* Data type used to store the results of parsing the command-line.
*/
struct ParsedCommandLine {
bool foregroundOptionSet;
bool helpOptionSet;
ParsedCommandLine() :
foregroundOptionSet(false),
helpOptionSet(false) {
}
};
/**
* The results of parsing the command-line.
*/
ParsedCommandLine m_parsedCommandLine;
/**
* The VDQM request handler thread pool which should contain as many threads
* as there are drives per tape server.
*/
server::BaseThreadPool *m_vdqmRequestHandlerThreadPool;
/**
* Parses the command-line arguments and sets the daemon options accordingly.
*
* @param argc Argument count from the executable's entry function: main().
* @param argv Argument vector from the executable's entry function: main().
*/
void parseCommandLine(const int argc, char **argv)
throw(castor::exception::Exception);
/**
* Writes the command-line usage message of the aggregator daemon onto the
* specified output stream.
*
* @param os Output stream to be written to.
* @param programName The program name to be used in the message.
*/
void usage(std::ostream &os, const char *const programName) throw();
/**
* Creates the VDQM request handler thread pool.
*/
void createVdqmRequestHandlerPool()
throw (castor::exception::Exception);
/**
* DLF message strings.
*/
static castor::dlf::Message s_dlfMessages[];
}; // class AggregatorDaemon
} // namespace aggregator
} // namespace tape
} // namespace castor
#endif // CASTOR_TAPE_AGGREGATOR_AGGREGATORDAEMON_HPP
/* This file was generated by ./AggregatorDlfMessagesCodeGenerator on Tue Sep 29 17:34:08 CEST 2009
*/
/******************************************************************************
* castor/tape/aggregator/AggregatorDlfMessageConstants.hpp
*
* This file is part of the Castor project.
* See http://castor.web.cern.ch/castor
*
* Copyright (C) 2003 CERN
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*
*
* @author Steven Murray Steven.Murray@cern.ch
*****************************************************************************/
#ifndef CASTOR_TAPE_AGGREGATOR_AGGREGATORDLFMESSAGECONSTANTS_HPP
#define CASTOR_TAPE_AGGREGATOR_AGGREGATORDLFMESSAGECONSTANTS_HPP 1
namespace castor {
namespace tape {
namespace aggregator {
enum AggregatorDlfMessages {
AGGREGATOR_NULL=0, /* " - " */
AGGREGATOR_STARTED=1, /* "aggregatord started" */
AGGREGATOR_FAILED_TO_PARSE_COMMAND_LINE=2, /* "Failed to parse the command line" */
AGGREGATOR_FAILED_TO_INIT_DB_SERVICE=3, /* "Failed to initialise database service" */
AGGREGATOR_VDQM_CONNECTION_WITH_INFO=4, /* "Received a connection from VDQM" */
AGGREGATOR_HANDLE_VDQM_REQUEST_EXCEPT=5, /* "Exception raised when handling a request from the VDQM" */
AGGREGATOR_FAILED_TO_READ_MESSAGE_HEADER=6, /* "Failed to read message header" */
AGGREGATOR_UNKNOWN_MAGIC=7, /* "Unknown magic number" */
AGGREGATOR_UNKNOWN_REQUEST_TYPE=8, /* "Unknown request type" */
AGGREGATOR_FAILED_TO_READ_MESSAGE_BODY=9, /* "Failed to read message body" */
AGGREGATOR_RECEIVE_RCP_JOB_RQST=10, /* "Receiving RCP job request" */
AGGREGATOR_RECEIVED_RCP_JOB_RQST=11, /* "Received RCP job request" */
AGGREGATOR_SUBMITTING_JOB_TO_RTCPD=12, /* "Submitting remote copy job to RTCPD" */
AGGREGATOR_FAILED_TO_SUBMIT_JOB_TO_RTCPD=13, /* "Failed to submit remote copy job to RTCPD" */
AGGREGATOR_FAILED_TO_MARSHALL_RTCP_ACKN=14, /* "Failed to marshall RTCP acknowledge message" */
AGGREGATOR_FAILED_TO_SEND_RCP_JOB_REPLY_TO_VDQM=15, /* "Failed to send RCP job reply to VDQM" */
AGGREGATOR_FAILED_TO_PROCESS_RCP_JOB_SUBMISSION=16, /* "Failed to process RCP job submission message" */
AGGREGATOR_RTCPD_HANDLER_SOCKET_IS_NULL=17, /* "The RtcpdHandlerThread has been passed a NULL socket pointer" */
AGGREGATOR_INITIAL_RTCPD_CALLBACK_WITH_INFO=18, /* "Received initial callback connection from RTCPD" */
AGGREGATOR_INITIAL_RTCPD_CALLBACK_WITHOUT_INFO=19, /* "Received initial callback connection from RTCPD without peer information" */
AGGREGATOR_RTCPD_CALLBACK_WITH_INFO=20, /* "Received a callback connection from RTCPD" */
AGGREGATOR_RTCPD_CALLBACK_WITHOUT_INFO=21, /* "Received a callback connection from RTCPD without peer information" */
AGGREGATOR_GOT_VOLREQID=22, /* "Got volume request ID from RTCPD" */
AGGREGATOR_FAILED_TO_GET_VOLREQID=23, /* "Failed to get volume request ID from RTCPD" */
AGGREGATOR_FAILED_TO_MARSHALL_RCP_JOB_REPLY_MESSAGE=24, /* "Failed to marshall RCP job reply message" */
AGGREGATOR_SIGNALLED_NO_MORE_REQUESTS=25, /* "Signalled no more requests to RTCPD" */
AGGREGATOR_FAILED_TO_COORDINATE_REMOTE_COPY=26, /* "Failed to coordinate remote copy" */
AGGREGATOR_TRANSFER_FAILED=27, /* "Transfer failed" */
AGGREGATOR_GAVE_REQUEST_FOR_MORE_WORK=28, /* "Gave request for more work to RTCPD" */
AGGREGATOR_DATA_ON_INITIAL_RTCPD_CONNECTION=29, /* "Data has arrived on the initial RTCPD connection" */
AGGREGATOR_RECEIVED_RTCP_ENDOF_REQ=30, /* "Received RTCP_ENDOF_REQ" */
AGGREGATOR_TAPE_POSITIONED=31, /* "Tape positioned" */
AGGREGATOR_FILE_TRANSFERED=32, /* "File transfered" */
AGGREGATOR_GET_REQUEST_INFO_FROM_RTCPD=33, /* "Getting request information from RTCPD" */
AGGREGATOR_GOT_REQUEST_INFO_FROM_RTCPD=34, /* "Got request information from RTCPD" */
AGGREGATOR_TOLD_CLIENT_TO_START_TRANSFER=35, /* "Told client to start the transfer protocol" */
AGGREGATOR_GET_VOLUME_FROM_CLIENT=36, /* "Getting volume from client" */
AGGREGATOR_GOT_VOLUME_FROM_CLIENT=37, /* "Got volume from client" */
AGGREGATOR_GOT_NO_MORE_FILES_FROM_CLIENT=38, /* "Got no more files from client" */
AGGREGATOR_GET_FILE_TO_MIGRATE_FROM_CLIENT=39, /* "Getting file to migrate from client" */
AGGREGATOR_GOT_FILE_TO_MIGRATE_FROM_CLIENT=40, /* "Got file to migrate from client" */
AGGREGATOR_GET_FILE_TO_RECALL_FROM_CLIENT=41, /* "Getting file to recall from client" */
AGGREGATOR_GOT_FILE_TO_RECALL_FROM_CLIENT=42, /* "Got file to recall from client" */
AGGREGATOR_GIVE_VOLUME_TO_RTCPD=43, /* "Giving volume to RTCPD" */
AGGREGATOR_GAVE_VOLUME_TO_RTCPD=44, /* "Gave volume to RTCPD" */
AGGREGATOR_ASK_RTCPD_TO_RQST_MORE_RECALL_WORK=45, /* "Asking RTCPD to request more recall work" */
AGGREGATOR_ASKED_RTCPD_TO_RQST_MORE_RECALL_WORK=46, /* "Asked RTCPD to request more recall work" */
AGGREGATOR_ASK_RTCPD_TO_RQST_MORE_MIGRATE_WORK=47, /* "Asking RTCPD to request more migrate work" */
AGGREGATOR_ASKED_RTCPD_TO_RQST_MORE_MIGRATE_WORK=48, /* "Asked RTCPD to request more migrate work" */
AGGREGATOR_TELL_RTCPD_DUMP_TAPE=49, /* "Telling RTCPD to dump tape" */
AGGREGATOR_TOLD_RTCPD_DUMP_TAPE=50, /* "Told RTCPD to dump tape" */
AGGREGATOR_TELL_RTCPD_END_OF_FILE_LIST=51, /* "Telling RTCPD end of file list" */
AGGREGATOR_TOLD_RTCPD_END_OF_FILE_LIST=52, /* "Told RTCPD end of file list" */
AGGREGATOR_TELL_RTCPD_TO_ABORT=53, /* "Telling RTCPD to abort" */
AGGREGATOR_TOLD_RTCPD_TO_ABORT=54, /* "Told RTCPD to abort" */
AGGREGATOR_GIVE_RECALL_FILE_TO_RTCPD=55, /* "Giving recall file to RTCPD" */
AGGREGATOR_GAVE_RECALL_FILE_TO_RTCPD=56, /* "Gave recall file to RTCPD" */
AGGREGATOR_GIVE_MIGRATE_FILE_TO_RTCPD=57, /* "Giving migrate file to RTCPD" */
AGGREGATOR_GAVE_MIGRATE_FILE_TO_RTCPD=58, /* "Gave migrate file to RTCPD" */
AGGREGATOR_RECEIVE_MSGBODY_FROM_RTCPD=59, /* "Receiving message body from RTCPD" */
AGGREGATOR_RECEIVED_MSGBODY_FROM_RTCPD=60, /* "Received message body from RTCPD" */
AGGREGATOR_RECEIVE_FILERQSTBODY_FROM_RTCPD=61, /* "Receiving FileRqstBody from RTCPD" */
AGGREGATOR_RECEIVED_FILERQSTBODY_FROM_RTCPD=62, /* "Received FileRqstBody from RTCPD" */
AGGREGATOR_RECEIVE_FILERQSTERRBODY_FROM_RTCPD=63, /* "Receiving FileRqstErrBody from RTCPD" */
AGGREGATOR_RECEIVED_FILERQSTERRBODY_FROM_RTCPD=64, /* "Received FileRqstErrBody from RTCPD" */
AGGREGATOR_PROCESSING_TAPE_DISK_RQST=65, /* "Processing a tape/disk IO request from RTCPD" */
AGGREGATOR_PING_RTCPD=66, /* "Pinging RTCPD" */
AGGREGATOR_PINGED_RTCPD=67, /* "Pinged RTCPD" */
AGGREGATOR_SEND_ACK_TO_RTCPD=68, /* "Sending acknowledge to RTCPD" */
AGGREGATOR_SENT_ACK_TO_RTCPD=69, /* "Sent acknowledge to RTCPD" */
AGGREGATOR_SEND_HEADER_TO_RTCPD=70, /* "Sending message header to RTCPD" */
AGGREGATOR_SENT_HEADER_TO_RTCPD=71, /* "Sent message header to RTCPD" */
AGGREGATOR_RECEIVE_TAPERQSTBODY=72, /* "Receiving tape request message body" */
AGGREGATOR_RECEIVED_TAPERQSTBODY=73, /* "Received tape request message body" */
AGGREGATOR_RECEIVE_GIVEOUTPBODY=74, /* "Receiving GIVE_OUTP message body" */
AGGREGATOR_RECEIVED_GIVEOUTPBODY=75, /* "Received GIVE_OUTP message body" */
AGGREGATOR_RECEIVE_TAPERQSTERRBODY=76, /* "Receiving tape request message body with error appendix" */
AGGREGATOR_RECEIVED_TAPERQSTERRBODY=77, /* "Received tape request message body with error appendix" */
AGGREGATOR_SEND_DELAYED_REQUEST_MORE_WORK_ACK_TO_RTCPD=78, /* "Sending delayed acknowledge of request for more work to RTCPD" */
AGGREGATOR_SENT_DELAYED_REQUEST_MORE_WORK_ACK_TO_RTCPD=79, /* "Sent delayed acknowledge of request for more work to RTCPD" */
AGGREGATOR_CREATED_RTCPD_CALLBACK_PORT=80, /* "Created TCP/IP port for RTCPD callbacks" */
AGGREGATOR_CONNECTION_CLOSED_BY_RTCPD=81, /* "Connection closed by RTCPD" */
AGGREGATOR_CLOSED_CONNECTION=82, /* "Connection closed by aggregator" */
AGGREGATOR_NOTIFY_CLIENT_FILE_MIGRATED=83, /* "Notifying client file migrated" */
AGGREGATOR_NOTIFIED_CLIENT_FILE_MIGRATED=84, /* "Notified client file migrated" */
AGGREGATOR_NOTIFY_CLIENT_FILE_RECALLED=85, /* "Notifying client file recalled" */
AGGREGATOR_NOTIFIED_CLIENT_FILE_RECALLED=86, /* "Notified client file recalled" */
AGGREGATOR_NOTIFY_CLIENT_END_OF_SESSION=87, /* "Notifying client end of session" */
AGGREGATOR_NOTIFIED_CLIENT_END_OF_SESSION=88, /* "Notified client end of session" */
AGGREGATOR_GET_DUMP_PARAMETERS_FROM_CLIENT=89, /* "Getting dump parameters from client" */
AGGREGATOR_GOT_DUMP_PARAMETERS_FROM_CLIENT=90, /* "Got dump parameters from client" */
AGGREGATOR_NOTIFY_CLIENT_DUMP_MESSAGE=91, /* "Notifying client dump message" */
AGGREGATOR_NOTIFIED_CLIENT_DUMP_MESSAGE=92, /* "Notified client dump message" */
AGGREGATOR_FAILED_TO_NOTIFY_CLIENT_END_OF_SESSION=93, /* "Failed to notify gateway end of session" */
AGGREGATOR_NOTIFY_CLIENT_END_OF_FAILED_SESSION=94, /* "Notifying client end of failed session" */
AGGREGATOR_NOTIFIED_CLIENT_END_OF_FAILED_SESSION=95, /* "Notified client end of failed session" */
AGGREGATOR_FAILED_TO_NOTIFY_CLIENT_END_OF_FAILED_SESSION=96, /* "Failed to notify gateway end of failed session" */
AGGREGATOR_SELECT_INTR=97, /* "Select interrupted" */
AGGREGATOR_ENTERING_BRIDGE_MODE=98, /* "Entering bridge mode" */
AGGREGATOR_PING_CLIENT=99, /* "Pinging client" */
AGGREGATOR_PINGED_CLIENT=100, /* "Pinged client" */
AGGREGATOR_CLOSED_INITIAL_CALLBACK_CONNECTION=101, /* "Closed initial callback connection" */
AGGREGATOR_RECEIVED_TAPE_INFO_FROM_VMGR=102 /* "Received tape information from VMGR" */
}; // enum AggregatorDlfMessages
} // namespace aggregator
} // namespace tape
} // namespace castor
#endif // CASTOR_TAPE_AGGREGATOR_AGGREGATORDLFMESSAGECONSTANTS_HPP
/******************************************************************************
* castor/tape/aggregator/AggregatorDlfMessageConstants.hpp
*
* This file is part of the Castor project.
* See http://castor.web.cern.ch/castor
*
* Copyright (C) 2003 CERN
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*
*
* @author Steven Murray Steven.Murray@cern.ch
*****************************************************************************/
#ifndef CASTOR_TAPE_AGGREGATOR_AGGREGATORDLFMESSAGECONSTANTS_HPP