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 2008/02/06 23:49:12 UTC

svn commit: r619200 - in /incubator/qpid/trunk/qpid/cpp: qpidc.spec.in src/Makefile.am src/qpid/DataDir.cpp src/qpid/DataDir.h src/qpid/broker/Broker.cpp src/qpid/broker/Broker.h src/tests/BrokerFixture.h src/tests/Makefile.am

Author: aconway
Date: Wed Feb  6 14:49:10 2008
New Revision: 619200

URL: http://svn.apache.org/viewvc?rev=619200&view=rev
Log:
>From Ted Ross, https://issues.apache.org/jira/browse/QPID-780
Implementation of --data-dir for qpidd.

Additions by myself:
 - set QPID_DATA_DIR= in test env so existing tests can run with no data dir.
 - src/Makefile.am and qpidc.spec.in install /var/lib/qpidd directory.

NOTE: qpidd with no optoins will now FAIL if it cannot write /var/lib/qpidd.
Start it with --data-dir= or set QPID_DATA_DIR= in your environement to
run with no data directory.


Added:
    incubator/qpid/trunk/qpid/cpp/src/qpid/DataDir.cpp   (with props)
    incubator/qpid/trunk/qpid/cpp/src/qpid/DataDir.h   (with props)
Modified:
    incubator/qpid/trunk/qpid/cpp/qpidc.spec.in
    incubator/qpid/trunk/qpid/cpp/src/Makefile.am
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Broker.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Broker.h
    incubator/qpid/trunk/qpid/cpp/src/tests/BrokerFixture.h
    incubator/qpid/trunk/qpid/cpp/src/tests/Makefile.am

Modified: incubator/qpid/trunk/qpid/cpp/qpidc.spec.in
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/qpidc.spec.in?rev=619200&r1=619199&r2=619200&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/qpidc.spec.in (original)
+++ incubator/qpid/trunk/qpid/cpp/qpidc.spec.in Wed Feb  6 14:49:10 2008
@@ -98,6 +98,7 @@
 %_libdir/libqpidcommon.so.0.1.0
 %_libdir/libqpidclient.so.0
 %_libdir/libqpidclient.so.0.1.0
+%_localstatedir/qpidd
 %config(noreplace) %_sysconfdir/qpidd.conf
 
 %files devel

Modified: incubator/qpid/trunk/qpid/cpp/src/Makefile.am
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/Makefile.am?rev=619200&r1=619199&r2=619200&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/Makefile.am (original)
+++ incubator/qpid/trunk/qpid/cpp/src/Makefile.am Wed Feb  6 14:49:10 2008
@@ -140,6 +140,7 @@
   qpid/sys/SystemInfo.cpp \
   qpid/sys/Serializer.cpp \
   qpid/sys/Shlib.cpp \
+  qpid/DataDir.cpp \
   qpid/Options.cpp \
   qpid/log/Options.cpp \
   qpid/log/Selector.cpp \
@@ -236,6 +237,7 @@
 nobase_include_HEADERS = \
   $(platform_hdr) \
   qpid/assert.h \
+  qpid/DataDir.h \
   qpid/Exception.h \
   qpid/Msg.h \
   qpid/Options.h \
@@ -437,4 +439,8 @@
 # Force build of qpidd during dist phase so help2man will work.
 dist-hook: $(BUILT_SOURCES)
 	$(MAKE) qpidd
+
+# Create the default data directory
+install-data-local:
+	$(mkinstalldirs) $(DESTDIR)/$(localstatedir)/lib/qpidd
 

