def process_cascade_request(message): ctr_increment('cascades processed') cascade_requests = RAMCollection('cascade requests') try: if len(cascade_requests.find_objuuids( cscuuid=message['cscuuid'])) == 0: cascade_request = cascade_requests.get_object() cascade_request.object = message cascade_request.set() if len(message['ftags']) > 0: if len(list(set(message['ftags']) & set(get_tag_values()))) > 0: Thread(target=forward_cascade_request, args=(message, )).start() else: Thread(target=forward_cascade_request, args=(message, )).start() if len(message['etags']) > 0: if len(list(set(message['etags']) & set(get_tag_values()))) > 0: Thread(target=execute_cascade_request, args=(message, )).start() else: Thread(target=execute_cascade_request, args=(message, )).start() except: pass
def create_route(agtuuid, gtwuuid, weight, timestamp=None): collection = RAMCollection('routes') routes = collection.find(agtuuid=agtuuid, gtwuuid=gtwuuid) if len(routes) > 1: for route in routes: route.destroy() route = collection.get_object() route.object = { 'gtwuuid': gtwuuid, 'agtuuid': agtuuid, 'weight': weight } route.set() elif len(routes) == 1: route = routes[0] if route.object['weight'] > weight: route.object['weight'] = weight route.set() else: route = collection.get_object() route.object = { 'gtwuuid': gtwuuid, 'agtuuid': agtuuid, 'weight': weight } route.set()
def init_peers(): ram_peers = RAMCollection('peers') peers = SQLCollection('peers') for objuuid in peers.list_objuuids(): ram_peer = ram_peers.get_object(objuuid) ram_peer.object = peers.get_object(objuuid).object ram_peer.set()
def pop_cascade_responses(cscuuid): responses = RAMCollection('cascade responses') response_objects = [] for objuuid in responses.find_objuuids(cscuuid=cscuuid): response = responses.get_object(objuuid) response_objects.append(response.object) response.destroy() return response_objects
def age_routes(v): routes = RAMCollection('routes') for route in routes.find(): try: if route.object['weight'] > MAX_WEIGHT: route.destroy() else: route.object['weight'] = route.object['weight'] + v route.set() except: route.destroy()
def process_route_advertisement(advertisement): peers = RAMCollection('peers') routes = RAMCollection('routes') ignored_peers = [cherrypy.config.get('agtuuid')] for peer in peers.find(): try: ignored_peers.append(peer.object['agtuuid']) except: pass for route in advertisement['routes']: try: if route['agtuuid'] not in ignored_peers: create_route(route['agtuuid'], advertisement['agtuuid'], route['weight'] + 1) except: pass prune()
def prune(): requests = RAMCollection('cascade requests') responses = RAMCollection('cascade responses') cscuuids = [] for objuuid in requests.list_objuuids(): request = requests.get_object(objuuid) try: if time() - request.object['timestamp'] > ASYNC_CASCADE_TIMEOUT: request.destroy() else: cscuuids.append(request.object['cscuuid']) except: request.destroy() for objuuid in responses.list_objuuids(): response = responses.get_object(objuuid) try: if response.object['cscuuid'] not in cscuuids: response.destroy() except: response.destroy()
def create_route_advertisement(): prune() routes = RAMCollection('routes') peers = RAMCollection('peers') advertisement = {} advertisement['type'] = 'route advertisement' advertisement['agtuuid'] = cherrypy.config.get('agtuuid') advertisement['routes'] = [] for route in routes.find(): try: if 'agtuuid' not in route.object: raise Exception('Invalid Route') if 'weight' not in route.object: raise Exception('Invalid Route') temp = {} temp['agtuuid'] = route.object['agtuuid'] temp['weight'] = route.object['weight'] temp['gtwuuid'] = cherrypy.config.get('agtuuid') advertisement['routes'].append(temp) except: route.destroy() for peer in peers.find(): try: temp = {} temp['agtuuid'] = peer.object['agtuuid'] temp['weight'] = 0 temp['gtwuuid'] = cherrypy.config.get('agtuuid') advertisement['routes'].append(temp) except: peer.destroy() return advertisement
def pull_messages(agtuuid): agtuuids = [] agtuuids.append(agtuuid) routes = RAMCollection('routes') routes_dict = {} for rteuuid in routes.list_objuuids(): route = routes.get_object(rteuuid) try: if route.object['agtuuid'] in routes_dict: if float(routes_dict[route.object['agtuuid']]['weight']) > \ float(route.object['weight']): routes_dict[route.object['agtuuid']] = { 'weight': route.object['weight'], 'gtwuuid': route.object['gtwuuid'] } else: routes_dict[route.object['agtuuid']] = { 'weight': route.object['weight'], 'gtwuuid': route.object['gtwuuid'] } except: route.destroy() for k, v in routes_dict.items(): try: if v['gtwuuid'] == agtuuid: agtuuids.append(k) except: pass messages = [] for agtuuid in agtuuids: messages += pop_messages(dest=agtuuid) return messages
def push_message(message): ctr_increment('messages pushed') ctr_increment('messages queued') message_lock.acquire() if 'timestamp' not in message: message['timestamp'] = time() messages = Collection('messages') new_message = messages.get_object() new_message.object = message new_message.set() message_lock.release()
def pop_messages(**kargs): message_lock.acquire() message_list = [] messages = Collection('messages') for message in messages.find(**kargs): message_list.append(message.object) message.destroy() ctr_increment('messages popped') ctr_decrement('messages queued') message_lock.release() return message_list
def worker(): register_timer(name='message_worker', target=worker, timeout=60).start() message_lock.acquire() messages = Collection('messages') for message in messages.find(): try: if time() - message.object['timestamp'] > MESSAGE_TIMEOUT: message.destroy() ctr_increment('messages expired') ctr_decrement('messages queued') except: message.destroy() message_lock.release()
def prune(): routes = RAMCollection('routes') peers = RAMCollection('peers') peer_agtuuids = [] for peer in peers.find(): try: if 'destroy time' in peer.object: if peer.object['destroy time'] < time(): peer.destroy() else: peer_agtuuids.append(peer.object['agtuuid']) else: peer_agtuuids.append(peer.object['agtuuid']) except: peer.destroy() peers = SQLCollection('peers') for peer in peers.find(): try: if 'destroy time' in peer.object: if peer.object['destroy time'] < time(): peer.destroy() else: peer_agtuuids.append(peer.object['agtuuid']) else: peer_agtuuids.append(peer.object['agtuuid']) except: peer.destroy() for route in routes.find(): try: if (len(peers.find(agtuuid=route.object['agtuuid'])) > 0 or route.object['agtuuid'] == cherrypy.config.get('agtuuid') or route.object['gtwuuid'] not in peer_agtuuids): route.destroy() except: route.destroy()
def service_cascade_request(message): ctr_increment('cascades serviced') cascade_response = RAMCollection('cascade responses').get_object() cascade_response.object = message cascade_response.set()
try: if time() - request.object['timestamp'] > ASYNC_CASCADE_TIMEOUT: request.destroy() else: cscuuids.append(request.object['cscuuid']) except: request.destroy() for objuuid in responses.list_objuuids(): response = responses.get_object(objuuid) try: if response.object['cscuuid'] not in cscuuids: response.destroy() except: response.destroy() def worker(): register_timer(name='cascade_worker', target=worker, timeout=60).start() prune() collection = RAMCollection('cascade requests') collection.create_attribute('cscuuid', "['cscuuid']") collection = RAMCollection('cascade responses') collection.create_attribute('cscuuid', "['cscuuid']") Thread(target=worker).start()
message_lock.release() return message_list def worker(): register_timer(name='message_worker', target=worker, timeout=60).start() message_lock.acquire() messages = Collection('messages') for message in messages.find(): try: if time() - message.object['timestamp'] > MESSAGE_TIMEOUT: message.destroy() ctr_increment('messages expired') ctr_decrement('messages queued') except: message.destroy() message_lock.release() collection = Collection('messages') collection.create_attribute('dest', "['dest']") collection.create_attribute('type', "['type']") Thread(target=worker).start()
def get_routes(): route_list = [] routes = RAMCollection('routes') for route in routes.find(): route_list.append(route.object) return route_list
def get_peers(): peer_list = [] peers = RAMCollection('peers') for peer in peers.find(): peer_list.append(peer.object) return peer_list