def has_key(self, *args, **kwargs):
     callargs = inspect.getcallargs(self.func, *args, **kwargs)
     key = binfootprint.dump(callargs)
     with self.PDS(name=self.db_name, path=self.db_path) as db:
         if self.subdbkey is not None:
             with db.getData(self.subdbkey, create_sub_data=True) as subdb:
                 return key in subdb
         else:
             return key in db
 def process_new_result(self, arg, result):
     args, kwargs = arg
     callargs = inspect.getcallargs(self.func, *args, **kwargs)
     key = binfootprint.dump(callargs)
     with self.PDS(name=self.db_name, path=self.db_path) as db:
         if self.subdbkey is not None:
             with db.getData(self.subdbkey, create_sub_data=True) as subdb:
                 subdb[key] = result
         else:
             db[key] = result
        def __init__(self, func):
            self.func = func
            try:
                self.__name__ = func.__name__
            except AttributeError:                  # for example a 'functools.partial' object has no attribute __name__
                self.__name__ = None
            try:
                self.__doc__ = func.__doc__
            except AttributeError:
                self.__doc__ = None
            self.verbose = verbose

            if db_name is None:
                if self.__name__ is None:
                    raise ValueError("can not get db_name from func.__name (__name__ is None)")

                self.db_name = self.__name__
                if self.verbose > 0:
                    print("db_name ", db_name, "set from func.__name__")
            else:
                self.db_name = db_name
                if self.verbose > 0:
                    print("db_name ", db_name)

            self.db_path = db_path
            if verbose > 0:
                print("db_path ", db_path)

            if kind == 'sql':
                self.PDS = PersistentDataStructure
            elif kind == 'hdf5':
                self.PDS = PersistentDataStructure_HDF5
            else:
                raise ValueError("unknown kind '{}'".format(kind))

            if verbose > 0:
                print("kind    ", kind)

            if subdbkey is None:
                self.subdbkey = None
                if self.verbose > 0:
                    print("subdbkey not set")
            else:
                if not isinstance(subdbkey, bytes):
                    self.subdbkey = binfootprint.dump(subdbkey)
                    if self.verbose > 0:
                        print("subdbkey", subdbkey, "(converted to bytes)")
                else:
                    self.subdbkey = subdbkey
                    if self.verbose > 0:
                        print("subdbkey", subdbkey)
        def put_arg(self, args, kwargs):
            callargs = inspect.getcallargs(self.func, *args, **kwargs)
            key = binfootprint.dump(callargs)

            with self.PDS(name=self.db_name, path=self.db_path) as db:
                if self.subdbkey is not None:
                    with db.getData(self.subdbkey, create_sub_data=True) as subdb:
                        if key in subdb:
                            return subdb[key]
                else:
                    if key in db:
                        return db[key]

            arg = (args, kwargs)
            jm.JobManager_Server.put_arg(self, arg)
            return None
        def __call__(self, *args, **kwargs):
            callargs = inspect.getcallargs(self.func, *args, **kwargs)
            if self.verbose > 0:
                print("call with", callargs)
            key = binfootprint.dump(callargs)
            with self.PDS(name=self.db_name, path=self.db_path) as db:
                if self.subdbkey is not None:
                    with db.getData(self.subdbkey, create_sub_data=True) as subdb:
                        if key in subdb:
                            if self.verbose > 0:
                                print("key found in subdb")
                            return subdb[key]
                else:
                    if key in db:
                        if self.verbose > 0:
                            print("key found in db")
                        return db[key]

            if self.verbose > 0:
                print("key not found, crunch ...")
            # did not find any cached results
            value = self.func(*args, **kwargs)
            if self.verbose > 0:
                print("done!")
            with self.PDS(name=self.db_name, path=self.db_path) as db:
                if self.subdbkey is not None:
                    with db.getData(self.subdbkey, create_sub_data=True) as subdb:
                        if self.verbose > 0:
                            print("save value to subdb")
                        subdb[key] = value
                else:
                    if self.verbose > 0:
                        print("save value to db")
                    db[key] = value

            if self.verbose > 0:
                print("return value")
            return value
Exemple #6
0
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import division, print_function

import sys
from os.path import abspath, dirname, split

# Add parent directory to beginning of path variable
sys.path = [split(dirname(abspath(__file__)))[0]] + sys.path

import binfootprint as bf

atoms = [
    12345678,  # int32
    3.141,  # float
    "hallo Welt",  # ascii string
    "öäüß",  # utf8 string
    True,
    False,
    None,  # special Value
    2**65,
    -(3**65),  # integer
    b"\xff\fe\03",
]  # bytes

binkey = bf.dump(atoms)  # generate a unique byte sequence
atoms_prime = bf.load(binkey)  # restore the original object
def test_shutdown_server_while_client_running():
    """
    start server with 100 elements in queue
    
    start client
    
    stop server -> client should catch exception, but can't do anything, 
        writing to fail won't work, because server went down
        except do emergency dump
    
    check if the final_result and the args dump end up to include
    all arguments given 
    """
    global PORT
   
    n = 100

    sigs = [('SIGTERM', signal.SIGTERM), ('SIGINT', signal.SIGINT)]

    for signame, sig in sigs:
        PORT += 1
    
        p_server = None
        p_client = None
        
        try:
            p_server = mp.Process(target=start_server, args=(n,False,0.1))
            p_server.start()       
            time.sleep(0.5)
            assert p_server.is_alive()
            
            p_client = mp.Process(target=start_client)
            p_client.start()
            time.sleep(2)
            assert p_client.is_alive()
            
            print("    send {} to server".format(signame))
            os.kill(p_server.pid, sig)
            
            p_server.join(TIMEOUT)
            assert not p_server.is_alive(), "server did not shut down on time"
            assert p_server.exitcode == 0, "the server raised an exception"
            p_client.join(TIMEOUT)
            assert not p_client.is_alive(), "client did not shut down on time"
            assert p_client.exitcode == 0, "the client raised an exception"


            print("[+] server and client joined {}".format(datetime.datetime.now().isoformat()))
            
            fname = 'jobmanager.dump'
            with open(fname, 'rb') as f:
                data = jobmanager.JobManager_Server.static_load(f)    
        
            ac = data['job_q']
            args_set = {binfootprint.dump(ac.data['_'+str(id_)]) for id_ in ac._not_gotten_ids}
            final_result = data['final_result']
        
            final_res_args = {binfootprint.dump(a[0]) for a in final_result}
                
            args_ref = range(1,n)
            set_ref = set()
            for a in args_ref:
                set_ref.add(binfootprint.dump(a))    
            
            set_recover = set(args_set) | set(final_res_args)
            
            intersec_set = set_ref-set_recover
        
            if len(intersec_set) == 0:
                print("[+] no arguments lost!")
        
            assert len(intersec_set) == 0, "NOT all arguments found in dump!"
        except:
            if p_server is not None:
                p_server.terminate()
            if p_client is not None:
                p_client.terminate()
            raise
Exemple #8
0
 def _convkey(self, key):
     dump = False
     if not isinstance(key, (bytes, bytearray)):
         key = bf.dump(key)
         dump = True
     return key, dump