Added: incubator/qpid/trunk/qpid/cpp/src/qpid/DataDir.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/DataDir.cpp?rev=619200&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/DataDir.cpp (added)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/DataDir.cpp Wed Feb  6 14:49:10 2008
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.
+ *
+ */
+
+#include "Exception.h"
+#include "DataDir.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <cerrno>
+
+namespace qpid {
+
+DataDir::DataDir (std::string path) :
+    enabled (!path.empty ()),
+    dirPath (path)
+{
+    if (!enabled)
+        return;
+
+    const  char *cpath = dirPath.c_str ();
+    struct stat  s;
+
+    if (::stat (cpath, &s))
+        throw Exception ("Data directory not found: " + path);
+
+    std::string lockFile (path);
+    lockFile = lockFile + "/lock";
+    int fd = ::open (lockFile.c_str (), O_CREAT | O_EXCL,
+                     S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+    if (fd == -1)
+    {
+        if (errno == EEXIST)
+            throw Exception ("Data directory is locked by another process");
+        if (errno == EACCES)
+            throw Exception ("Insufficient privileges for data directory");
+
+        std::ostringstream oss;
+        oss << "Error locking data directory: errno=" << errno;
+        throw Exception (oss.str ());
+    }
+}
+
+DataDir::~DataDir ()
+{
+    std::string lockFile (dirPath);
+    lockFile = lockFile + "/lock";
+
+    ::unlink (lockFile.c_str ());
+}
+
+} // namespace qpid
+

Propchange: incubator/qpid/trunk/qpid/cpp/src/qpid/DataDir.cpp
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/qpid/trunk/qpid/cpp/src/qpid/DataDir.cpp
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/qpid/trunk/qpid/cpp/src/qpid/DataDir.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/DataDir.h?rev=619200&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/DataDir.h (added)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/DataDir.h Wed Feb  6 14:49:10 2008
@@ -0,0 +1,47 @@
+#ifndef QPID_DATADIR_H
+#define QPID_DATADIR_H
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.
+ *
+ */
+
+#include <string>
+
+namespace qpid {
+
+/**
+ * DataDir class.
+ */
+class DataDir
+{
+    const bool        enabled;
+    const std::string dirPath;
+
+  public:
+
+    DataDir (std::string path);
+    ~DataDir ();
+
+    bool        isEnabled () { return enabled; }
+    std::string getPath   () { return dirPath; }
+};
+ 
+} // namespace qpid
+
+#endif  /*!QPID_DATADIR_H*/

Propchange: incubator/qpid/trunk/qpid/cpp/src/qpid/DataDir.h
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/qpid/trunk/qpid/cpp/src/qpid/DataDir.h
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Broker.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Broker.cpp?rev=619200&r1=619199&r2=619200&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Broker.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Broker.cpp Wed Feb  6 14:49:10 2008
@@ -60,6 +60,7 @@
 
 Broker::Options::Options(const std::string& name) :
     qpid::Options(name),
+    dataDir("/var/lib/qpidd"),
     port(DEFAULT_PORT),
     workerThreads(5),
     maxConnections(500),
@@ -72,6 +73,8 @@
     int c = sys::SystemInfo::concurrency();
     workerThreads=std::max(2,c);
     addOptions()
+        ("data-dir", optValue(dataDir,"DIR"),
+         "Directory to contain persistent data generated by the broker")
         ("port,p", optValue(port,"PORT"),
          "Tells the broker to listen on PORT")
         ("worker-threads", optValue(workerThreads, "N"),
@@ -82,7 +85,7 @@
          "Sets the connection backlog limit for the server socket")
         ("staging-threshold", optValue(stagingThreshold, "N"),
          "Stages messages over N bytes to disk")
-        ("mgmt,m", optValue(enableMgmt,"yes|no"),
+        ("mgmt-enable,m", optValue(enableMgmt,"yes|no"),
          "Enable Management")
         ("mgmt-pub-interval", optValue(mgmtPubInterval, "SECONDS"),
          "Management Publish Interval")
@@ -100,6 +103,7 @@
 Broker::Broker(const Broker::Options& conf) :
     config(conf),
     store(0),
+    dataDir(conf.dataDir),
     factory(*this),
     sessionManager(conf.ack)
 {

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Broker.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Broker.h?rev=619200&r1=619199&r2=619200&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Broker.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/Broker.h Wed Feb  6 14:49:10 2008
@@ -37,6 +37,7 @@
 #include "qpid/management/ArgsBrokerConnect.h"
 #include "qpid/Options.h"
 #include "qpid/Plugin.h"
+#include "qpid/DataDir.h"
 #include "qpid/framing/FrameHandler.h"
 #include "qpid/framing/OutputHandler.h"
 #include "qpid/framing/ProtocolInitiation.h"
@@ -59,7 +60,8 @@
 
     struct Options : public qpid::Options {
         Options(const std::string& name="Broker Options");
-        
+
+        std::string dataDir;
         uint16_t port;
         int workerThreads;
         int maxConnections;
@@ -99,6 +101,7 @@
     ExchangeRegistry& getExchanges() { return exchanges; }
     uint64_t getStagingThreshold() { return config.stagingThreshold; }
     DtxManager& getDtxManager() { return dtxManager; }
+    DataDir& getDataDir() { return dataDir; }
 
     SessionManager& getSessionManager() { return sessionManager; }
 
@@ -113,6 +116,7 @@
     Options config;
     sys::Acceptor::shared_ptr acceptor;
     MessageStore* store;
+    DataDir dataDir;
 
     QueueRegistry queues;
     ExchangeRegistry exchanges;

Modified: incubator/qpid/trunk/qpid/cpp/src/tests/BrokerFixture.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/BrokerFixture.h?rev=619200&r1=619199&r2=619200&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/BrokerFixture.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/BrokerFixture.h Wed Feb  6 14:49:10 2008
@@ -46,6 +46,7 @@
         // Management doesn't play well with multiple in-process brokers.
         opts.enableMgmt=false;  
         opts.workerThreads=1;
+        opts.dataDir="";
         broker = Broker::create(opts);
         // TODO aconway 2007-12-05: At one point BrokerFixture
         // tests could hang in Connection ctor if the following

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?rev=619200&r1=619199&r2=619200&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/Makefile.am (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/Makefile.am Wed Feb  6 14:49:10 2008
@@ -109,7 +109,7 @@
 
 check_PROGRAMS += $(testprogs) interop_runner
 
-TESTS_ENVIRONMENT = VALGRIND=$(VALGRIND) srcdir=$(srcdir) $(srcdir)/run_test
+TESTS_ENVIRONMENT = VALGRIND=$(VALGRIND) srcdir=$(srcdir) QPID_DATA_DIR= $(srcdir)/run_test 
 
 system_tests = client_test quick_perftest quick_topictest
 TESTS += run-unit-tests start_broker $(system_tests) python_tests stop_broker