You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2007/04/30 21:03:55 UTC
svn commit: r533828 - in /incubator/qpid/trunk/qpid/cpp: README
qpidc.spec.in src/Makefile.am src/qpid/broker/Daemon.cpp
src/qpid/broker/Daemon.h src/qpidd.cpp src/tests/Makefile.am
src/tests/daemon_test src/tests/test_env
Author: aconway
Date: Mon Apr 30 12:03:53 2007
New Revision: 533828
URL: http://svn.apache.org/viewvc?view=rev&rev=533828
Log:
Resolves: QPID-298, QPID-304: qpidd flags to control broker daemon.
* README: added new dependency, libdaemon.
* qpidc.spec.in: libdaemon dependencies.
* broker/Daemon.h|cpp: Daemon and pid file management, wrapper for libdaemon.
* qpidd.cpp modifid flags
-d [ --daemon ] - waits till deamon is listening before returning.
* qpidd.cpp: new flags
-q [ --quit ] Stop the running daemon politely.
-k [ --kill ] Kill the running daemon harshly.
-c [ --check ] If daemon is running return 0.
--wait SECONDS (=10) Maximum wait for daemon response.
--ppid Print daemon pid to stdout
* tests/dameon_test: Test daemon startup, shutdown.
* test_env: minor fix.
Added:
incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Daemon.cpp
- copied, changed from r533819, incubator/qpid/branches/M2/cpp/lib/broker/Daemon.cpp
incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Daemon.h
- copied unchanged from r533819, incubator/qpid/branches/M2/cpp/lib/broker/Daemon.h
incubator/qpid/trunk/qpid/cpp/src/tests/daemon_test
- copied, changed from r533819, incubator/qpid/branches/M2/cpp/tests/daemon_test
Modified:
incubator/qpid/trunk/qpid/cpp/README
incubator/qpid/trunk/qpid/cpp/qpidc.spec.in
incubator/qpid/trunk/qpid/cpp/src/Makefile.am
incubator/qpid/trunk/qpid/cpp/src/qpidd.cpp
incubator/qpid/trunk/qpid/cpp/src/tests/Makefile.am
incubator/qpid/trunk/qpid/cpp/src/tests/test_env
Modified: incubator/qpid/trunk/qpid/cpp/README
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/README?view=diff&rev=533828&r1=533827&r2=533828
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/README (original)
+++ incubator/qpid/trunk/qpid/cpp/README Mon Apr 30 12:03:53 2007
@@ -38,7 +38,7 @@
* apr <http://apr.apache.org> (1.2.7)
* boost <http://www.boost.org> (1.33.1)
* cppunit <http://cppunit.sourceforge.net> (1.11.4)
-
+ * libdaemon <http://www.stud.uni-hamburg.de/users/lennart/projects/libdaemon> (0.10)
Using tools:
* boost-jam <http://boost.sourceforge.net/> (3.1.13)
Modified: incubator/qpid/trunk/qpid/cpp/qpidc.spec.in
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/qpidc.spec.in?view=diff&rev=533828&r1=533827&r2=533828
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/qpidc.spec.in (original)
+++ incubator/qpid/trunk/qpid/cpp/qpidc.spec.in Mon Apr 30 12:03:53 2007
@@ -20,11 +20,13 @@
BuildRequires: e2fsprogs-devel
BuildRequires: graphviz
BuildRequires: help2man
+BuildRequires: libdaemon-devel
BuildRequires: libtool
BuildRequires: pkgconfig
-Requires: boost
Requires: apr
+Requires: boost
+Requires: libdaemon
Requires(post):/sbin/chkconfig
Requires(preun):/sbin/chkconfig
Modified: incubator/qpid/trunk/qpid/cpp/src/Makefile.am
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/Makefile.am?view=diff&rev=533828&r1=533827&r2=533828
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/Makefile.am (original)
+++ incubator/qpid/trunk/qpid/cpp/src/Makefile.am Mon Apr 30 12:03:53 2007
@@ -5,10 +5,9 @@
# -I top_builddir for config.h
INCLUDES = -I$(top_builddir) -I$(top_srcdir)/gen
-qpidd_LDADD = \
- libqpidbroker.la \
- libqpidcommon.la \
- -lboost_program_options
+qpidd_LDADD = \
+ libqpidbroker.la \
+ libqpidcommon.la
sbin_PROGRAMS = qpidd
qpidd_SOURCES = qpidd.cpp
@@ -104,7 +103,7 @@
qpid/CommonOptions.cpp
-libqpidbroker_la_LIBADD = libqpidcommon.la
+libqpidbroker_la_LIBADD = libqpidcommon.la -ldaemon -lboost_filesystem
libqpidbroker_la_LDFLAGS = -version-info $(LIBTOOL_VERSION_INFO_ARG)
libqpidbroker_la_SOURCES = \
qpid/broker/AccumulatedAck.cpp \
@@ -118,6 +117,7 @@
qpid/broker/BrokerQueue.cpp \
qpid/broker/Connection.cpp \
qpid/broker/ConnectionFactory.cpp \
+ qpid/broker/Daemon.cpp \
qpid/broker/DeliverableMessage.cpp \
qpid/broker/DeliveryRecord.cpp \
qpid/broker/DirectExchange.cpp \
@@ -204,6 +204,7 @@
qpid/broker/ConnectionFactory.h \
qpid/broker/ConnectionToken.h \
qpid/broker/Content.h \
+ qpid/broker/Daemon.h \
qpid/broker/DeliveryRecord.h \
qpid/broker/HeadersExchange.h \
qpid/broker/LazyLoadedContent.h \
Copied: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Daemon.cpp (from r533819, incubator/qpid/branches/M2/cpp/lib/broker/Daemon.cpp)
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Daemon.cpp?view=diff&rev=533828&p1=incubator/qpid/branches/M2/cpp/lib/broker/Daemon.cpp&r1=533819&p2=incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Daemon.cpp&r2=533828
==============================================================================
--- incubator/qpid/branches/M2/cpp/lib/broker/Daemon.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Daemon.cpp Mon Apr 30 12:03:53 2007
@@ -15,8 +15,8 @@
* limitations under the License.
*
*/
-#include "QpidError.h"
#include "Daemon.h"
+#include "qpid/QpidError.h"
#include <libdaemon/daemon.h>
#include <errno.h>
#include <unistd.h>
Modified: incubator/qpid/trunk/qpid/cpp/src/qpidd.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpidd.cpp?view=diff&rev=533828&r1=533827&r2=533828
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpidd.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpidd.cpp Mon Apr 30 12:03:53 2007
@@ -24,29 +24,51 @@
#include <signal.h>
#include "config.h"
#include "qpid/sys/posix/check.h"
+#include "qpid/broker/Daemon.h"
using namespace qpid;
using namespace qpid::broker;
using namespace qpid::sys;
using namespace std;
+Broker::shared_ptr brokerPtr;
+
+void handle_signal(int /*signal*/){
+ std::cerr << "Shutting down..." << std::endl;
+ brokerPtr->shutdown();
+}
+
+
/** Command line options */
struct QpiddOptions : public Broker::Options
{
bool help;
bool version;
bool daemon;
+ bool quit;
+ bool kill;
+ bool check;
+ bool ppid;
+ int wait;
string config;
po::options_description desc;
QpiddOptions() :
help(false), version(false), daemon(false),
+ quit(false), kill(false), check(false), ppid(false), wait(10),
config("/etc/qpidd.conf"),
desc("Options")
{
using namespace po;
desc.add_options()
- ("daemon,d", optValue(daemon), "Run as a daemon");
+ ("daemon,d", optValue(daemon), "Run as a daemon.")
+ ("quit,q", optValue(quit), "Stop the running daemon politely.")
+ ("kill,k", optValue(kill), "Kill the running daemon harshly.")
+ ("check,c", optValue(check), "If daemon is running return 0.")
+ ("wait", optValue(wait, "SECONDS"),
+ "Maximum wait for daemon response.")
+ ("ppid", optValue(ppid), "Print daemon pid to stdout" );
+ po::options_description brokerOpts;
Broker::Options::addTo(desc);
desc.add_options()
("config", optValue(config, "FILE"), "Configuation file")
@@ -86,43 +108,80 @@
config.usage(out); return out;
}
-Broker::shared_ptr brokerPtr;
-
-void handle_signal(int /*signal*/){
- if (brokerPtr) {
- cerr << "Shutting down..." << endl;
- brokerPtr->shutdown();
- }
-}
-
int main(int argc, char* argv[])
{
QpiddOptions config;
try {
config.parse(argc, argv);
+ string name=(boost::format("%s.%d")
+ % Daemon::nameFromArgv0(argv[0])
+ % (config.port)).str();
+ // Spelled 'demon' to avoid clash with daemon.h function.
+ Daemon demon(name, config.wait);
+
+ // Options that just print information.
if(config.help) {
config.usage(cout);
+ return 0;
}
- else if (config.version) {
+ if (config.version) {
cout << "qpidd (" << PACKAGE_NAME << ") version "
<< PACKAGE_VERSION << endl;
+ return 0;
}
- else {
- brokerPtr=Broker::create(config);
- signal(SIGINT, handle_signal);
- if (config.daemon) {
- if (daemon(0, 0) < 0) // daemon(nochdir, noclose)
- throw QPID_ERROR(
- INTERNAL_ERROR,
- "Failed to detach as daemon: "+ strError(errno));
+
+ // Options that affect an already running daemon.
+ if (config.quit || config.kill || config.check) {
+ pid_t pid = demon.check();
+ if (config.ppid && pid > 0)
+ cout << pid << endl;
+ if (config.kill)
+ demon.kill();
+ else if (config.quit)
+ demon.quit();
+ if (config.check && pid <= 0)
+ return 1;
+ return 0;
+ }
+
+ // Starting the broker:
+ signal(SIGINT, handle_signal);
+ if (config.daemon) {
+ pid_t pid = demon.fork();
+ if (pid == 0) { // Child
+ try {
+ brokerPtr=Broker::create(config);
+ demon.ready(); // Notify parent we're ready.
+ brokerPtr->run();
+ } catch (const exception& e) {
+ // TODO aconway 2007-04-26: Log this, cerr is lost.
+ cerr << "Broker daemon failed: " << e.what() << endl;
+ demon.failed(); // Notify parent we failed.
+ return 1;
+ }
+ }
+ else if (pid > 0) { // Parent
+ if (config.ppid)
+ cout << pid << endl;
+ return 0;
}
- brokerPtr->run();
+ else { // pid < 0
+ throw Exception("fork failed"+strError(errno));
+ }
+ } // Non-daemon broker.
+ else {
+ brokerPtr = Broker::create(config);
+ brokerPtr->run();
}
return 0;
}
- catch(const exception& e) {
+ catch(const po::error& e) {
+ // Command line parsing error.
cerr << "Error: " << e.what() << endl
<< "Type 'qpidd --help' for usage." << endl;
+ }
+ catch(const exception& e) {
+ cerr << "Error: " << e.what() << endl;
}
return 1;
}
Modified: incubator/qpid/trunk/qpid/cpp/src/tests/Makefile.am
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/Makefile.am?view=diff&rev=533828&r1=533827&r2=533828
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/Makefile.am (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/Makefile.am Mon Apr 30 12:03:53 2007
@@ -57,7 +57,7 @@
TESTS_ENVIRONMENT = VALGRIND=$(VALGRIND) srcdir=$(srcdir)
CLIENT_TESTS = client_test quick_topictest
-TESTS = run-unit-tests start_broker $(CLIENT_TESTS) python_tests kill_broker
+TESTS = run-unit-tests start_broker $(CLIENT_TESTS) python_tests kill_broker daemon_test
EXTRA_DIST = \
test_env \
Copied: incubator/qpid/trunk/qpid/cpp/src/tests/daemon_test (from r533819, incubator/qpid/branches/M2/cpp/tests/daemon_test)
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/daemon_test?view=diff&rev=533828&p1=incubator/qpid/branches/M2/cpp/tests/daemon_test&r1=533819&p2=incubator/qpid/trunk/qpid/cpp/src/tests/daemon_test&r2=533828
==============================================================================
--- incubator/qpid/branches/M2/cpp/tests/daemon_test (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/daemon_test Mon Apr 30 12:03:53 2007
@@ -4,19 +4,21 @@
#
TEMP=`mktemp`
+qpidd=../qpidd
+client_tests=./client_test
trap 'rm -f $TEMP' 0
fail() { echo FAIL: $0:$* 1>&2; exit 1; }
# Start and stop daemon.
-PID=`qpidd --check --ppid` && fail $LINENO: qpidd already running $PID
-qpidd -d || $LINENO: qpidd -d failed
-qpidd --check || fail $LINENO: qpidd --check says qpidd didnt start
-client_test > $TEMP || fail $LINENO: client_test: `cat $TEMP`
-qpidd -q || fail $LINENO: qpidd -q failed
-qpidd -d || fail $LINENO: restart after quit failed.
-qpidd -k || fail $LINENO: qpidd -k failed
+PID=`$qpidd --check --ppid` && fail $LINENO: $qpidd already running $PID
+$qpidd -d || $LINENO: $qpidd -d failed
+$qpidd --check || fail $LINENO: $qpidd --check says $qpidd didnt start
+./client_test > $TEMP || fail $LINENO: client_test: `cat $TEMP`
+$qpidd -q || fail $LINENO: $qpidd -q failed
+$qpidd -d || fail $LINENO: restart after quit failed.
+$qpidd -k || fail $LINENO: $qpidd -k failed
# Supress expected message re. cleanup of old PID file.
-PID=`qpidd --check --ppid 2>/dev/null` && fail $LINENO: $PID still running after kill.
+PID=`$qpidd --check --ppid 2>/dev/null` && fail $LINENO: $PID still running after kill.
true
Modified: incubator/qpid/trunk/qpid/cpp/src/tests/test_env
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/test_env?view=diff&rev=533828&r1=533827&r2=533828
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/test_env (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/test_env Mon Apr 30 12:03:53 2007
@@ -6,7 +6,7 @@
# Use VALGRIND if set, else look on path.
test -z "$VALGRIND" && VALGRIND=`which valgrind 2>/dev/null`
# No valgrind, just run the command
-test -z "$VALGRIND" && exec libtool --mode=execute "$@"
+test -z "$VALGRIND" && { exec libtool --mode=execute "$@"; exit $?; }
test "$VERBOSE" = yes && set -x
test -z "$vg_log" && vg_log=valgrind.out