C++
Generator.cpp
#include <arc/credential/Credential.h>
#include <arc/GUID.h>
#include "Generator.h"
Generator::Generator() {
}
Generator::~Generator() {
logger.msg(
Arc::INFO,
"Shutting down scheduler");
scheduler.stop();
logger.msg(
Arc::INFO,
"Scheduler stopped, exiting");
}
logger.msg(
Arc::INFO,
"Received DTR %s back from scheduler in state %s", dtr->get_id(), dtr->get_status().str());
counter.dec();
}
void Generator::start() {
logger.msg(
Arc::INFO,
"Starting DTR threads");
scheduler.SetDumpLocation("/tmp/dtr.log");
scheduler.start();
}
void Generator::run(const std::string& source, const std::string& destination) {
logger.msg(
Arc::ERROR,
"No valid credentials found, exiting");
return;
}
std::list<DataStaging::DTRLogDestination> logs;
if (!(*dtr)) {
logger.msg(
Arc::ERROR,
"Problem creating dtr (source %s, destination %s)", source, destination);
return;
}
dtr->set_tries_left(5);
counter.inc();
}
Generator.h
#ifndef GENERATOR_H_
#define GENERATOR_H_
#include <arc/Thread.h>
#include <arc/Logger.h>
#include <arc/data-staging/Scheduler.h>
private:
std::list<Arc::LogDestination*> root_destinations;
public:
Generator();
~Generator();
void start();
void run(const std::string& source, const std::string& destination);
};
#endif
generator-main.cpp
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <signal.h>
#include <arc/StringConv.h>
#include "Generator.h"
static bool run = true;
static void do_shutdown(int) {
run = false;
}
static void usage() {
std::cout << "Usage: generator [num mock transfers]" << std::endl;
std::cout << " generator source destination" << std::endl;
std::cout << "To use mock transfers ARC must be built with configure --enable-mock-dmc" << std::endl;
std::cout << "The default number of mock transfers is 10" << std::endl;
}
int main(int argc, char** argv) {
signal(SIGTTOU,SIG_IGN);
signal(SIGTTIN,SIG_IGN);
signal(SIGINT, do_shutdown);
Generator generator;
int num = 10;
if (argc == 1 || argc == 2) {
if (argc == 2 && (std::string(argv[1]) ==
"-h" || !
Arc::stringto(argv[1], num))) {
usage();
return 1;
}
generator.start();
for (int i = 0; i < num; ++i) {
std::string destination =
"mock://mockdest/mock." +
Arc::tostring(i);
generator.run(source, destination);
}
}
else if (argc == 3) {
generator.start();
generator.run(argv[1], argv[2]);
}
else {
usage();
return 1;
}
while (generator.counter.get() > 0 && run) {
sleep(1);
}
return 0;
}
Python
import os
import sys
import time
import arc
class DTRGenerator(arc.DTRCallback):
def __init__(self):
super(DTRGenerator, self).__init__()
self.root_logger = arc.Logger_getRootLogger()
self.stream = arc.LogStream(sys.stdout)
self.root_logger.addDestination(self.stream)
self.root_logger.setThreshold(arc.DEBUG)
self.cfg = arc.UserConfig('', '')
self.id = '1'
arc.DTR.LOG_LEVEL = self.root_logger.getThreshold()
self.scheduler = arc.Scheduler()
self.scheduler.start()
def __del__(self):
self.scheduler.stop()
def add(self, source, dest):
dtrlog = arc.createDTRLogger(self.root_logger, "DTR")
dtrlog.__deref__().addDestination(self.stream)
dtrlog.__deref__().setThreshold(arc.DEBUG)
dtrptr = arc.createDTRPtr(source, dest, self.cfg, self.id, os.getuid(), dtrlog)
dtrptr.registerCallback(self.scheduler, arc.SCHEDULER)
arc.DTR.push(dtrptr, arc.SCHEDULER)
while dtrptr.get_status() != arc.DTRStatus.ERROR and dtrptr.get_status() != arc.DTRStatus.DONE:
time.sleep(1)
sys.stdout.write("%s\n"%dtrptr.get_status().str())
def receiveDTR(self, dtr):
sys.stdout.write('Received back DTR %s\n'%str(dtr.get_id()))
def main(args):
if len(args) != 3:
sys.stdout.write("Usage: python dtr_generator.py source destination\n")
sys.exit(1)
generator = DTRGenerator()
generator.add(args[1], args[2])
if __name__ == '__main__':
main(sys.argv[0:])