Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksey Lim <alsroot@sugarlabs.org>2014-05-13 10:37:10 (GMT)
committer Aleksey Lim <alsroot@sugarlabs.org>2014-05-13 10:37:10 (GMT)
commit5ff35e9cfd584be2ed6c0dcc449387bd1757f2a1 (patch)
treec6d24e67becd52059479f400c50be5ed615ba867
parent79f0c64f59b0742a7f4c56e27c15feb8db08e308 (diff)
Count number of Context solves
-rwxr-xr-xsugar-network-node11
-rw-r--r--sugar_network/model/context.py2
-rw-r--r--sugar_network/model/post.py9
-rw-r--r--sugar_network/node/stats.py14
-rwxr-xr-xtests/units/node/stats.py30
5 files changed, 47 insertions, 19 deletions
diff --git a/sugar-network-node b/sugar-network-node
index da20284..f1792c9 100755
--- a/sugar-network-node
+++ b/sugar-network-node
@@ -98,14 +98,12 @@ class Application(application.Daemon):
volume=volume, auth=SugarAuth(node.data_root.value),
find_limit=node.find_limit.value)
+ routes.stats_init(join(node.data_root.value, 'var'),
+ stats.stats_step.value, stats.stats_rras.value)
+ self.jobs.spawn(routes.stats_auto_commit)
self.jobs.spawn(volume.populate)
self.jobs.spawn(model.presolve, join(node.data_root.value, 'files'))
- if stats.stats.value:
- routes.stats_init(join(node.data_root.value, 'var'),
- stats.stats_step.value, stats.stats_rras.value)
- self.jobs.spawn(routes.stats_auto_commit)
-
logging.info('Listen requests on %s:%s',
node.host.value, node.port.value)
server = coroutine.WSGIServer(
@@ -128,8 +126,7 @@ class Application(application.Daemon):
try:
self.jobs.join()
finally:
- if stats.stats.value:
- routes.stats_commit()
+ routes.stats_commit()
volume.close()
os.unlink(backdoor.value)
diff --git a/sugar_network/model/context.py b/sugar_network/model/context.py
index 36021c7..89a0c08 100644
--- a/sugar_network/model/context.py
+++ b/sugar_network/model/context.py
@@ -84,7 +84,7 @@ class Context(db.Resource):
@db.indexed_property(db.Numeric, slot=2, default=0,
acl=ACL.READ | ACL.LOCAL)
- def downloads(self, value):
+ def solves(self, value):
return value
@db.indexed_property(model.Rating, slot=3, acl=ACL.READ | ACL.LOCAL)
diff --git a/sugar_network/model/post.py b/sugar_network/model/post.py
index 511ae59..e26eb91 100644
--- a/sugar_network/model/post.py
+++ b/sugar_network/model/post.py
@@ -47,7 +47,7 @@ class Post(db.Resource):
def solution(self, value):
return value
- @db.indexed_property(db.Enum, prefix='V', items=range(5), default=0,
+ @db.indexed_property(db.Enum, prefix='V', items=range(6), default=0,
acl=ACL.CREATE | ACL.READ)
def vote(self, value):
return value
@@ -75,12 +75,7 @@ class Post(db.Resource):
value['name'] = self['title']
return value
- @db.indexed_property(db.Numeric, slot=2, default=0,
- acl=ACL.READ | ACL.LOCAL)
- def downloads(self, value):
- return value
-
- @db.indexed_property(model.Rating, slot=3, acl=ACL.READ | ACL.LOCAL)
+ @db.indexed_property(model.Rating, slot=2, acl=ACL.READ | ACL.LOCAL)
def rating(self, value):
return value
diff --git a/sugar_network/node/stats.py b/sugar_network/node/stats.py
index c31b204..d5941eb 100644
--- a/sugar_network/node/stats.py
+++ b/sugar_network/node/stats.py
@@ -23,10 +23,6 @@ from sugar_network.toolkit.coroutine import this
from sugar_network.toolkit import Option, coroutine, enforce
-stats = Option(
- 'collect unpersonalized node statistics',
- default=False, type_cast=Option.bool_cast, action='store_true')
-
stats_step = Option(
'step interval in seconds for RRD statistics database',
default=60 * 5, type_cast=int)
@@ -110,6 +106,7 @@ class StatRoutes(object):
_rrd = None
_stats = None
+ _solves = None
_stated = False
def stats_init(self, path, step, rras):
@@ -117,6 +114,7 @@ class StatRoutes(object):
self._rrd = Rrd(path, 'stats', _DS, step, rras)
self._stats = self._rrd.values()
+ self._solves = {}
if not self._stats:
for field, traits in _DS.items():
@@ -142,6 +140,9 @@ class StatRoutes(object):
stat = stat()
self._stats[stat] += shift
+ if stat == 'solved':
+ self._solves[r.guid] = self._solves.get(r.guid, 0) + 1
+
return result
@route('GET', cmd='stats', arguments={
@@ -188,6 +189,11 @@ class StatRoutes(object):
if traits['type'] == 'ABSOLUTE':
self._stats[field] = 0
+ context = this.volume['context']
+ for guid, solves in self._solves.items():
+ context.update(guid, {'solves': context[guid]['solves'] + solves})
+ self._solves.clear()
+
def stats_regen(self, path, step, rras):
for i in Rrd(path, 'stats', _DS, step, rras).files:
os.unlink(i)
diff --git a/tests/units/node/stats.py b/tests/units/node/stats.py
index 91b4dee..e7e2f3f 100755
--- a/tests/units/node/stats.py
+++ b/tests/units/node/stats.py
@@ -371,6 +371,36 @@ class StatsTest(tests.Test):
],
this.call(method='GET', cmd='stats', limit=10))
+ def test_StatSolvedPerObject(self):
+ ts = int(time.time())
+ volume = self.start_master(auth=RootAuth())
+ self.node_routes.stats_init('.', 1, ['RRA:AVERAGE:0.5:1:10'])
+
+ self.override(time, 'time', lambda: ts)
+ guid = this.call(method='POST', path=['context'], content={'title': '', 'summary': '', 'description': '', 'type': 'activity'})
+ this.call(method='POST', path=['context', guid, 'releases'], content=StringIO(
+ self.zips(('topdir/activity/activity.info', '\n'.join([
+ '[Activity]',
+ 'name = Activity',
+ 'bundle_id = %s' % guid,
+ 'exec = true',
+ 'icon = icon',
+ 'activity_version = 1',
+ 'license = Public Domain',
+ ])))))
+ this.call(method='GET', path=['context', guid], cmd='solve')
+ self.node_routes.stats_commit()
+ self.assertEqual(1, volume['context'][guid]['solves'])
+
+ this.call(method='GET', path=['context', guid], cmd='solve')
+ this.call(method='GET', path=['context', guid], cmd='solve')
+ self.node_routes.stats_commit()
+ self.assertEqual(3, volume['context'][guid]['solves'])
+
+ this.call(method='GET', path=['context', guid], cmd='solve')
+ self.node_routes.stats_commit()
+ self.assertEqual(4, volume['context'][guid]['solves'])
+
if __name__ == '__main__':
tests.main()