From 5ff35e9cfd584be2ed6c0dcc449387bd1757f2a1 Mon Sep 17 00:00:00 2001 From: Aleksey Lim Date: Tue, 13 May 2014 10:37:10 +0000 Subject: Count number of Context solves --- 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() -- cgit v0.9.1