rhmessaging commits: r1506 - mgmt/cumin/python/cumin.
by rhmessaging-commits@lists.jboss.org
Author: justi9
Date: 2007-12-17 16:51:49 -0500 (Mon, 17 Dec 2007)
New Revision: 1506
Modified:
mgmt/cumin/python/cumin/__init__.py
mgmt/cumin/python/cumin/queue.py
mgmt/cumin/python/cumin/widgets.py
Log:
An approximate fix for column sort of stat columns in the queue list.
Modified: mgmt/cumin/python/cumin/__init__.py
===================================================================
--- mgmt/cumin/python/cumin/__init__.py 2007-12-17 19:26:18 UTC (rev 1505)
+++ mgmt/cumin/python/…
[View More]cumin/__init__.py 2007-12-17 21:51:49 UTC (rev 1506)
@@ -32,7 +32,7 @@
self.model = CuminModel()
self.broker_connect_thread = BrokerConnectThread(self.model)
- #self.broker_connect_thread.start()
+ self.broker_connect_thread.start()
self.cumin_page = CuminPage(self, "cumin.html")
self.set_default_page(self.cumin_page)
@@ -106,5 +106,3 @@
print "Connection succeeded"
except socket.error:
print "Connection failed"
-
-
Modified: mgmt/cumin/python/cumin/queue.py
===================================================================
--- mgmt/cumin/python/cumin/queue.py 2007-12-17 19:26:18 UTC (rev 1505)
+++ mgmt/cumin/python/cumin/queue.py 2007-12-17 21:51:49 UTC (rev 1506)
@@ -28,13 +28,15 @@
col = TableColumn(None)
self.header.add_column(col)
- col = TableColumn("name", "name", "Name")
+ col = TableColumn("name", Queue.q.name, "Name")
self.header.add_column(col)
- col = TableColumn("bindings", None, "Exchange Bindings", "ralign")
+ col = TableColumn("bindings", QueueStats.q.bindings,
+ "Exchange Bindings", "ralign")
self.header.add_column(col)
- col = TableColumn("consumers", None, "Consumers", "ralign")
+ col = TableColumn("consumers", QueueStats.q.consumers,
+ "Consumers", "ralign")
self.header.add_column(col)
col = self.EnqueuedColumn("enqueued", None, None, "ralign")
@@ -66,36 +68,39 @@
return "%s Enqueued" % self.header.parent().get_unit_plural \
(session)
- def get_column(self, session, items):
- unit = self.header.parent().unit.get(session)
- return "queue_stats.%sTotalEnqueues" % \
- (unit == "b" and "byte" or "msg")
+ def get_column_name(self, session):
+ if self.header.parent().unit.get(session) == "b":
+ return QueueStats.q.byteTotalEnqueues
+ else:
+ return QueueStats.q.msgTotalEnqueues
class DequeuedColumn(TableColumn):
def get_title(self, session):
return "%s Dequeued" % self.header.parent().get_unit_plural \
(session)
- def get_column(self, session, items):
- unit = self.header.parent().unit.get(session)
- return "queue_stats.%sTotalDequeues" % \
- (unit == "b" and "byte" or "msg")
+ def get_column_name(self, session):
+ if self.header.parent().unit.get(session) == "b":
+ return QueueStats.q.byteTotalDequeues
+ else:
+ return QueueStats.q.msgTotalDequeues
class DepthColumn(TableColumn):
def get_title(self, session):
return "%s Depth" % self.header.parent().get_unit_singular(session)
- def get_column(self, session, items):
- unit = self.header.parent().unit.get(session)
- return "queue_stats.%sDepth" % (unit == "b" and "byte" or "msg")
+ def get_column_name(self, session):
+ if self.header.parent().unit.get(session) == "b":
+ return QueueStats.q.byteDepth
+ else:
+ return QueueStats.q.msgDepth
def get_item_count(self, session, vhost):
return vhost.queues.count()
def do_get_items(self, session, vhost):
if vhost:
- queues = Queue.select()
- queues = queues.filter(Queue.q.vhostID == vhost.id)
+ queues = vhost.queues
queues = queues.filter(Queue.q.statsCurrID == QueueStats.q.id)
column = self.header.get_selected_column(session)
@@ -283,9 +288,13 @@
return queue.bindings.count()
def do_get_items(self, session, queue):
+ bindings = queue.bindings
+
start, end = self.get_bounds(session)
- return queue.bindings[start:end]
+ bindings = bindings[start:end]
+ return bindings
+
def render_item_href(self, session, binding):
branch = session.branch()
self.page().show_exchange(branch, binding.exchange)
Modified: mgmt/cumin/python/cumin/widgets.py
===================================================================
--- mgmt/cumin/python/cumin/widgets.py 2007-12-17 19:26:18 UTC (rev 1505)
+++ mgmt/cumin/python/cumin/widgets.py 2007-12-17 21:51:49 UTC (rev 1506)
@@ -377,9 +377,14 @@
return self.class_
def get_sorted_items(self, session, items):
- # XXX sqlobject specific
- return items.orderBy(self.get_column_name(session))
+ name = self.get_column_name(session)
+ if name:
+ # XXX sqlobject specific
+ items = items.orderBy(self.get_column_name(session))
+
+ return items
+
class PaginatedItemSet(ItemSet):
def __init__(self, app, name):
super(PaginatedItemSet, self).__init__(app, name)
[View Less]
17 years, 3 months
rhmessaging commits: r1505 - mgmt/mint/python/mint.
by rhmessaging-commits@lists.jboss.org
Author: justi9
Date: 2007-12-17 14:26:18 -0500 (Mon, 17 Dec 2007)
New Revision: 1505
Modified:
mgmt/mint/python/mint/schema.py
mgmt/mint/python/mint/schema.sql
mgmt/mint/python/mint/schemaparser.py
Log:
Upgrades the schema.
Makes the parser generate SQLMultipleJoins instead of MultipleJoins.
Modified: mgmt/mint/python/mint/schema.py
===================================================================
--- mgmt/mint/python/mint/schema.py 2007-12-17 19:18:02 UTC (rev 1504)
+++ mgmt/…
[View More]mint/python/mint/schema.py 2007-12-17 19:26:18 UTC (rev 1505)
@@ -55,6 +55,7 @@
classToSchemaNameMap[self.__class__.__name__], "leaveCluster", args=actualArgs, packageName="qpid")
def echo(self, model, managedBrokerLabel, callbackMethod, sequence, body):
+ """Request a response to test the path to the management agent"""
actualArgs = dict()
actualArgs["sequence"] = sequence
actualArgs["body"] = body
@@ -247,12 +248,6 @@
model.getConnectedBroker(managedBrokerLabel).method(methodId, self.idOriginal, \
classToSchemaNameMap[self.__class__.__name__], "close", args=actualArgs, packageName="qpid")
- def detach(self, model, managedBrokerLabel, callbackMethod):
- actualArgs = dict()
- methodId = model.registerCallback(callbackMethod)
- model.getConnectedBroker(managedBrokerLabel).method(methodId, self.idOriginal, \
- classToSchemaNameMap[self.__class__.__name__], "detach", args=actualArgs, packageName="qpid")
-
Vhost.sqlmeta.addJoin(SQLMultipleJoin('Client', joinMethodName='clients'))
@@ -260,11 +255,12 @@
idOriginal = BigIntCol(default=None)
recTime = TimestampCol(default=None)
client = ForeignKey('Client', cascade='null', default=None)
+ closing = BoolCol(default=None)
authIdentity = StringCol(length=1000, default=None)
framesFromClient = BigIntCol(default=None)
- msgsConsumed = BigIntCol(default=None)
+ framesToClient = BigIntCol(default=None)
bytesFromClient = BigIntCol(default=None)
- bytesConsumed = BigIntCol(default=None)
+ bytesToClient = BigIntCol(default=None)
Client.sqlmeta.addJoin(SQLMultipleJoin('ClientStats', joinMethodName='stats'))
@@ -279,6 +275,7 @@
statsPrev = ForeignKey('SessionStats', cascade='null', default=None)
vhost = ForeignKey('Vhost', cascade='null', default=None)
name = StringCol(length=1000, default=None)
+ channelId = SmallIntCol(default=None)
client = ForeignKey('Client', cascade='null', default=None)
detachedLifespan = IntCol(default=None)
Modified: mgmt/mint/python/mint/schema.sql
===================================================================
--- mgmt/mint/python/mint/schema.sql 2007-12-17 19:18:02 UTC (rev 1504)
+++ mgmt/mint/python/mint/schema.sql 2007-12-17 19:26:18 UTC (rev 1505)
@@ -109,11 +109,12 @@
id_original BIGINT,
rec_time TIMESTAMP,
client_id INT,
+ closing BOOL,
auth_identity VARCHAR(1000),
frames_from_client BIGINT,
- msgs_consumed BIGINT,
+ frames_to_client BIGINT,
bytes_from_client BIGINT,
- bytes_consumed BIGINT
+ bytes_to_client BIGINT
);
CREATE TABLE consumer (
@@ -297,6 +298,7 @@
stats_prev_id INT,
vhost_id INT,
name VARCHAR(1000),
+ channel_id SMALLINT,
client_id INT,
detached_lifespan INT
);
Modified: mgmt/mint/python/mint/schemaparser.py
===================================================================
--- mgmt/mint/python/mint/schemaparser.py 2007-12-17 19:18:02 UTC (rev 1504)
+++ mgmt/mint/python/mint/schemaparser.py 2007-12-17 19:26:18 UTC (rev 1505)
@@ -54,7 +54,7 @@
def generateMultipleJoin(self, tableFrom, tableTo, attrib=""):
if (attrib == ""):
attrib = tableTo.lower() + "s"
- self.additionalPythonOutput += "\n%s.sqlmeta.addJoin(MultipleJoin('%s', joinMethodName='%s'))\n" % (tableFrom, tableTo, attrib)
+ self.additionalPythonOutput += "\n%s.sqlmeta.addJoin(SQLMultipleJoin('%s', joinMethodName='%s'))\n" % (tableFrom, tableTo, attrib)
def generateClassAttribs(self, schemaName, elements):
for elem in elements:
[View Less]
17 years, 3 months
rhmessaging commits: r1504 - mgmt/cumin/python/cumin.
by rhmessaging-commits@lists.jboss.org
Author: justi9
Date: 2007-12-17 14:18:02 -0500 (Mon, 17 Dec 2007)
New Revision: 1504
Modified:
mgmt/cumin/python/cumin/queue.py
mgmt/cumin/python/cumin/widgets.py
Log:
More table sorting improvements.
Modified: mgmt/cumin/python/cumin/queue.py
===================================================================
--- mgmt/cumin/python/cumin/queue.py 2007-12-17 18:49:24 UTC (rev 1503)
+++ mgmt/cumin/python/cumin/queue.py 2007-12-17 19:18:02 UTC (rev 1504)
@@ -23,18 +23,35 @@
self.…
[View More]add_child(self.unit)
self.header = TableHeader(app, "header")
- self.header.add_column(TableColumn())
- self.header.add_column(TableColumn("Name", "name"))
- self.header.add_column \
- (TableColumn("Exchange Bindings", None, "ralign"))
- self.header.add_column(TableColumn("Consumers", None, "ralign"))
- self.header.add_column(self.EnqueuedColumn(html_class="ralign"))
- self.header.add_column(self.DequeuedColumn(html_class="ralign"))
- self.header.add_column(self.DepthColumn(html_class="ralign"))
- self.header.add_column(TableColumn("Depth Accel.", None, "ralign"))
- self.header.add_column(TableColumn("Status", None))
self.add_child(self.header)
+ col = TableColumn(None)
+ self.header.add_column(col)
+
+ col = TableColumn("name", "name", "Name")
+ self.header.add_column(col)
+
+ col = TableColumn("bindings", None, "Exchange Bindings", "ralign")
+ self.header.add_column(col)
+
+ col = TableColumn("consumers", None, "Consumers", "ralign")
+ self.header.add_column(col)
+
+ col = self.EnqueuedColumn("enqueued", None, None, "ralign")
+ self.header.add_column(col)
+
+ col = self.DequeuedColumn("dequeued", None, None, "ralign")
+ self.header.add_column(col)
+
+ col = self.DepthColumn("depth", None, None, "ralign")
+ self.header.add_column(col)
+
+ col = TableColumn("accel", None, "Depth Accel.", "ralign")
+ self.header.add_column(col)
+
+ col = TableColumn("status", None, "Status")
+ self.header.add_column(col)
+
def get_title(self, session, vhost):
return "Queues %s" % fmt_count(self.get_item_count(session, vhost))
@@ -49,23 +66,28 @@
return "%s Enqueued" % self.header.parent().get_unit_plural \
(session)
- def get_sort_key(self, session):
- return None
+ def get_column(self, session, items):
+ unit = self.header.parent().unit.get(session)
+ return "queue_stats.%sTotalEnqueues" % \
+ (unit == "b" and "byte" or "msg")
class DequeuedColumn(TableColumn):
def get_title(self, session):
return "%s Dequeued" % self.header.parent().get_unit_plural \
(session)
- def get_sort_key(self, session):
- return None
+ def get_column(self, session, items):
+ unit = self.header.parent().unit.get(session)
+ return "queue_stats.%sTotalDequeues" % \
+ (unit == "b" and "byte" or "msg")
class DepthColumn(TableColumn):
def get_title(self, session):
return "%s Depth" % self.header.parent().get_unit_singular(session)
- def get_sort_key(self, session):
- return None
+ def get_column(self, session, items):
+ unit = self.header.parent().unit.get(session)
+ return "queue_stats.%sDepth" % (unit == "b" and "byte" or "msg")
def get_item_count(self, session, vhost):
return vhost.queues.count()
@@ -76,8 +98,8 @@
queues = queues.filter(Queue.q.vhostID == vhost.id)
queues = queues.filter(Queue.q.statsCurrID == QueueStats.q.id)
- sort_key = self.header.get_sort_key(session) or "name"
- queues = queues.orderBy(sort_key)
+ column = self.header.get_selected_column(session)
+ queues = column.get_sorted_items(session, queues)
start, end = self.get_bounds(session)
queues = queues[start:end]
Modified: mgmt/cumin/python/cumin/widgets.py
===================================================================
--- mgmt/cumin/python/cumin/widgets.py 2007-12-17 18:49:24 UTC (rev 1503)
+++ mgmt/cumin/python/cumin/widgets.py 2007-12-17 19:18:02 UTC (rev 1504)
@@ -330,15 +330,18 @@
self.columns = list() # of TableColumns
- self.sort = Parameter(app, "sort")
- self.add_parameter(self.sort)
+ self.column = Parameter(app, "col")
+ self.add_parameter(self.column)
def add_column(self, column):
self.columns.append(column)
column.header = self
- def get_sort_key(self, session):
- return self.sort.get(session)
+ def get_selected_column(self, session):
+ name = self.column.get(session)
+ for column in self.columns:
+ if column.name == name:
+ return column
def get_items(self, session, object):
return self.columns
@@ -350,35 +353,33 @@
return column.get_title(session)
def render_item_href(self, session, column):
- sort_key = column.get_sort_key(session)
+ branch = session.branch()
+ self.column.set(branch, column.name)
+ return branch.marshal()
- if sort_key:
- branch = session.branch()
- self.sort.set(branch, sort_key)
- href = branch.marshal()
- else:
- href = session.marshal()
-
- return href
-
# XXX for now, not a Widget
class TableColumn(object):
- def __init__(self, title=None, sort_key=None, html_class=None):
+ def __init__(self, name, column_name=None, title=None, class_=None):
+ self.name = name
+ self.column_name = column_name
self.title = title
- self.sort_key = sort_key
- self.html_class = html_class
+ self.class_ = class_
self.header = None
+ def get_column_name(self, session):
+ return self.column_name
+
def get_title(self, session):
return self.title
- def get_sort_key(self, session):
- return self.sort_key
-
def get_class(self, session):
- return self.html_class
+ return self.class_
+ def get_sorted_items(self, session, items):
+ # XXX sqlobject specific
+ return items.orderBy(self.get_column_name(session))
+
class PaginatedItemSet(ItemSet):
def __init__(self, app, name):
super(PaginatedItemSet, self).__init__(app, name)
[View Less]
17 years, 3 months
rhmessaging commits: r1503 - store/trunk/cpp/lib/jrnl.
by rhmessaging-commits@lists.jboss.org
Author: kpvdr
Date: 2007-12-17 13:49:24 -0500 (Mon, 17 Dec 2007)
New Revision: 1503
Modified:
store/trunk/cpp/lib/jrnl/jcntl.cpp
store/trunk/cpp/lib/jrnl/jcntl.hpp
Log:
Added separate mutex for jcntl::get_wr_events(), which was previoiusly deadlocking on the write mutex.
Modified: store/trunk/cpp/lib/jrnl/jcntl.cpp
===================================================================
--- store/trunk/cpp/lib/jrnl/jcntl.cpp 2007-12-17 16:45:58 UTC (rev 1502)
+++ store/trunk/cpp/lib/jrnl/…
[View More]jcntl.cpp 2007-12-17 18:49:24 UTC (rev 1503)
@@ -73,7 +73,8 @@
_wmgr(this, _emap, _tmap, _wrfc),
_rcvdat(_num_jfiles)
{
- pthread_mutex_init(&_mutex, NULL);
+ pthread_mutex_init(&_wr_mutex, NULL);
+ pthread_mutex_init(&_gev_mutex, NULL);
}
jcntl::~jcntl()
@@ -88,7 +89,8 @@
::delete _datafh[i];
::delete[] _datafh;
}
- pthread_mutex_destroy(&_mutex);
+ pthread_mutex_destroy(&_gev_mutex);
+ pthread_mutex_destroy(&_wr_mutex);
}
void
@@ -209,7 +211,7 @@
{
check_wstatus("enqueue_data_record");
{
- slock s(&_mutex);
+ slock s(&_wr_mutex);
iores r;
while (handle_aio_wait(_wmgr.enqueue(data_buff, tot_data_len, this_data_len, dtokp, NULL,
0, transient, false), r));
@@ -222,7 +224,7 @@
{
check_wstatus("enqueue_extern_data_record");
{
- slock s(&_mutex);
+ slock s(&_wr_mutex);
iores r;
while (handle_aio_wait(_wmgr.enqueue(NULL, tot_data_len, 0, dtokp, NULL, 0, transient,
true), r));
@@ -237,7 +239,7 @@
{
check_wstatus("enqueue_tx_data_record");
{
- slock s(&_mutex);
+ slock s(&_wr_mutex);
iores r;
while (handle_aio_wait(_wmgr.enqueue(data_buff, tot_data_len, this_data_len, dtokp,
xid.data(), xid.size(), transient, false), r));
@@ -251,7 +253,7 @@
{
check_wstatus("enqueue_extern_txn_data_record");
{
- slock s(&_mutex);
+ slock s(&_wr_mutex);
iores r;
while (handle_aio_wait(_wmgr.enqueue(NULL, tot_data_len, 0, dtokp, xid.data(), xid.size(),
transient, true), r));
@@ -287,7 +289,7 @@
{
check_wstatus("dequeue_data");
{
- slock s(&_mutex);
+ slock s(&_wr_mutex);
iores r;
while (handle_aio_wait(_wmgr.dequeue(dtokp, NULL, 0), r));
return r;
@@ -299,7 +301,7 @@
{
check_wstatus("dequeue_data");
{
- slock s(&_mutex);
+ slock s(&_wr_mutex);
iores r;
while (handle_aio_wait(_wmgr.dequeue(dtokp, xid.data(), xid.size()), r));
return r;
@@ -311,7 +313,7 @@
{
check_wstatus("txn_abort");
{
- slock s(&_mutex);
+ slock s(&_wr_mutex);
iores r;
while (handle_aio_wait(_wmgr.abort(dtokp, xid.data(), xid.size()), r));
return r;
@@ -323,7 +325,7 @@
{
check_wstatus("txn_commit");
{
- slock s(&_mutex);
+ slock s(&_wr_mutex);
iores r;
while (handle_aio_wait(_wmgr.commit(dtokp, xid.data(), xid.size()), r));
return r;
@@ -339,7 +341,7 @@
const u_int32_t
jcntl::get_wr_events()
{
- stlock t(&_mutex);
+ stlock t(&_gev_mutex);
if (t.locked())
return _wmgr.get_events(pmgr::UNUSED);
return 0;
@@ -375,7 +377,7 @@
if (_readonly_flag)
throw jexception(jerrno::JERR_JCNTL_READONLY, "jcntl", "flush");
{
- slock s(&_mutex);
+ slock s(&_wr_mutex);
return _wmgr.flush();
}
}
Modified: store/trunk/cpp/lib/jrnl/jcntl.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/jcntl.hpp 2007-12-17 16:45:58 UTC (rev 1502)
+++ store/trunk/cpp/lib/jrnl/jcntl.hpp 2007-12-17 18:49:24 UTC (rev 1503)
@@ -139,7 +139,8 @@
rmgr _rmgr; ///< Read page manager which manages AIO
wmgr _wmgr; ///< Write page manager which manages AIO
rcvdat _rcvdat; ///< Recovery data used for recovery
- pthread_mutex_t _mutex; ///< Mutex for thread safety
+ pthread_mutex_t _wr_mutex; ///< Mutex for journal writes
+ pthread_mutex_t _gev_mutex; ///< Mutex for get_events
public:
/**
[View Less]
17 years, 3 months
rhmessaging commits: r1502 - in mgmt: notes and 1 other directory.
by rhmessaging-commits@lists.jboss.org
Author: justi9
Date: 2007-12-17 11:45:58 -0500 (Mon, 17 Dec 2007)
New Revision: 1502
Modified:
mgmt/cumin/python/cumin/__init__.py
mgmt/cumin/python/cumin/client.py
mgmt/cumin/python/cumin/exchange.py
mgmt/cumin/python/cumin/queue.py
mgmt/cumin/python/cumin/queue.strings
mgmt/cumin/python/cumin/widgets.py
mgmt/cumin/python/cumin/widgets.strings
mgmt/notes/justin-todo.txt
Log:
Adds classes TableHeader and TableColumn. Uses them to provide the
first cut of table sort for …
[View More]QueueSet.
Converts all sqlobject collection accesses to the simpler
attr-oriented method now that we reconfigured sqlobject to make them
SelectResults objects.
Modified: mgmt/cumin/python/cumin/__init__.py
===================================================================
--- mgmt/cumin/python/cumin/__init__.py 2007-12-17 16:21:15 UTC (rev 1501)
+++ mgmt/cumin/python/cumin/__init__.py 2007-12-17 16:45:58 UTC (rev 1502)
@@ -32,7 +32,7 @@
self.model = CuminModel()
self.broker_connect_thread = BrokerConnectThread(self.model)
- self.broker_connect_thread.start()
+ #self.broker_connect_thread.start()
self.cumin_page = CuminPage(self, "cumin.html")
self.set_default_page(self.cumin_page)
Modified: mgmt/cumin/python/cumin/client.py
===================================================================
--- mgmt/cumin/python/cumin/client.py 2007-12-17 16:21:15 UTC (rev 1501)
+++ mgmt/cumin/python/cumin/client.py 2007-12-17 16:45:58 UTC (rev 1502)
@@ -25,13 +25,12 @@
return self.unit.get(session) == "b" and "Bytes" or "Frames"
def get_item_count(self, session, vhost):
- return Client.select(Client.q.vhostID == vhost.id).count()
+ return vhost.clients.count()
def do_get_items(self, session, vhost):
if vhost:
start, end = self.get_bounds(session)
- return Client.select(Client.q.vhostID == vhost.id,
- orderBy="address")[start:end]
+ return vhost.clients.orderBy("address")[start:end]
def render_item_link(self, session, client):
branch = session.branch()
@@ -202,10 +201,10 @@
return "Sessions %s" % fmt_count(self.get_item_count(session, client))
def get_item_count(self, session, client):
- return Session.select(Session.q.clientID == client.id).count()
+ return client.sessions.count()
def do_get_items(self, session, client):
- return Session.select(Session.q.clientID == client.id)
+ return client.sessions
def render_item_name(self, session, session_):
return session_.name
Modified: mgmt/cumin/python/cumin/exchange.py
===================================================================
--- mgmt/cumin/python/cumin/exchange.py 2007-12-17 16:21:15 UTC (rev 1501)
+++ mgmt/cumin/python/cumin/exchange.py 2007-12-17 16:45:58 UTC (rev 1502)
@@ -52,13 +52,12 @@
return self.unit.get(session) == "b" and "Bytes" or "Msgs."
def get_item_count(self, session, vhost):
- return Exchange.select(Exchange.q.vhostID == vhost.id).count()
+ return vhost.exchanges.count()
def do_get_items(self, session, vhost):
if vhost:
start, end = self.paginator.get_bounds(session)
- return Exchange.select(Exchange.q.vhostID == vhost.id,
- orderBy="name")[start:end]
+ return vhost.exchanges.orderBy("name")[start:end]
def render_item_link(self, session, exchange):
branch = session.branch()
@@ -214,11 +213,11 @@
fmt_count(self.get_item_count(session, exchange))
def get_item_count(self, session, exchange):
- return Binding.select(Binding.q.exchangeID == exchange.id).count()
+ return exchange.bindings.count()
def do_get_items(self, session, exchange):
start, end = self.get_bounds(session)
- return Binding.select(Binding.q.exchangeID == exchange.id)[start:end]
+ return exchange.bindings[start:end]
def render_item_href(self, session, binding):
branch = session.branch()
Modified: mgmt/cumin/python/cumin/queue.py
===================================================================
--- mgmt/cumin/python/cumin/queue.py 2007-12-17 16:21:15 UTC (rev 1501)
+++ mgmt/cumin/python/cumin/queue.py 2007-12-17 16:45:58 UTC (rev 1502)
@@ -22,26 +22,68 @@
self.unit = UnitSwitch(app, "unit")
self.add_child(self.unit)
+ self.header = TableHeader(app, "header")
+ self.header.add_column(TableColumn())
+ self.header.add_column(TableColumn("Name", "name"))
+ self.header.add_column \
+ (TableColumn("Exchange Bindings", None, "ralign"))
+ self.header.add_column(TableColumn("Consumers", None, "ralign"))
+ self.header.add_column(self.EnqueuedColumn(html_class="ralign"))
+ self.header.add_column(self.DequeuedColumn(html_class="ralign"))
+ self.header.add_column(self.DepthColumn(html_class="ralign"))
+ self.header.add_column(TableColumn("Depth Accel.", None, "ralign"))
+ self.header.add_column(TableColumn("Status", None))
+ self.add_child(self.header)
+
def get_title(self, session, vhost):
return "Queues %s" % fmt_count(self.get_item_count(session, vhost))
- def render_unit_singular(self, session, vhost):
+ def get_unit_singular(self, session):
return self.unit.get(session) == "b" and "Byte" or "Msg."
- def render_unit_plural(self, session, vhost):
+ def get_unit_plural(self, session):
return self.unit.get(session) == "b" and "Bytes" or "Msgs."
+ class EnqueuedColumn(TableColumn):
+ def get_title(self, session):
+ return "%s Enqueued" % self.header.parent().get_unit_plural \
+ (session)
+
+ def get_sort_key(self, session):
+ return None
+
+ class DequeuedColumn(TableColumn):
+ def get_title(self, session):
+ return "%s Dequeued" % self.header.parent().get_unit_plural \
+ (session)
+
+ def get_sort_key(self, session):
+ return None
+
+ class DepthColumn(TableColumn):
+ def get_title(self, session):
+ return "%s Depth" % self.header.parent().get_unit_singular(session)
+
+ def get_sort_key(self, session):
+ return None
+
def get_item_count(self, session, vhost):
- return Queue.select(Queue.q.vhostID == vhost.id).count()
+ return vhost.queues.count()
def do_get_items(self, session, vhost):
if vhost:
+ queues = Queue.select()
+ queues = queues.filter(Queue.q.vhostID == vhost.id)
+ queues = queues.filter(Queue.q.statsCurrID == QueueStats.q.id)
+
+ sort_key = self.header.get_sort_key(session) or "name"
+ queues = queues.orderBy(sort_key)
+
start, end = self.get_bounds(session)
- return Queue.select(Queue.q.vhostID == vhost.id,
- join=LEFTJOINOn(None, QueueStats,
- Queue.q.statsCurrID == QueueStats.q.id),
- orderBy="name")[start:end]
+ queues = queues[start:end]
+ return queues
+
def render_item_link(self, session, queue):
branch = session.branch()
self.page().show_queue(branch, queue).show_view(branch)
@@ -216,11 +258,11 @@
fmt_count(self.get_item_count(session, queue))
def get_item_count(self, session, queue):
- return Binding.select(Binding.q.queueID == queue.id).count()
+ return queue.bindings.count()
def do_get_items(self, session, queue):
start, end = self.get_bounds(session)
- return Binding.select(Binding.q.queueID == queue.id)[start:end]
+ return queue.bindings[start:end]
def render_item_href(self, session, binding):
branch = session.branch()
@@ -483,11 +525,11 @@
return "Consumers %s" % fmt_count(self.get_item_count(session, queue))
def get_item_count(self, session, queue):
- return Consumer.select(Consumer.q.queueID == queue.id).count()
+ return queue.consumers.count()
def do_get_items(self, session, queue):
start, end = self.get_bounds(session)
- return Consumer.select(Consumer.q.queueID == queue.id)[start:end]
+ return queue.consumers[start:end]
def render_item_name(self, session, consumer):
return consumer.name
Modified: mgmt/cumin/python/cumin/queue.strings
===================================================================
--- mgmt/cumin/python/cumin/queue.strings 2007-12-17 16:21:15 UTC (rev 1501)
+++ mgmt/cumin/python/cumin/queue.strings 2007-12-17 16:45:58 UTC (rev 1502)
@@ -16,18 +16,7 @@
</div>
<table class="mobjects">
- <tr>
- <th><input type="checkbox"/></th>
- <th>Name</th>
- <th class="ralign">Consumers</th>
- <th class="ralign">Exchange Bindings</th>
- <th class="ralign">{unit_plural} Enqueued</th>
- <th class="ralign">{unit_plural} Dequeued</th>
- <th class="ralign">{unit_singular} Depth</th>
- <th class="ralign">Depth Accel.</th>
- <th>Status</th>
- </tr>
-
+ {header}
{items}
</table>
<!-- </form> -->
Modified: mgmt/cumin/python/cumin/widgets.py
===================================================================
--- mgmt/cumin/python/cumin/widgets.py 2007-12-17 16:21:15 UTC (rev 1501)
+++ mgmt/cumin/python/cumin/widgets.py 2007-12-17 16:45:58 UTC (rev 1502)
@@ -328,19 +328,57 @@
def __init__(self, app, name):
super(TableHeader, self).__init__(app, name)
- self.columns = list()
+ self.columns = list() # of TableColumns
- XXX
+ self.sort = Parameter(app, "sort")
+ self.add_parameter(self.sort)
+ def add_column(self, column):
+ self.columns.append(column)
+ column.header = self
+
+ def get_sort_key(self, session):
+ return self.sort.get(session)
+
def get_items(self, session, object):
return self.columns
+ def render_item_class(self, session, column):
+ return column.get_class(session)
+
def render_item_content(self, session, column):
- return column.render_
+ return column.get_title(session)
def render_item_href(self, session, column):
- return column.get_href(session, column)
+ sort_key = column.get_sort_key(session)
+ if sort_key:
+ branch = session.branch()
+ self.sort.set(branch, sort_key)
+ href = branch.marshal()
+ else:
+ href = session.marshal()
+
+ return href
+
+# XXX for now, not a Widget
+class TableColumn(object):
+ def __init__(self, title=None, sort_key=None, html_class=None):
+ self.title = title
+ self.sort_key = sort_key
+ self.html_class = html_class
+
+ self.header = None
+
+ def get_title(self, session):
+ return self.title
+
+ def get_sort_key(self, session):
+ return self.sort_key
+
+ def get_class(self, session):
+ return self.html_class
+
class PaginatedItemSet(ItemSet):
def __init__(self, app, name):
super(PaginatedItemSet, self).__init__(app, name)
Modified: mgmt/cumin/python/cumin/widgets.strings
===================================================================
--- mgmt/cumin/python/cumin/widgets.strings 2007-12-17 16:21:15 UTC (rev 1501)
+++ mgmt/cumin/python/cumin/widgets.strings 2007-12-17 16:45:58 UTC (rev 1502)
@@ -81,3 +81,11 @@
[Paginator.item_html]
<li><a {item_class_attr} href="{item_href}">{item_content}</a></li>
+
+[TableHeader.html]
+<thead>
+ <tr>{items}</tr>
+</thead>
+
+[TableHeader.item_html]
+<th class="{item_class}"><a href="{item_href}">{item_content}</a></th>
Modified: mgmt/notes/justin-todo.txt
===================================================================
--- mgmt/notes/justin-todo.txt 2007-12-17 16:21:15 UTC (rev 1501)
+++ mgmt/notes/justin-todo.txt 2007-12-17 16:45:58 UTC (rev 1502)
@@ -35,8 +35,12 @@
- Handle other exception conditions on broker connect more gracefully
+ * Remove sqlobject workaround in CuminStat.samples
+
Deferred
+ * Go back to Widget.parent as an attr, not a function
+
* Indicate how old stats are
* Need way to control connectToBroker timeout
[View Less]
17 years, 3 months
rhmessaging commits: r1501 - in store/trunk/cpp/lib: jrnl and 1 other directory.
by rhmessaging-commits@lists.jboss.org
Author: kpvdr
Date: 2007-12-17 11:21:15 -0500 (Mon, 17 Dec 2007)
New Revision: 1501
Modified:
store/trunk/cpp/lib/JournalImpl.cpp
store/trunk/cpp/lib/JournalImpl.h
store/trunk/cpp/lib/jrnl/jcntl.cpp
store/trunk/cpp/lib/jrnl/jcntl.hpp
store/trunk/cpp/lib/jrnl/slock.hpp
Log:
Removed locks and monitors from class JournalImpl, returned to simpler approach of waiting for AIO to return by sleeping and periodically cheching for aio returns on the thread that had its write interrupted, …
[View More]while all other write threads remain locked by jcntl's write mutex.
Modified: store/trunk/cpp/lib/JournalImpl.cpp
===================================================================
--- store/trunk/cpp/lib/JournalImpl.cpp 2007-12-17 14:32:28 UTC (rev 1500)
+++ store/trunk/cpp/lib/JournalImpl.cpp 2007-12-17 16:21:15 UTC (rev 1501)
@@ -50,8 +50,6 @@
getEventsTimerSetFlag(false),
writeActivityFlag(false),
flushTriggeredFlag(true),
- aioWait(false),
- aioWaitLock(false),
_xidp(0),
_datap(0),
_dlen(0),
@@ -179,63 +177,52 @@
JournalImpl::enqueue_data_record(const void* const data_buff, const size_t tot_data_len,
const size_t this_data_len, data_tok* dtokp, const bool transient)
{
- writeLockCheck();
- while(handleIoResult(jcntl::enqueue_data_record(data_buff, tot_data_len, this_data_len, dtokp,
- transient)));
+ handleIoResult(jcntl::enqueue_data_record(data_buff, tot_data_len, this_data_len, dtokp, transient));
}
void
JournalImpl::enqueue_extern_data_record(const size_t tot_data_len, data_tok* dtokp,
const bool transient)
{
- writeLockCheck();
- while(handleIoResult(jcntl::enqueue_extern_data_record(tot_data_len, dtokp, transient)));
+ handleIoResult(jcntl::enqueue_extern_data_record(tot_data_len, dtokp, transient));
}
void
JournalImpl::enqueue_txn_data_record(const void* const data_buff, const size_t tot_data_len,
const size_t this_data_len, data_tok* dtokp, const std::string& xid, const bool transient)
{
- writeLockCheck();
- while(handleIoResult(jcntl::enqueue_txn_data_record(data_buff, tot_data_len, this_data_len,
- dtokp, xid, transient)));
+ handleIoResult(jcntl::enqueue_txn_data_record(data_buff, tot_data_len, this_data_len, dtokp, xid, transient));
}
void
JournalImpl::enqueue_extern_txn_data_record(const size_t tot_data_len, data_tok* dtokp,
const std::string& xid, const bool transient)
{
- writeLockCheck();
- while(handleIoResult(jcntl::enqueue_extern_txn_data_record(tot_data_len, dtokp, xid,
- transient)));
+ handleIoResult(jcntl::enqueue_extern_txn_data_record(tot_data_len, dtokp, xid, transient));
}
void
JournalImpl::dequeue_data_record(data_tok* const dtokp)
{
- writeLockCheck();
- while(handleIoResult(jcntl::dequeue_data_record(dtokp)));
+ handleIoResult(jcntl::dequeue_data_record(dtokp));
}
void
JournalImpl::dequeue_txn_data_record(data_tok* const dtokp, const std::string& xid)
{
- writeLockCheck();
- while(handleIoResult(jcntl::dequeue_txn_data_record(dtokp, xid)));
+ handleIoResult(jcntl::dequeue_txn_data_record(dtokp, xid));
}
void
JournalImpl::txn_abort(data_tok* const dtokp, const std::string& xid)
{
- writeLockCheck();
- while(handleIoResult(jcntl::txn_abort(dtokp, xid)));
+ handleIoResult(jcntl::txn_abort(dtokp, xid));
}
void
JournalImpl::txn_commit(data_tok* const dtokp, const std::string& xid)
{
- writeLockCheck();
- while(handleIoResult(jcntl::txn_commit(dtokp, xid)));
+ handleIoResult(jcntl::txn_commit(dtokp, xid));
}
void
@@ -295,36 +282,13 @@
}
void
-JournalImpl::writeLockCheck()
-{
- qpid::sys::ScopedLock<qpid::sys::Monitor> s(writeLock);
- if (aioWait)
- {
- aioWaitLock = true;
- writeLock.wait();
- }
-}
-
-const bool
JournalImpl::handleIoResult(const iores r)
{
writeActivityFlag = true;
switch (r)
{
case rhm::journal::RHM_IORES_SUCCESS:
- {
- qpid::sys::ScopedLock<qpid::sys::Monitor> s(writeLock);
- aioWait = false;
- }
- return false;
- case rhm::journal::RHM_IORES_AIO_WAIT:
- {
- qpid::sys::ScopedLock<qpid::sys::Monitor> s(writeLock);
- aioWait = true;
- }
- usleep(1000); // TODO: add counter here to limit the time spent in this loop?
- get_wr_events();
- return true;
+ return;
case rhm::journal::RHM_IORES_ENQCAPTHRESH:
{
std::ostringstream oss;
@@ -382,7 +346,6 @@
dtokp->release();
this_dtok_list.pop_front();
}
- jip->notifyWriteMonitor();
}
void
Modified: store/trunk/cpp/lib/JournalImpl.h
===================================================================
--- store/trunk/cpp/lib/JournalImpl.h 2007-12-17 14:32:28 UTC (rev 1500)
+++ store/trunk/cpp/lib/JournalImpl.h 2007-12-17 16:21:15 UTC (rev 1501)
@@ -74,10 +74,6 @@
bool writeActivityFlag;
bool flushTriggeredFlag;
qpid::intrusive_ptr<qpid::broker::TimerTask> inactivityFireEventPtr;
-
- qpid::sys::Monitor writeLock;
- bool aioWait;
- bool aioWaitLock; // monitor lock taken
// temp local vars for loadMsgContent below
void* _xidp;
@@ -152,18 +148,10 @@
// TimerTask callback
void getEventsFire();
void flushFire();
-
- // Notify write monitor
- inline void notifyWriteMonitor()
- {
- qpid::sys::ScopedLock<qpid::sys::Monitor> s(writeLock);
- if (aioWaitLock) { aioWaitLock = false; writeLock.notify(); }
- }
private:
- void writeLockCheck();
- const bool handleIoResult(const journal::iores r);
- static void aio_wr_callback(jcntl* journal, u_int32_t num_dtoks);
+ void handleIoResult(const journal::iores r);
+ static void aio_wr_callback(jcntl* journal, u_int32_t num_dtoks);
static void aio_rd_callback(jcntl* journal, u_int32_t num_dtoks);
}; // class JournalImpl
Modified: store/trunk/cpp/lib/jrnl/jcntl.cpp
===================================================================
--- store/trunk/cpp/lib/jrnl/jcntl.cpp 2007-12-17 14:32:28 UTC (rev 1500)
+++ store/trunk/cpp/lib/jrnl/jcntl.cpp 2007-12-17 16:21:15 UTC (rev 1501)
@@ -42,6 +42,7 @@
#include <jrnl/file_hdr.hpp>
#include <jrnl/jerrno.hpp>
#include <jrnl/jinf.hpp>
+#include <jrnl/slock.hpp>
#include <sstream>
#include <unistd.h>
@@ -207,16 +208,26 @@
const size_t this_data_len, data_tok* dtokp, const bool transient)
{
check_wstatus("enqueue_data_record");
- slock s(&_mutex);
- return _wmgr.enqueue(data_buff, tot_data_len, this_data_len, dtokp, NULL, 0, transient, false);
+ {
+ slock s(&_mutex);
+ iores r;
+ while (handle_aio_wait(_wmgr.enqueue(data_buff, tot_data_len, this_data_len, dtokp, NULL,
+ 0, transient, false), r));
+ return r;
+ }
}
const iores
jcntl::enqueue_extern_data_record(const size_t tot_data_len, data_tok* dtokp, const bool transient)
{
check_wstatus("enqueue_extern_data_record");
- slock s(&_mutex);
- return _wmgr.enqueue(NULL, tot_data_len, 0, dtokp, NULL, 0, transient, true);
+ {
+ slock s(&_mutex);
+ iores r;
+ while (handle_aio_wait(_wmgr.enqueue(NULL, tot_data_len, 0, dtokp, NULL, 0, transient,
+ true), r));
+ return r;
+ }
}
const iores
@@ -225,9 +236,13 @@
const bool transient)
{
check_wstatus("enqueue_tx_data_record");
- slock s(&_mutex);
- return _wmgr.enqueue(data_buff, tot_data_len, this_data_len, dtokp, xid.data(), xid.size(),
- transient, false);
+ {
+ slock s(&_mutex);
+ iores r;
+ while (handle_aio_wait(_wmgr.enqueue(data_buff, tot_data_len, this_data_len, dtokp,
+ xid.data(), xid.size(), transient, false), r));
+ return r;
+ }
}
const iores
@@ -235,8 +250,13 @@
const std::string& xid, const bool transient)
{
check_wstatus("enqueue_extern_txn_data_record");
- slock s(&_mutex);
- return _wmgr.enqueue(NULL, tot_data_len, 0, dtokp, xid.data(), xid.size(), transient, true);
+ {
+ slock s(&_mutex);
+ iores r;
+ while (handle_aio_wait(_wmgr.enqueue(NULL, tot_data_len, 0, dtokp, xid.data(), xid.size(),
+ transient, true), r));
+ return r;
+ }
}
const iores
@@ -266,32 +286,48 @@
jcntl::dequeue_data_record(data_tok* const dtokp)
{
check_wstatus("dequeue_data");
- slock s(&_mutex);
- return _wmgr.dequeue(dtokp, NULL, 0);
+ {
+ slock s(&_mutex);
+ iores r;
+ while (handle_aio_wait(_wmgr.dequeue(dtokp, NULL, 0), r));
+ return r;
+ }
}
const iores
jcntl::dequeue_txn_data_record(data_tok* const dtokp, const std::string& xid)
{
check_wstatus("dequeue_data");
- slock s(&_mutex);
- return _wmgr.dequeue(dtokp, xid.data(), xid.size());
+ {
+ slock s(&_mutex);
+ iores r;
+ while (handle_aio_wait(_wmgr.dequeue(dtokp, xid.data(), xid.size()), r));
+ return r;
+ }
}
const iores
jcntl::txn_abort(data_tok* const dtokp, const std::string& xid)
{
check_wstatus("txn_abort");
- slock s(&_mutex);
- return _wmgr.abort(dtokp, xid.data(), xid.size());
+ {
+ slock s(&_mutex);
+ iores r;
+ while (handle_aio_wait(_wmgr.abort(dtokp, xid.data(), xid.size()), r));
+ return r;
+ }
}
const iores
jcntl::txn_commit(data_tok* const dtokp, const std::string& xid)
{
check_wstatus("txn_commit");
- slock s(&_mutex);
- return _wmgr.commit(dtokp, xid.data(), xid.size());
+ {
+ slock s(&_mutex);
+ iores r;
+ while (handle_aio_wait(_wmgr.commit(dtokp, xid.data(), xid.size()), r));
+ return r;
+ }
}
const bool
@@ -338,8 +374,10 @@
return RHM_IORES_SUCCESS;
if (_readonly_flag)
throw jexception(jerrno::JERR_JCNTL_READONLY, "jcntl", "flush");
- slock s(&_mutex);
- return _wmgr.flush();
+ {
+ slock s(&_mutex);
+ return _wmgr.flush();
+ }
}
// Private functions
@@ -394,6 +432,24 @@
}
}
+const bool
+jcntl::handle_aio_wait(const iores res, iores& resout)
+{
+ resout = res;
+ if (res == RHM_IORES_AIO_WAIT)
+ {
+ u_int32_t cnt = 0;
+ while (get_wr_events() == 0)
+ {
+ if (cnt++ > MAX_AIO_CMPL_SLEEPS)
+ throw jexception(jerrno::JERR_JCNTL_AIOCMPLWAIT, "jcntl", "aio_cmpl_wait");
+ usleep(AIO_CMPL_SLEEP);
+ }
+ return true;
+ }
+ return false;
+}
+
void
jcntl::rcvr_janalyze(rcvdat& rd, const std::vector<std::string>& prep_txn_list)
{
Modified: store/trunk/cpp/lib/jrnl/jcntl.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/jcntl.hpp 2007-12-17 14:32:28 UTC (rev 1500)
+++ store/trunk/cpp/lib/jrnl/jcntl.hpp 2007-12-17 16:21:15 UTC (rev 1501)
@@ -46,7 +46,6 @@
#include <jrnl/lfh.hpp>
#include <jrnl/rcvdat.hpp>
#include <jrnl/rmgr.hpp>
-#include <jrnl/slock.hpp>
#include <jrnl/wmgr.hpp>
#include <jrnl/wrfc.hpp>
@@ -609,6 +608,12 @@
void aio_cmpl_wait();
/**
+ * \brief Call that blocks until at least one message returns; used to wait for
+ * AIO wait conditions to clear.
+ */
+ const bool handle_aio_wait(const iores res, iores& resout);
+
+ /**
* \brief Analyze journal for recovery.
*/
void rcvr_janalyze(rcvdat& rd, const std::vector<std::string>& prep_txn_list);
Modified: store/trunk/cpp/lib/jrnl/slock.hpp
===================================================================
--- store/trunk/cpp/lib/jrnl/slock.hpp 2007-12-17 14:32:28 UTC (rev 1500)
+++ store/trunk/cpp/lib/jrnl/slock.hpp 2007-12-17 16:21:15 UTC (rev 1501)
@@ -3,8 +3,8 @@
*
* Red Hat Messaging - Message Journal
*
-* Messaging journal top-level control and interface class
-* rhm::journal::slock. See class documentation for details.
+* Messaging journal scoped lock class rhm::journal::slock and scoped try-clock
+* class rhm::journal::stlock.
*
* \author Kim van der Riet
*
[View Less]
17 years, 3 months
rhmessaging commits: r1500 - mgmt/cumin/python/wooly.
by rhmessaging-commits@lists.jboss.org
Author: justi9
Date: 2007-12-17 09:32:28 -0500 (Mon, 17 Dec 2007)
New Revision: 1500
Added:
mgmt/cumin/python/wooly/__init__.strings
Log:
Forgot to add ths file with change 1499.
Added: mgmt/cumin/python/wooly/__init__.strings
===================================================================
--- mgmt/cumin/python/wooly/__init__.strings (rev 0)
+++ mgmt/cumin/python/wooly/__init__.strings 2007-12-17 14:32:28 UTC (rev 1500)
@@ -0,0 +1,8 @@
+[Widget.html]
+{content}…
[View More]
+
+[Widget.errors_html]
+<ul class="errors">{error_messages}</ul>
+
+[Widget.error_message_html]
+<li>{error_message}</li>
[View Less]
17 years, 3 months
rhmessaging commits: r1499 - in mgmt: cumin/python/wooly and 2 other directories.
by rhmessaging-commits@lists.jboss.org
Author: justi9
Date: 2007-12-17 09:31:51 -0500 (Mon, 17 Dec 2007)
New Revision: 1499
Modified:
mgmt/cumin/python/cumin/__init__.py
mgmt/cumin/python/cumin/broker.py
mgmt/cumin/python/cumin/broker.strings
mgmt/cumin/python/cumin/brokergroup.py
mgmt/cumin/python/cumin/client.py
mgmt/cumin/python/cumin/exchange.py
mgmt/cumin/python/cumin/model.py
mgmt/cumin/python/cumin/page.strings
mgmt/cumin/python/cumin/parameters.py
mgmt/cumin/python/cumin/queue.py
mgmt/cumin/…
[View More]python/cumin/widgets.py
mgmt/cumin/python/cumin/widgets.strings
mgmt/cumin/python/wooly/__init__.py
mgmt/cumin/python/wooly/forms.py
mgmt/cumin/python/wooly/forms.strings
mgmt/mint/python/mint/__init__.py
mgmt/mint/python/mint/schema.py
mgmt/notes/justin-todo.txt
Log:
A large set of changes:
Changes the mint model to use SQLMultipleJoin and SQLRelatedJoin in
lieu of the non SQL prefixed varieties, in order to reduce the number
of queries.
Adds a groups column to the broker browser.
Adds a groups property to the broker view.
Fixes the initial group box in the broker add form.
Adds exception handling ot the broker connect thread.
Adds a connection attempt backoff algorythm.
Moves error rendering methods from FormInput to Widget.
Adds queue message latency stat metadata, and hence to the stats view.
Makes broker group add return to the list view, not the group view.
Changes len(sqlobjectcoll) to sqlobjectoll.count() where appropriate.
Adds exception handling to the queue.purge call.
Switches to using stats, not child counts, for binding, producer, and
consumer counts in the queue and exchange lists.
Modified: mgmt/cumin/python/cumin/__init__.py
===================================================================
--- mgmt/cumin/python/cumin/__init__.py 2007-12-17 02:44:36 UTC (rev 1498)
+++ mgmt/cumin/python/cumin/__init__.py 2007-12-17 14:31:51 UTC (rev 1499)
@@ -64,25 +64,47 @@
self.event = Event()
+ self.attempts = dict()
+
def prompt(self):
self.event.set()
self.event.clear()
def run(self):
+ try:
+ self.do_run()
+ except Exception, e:
+ print e
+
+ def do_run(self):
while True:
for reg in BrokerRegistration.select():
if reg.broker is None or reg.broker.managedBroker not in \
self.model.data.connectedBrokers:
- print "Trying to connect to broker '%s' at %s:%i" % \
- (reg.name, reg.host, reg.port or 5672)
+ attempts = self.attempts.get(reg, 0)
+ attempts += 1
+ self.attempts[reg] = attempts
+
+ if attempts < 10:
+ self.connect(reg)
+ elif attempts < 100 and attempts % 10 == 0:
+ self.connect(reg)
+ elif attempts % 100 == 0:
+ self.connect(reg)
- try:
- self.model.data.connectToBroker \
- (reg.host, reg.port or 5672)
+ self.event.wait(10)
+
+ def connect(self, reg):
+ print "Trying to connect to broker '%s' at %s:%i" % \
+ (reg.name, reg.host, reg.port or 5672)
- print "Connection succeeded"
- except socket.error:
- print "Connection failed"
+ try:
+ self.model.data.connectToBroker \
+ (reg.host, reg.port or 5672)
- self.event.wait(30)
+ print "Connection succeeded"
+ except socket.error:
+ print "Connection failed"
+
+
Modified: mgmt/cumin/python/cumin/broker.py
===================================================================
--- mgmt/cumin/python/cumin/broker.py 2007-12-17 02:44:36 UTC (rev 1498)
+++ mgmt/cumin/python/cumin/broker.py 2007-12-17 14:31:51 UTC (rev 1499)
@@ -16,7 +16,7 @@
strings = StringCatalog(__file__)
-class BrokerSetForm(PaginatedItemSet, Form):
+class BrokerSetForm(PaginatedItemSet, Form, Frame):
def __init__(self, app, name):
super(BrokerSetForm, self).__init__(app, name)
@@ -96,18 +96,27 @@
self.page().show_broker(branch, broker).show_view(branch)
return fmt_olink(branch, broker)
- def render_item_group_link(self, session, broker):
- group = None #broker.get_broker_group()
+ def render_item_group_links(self, session, broker):
+ count = broker.groups.count()
- if group:
- branch = session.branch()
- self.page().show_broker_group(branch, group).show_view(branch)
- return fmt_olink(branch, group)
+ if count == 0:
+ link = fmt_none()
+ elif count < 3:
+ links = list()
+
+ for group in broker.groups[:2]:
+ branch = session.branch()
+ self.page().show_broker_group(branch, group).show_view(branch)
+ links.append(fmt_olink(branch, group))
+
+ link = ", ".join(links)
else:
- return fmt_none()
+ link = "%i groups" % count
+ return link
+
def render_item_profile_link(self, session, broker):
- profile = None #broker.get_broker_profile()
+ profile = broker.profile
if profile:
branch = session.branch()
@@ -117,7 +126,7 @@
return fmt_none()
def render_item_cluster_link(self, session, broker):
- cluster = None #broker.get_broker_cluster()
+ cluster = broker.cluster
if cluster:
branch = session.branch()
@@ -294,6 +303,19 @@
def render_name(self, session, broker):
return broker.name
+ def render_address(self, session, broker):
+ return broker.host + (broker.port and ":%i" % broker.port or "")
+
+ def render_group_links(self, session, broker):
+ links = list()
+
+ for group in broker.groups:
+ branch = session.branch()
+ self.page().show_broker_group(branch, group).show_view(branch)
+ links.append(fmt_olink(branch, group))
+
+ return ", ".join(links)
+
def render_cluster_link(self, session, broker):
cluster = broker.cluster
@@ -315,7 +337,9 @@
return fmt_none()
def render_version(self, session, broker):
- return "1.0"
+ broker = broker.broker
+ if broker:
+ return broker.version
class BrokerQueueTab(QueueSet):
def get_object(self, session, broker):
@@ -665,6 +689,9 @@
reg.name = names[i]
+ if groups[i]:
+ reg.addBrokerGroup(groups[i])
+
self.app.broker_connect_thread.prompt()
self.process_cancel(session, model)
Modified: mgmt/cumin/python/cumin/broker.strings
===================================================================
--- mgmt/cumin/python/cumin/broker.strings 2007-12-17 02:44:36 UTC (rev 1498)
+++ mgmt/cumin/python/cumin/broker.strings 2007-12-17 14:31:51 UTC (rev 1499)
@@ -25,7 +25,7 @@
<th>Profile</th>
<th>Cluster</th>
-->
- <th>Load</th>
+ <th>Groups</th>
<th>Status</th>
</tr>
@@ -43,7 +43,7 @@
<td>{item_profile_link}</td>
<td>{item_cluster_link}</td>
-->
- <td>{item_load}</td>
+ <td>{item_group_links}</td>
<td>{item_status}</td>
</tr>
@@ -135,10 +135,12 @@
<table class="props">
<tr><th>Name</th><td>{name}</td></tr>
+ <tr><th>Address</th><td>{address}</td></tr>
<!--
<tr><th>Cluster</th><td>{cluster_link}</td></tr>
<tr><th>Profile</th><td>{profile_link}</td></tr>
-->
+ <tr><th>Groups</th><td>{group_links}</td></tr>
<tr><th>Version</th><td>{version}</td></tr>
<tr>
<th class="actions" colspan="2">
@@ -235,7 +237,7 @@
<td><input type="text" name="{field_address_name}" value="{field_address_value}" size="35" tabindex="100"/></td>
<td>
<select name="{field_group_name}" tabindex="100">
- <option>None</option>
+ <option value="__none__">None</option>
{groups}
</select>
</td>
Modified: mgmt/cumin/python/cumin/brokergroup.py
===================================================================
--- mgmt/cumin/python/cumin/brokergroup.py 2007-12-17 02:44:36 UTC (rev 1498)
+++ mgmt/cumin/python/cumin/brokergroup.py 2007-12-17 14:31:51 UTC (rev 1499)
@@ -108,7 +108,6 @@
branch = session.branch()
self.page().show_broker_group(branch, group).show_view(branch)
- self.page().set_redirect_url(session, branch.marshal())
class BrokerGroupAdd(BrokerGroupForm, Frame):
def get_title(self, session, model):
@@ -122,6 +121,7 @@
def process_submit(self, session, model):
group = BrokerGroup()
self.process_group(session, group)
+ self.process_cancel(session, model)
class BrokerGroupEdit(BrokerGroupForm, Frame):
def get_title(self, session, group):
@@ -134,6 +134,7 @@
def process_submit(self, session, group):
self.process_group(session, group)
+ self.process_cancel(session, group)
def process_display(self, session, group):
self.group_name.set(session, group.name)
Modified: mgmt/cumin/python/cumin/client.py
===================================================================
--- mgmt/cumin/python/cumin/client.py 2007-12-17 02:44:36 UTC (rev 1498)
+++ mgmt/cumin/python/cumin/client.py 2007-12-17 14:31:51 UTC (rev 1499)
@@ -42,7 +42,7 @@
branch = session.branch()
frame = self.page().show_client(branch, client)
frame.show_view(branch).show_sessions(branch)
- return fmt_link(branch.marshal(), len(client.sessions))
+ return fmt_link(branch.marshal(), client.sessions.count())
def render_item_from(self, session, client):
unit = self.unit.get(session)
Modified: mgmt/cumin/python/cumin/exchange.py
===================================================================
--- mgmt/cumin/python/cumin/exchange.py 2007-12-17 02:44:36 UTC (rev 1498)
+++ mgmt/cumin/python/cumin/exchange.py 2007-12-17 14:31:51 UTC (rev 1499)
@@ -70,13 +70,15 @@
branch = session.branch()
frame = self.page().show_exchange(branch, exchange)
frame.show_view(branch).show_producers(branch)
- return fmt_link(branch.marshal(), len(exchange.producers))
+ stat = self.app.model.exchange.get_stat("producers")
+ return fmt_link(branch.marshal(), stat.value(exchange))
def render_item_bindings(self, session, exchange):
branch = session.branch()
frame = self.page().show_exchange(branch, exchange)
frame.show_view(branch).show_bindings(branch)
- return fmt_link(branch.marshal(), len(exchange.bindings))
+ stat = self.app.model.exchange.get_stat("bindings")
+ return fmt_link(branch.marshal(), stat.value(exchange))
def render_item_received(self, session, exchange):
unit = self.unit.get(session)
@@ -373,13 +375,14 @@
class ExchangeProducerSet(ItemSet):
def get_title(self, session, exchange):
- return "Producers %s" % fmt_count(len(exchange.producers))
+ return "Producers %s" % \
+ fmt_count(self.get_item_count(session, exchange))
def get_item_count(self, session, exchange):
- return Producer.select(Producer.q.exchangeID == exchange.id).count()
+ return exchange.producers.count()
def do_get_items(self, session, exchange):
- return Producer.select(Producer.q.exchangeID == exchange.id)
+ return exchange.producers
def render_item_name(self, session, producer):
return producer.name
Modified: mgmt/cumin/python/cumin/model.py
===================================================================
--- mgmt/cumin/python/cumin/model.py 2007-12-17 02:44:36 UTC (rev 1498)
+++ mgmt/cumin/python/cumin/model.py 2007-12-17 14:31:51 UTC (rev 1499)
@@ -182,6 +182,21 @@
stat.unit = "message"
stat.categories = ("general")
+ stat = CuminStat(self, "messageLatencyMin", "int")
+ stat.title = "Min. Msg. Latency"
+ stat.unit = "nanosecond"
+ stat.categories = ("general")
+
+ stat = CuminStat(self, "messageLatencyMax", "int")
+ stat.title = "Max. Msg. Latency"
+ stat.unit = "nanosecond"
+ stat.categories = ("general")
+
+ stat = CuminStat(self, "messageLatencyAvg", "int")
+ stat.title = "Avg. Msg. Latency"
+ stat.unit = "nanosecond"
+ stat.categories = ("general")
+
# Disk
#stat = CuminStat(self, "diskPageSize", "int")
Modified: mgmt/cumin/python/cumin/page.strings
===================================================================
--- mgmt/cumin/python/cumin/page.strings 2007-12-17 02:44:36 UTC (rev 1498)
+++ mgmt/cumin/python/cumin/page.strings 2007-12-17 14:31:51 UTC (rev 1499)
@@ -379,10 +379,6 @@
vertical-align: -35%;
}
-select {
- border-style: groove;
-}
-
ul.radiotabs {
list-style: none;
margin: 0 0 1em 0;
Modified: mgmt/cumin/python/cumin/parameters.py
===================================================================
--- mgmt/cumin/python/cumin/parameters.py 2007-12-17 02:44:36 UTC (rev 1498)
+++ mgmt/cumin/python/cumin/parameters.py 2007-12-17 14:31:51 UTC (rev 1499)
@@ -10,8 +10,13 @@
class BrokerGroupParameter(Parameter):
def do_unmarshal(self, string):
- return BrokerGroup.get(int(string))
+ if string == "__none__":
+ object = None
+ else:
+ object = BrokerGroup.get(int(string))
+ return object
+
def do_marshal(self, group):
return str(group.id)
Modified: mgmt/cumin/python/cumin/queue.py
===================================================================
--- mgmt/cumin/python/cumin/queue.py 2007-12-17 02:44:36 UTC (rev 1498)
+++ mgmt/cumin/python/cumin/queue.py 2007-12-17 14:31:51 UTC (rev 1499)
@@ -54,13 +54,15 @@
branch = session.branch()
frame = self.page().show_queue(branch, queue)
frame.show_view(branch).show_consumers(branch)
- return fmt_link(branch.marshal(), len(queue.consumers))
+ stat = self.app.model.queue.get_stat("consumers")
+ return fmt_link(branch.marshal(), stat.value(queue))
def render_item_bindings(self, session, queue):
branch = session.branch()
frame = self.page().show_queue(branch, queue)
frame.show_view(branch).show_bindings(branch)
- return fmt_link(branch.marshal(), len(queue.bindings))
+ stat = self.app.model.queue.get_stat("bindings")
+ return fmt_link(branch.marshal(), stat.value(queue))
def render_item_enqueued(self, session, queue):
unit = self.unit.get(session)
@@ -355,16 +357,13 @@
self.page().set_redirect_url(session, branch.marshal())
def process_submit(self, session, queue):
- print "open purge"
+ try:
+ queue.purge(self.app.model.data, queue.managedBroker, doit)
+ except Exception, e:
+ self.add_error(session, e)
+ else:
+ self.process_cancel(session, queue)
- print "queue.managedBroker", queue.managedBroker
-
- queue.purge(self.app.model.data, queue.managedBroker, doit)
-
- print "close purge"
-
- self.process_cancel(session, queue)
-
def render_submit_content(self, session, queue):
return "Yes, Purge Queue '%s'" % queue.name
Modified: mgmt/cumin/python/cumin/widgets.py
===================================================================
--- mgmt/cumin/python/cumin/widgets.py 2007-12-17 02:44:36 UTC (rev 1498)
+++ mgmt/cumin/python/cumin/widgets.py 2007-12-17 14:31:51 UTC (rev 1499)
@@ -324,6 +324,23 @@
def render_item_content(self, session, page):
return page + 1
+class TableHeader(ItemSet):
+ def __init__(self, app, name):
+ super(TableHeader, self).__init__(app, name)
+
+ self.columns = list()
+
+ XXX
+
+ def get_items(self, session, object):
+ return self.columns
+
+ def render_item_content(self, session, column):
+ return column.render_
+
+ def render_item_href(self, session, column):
+ return column.get_href(session, column)
+
class PaginatedItemSet(ItemSet):
def __init__(self, app, name):
super(PaginatedItemSet, self).__init__(app, name)
@@ -389,3 +406,4 @@
def render_item_messages_matched_rate(self, session, binding):
stat = self.app.model.binding.get_stat("msgMatched")
return fmt_rate(stat.rate(binding), "msg", "sec")
+
Modified: mgmt/cumin/python/cumin/widgets.strings
===================================================================
--- mgmt/cumin/python/cumin/widgets.strings 2007-12-17 02:44:36 UTC (rev 1498)
+++ mgmt/cumin/python/cumin/widgets.strings 2007-12-17 14:31:51 UTC (rev 1499)
@@ -4,6 +4,7 @@
<h1>{title}</h1>
</div>
<div class="body">
+ {errors}
<div>{submit}</div>
<div>{cancel}</div>
{hidden_inputs}
Modified: mgmt/cumin/python/wooly/__init__.py
===================================================================
--- mgmt/cumin/python/wooly/__init__.py 2007-12-17 02:44:36 UTC (rev 1498)
+++ mgmt/cumin/python/wooly/__init__.py 2007-12-17 14:31:51 UTC (rev 1499)
@@ -7,9 +7,9 @@
from resources import ResourceFinder, StringCatalog
+strings = StringCatalog(__file__)
+
class Widget(object):
- html = "{content}"
-
def __init__(self, app, name):
self.app = app
self.__name = name
@@ -18,7 +18,9 @@
self.attributes = list()
self.parameters = list()
- self.__template = Template(self, "html")
+ self.__main_tmpl = Template(self, "html")
+ self.__errors_tmpl = Template(self, "errors_html")
+ self.__error_message_tmpl = Template(self, "error_message_html")
self.errors = Attribute(app, "errors")
self.errors.set_default(list())
@@ -27,7 +29,7 @@
self.__ancestors = None
self.__path = None
self.__page = None
- self.child_index = None
+ self.__child_index = None
app.add_widget(self)
@@ -79,13 +81,13 @@
widget.__parent = self
def get_child(self, name):
- if not self.child_index:
- self.child_index = dict()
+ if not self.__child_index:
+ self.__child_index = dict()
for child in self.children:
- self.child_index[child.name()] = child
+ self.__child_index[child.name()] = child
- return self.child_index.get(name, None)
+ return self.__child_index.get(name, None)
def add_attribute(self, attribute):
self.attributes.append(attribute)
@@ -169,7 +171,7 @@
def do_render(self, session, object):
writer = Writer()
- self.__template.render(session, object, writer)
+ self.__main_tmpl.render(session, object, writer)
return writer.to_string()
@@ -196,6 +198,25 @@
return writer.to_string()
+ def render_errors(self, session, object):
+ writer = Writer()
+
+ if self.get_errors(session):
+ self.__errors_tmpl.render(session, object, writer)
+
+ return writer.to_string()
+
+ def render_error_messages(self, session, object):
+ writer = Writer()
+
+ for error in self.get_errors(session):
+ self.__error_message_tmpl.render(session, error, writer)
+
+ return writer.to_string()
+
+ def render_error_message(self, session, error):
+ return error.message
+
def __str__(self):
return "%s '%s'" % (self.__class__.__name__, self.path())
Modified: mgmt/cumin/python/wooly/forms.py
===================================================================
--- mgmt/cumin/python/wooly/forms.py 2007-12-17 02:44:36 UTC (rev 1498)
+++ mgmt/cumin/python/wooly/forms.py 2007-12-17 14:31:51 UTC (rev 1499)
@@ -88,25 +88,6 @@
def render_value(self, session, object):
return self.param.marshal(self.param.get(session))
- def render_errors(self, session, object):
- writer = Writer()
-
- if self.get_errors(session):
- self.errors_tmp.render(session, object, writer)
-
- return writer.to_string()
-
- def render_error_messages(self, session, object):
- writer = Writer()
-
- for error in self.get_errors(session):
- self.errors_tmpl.render(session, error, writer)
-
- return writer.to_string()
-
- def render_error_message(self, session, error):
- return error.message
-
def render_tab_index(self, session, object):
return self.tab_index
Modified: mgmt/cumin/python/wooly/forms.strings
===================================================================
--- mgmt/cumin/python/wooly/forms.strings 2007-12-17 02:44:36 UTC (rev 1498)
+++ mgmt/cumin/python/wooly/forms.strings 2007-12-17 14:31:51 UTC (rev 1499)
@@ -1,12 +1,6 @@
[FormButton.html]
<button class="{class}" id="{id}" type="submit" name="{name}" value="{value}" tabindex="{tab_index}" {disabled_attr}>{content}</button>
-[FormInput.errors_html]
-<ul class="errors">{error_messages}</ul>
-
-[FormInput.error_message_html]
-<li>{error_message}</li>
-
[TextInput.html]
{errors}
<input type="text" name="{name}" value="{value}" tabindex="{tab_index}" {disabled_attr} size="{size}"/>
Modified: mgmt/mint/python/mint/__init__.py
===================================================================
--- mgmt/mint/python/mint/__init__.py 2007-12-17 02:44:36 UTC (rev 1498)
+++ mgmt/mint/python/mint/__init__.py 2007-12-17 14:31:51 UTC (rev 1499)
@@ -45,12 +45,12 @@
class BrokerCluster(SQLObject):
name = StringCol(length=1000, default=None)
- brokers = MultipleJoin("BrokerRegistration", joinColumn="cluster_id")
+ brokers = SQLMultipleJoin("BrokerRegistration", joinColumn="cluster_id")
class BrokerProfile(SQLObject):
name = StringCol(length=1000, default=None)
- brokers = MultipleJoin("BrokerRegistration", joinColumn="profile_id")
- properties = MultipleJoin("ConfigProperty", joinColumn="profile_id")
+ brokers = SQLMultipleJoin("BrokerRegistration", joinColumn="profile_id")
+ properties = SQLMultipleJoin("ConfigProperty", joinColumn="profile_id")
class ConfigProperty(SQLObject):
name = StringCol(length=1000, default=None)
Modified: mgmt/mint/python/mint/schema.py
===================================================================
--- mgmt/mint/python/mint/schema.py 2007-12-17 02:44:36 UTC (rev 1498)
+++ mgmt/mint/python/mint/schema.py 2007-12-17 14:31:51 UTC (rev 1499)
@@ -16,7 +16,7 @@
recTime = TimestampCol(default=None)
system = ForeignKey('System', cascade='null', default=None)
-System.sqlmeta.addJoin(MultipleJoin('SystemStats', joinMethodName='stats'))
+System.sqlmeta.addJoin(SQLMultipleJoin('SystemStats', joinMethodName='stats'))
class Broker(SQLObject):
@@ -62,7 +62,7 @@
model.getConnectedBroker(managedBrokerLabel).method(methodId, self.idOriginal, \
classToSchemaNameMap[self.__class__.__name__], "echo", args=actualArgs, packageName="qpid")
-System.sqlmeta.addJoin(MultipleJoin('Broker', joinMethodName='brokers'))
+System.sqlmeta.addJoin(SQLMultipleJoin('Broker', joinMethodName='brokers'))
class BrokerStats(SQLObject):
@@ -70,7 +70,7 @@
recTime = TimestampCol(default=None)
broker = ForeignKey('Broker', cascade='null', default=None)
-Broker.sqlmeta.addJoin(MultipleJoin('BrokerStats', joinMethodName='stats'))
+Broker.sqlmeta.addJoin(SQLMultipleJoin('BrokerStats', joinMethodName='stats'))
class Vhost(SQLObject):
@@ -84,7 +84,7 @@
broker = ForeignKey('Broker', cascade='null', default=None)
name = StringCol(length=1000, default=None)
-Broker.sqlmeta.addJoin(MultipleJoin('Vhost', joinMethodName='vhosts'))
+Broker.sqlmeta.addJoin(SQLMultipleJoin('Vhost', joinMethodName='vhosts'))
class VhostStats(SQLObject):
@@ -92,7 +92,7 @@
recTime = TimestampCol(default=None)
vhost = ForeignKey('Vhost', cascade='null', default=None)
-Vhost.sqlmeta.addJoin(MultipleJoin('VhostStats', joinMethodName='stats'))
+Vhost.sqlmeta.addJoin(SQLMultipleJoin('VhostStats', joinMethodName='stats'))
class Queue(SQLObject):
@@ -116,7 +116,7 @@
model.getConnectedBroker(managedBrokerLabel).method(methodId, self.idOriginal, \
classToSchemaNameMap[self.__class__.__name__], "purge", args=actualArgs, packageName="qpid")
-Vhost.sqlmeta.addJoin(MultipleJoin('Queue', joinMethodName='queues'))
+Vhost.sqlmeta.addJoin(SQLMultipleJoin('Queue', joinMethodName='queues'))
class QueueStats(SQLObject):
@@ -166,7 +166,7 @@
messageLatencyMax = BigIntCol(default=None)
messageLatencyAvg = BigIntCol(default=None)
-Queue.sqlmeta.addJoin(MultipleJoin('QueueStats', joinMethodName='stats'))
+Queue.sqlmeta.addJoin(SQLMultipleJoin('QueueStats', joinMethodName='stats'))
class Exchange(SQLObject):
@@ -181,7 +181,7 @@
name = StringCol(length=1000, default=None)
type = StringCol(length=1000, default=None)
-Vhost.sqlmeta.addJoin(MultipleJoin('Exchange', joinMethodName='exchanges'))
+Vhost.sqlmeta.addJoin(SQLMultipleJoin('Exchange', joinMethodName='exchanges'))
class ExchangeStats(SQLObject):
@@ -201,7 +201,7 @@
byteDrops = BigIntCol(default=None)
byteRoutes = BigIntCol(default=None)
-Exchange.sqlmeta.addJoin(MultipleJoin('ExchangeStats', joinMethodName='stats'))
+Exchange.sqlmeta.addJoin(SQLMultipleJoin('ExchangeStats', joinMethodName='stats'))
class Binding(SQLObject):
@@ -216,9 +216,9 @@
queue = ForeignKey('Queue', cascade='null', default=None)
bindingKey = StringCol(length=1000, default=None)
-Exchange.sqlmeta.addJoin(MultipleJoin('Binding', joinMethodName='bindings'))
+Exchange.sqlmeta.addJoin(SQLMultipleJoin('Binding', joinMethodName='bindings'))
-Queue.sqlmeta.addJoin(MultipleJoin('Binding', joinMethodName='bindings'))
+Queue.sqlmeta.addJoin(SQLMultipleJoin('Binding', joinMethodName='bindings'))
class BindingStats(SQLObject):
@@ -227,7 +227,7 @@
binding = ForeignKey('Binding', cascade='null', default=None)
msgMatched = BigIntCol(default=None)
-Binding.sqlmeta.addJoin(MultipleJoin('BindingStats', joinMethodName='stats'))
+Binding.sqlmeta.addJoin(SQLMultipleJoin('BindingStats', joinMethodName='stats'))
class Client(SQLObject):
@@ -253,7 +253,7 @@
model.getConnectedBroker(managedBrokerLabel).method(methodId, self.idOriginal, \
classToSchemaNameMap[self.__class__.__name__], "detach", args=actualArgs, packageName="qpid")
-Vhost.sqlmeta.addJoin(MultipleJoin('Client', joinMethodName='clients'))
+Vhost.sqlmeta.addJoin(SQLMultipleJoin('Client', joinMethodName='clients'))
class ClientStats(SQLObject):
@@ -266,7 +266,7 @@
bytesFromClient = BigIntCol(default=None)
bytesConsumed = BigIntCol(default=None)
-Client.sqlmeta.addJoin(MultipleJoin('ClientStats', joinMethodName='stats'))
+Client.sqlmeta.addJoin(SQLMultipleJoin('ClientStats', joinMethodName='stats'))
class Session(SQLObject):
@@ -306,9 +306,9 @@
model.getConnectedBroker(managedBrokerLabel).method(methodId, self.idOriginal, \
classToSchemaNameMap[self.__class__.__name__], "close", args=actualArgs, packageName="qpid")
-Vhost.sqlmeta.addJoin(MultipleJoin('Session', joinMethodName='sessions'))
+Vhost.sqlmeta.addJoin(SQLMultipleJoin('Session', joinMethodName='sessions'))
-Client.sqlmeta.addJoin(MultipleJoin('Session', joinMethodName='sessions'))
+Client.sqlmeta.addJoin(SQLMultipleJoin('Session', joinMethodName='sessions'))
class SessionStats(SQLObject):
@@ -319,7 +319,7 @@
remainingLifespan = IntCol(default=None)
framesOutstanding = IntCol(default=None)
-Session.sqlmeta.addJoin(MultipleJoin('SessionStats', joinMethodName='stats'))
+Session.sqlmeta.addJoin(SQLMultipleJoin('SessionStats', joinMethodName='stats'))
class Destination(SQLObject):
@@ -353,7 +353,7 @@
model.getConnectedBroker(managedBrokerLabel).method(methodId, self.idOriginal, \
classToSchemaNameMap[self.__class__.__name__], "start", args=actualArgs, packageName="qpid")
-Session.sqlmeta.addJoin(MultipleJoin('Destination', joinMethodName='destinations'))
+Session.sqlmeta.addJoin(SQLMultipleJoin('Destination', joinMethodName='destinations'))
class DestinationStats(SQLObject):
@@ -366,7 +366,7 @@
msgCredits = IntCol(default=None)
byteCredits = IntCol(default=None)
-Destination.sqlmeta.addJoin(MultipleJoin('DestinationStats', joinMethodName='stats'))
+Destination.sqlmeta.addJoin(SQLMultipleJoin('DestinationStats', joinMethodName='stats'))
class Producer(SQLObject):
@@ -380,9 +380,9 @@
destination = ForeignKey('Destination', cascade='null', default=None)
exchange = ForeignKey('Exchange', cascade='null', default=None)
-Destination.sqlmeta.addJoin(MultipleJoin('Producer', joinMethodName='producers'))
+Destination.sqlmeta.addJoin(SQLMultipleJoin('Producer', joinMethodName='producers'))
-Exchange.sqlmeta.addJoin(MultipleJoin('Producer', joinMethodName='producers'))
+Exchange.sqlmeta.addJoin(SQLMultipleJoin('Producer', joinMethodName='producers'))
class ProducerStats(SQLObject):
@@ -392,7 +392,7 @@
msgsProduced = BigIntCol(default=None)
bytesProduced = BigIntCol(default=None)
-Producer.sqlmeta.addJoin(MultipleJoin('ProducerStats', joinMethodName='stats'))
+Producer.sqlmeta.addJoin(SQLMultipleJoin('ProducerStats', joinMethodName='stats'))
class Consumer(SQLObject):
@@ -412,9 +412,9 @@
model.getConnectedBroker(managedBrokerLabel).method(methodId, self.idOriginal, \
classToSchemaNameMap[self.__class__.__name__], "close", args=actualArgs, packageName="qpid")
-Destination.sqlmeta.addJoin(MultipleJoin('Consumer', joinMethodName='consumers'))
+Destination.sqlmeta.addJoin(SQLMultipleJoin('Consumer', joinMethodName='consumers'))
-Queue.sqlmeta.addJoin(MultipleJoin('Consumer', joinMethodName='consumers'))
+Queue.sqlmeta.addJoin(SQLMultipleJoin('Consumer', joinMethodName='consumers'))
class ConsumerStats(SQLObject):
@@ -427,7 +427,7 @@
unackedMessagesLow = IntCol(default=None)
unackedMessagesHigh = IntCol(default=None)
-Consumer.sqlmeta.addJoin(MultipleJoin('ConsumerStats', joinMethodName='stats'))
+Consumer.sqlmeta.addJoin(SQLMultipleJoin('ConsumerStats', joinMethodName='stats'))
classToSchemaNameMap = dict()
Modified: mgmt/notes/justin-todo.txt
===================================================================
--- mgmt/notes/justin-todo.txt 2007-12-17 02:44:36 UTC (rev 1498)
+++ mgmt/notes/justin-todo.txt 2007-12-17 14:31:51 UTC (rev 1499)
@@ -20,10 +20,6 @@
* Broker groups
- - Add a groups column to the browser broker list
-
- - Fix initial group box in broker register form, or remove it
-
- Group form submit has different behaviors between hitting enter
and clicking submit
@@ -39,13 +35,21 @@
- Handle other exception conditions on broker connect more gracefully
- - Need to handle exceptions in broker connect thread, so it doesn't
- stop trying
-
Deferred
+ * Indicate how old stats are
+
+ * Need way to control connectToBroker timeout
+
+ * Add broker reg name unique constraint and validation
+
+ * Whereever it makes sense, add a switch to display living, dead, or
+ all objects
+
+ * BrokerSetForm displays no rows instead of [None] with some filters
+
* Add an edit form for broker registrations so you can change their
- names
+ names, and also their group membership
* Add inactive state to some status lights
[View Less]
17 years, 3 months
rhmessaging commits: r1498 - in store/trunk/cpp: tests and 1 other directory.
by rhmessaging-commits@lists.jboss.org
Author: cctrieloff
Date: 2007-12-16 21:44:36 -0500 (Sun, 16 Dec 2007)
New Revision: 1498
Modified:
store/trunk/cpp/lib/JournalImpl.cpp
store/trunk/cpp/lib/JournalImpl.h
store/trunk/cpp/tests/run-unit-tests
Log:
- updated locking
- also stop() from JournalImpl
Modified: store/trunk/cpp/lib/JournalImpl.cpp
===================================================================
--- store/trunk/cpp/lib/JournalImpl.cpp 2007-12-14 21:53:32 UTC (rev 1497)
+++ store/trunk/cpp/lib/JournalImpl.…
[View More]cpp 2007-12-17 02:44:36 UTC (rev 1498)
@@ -51,6 +51,7 @@
writeActivityFlag(false),
flushTriggeredFlag(true),
aioWait(false),
+ aioWaitLock(false),
_xidp(0),
_datap(0),
_dlen(0),
@@ -65,6 +66,10 @@
JournalImpl::~JournalImpl()
{
+ if (_init_flag && !_stop_flag){
+ try { stop(true); }
+ catch (const jexception& e) { std::cerr << e << std::endl; }
+ }
(dynamic_cast<GetEventsFireEvent*>(getEventsFireEventsPtr.get()))->cancel();
(dynamic_cast<InactivityFireEvent*>(inactivityFireEventPtr.get()))->cancel();
if (_xidp) {
@@ -174,7 +179,7 @@
JournalImpl::enqueue_data_record(const void* const data_buff, const size_t tot_data_len,
const size_t this_data_len, data_tok* dtokp, const bool transient)
{
- qpid::sys::ScopedLock<qpid::sys::Monitor> s(writeLock);
+ writeLockCheck();
while(handleIoResult(jcntl::enqueue_data_record(data_buff, tot_data_len, this_data_len, dtokp,
transient)));
}
@@ -183,7 +188,7 @@
JournalImpl::enqueue_extern_data_record(const size_t tot_data_len, data_tok* dtokp,
const bool transient)
{
- qpid::sys::ScopedLock<qpid::sys::Monitor> s(writeLock);
+ writeLockCheck();
while(handleIoResult(jcntl::enqueue_extern_data_record(tot_data_len, dtokp, transient)));
}
@@ -191,7 +196,7 @@
JournalImpl::enqueue_txn_data_record(const void* const data_buff, const size_t tot_data_len,
const size_t this_data_len, data_tok* dtokp, const std::string& xid, const bool transient)
{
- qpid::sys::ScopedLock<qpid::sys::Monitor> s(writeLock);
+ writeLockCheck();
while(handleIoResult(jcntl::enqueue_txn_data_record(data_buff, tot_data_len, this_data_len,
dtokp, xid, transient)));
}
@@ -200,7 +205,7 @@
JournalImpl::enqueue_extern_txn_data_record(const size_t tot_data_len, data_tok* dtokp,
const std::string& xid, const bool transient)
{
- qpid::sys::ScopedLock<qpid::sys::Monitor> s(writeLock);
+ writeLockCheck();
while(handleIoResult(jcntl::enqueue_extern_txn_data_record(tot_data_len, dtokp, xid,
transient)));
}
@@ -208,28 +213,28 @@
void
JournalImpl::dequeue_data_record(data_tok* const dtokp)
{
- qpid::sys::ScopedLock<qpid::sys::Monitor> s(writeLock);
+ writeLockCheck();
while(handleIoResult(jcntl::dequeue_data_record(dtokp)));
}
void
JournalImpl::dequeue_txn_data_record(data_tok* const dtokp, const std::string& xid)
{
- qpid::sys::ScopedLock<qpid::sys::Monitor> s(writeLock);
+ writeLockCheck();
while(handleIoResult(jcntl::dequeue_txn_data_record(dtokp, xid)));
}
void
JournalImpl::txn_abort(data_tok* const dtokp, const std::string& xid)
{
- qpid::sys::ScopedLock<qpid::sys::Monitor> s(writeLock);
+ writeLockCheck();
while(handleIoResult(jcntl::txn_abort(dtokp, xid)));
}
void
JournalImpl::txn_commit(data_tok* const dtokp, const std::string& xid)
{
- qpid::sys::ScopedLock<qpid::sys::Monitor> s(writeLock);
+ writeLockCheck();
while(handleIoResult(jcntl::txn_commit(dtokp, xid)));
}
@@ -289,6 +294,17 @@
journalTimer.add(inactivityFireEventPtr);
}
+void
+JournalImpl::writeLockCheck()
+{
+ qpid::sys::ScopedLock<qpid::sys::Monitor> s(writeLock);
+ if (aioWait)
+ {
+ aioWaitLock = true;
+ writeLock.wait();
+ }
+}
+
const bool
JournalImpl::handleIoResult(const iores r)
{
@@ -296,10 +312,18 @@
switch (r)
{
case rhm::journal::RHM_IORES_SUCCESS:
+ {
+ qpid::sys::ScopedLock<qpid::sys::Monitor> s(writeLock);
+ aioWait = false;
+ }
return false;
case rhm::journal::RHM_IORES_AIO_WAIT:
- aioWait = true;
- writeLock.wait();
+ {
+ qpid::sys::ScopedLock<qpid::sys::Monitor> s(writeLock);
+ aioWait = true;
+ }
+ usleep(1000); // TODO: add counter here to limit the time spent in this loop?
+ get_wr_events();
return true;
case rhm::journal::RHM_IORES_ENQCAPTHRESH:
{
Modified: store/trunk/cpp/lib/JournalImpl.h
===================================================================
--- store/trunk/cpp/lib/JournalImpl.h 2007-12-14 21:53:32 UTC (rev 1497)
+++ store/trunk/cpp/lib/JournalImpl.h 2007-12-17 02:44:36 UTC (rev 1498)
@@ -77,6 +77,7 @@
qpid::sys::Monitor writeLock;
bool aioWait;
+ bool aioWaitLock; // monitor lock taken
// temp local vars for loadMsgContent below
void* _xidp;
@@ -153,9 +154,14 @@
void flushFire();
// Notify write monitor
- inline void notifyWriteMonitor() { if (aioWait) { aioWait = false; writeLock.notify(); } }
+ inline void notifyWriteMonitor()
+ {
+ qpid::sys::ScopedLock<qpid::sys::Monitor> s(writeLock);
+ if (aioWaitLock) { aioWaitLock = false; writeLock.notify(); }
+ }
private:
+ void writeLockCheck();
const bool handleIoResult(const journal::iores r);
static void aio_wr_callback(jcntl* journal, u_int32_t num_dtoks);
static void aio_rd_callback(jcntl* journal, u_int32_t num_dtoks);
Modified: store/trunk/cpp/tests/run-unit-tests
===================================================================
--- store/trunk/cpp/tests/run-unit-tests 2007-12-14 21:53:32 UTC (rev 1497)
+++ store/trunk/cpp/tests/run-unit-tests 2007-12-17 02:44:36 UTC (rev 1498)
@@ -3,12 +3,8 @@
. $srcdir/setup
fail=0
-
-DB_HOME=dbdata
-mkdir -p $DB_HOME
-export DB_HOME
+ulimit -c unlimited
LD_PRELOAD=$pwd/.libs/libdlclose_noop.so $vg DllPlugInTester -c -b $pwd/.libs/*Test.so 2> out || fail=1
-rm -rf $DB_HOME
vg_check out || fail=1
exit $fail
[View Less]
17 years, 3 months
rhmessaging commits: r1497 - store/trunk/cpp/lib.
by rhmessaging-commits@lists.jboss.org
Author: kpvdr
Date: 2007-12-14 16:53:32 -0500 (Fri, 14 Dec 2007)
New Revision: 1497
Modified:
store/trunk/cpp/lib/JournalImpl.cpp
Log:
Removed a debug and a sleep that were left behind from the last test
Modified: store/trunk/cpp/lib/JournalImpl.cpp
===================================================================
--- store/trunk/cpp/lib/JournalImpl.cpp 2007-12-14 21:09:53 UTC (rev 1496)
+++ store/trunk/cpp/lib/JournalImpl.cpp 2007-12-14 21:53:32 UTC (rev 1497)
@@ -298,10 +298,8 @@
…
[View More] case rhm::journal::RHM_IORES_SUCCESS:
return false;
case rhm::journal::RHM_IORES_AIO_WAIT:
-std::cout << "W " << std::flush;
aioWait = true;
writeLock.wait();
- usleep(1000);
return true;
case rhm::journal::RHM_IORES_ENQCAPTHRESH:
{
[View Less]
17 years, 3 months