From cadaad167b4cf102d7987b0c342c32a071ed5a64 Mon Sep 17 00:00:00 2001 From: Ismael Date: Wed, 13 Nov 2019 09:24:01 +0100 Subject: [PATCH 01/81] main branch prepared for Interface integration --- setup.py | 16 +-- storageAPI/storage/__init__.py | 0 storageAPI/storage/api.py | 109 -------------- storageAPI/storageItf/.gitignore | 66 --------- storageAPI/storageItf/pom.xml | 80 ----------- .../main/java/storage/StorageException.java | 23 --- .../src/main/java/storage/StorageItf.java | 133 ------------------ .../src/main/java/storage/StubItf.java | 7 - 8 files changed, 4 insertions(+), 430 deletions(-) delete mode 100755 storageAPI/storage/__init__.py delete mode 100755 storageAPI/storage/api.py delete mode 100644 storageAPI/storageItf/.gitignore delete mode 100644 storageAPI/storageItf/pom.xml delete mode 100644 storageAPI/storageItf/src/main/java/storage/StorageException.java delete mode 100644 storageAPI/storageItf/src/main/java/storage/StorageItf.java delete mode 100644 storageAPI/storageItf/src/main/java/storage/StubItf.java diff --git a/setup.py b/setup.py index 76f20d64..71ac02a2 100644 --- a/setup.py +++ b/setup.py @@ -35,22 +35,14 @@ def cmake_build(): # if subprocess.call(["make", "-j4", "-C", "./build", "install"]) != 0: # raise EnvironmentError("error calling make install") -def get_var(var): - value = os.environ.get(var,'') - return [p for p in value.split(':') if p != ''] - - -PATH_LIBS = get_var('LD_LIBRARY_PATH') -PATH_INCLUDE = get_var('CPATH') + get_var('CPLUS_INCLUDE_PATH') + get_var('C_INCLUDE_PATH') extensions = [ Extension( "hfetch", sources=glob.glob("hecuba_core/src/py_interface/*.cpp"), - include_dirs=['hecuba_core/src/', 'build/include', numpy.get_include()] + PATH_INCLUDE, + include_dirs=['hecuba_core/src/', 'build/include', numpy.get_include()], libraries=['hfetch', 'cassandra'], - library_dirs=['build/lib', 'build/lib64'] + PATH_LIBS, - extra_compile_args=['-std=c++11'], + library_dirs=['build/lib', 'build/lib64'], extra_link_args=['-Wl,-rpath=$ORIGIN'] ), ] @@ -71,8 +63,8 @@ def setup_packages(): # compute which libraries were built metadata = dict(name="Hecuba", version="0.1.3", - package_dir={'hecuba': 'hecuba_py/hecuba', 'storage': 'storageAPI/storage'}, - packages=['hecuba', 'storage'], # find_packages(), + package_dir={'hecuba': 'hecuba_py/hecuba', 'storage': 'storage', 'pycompss': 'pycompss'}, + packages=['hecuba', 'storage', 'pycompss'] + find_packages(), install_requires=['cassandra-driver>=3.7.1', 'numpy>=1.16'], zip_safe=False, data_files=[('', extra_files)], diff --git a/storageAPI/storage/__init__.py b/storageAPI/storage/__init__.py deleted file mode 100755 index e69de29b..00000000 diff --git a/storageAPI/storage/api.py b/storageAPI/storage/api.py deleted file mode 100755 index 4ecd4fbf..00000000 --- a/storageAPI/storage/api.py +++ /dev/null @@ -1,109 +0,0 @@ -import uuid - - -def init(config_file_path=None): - """ - Function that can be useful when running the application with COMPSs >= 2.0 - It is executed at the beginning of the application - """ - pass - - -def finish(): - """ - Function that can be useful when running the application with COMPSs >= 2.0 - It is executed at the end of the application - """ - pass - - -def initWorker(config_file_path=None): - """ - Function that can be useful when running the application with COMPSs >= 2.0 - It is executed at the beginning of the application - """ - pass - - -def finishWorker(): - """ - Function that can be useful when running the application with COMPSs >= 2.0 - It is executed at the end of the application - """ - pass - - -def start_task(params): - """ - Initializes, if needed, the global vars for prefetch and batch, and starts the context if batch is activated - Args: - params: a list of objects (Blocks, StorageObjs, strings, ints, ...) - """ - pass - - -def end_task(params): - """ - Terminates, if needed, the context (to save all data remaining in the batch) and the prefetch. It also prints - the statistics of the StorageObjs if desired. - Args: - params: a list of objects (Blocks, StorageObjs, strings, ints, ...) - """ - pass - - -class TaskContext(object): - def __init__(self, logger, values, **kwargs): - self.logger = logger - self.values = values - - def __enter__(self): - # Do something prolog - start_task(self.values) - # Ready to start the task - self.logger.info("Prolog finished") - pass - - def __exit__(self, type, value, traceback): - # Do something epilog - end_task(self.values) - # Finished - self.logger.info("Epilog finished") - pass - - -def getByID(objid): - """ - We rebuild the object from its id. - - Args: - objid (str): object identifier - - Returns: - Hecuba Object - - """ - """ - TODO - Args: - objid (str): object identifier - Returns: - (Block| Storageobj) - """ - from hecuba import log - from hecuba.IStorage import build_remotely - from hecuba import config - - query = "SELECT * FROM hecuba.istorage WHERE storage_id = %s" - - if isinstance(objid, str): - objid = uuid.UUID(objid) - - results = config.session.execute(query, [objid]) - if not results: - raise RuntimeError("Object {} not found on hecuba.istorage".format(objid)) - - results = results[0] - - log.debug("IStorage API:getByID(%s) of class %s", objid, results.class_name) - return build_remotely(results._asdict()) diff --git a/storageAPI/storageItf/.gitignore b/storageAPI/storageItf/.gitignore deleted file mode 100644 index a32a599c..00000000 --- a/storageAPI/storageItf/.gitignore +++ /dev/null @@ -1,66 +0,0 @@ -# Compiled class file -*.class - -# Log file -*.log - -# BlueJ files -*.ctxt - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.ear -*.zip -*.tar.gz -*.rar - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* - -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm -# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 - -# User-specific stuff: -.idea/**/workspace.xml -.idea/**/tasks.xml -.idea/dictionaries - -# Sensitive or high-churn files: -.idea/**/dataSources/ -.idea/**/dataSources.ids -.idea/**/dataSources.xml -.idea/**/dataSources.local.xml -.idea/**/sqlDataSources.xml -.idea/**/dynamic.xml -.idea/**/uiDesigner.xml - -# Gradle: -.idea/**/gradle.xml -.idea/**/libraries - -# Mongo Explorer plugin: -.idea/**/mongoSettings.xml - -## File-based project format: -*.iws - -## Plugin-specific files: - -# IntelliJ -/out/ - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties -fabric.properties diff --git a/storageAPI/storageItf/pom.xml b/storageAPI/storageItf/pom.xml deleted file mode 100644 index 71e21273..00000000 --- a/storageAPI/storageItf/pom.xml +++ /dev/null @@ -1,80 +0,0 @@ - - 4.0.0 - storage.StorageItf - StorageItf - jar - 1.0 - StorageItf - http://maven.apache.org - - - junit - junit - 3.8.1 - test - - - com.datastax.cassandra - cassandra-driver-core - 3.1.0 - - - com.googlecode.json-simple - json-simple - 1.1 - - - com.google.code.gson - gson - 2.2.4 - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 2.5.1 - - 1.8 - 1.8 - true - 1g - 4g - - - - maven-assembly-plugin - - - - storage.StorageItf.main - storage - - - - jar-with-dependencies - - - - - - - - com.springsource.repository.bundles.release - SpringSource Enterprise Bundle Repository - SpringSource Bundle Releases - http://repository.springsource.com/maven/bundles/release - - - com.springsource.repository.bundles.external - SpringSource Enterprise Bundle Repository - External Bundle Releases - http://repository.springsource.com/maven/bundles/external - - - central - http://repo1.maven.org/maven2/ - - - - diff --git a/storageAPI/storageItf/src/main/java/storage/StorageException.java b/storageAPI/storageItf/src/main/java/storage/StorageException.java deleted file mode 100644 index e91fb7fe..00000000 --- a/storageAPI/storageItf/src/main/java/storage/StorageException.java +++ /dev/null @@ -1,23 +0,0 @@ -package storage; - -import java.util.*; -import java.lang.*; - -import java.io.*; -import static java.lang.System.out; - -public class StorageException extends Exception{ - - public StorageException(String message) { - super(message); - } - - public StorageException(String message, Throwable throwable) { - super(message, throwable); - } - - public String getMessage() - { - return super.getMessage(); - } -} \ No newline at end of file diff --git a/storageAPI/storageItf/src/main/java/storage/StorageItf.java b/storageAPI/storageItf/src/main/java/storage/StorageItf.java deleted file mode 100644 index f9398471..00000000 --- a/storageAPI/storageItf/src/main/java/storage/StorageItf.java +++ /dev/null @@ -1,133 +0,0 @@ -package storage; -import com.datastax.driver.core.*; -import java.util.*; -import java.util.function.Function; -import static java.util.stream.Collectors.*; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.regex.Pattern; - -public class StorageItf { - - private static Cluster cluster = null; - private static Session session = null; - - /** - * This function returns a order list of the hosts that have the higher number of local tokens. - * - * @param objectID the block identifier - * @return - * @throws storage.StorageException - */ - public static List getLocations(String objectID) throws storage.StorageException { - UUID uuid = UUID.fromString(objectID.replace(" ", "")); - List resultSet = Collections.emptyList(); - checkCassandra(); - Row storage_info = session.execute("SELECT class_name FROM hecuba.istorage WHERE storage_id = ?", uuid).one(); - String class_name = storage_info.getString("class_name"); - if(class_name == "hecuba.hdict.StorageDict"){ - Metadata metadata = cluster.getMetadata(); - String name = storage_info.getString("name"); - int pposition = name.indexOf('.'); - if (pposition == -1) { - throw new StorageException("I cannot detect the keyspace name from " + name); - } - final String nodeKp = name.substring(0, pposition); - - Set> hostsTkns = storage_info.getList("tokens", TupleValue.class).stream() - .map(tok -> metadata.newToken(tok.getLong(0) + "")) - .flatMap(token -> - metadata.getReplicas(Metadata.quote(nodeKp), metadata.newTokenRange(token, token)).stream()) - .collect(groupingBy(Function.identity(), counting())).entrySet(); - - ArrayList> result = new ArrayList<>(hostsTkns); - Collections.sort(result, Comparator.comparing(o -> (o.getValue()))); - List toReturn; - toReturn = result.stream().map(a -> a.getKey().getAddress().toString().replaceAll("^.*/", "")).collect(toList()); - List toReturnHN = new ArrayList(); - for (String ip : toReturn){ - try{ - InetAddress addr = InetAddress.getByName(ip); - String host = addr.getHostName(); - String[] HNsplitted = host.split("-"); - HNsplitted = HNsplitted[0].split(Pattern.quote(".")); - toReturnHN.add(HNsplitted[0]); - }catch(UnknownHostException e){ - throw new storage.StorageException("Problem obtaining hostaddress:" + e); - } - } - System.out.println("Result for objectID " + objectID + ":" + toReturnHN.get(0)); - return toReturnHN; - } - if(class_name == "hecuba.hdict.StorageObj"){ - System.out.println("Result for objectID " + objectID + ": []"); - } - return resultSet; - } - - - private static void checkCassandra() { - if (cluster == null) { - String[] nodeIP = System.getenv("CONTACT_NAMES").split(","); - int nodePort = Integer.parseInt(System.getenv("NODE_PORT")); - cluster = new Cluster.Builder() - .addContactPoints(nodeIP) - .withPort(nodePort) - .build(); - session = cluster.connect(); - } - - } - - private static void closeCassandra() { - if (cluster != null) { - session.close(); - session = null; - cluster.close(); - cluster = null; - } - - } - - - public static void newReplica(String objectID, String node) throws StorageException { - } - - public static String newVersion(String objectID, String node) throws StorageException { - //return ""; - return objectID; - } - - public static void consolidateVersion(String objectID) throws StorageException { - } - - public static void delete(String objectID) throws StorageException { - } - - public static void finish() throws StorageException { - closeCassandra(); - - } - - public static java.lang.Object getByID(String objectID) throws StorageException { - return null; - } - - public static void init(String configFile) throws storage.StorageException { - - } - - public static void main(String[] args) throws StorageException { - - StorageItf client = new StorageItf(); - - try { - client.init(null); - } catch (StorageException e) { - e.printStackTrace(); - } - - client.getLocations(args[0]).forEach(System.out::println); - System.out.println("Application ended"); - } -} diff --git a/storageAPI/storageItf/src/main/java/storage/StubItf.java b/storageAPI/storageItf/src/main/java/storage/StubItf.java deleted file mode 100644 index 8c7be25f..00000000 --- a/storageAPI/storageItf/src/main/java/storage/StubItf.java +++ /dev/null @@ -1,7 +0,0 @@ -package storage; - -public interface StubItf{ - - public String getID(); - -} From 5d46dd360a571b4450db5da9470d7a218cf2ac68 Mon Sep 17 00:00:00 2001 From: Ismael Date: Wed, 13 Nov 2019 09:25:04 +0100 Subject: [PATCH 02/81] main branch prepared for Interface integration --- .travis.yml | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/.travis.yml b/.travis.yml index 48135889..81358c87 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,27 +40,9 @@ addons: # command to run tests script: - - nosetests --with-coverage -v -s hecuba_py/tests/*.py - - nosetests --with-coverage -v -s hecuba_py/tests/withcassandra + #- nosetests --with-coverage -v -s hecuba_py/tests/*.py + #- nosetests --with-coverage -v -s hecuba_py/tests/withcassandra -jobs: - include: - - stage: build_wheel_manylinux2010 - sudo: required - env: - - DOCKER_IMAGE=quay.io/pypa/manylinux2010_x86_64 PLAT=manylinux2010_x86_64 - install: - - docker pull $DOCKER_IMAGE - script: - - docker run --rm -e PLAT=$PLAT -v `pwd`:/io $DOCKER_IMAGE /io/.travis/build-wheels.sh - - stage: build_wheel_manylinux1 - sudo: required - env: - - DOCKER_IMAGE=quay.io/pypa/manylinux1_x86_64 PLAT=manylinux1_x86_64 - install: - - docker pull $DOCKER_IMAGE - script: - - docker run --rm -e PLAT=$PLAT -v `pwd`:/io $DOCKER_IMAGE /io/.travis/build-wheels.sh # Push the results back to codecov after_success: From fd959c44e444db5f89acbb7c6e6475cdc06e7578 Mon Sep 17 00:00:00 2001 From: Ismael Date: Wed, 13 Nov 2019 10:48:05 +0100 Subject: [PATCH 03/81] add_data_model, mock classes, tests added --- setup.py | 4 +- storage/__init__.py | 220 ++++++++++++++++++++++ storage/cql_iface/__init__.py | 0 storage/cql_iface/cql_comm.py | 9 + storage/cql_iface/cql_iface.py | 67 +++++++ storage/cql_iface/tests/__init__.py | 0 storage/cql_iface/tests/api_tests.py | 121 ++++++++++++ storage/cql_iface/tests/mockStorageObj.py | 50 +++++ storage/cql_iface/tests/mockhdict.py | 59 ++++++ storage/cql_iface/tests/mockhnumpy.py | 79 ++++++++ storage/storage_iface.py | 15 ++ 11 files changed, 622 insertions(+), 2 deletions(-) create mode 100644 storage/__init__.py create mode 100644 storage/cql_iface/__init__.py create mode 100644 storage/cql_iface/cql_comm.py create mode 100644 storage/cql_iface/cql_iface.py create mode 100644 storage/cql_iface/tests/__init__.py create mode 100644 storage/cql_iface/tests/api_tests.py create mode 100644 storage/cql_iface/tests/mockStorageObj.py create mode 100644 storage/cql_iface/tests/mockhdict.py create mode 100644 storage/cql_iface/tests/mockhnumpy.py create mode 100644 storage/storage_iface.py diff --git a/setup.py b/setup.py index 71ac02a2..47394078 100644 --- a/setup.py +++ b/setup.py @@ -63,8 +63,8 @@ def setup_packages(): # compute which libraries were built metadata = dict(name="Hecuba", version="0.1.3", - package_dir={'hecuba': 'hecuba_py/hecuba', 'storage': 'storage', 'pycompss': 'pycompss'}, - packages=['hecuba', 'storage', 'pycompss'] + find_packages(), + package_dir={'hecuba': 'hecuba_py/hecuba', 'storage': 'storage'}, #'pycompss': 'pycompss'}, + packages=['hecuba', 'storage'] + find_packages(), #'pycompss'] + find_packages(), install_requires=['cassandra-driver>=3.7.1', 'numpy>=1.16'], zip_safe=False, data_files=[('', extra_files)], diff --git a/storage/__init__.py b/storage/__init__.py new file mode 100644 index 00000000..ae2bd0e0 --- /dev/null +++ b/storage/__init__.py @@ -0,0 +1,220 @@ +from cassandra.cluster import Cluster +from cassandra.policies import RetryPolicy, RoundRobinPolicy, TokenAwarePolicy +from hecuba import log +import os + + +class _NRetry(RetryPolicy): + def __init__(self, time_to_retry=5): + self.time_to_retry = time_to_retry + + def on_unavailable(self, query, consistency, required_replicas, alive_replicas, retry_num): + if retry_num > self.time_to_retry: + return self.RETHROW, None + else: + return self.RETHROW, None + + def on_write_timeout(self, query, consistency, write_type, required_responses, received_responses, retry_num): + if retry_num > self.time_to_retry: + return self.RETHROW, None + else: + return self.RETHROW, None + + def on_read_timeout(self, query, consistency, required_responses, received_responses, data_retrieved, retry_num): + if retry_num > self.time_to_retry: + return self.RETHROW, None + else: + return self.RETHROW, None + + +class Config(object): + class __Config: + def __init__(self): + self.configured = False + + instance = __Config() + + @staticmethod + def execute(statement, args): + if not Config.instance.configured: + raise RuntimeError("Not configured to contact cassandra on CQL_Comm storage") + + return Config.instance.session.execute(statement, args) + + def __getattr__(self, item): + return getattr(Config.instance, item) + + def __init__(self): + singleton = Config.instance + if singleton.configured: + log.info('setting down') + return + + singleton.configured = True + + if 'CREATE_SCHEMA' in os.environ: + singleton.id_create_schema = int(os.environ['CREATE_SCHEMA']) + else: + singleton.id_create_schema = -1 + + try: + singleton.nodePort = int(os.environ['NODE_PORT']) + log.info('NODE_PORT: %d', singleton.nodePort) + except KeyError: + log.warn('using default NODE_PORT 9042') + singleton.nodePort = 9042 + + try: + singleton.contact_names = os.environ['CONTACT_NAMES'].split(",") + log.info('CONTACT_NAMES: %s', str.join(" ", singleton.contact_names)) + except KeyError: + log.warn('using default contact point localhost') + singleton.contact_names = ['127.0.0.1'] + + if hasattr(singleton, 'session'): + log.warn('Shutting down pre-existent sessions and cluster') + try: + singleton.session.shutdown() + singleton.cluster.shutdown() + except Exception: + log.warn('error shutting down') + try: + singleton.replication_factor = int(os.environ['REPLICA_FACTOR']) + log.info('REPLICA_FACTOR: %d', singleton.replication_factor) + except KeyError: + singleton.replication_factor = 1 + log.warn('using default REPLICA_FACTOR: %d', singleton.replication_factor) + + try: + user_defined_execution_name = os.environ['EXECUTION_NAME'] + if user_defined_execution_name == 'hecuba': + raise RuntimeError('Error: the application keyspace cannot be \'hecuba\'. ' + 'This keyspace is reserved for storing metadata.') + singleton.execution_name = user_defined_execution_name + log.info('EXECUTION_NAME: %s', singleton.execution_name) + except KeyError: + singleton.execution_name = 'my_app' + log.warn('using default EXECUTION_NAME: %s', singleton.execution_name) + try: + singleton.splits_per_node = int(os.environ['SPLITS_PER_NODE']) + log.info('SPLITS_PER_NODE: %d', singleton.splits_per_node) + except KeyError: + singleton.splits_per_node = 32 + log.warn('using default SPLITS_PER_NODE: %d', singleton.splits_per_node) + + try: + singleton.token_range_size = int(os.environ['TOKEN_RANGE_SIZE']) + log.info('TOKEN_RANGE_SIZE: %d', singleton.token_range_size) + singleton.target_token_range_size = None + except KeyError: + singleton.token_range_size = None + + try: + singleton.target_token_range_size = int(os.environ['TARGET_TOKEN_RANGE_SIZE']) + log.info('TARGET_TOKEN_RANGE_SIZE: %d', singleton.target_token_range_size) + except KeyError: + singleton.target_token_range_size = 64 * 1024 + log.warn('using default TARGET_TOKEN_RANGE_SIZE: %d', singleton.target_token_range_size) + + try: + singleton.max_cache_size = int(os.environ['MAX_CACHE_SIZE']) + log.info('MAX_CACHE_SIZE: %d', singleton.max_cache_size) + except KeyError: + singleton.max_cache_size = 1000 + log.warn('using default MAX_CACHE_SIZE: %d', singleton.max_cache_size) + + try: + singleton.replication_strategy = os.environ['REPLICATION_STRATEGY'] + log.info('REPLICATION_STRATEGY: %s', singleton.replication_strategy) + except KeyError: + singleton.replication_strategy = "SimpleStrategy" + log.warn('using default REPLICATION_STRATEGY: %s', singleton.replication_strategy) + + try: + singleton.replication_strategy_options = os.environ['REPLICATION_STRATEGY_OPTIONS'] + log.info('REPLICATION_STRATEGY_OPTIONS: %s', singleton.replication_strategy_options) + except KeyError: + singleton.replication_strategy_options = "" + log.warn('using default REPLICATION_STRATEGY_OPTIONS: %s', singleton.replication_strategy_options) + + if singleton.replication_strategy is "SimpleStrategy": + singleton.replication = "{'class' : 'SimpleStrategy', 'replication_factor': %d}" % \ + singleton.replication_factor + else: + singleton.replication = "{'class' : '%s', %s}" % ( + singleton.replication_strategy, singleton.replication_strategy_options) + try: + singleton.hecuba_print_limit = int(os.environ['HECUBA_PRINT_LIMIT']) + log.info('HECUBA_PRINT_LIMIT: %s', singleton.hecuba_print_limit) + except KeyError: + singleton.hecuba_print_limit = 1000 + log.warn('using default HECUBA_PRINT_LIMIT: %s', singleton.hecuba_print_limit) + + try: + singleton.prefetch_size = int(os.environ['PREFETCH_SIZE']) + log.info('PREFETCH_SIZE: %s', singleton.prefetch_size) + except KeyError: + singleton.prefetch_size = 10000 + log.warn('using default PREFETCH_SIZE: %s', singleton.prefetch_size) + + try: + singleton.write_buffer_size = int(os.environ['WRITE_BUFFER_SIZE']) + log.info('WRITE_BUFFER_SIZE: %s', singleton.write_buffer_size) + except KeyError: + singleton.write_buffer_size = 1000 + log.warn('using default WRITE_BUFFER_SIZE: %s', singleton.write_buffer_size) + + try: + singleton.write_callbacks_number = int(os.environ['WRITE_CALLBACKS_NUMBER']) + log.info('WRITE_CALLBACKS_NUMBER: %s', singleton.write_callbacks_number) + except KeyError: + singleton.write_callbacks_number = 16 + log.warn('using default WRITE_CALLBACKS_NUMBER: %s', singleton.write_callbacks_number) + + try: + env_var = os.environ['TIMESTAMPED_WRITES'].lower() + singleton.timestamped_writes = False if env_var == 'no' or env_var == 'false' else True + log.info('TIMESTAMPED WRITES ENABLED? {}'.format(singleton.timestamped_writes)) + except KeyError: + singleton.timestamped_writes = True + log.warn('using default TIMESTAMPED_WRITES: %s', singleton.timestamped_writes) + + if singleton.max_cache_size < singleton.write_buffer_size: + import warnings + message = "Defining a MAX_CACHE_SIZE smaller than WRITE_BUFFER_SIZE can result " \ + "in reading outdated results from the persistent storage" + warnings.warn(message) + + log.info('Initializing global session') + + singleton.cluster = Cluster(contact_points=singleton.contact_names, + load_balancing_policy=TokenAwarePolicy(RoundRobinPolicy()), + port=singleton.nodePort, + default_retry_policy=_NRetry(5)) + singleton.session = singleton.cluster.connect() + singleton.session.encoder.mapping[tuple] = singleton.session.encoder.cql_encode_tuple + if singleton.id_create_schema == -1: + queries = [ + "CREATE KEYSPACE IF NOT EXISTS hecuba WITH replication = %s" % singleton.replication, + """CREATE TYPE IF NOT EXISTS hecuba.q_meta( + mem_filter text, + from_point frozen>, + to_point frozen>, + precision float); + """, + 'CREATE TYPE IF NOT EXISTS hecuba.np_meta(dims frozen>,type int,block_id int);', + """CREATE TABLE IF NOT EXISTS hecuba.istorage (storage_id uuid, + data_model text, name text, PRIMARY KEY(storage_id)); + """] + for query in queries: + try: + singleton.session.execute(query) + except Exception as e: + log.error("Error executing query %s" % query) + raise e + + from hfetch import connectCassandra + # connecting c++ bindings + connectCassandra(singleton.contact_names, singleton.nodePort) + +config = Config() \ No newline at end of file diff --git a/storage/cql_iface/__init__.py b/storage/cql_iface/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/storage/cql_iface/cql_comm.py b/storage/cql_iface/cql_comm.py new file mode 100644 index 00000000..0f940551 --- /dev/null +++ b/storage/cql_iface/cql_comm.py @@ -0,0 +1,9 @@ + + +class CqlCOMM(object): + + + @staticmethod + def register_data_model(data_model_id, definition): + # extract keys, values and so on + pass \ No newline at end of file diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py new file mode 100644 index 00000000..7479ebd3 --- /dev/null +++ b/storage/cql_iface/cql_iface.py @@ -0,0 +1,67 @@ +import uuid + +import numpy +from storage.cql_iface.tests.mockIStorage import IStorage + +from .cql_comm import CqlCOMM +from ..storage_iface import StorageIface + +""" +Mockup on how the Cassandra implementation of the interface could work. +""" + + +class CQLIface(StorageIface): + # DataModelID - DataModelDef + data_models_cache = {} + + # StorageID - DataModelID + object_to_data_model = {} + # Object Name - Cache + hcache_by_name = {} + # Object's class - Cache + hcache_by_class = {} + # StorageID - Cache + hcache_by_id = {} + + # User class to Cassandra data type + _hecuba2cassandra_typemap = {str: 'text', + bool: 'boolean', + float: 'float', + int: 'int', + tuple: 'tuple', + list: 'list', + set: 'set', + dict: 'map', + bytearray: 'blob', + bytes: 'blob', + numpy.int64: 'double', + numpy.ndarray: 'hecuba.hnumpy.StorageNumpy', + uuid.UUID: 'uuid'} + + def __init__(self): + pass + + @staticmethod + def is_persistent(pyobject): + return pyobject.getID() is not None and pyobject.get_name() is not None + + def check_definition(self, definition): + if not isinstance(definition, dict): + raise TypeError("Expected a dict type as a definition") + elif not all(name in definition for name in ["type", "value_id", "fields"]): + raise KeyError("Expected keys 'type', 'value_id' and 'fields'") + elif not issubclass(definition["type"], IStorage): + raise TypeError("Class must inherit IStorage") + + def add_data_model(self, definition): + self.check_definition(definition) + dm = list(definition.items()) + dm.sort() + datamodel_id = hash(str(dm)) + try: + self.data_models_cache[datamodel_id] + except KeyError: + self.data_models_cache[datamodel_id] = definition + CqlCOMM.register_data_model(datamodel_id, definition) + return datamodel_id diff --git a/storage/cql_iface/tests/__init__.py b/storage/cql_iface/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py new file mode 100644 index 00000000..54e012ef --- /dev/null +++ b/storage/cql_iface/tests/api_tests.py @@ -0,0 +1,121 @@ +import unittest +import numpy +import uuid + +from storage.cql_iface.cql_iface import CQLIface + +from storage.cql_iface.tests.mockIStorage import IStorage +from storage.cql_iface.tests.mocktools import storage_id_from_name +from storage.cql_iface.tests.mockhdict import StorageDict +from storage.cql_iface.tests.mockStorageObj import StorageObj +from storage.cql_iface.tests.mockhnumpy import StorageNumpy + +class TestClass(IStorage): + + def __new__(cls, name='', *args, **kwargs): + toret = super(TestClass, cls).__new__(cls) + storage_id = kwargs.get('storage_id', None) + if storage_id is None and name: + storage_id = storage_id_from_name(name) + + if name or storage_id: + toret.setID(storage_id) + toret.set_name(name) + toret._is_persistent = True + return toret + + def __init__(self, *args, **kwargs): + super(TestClass, self).__init__() + +class mockClass(IStorage): + pass + +class HfetchTests(unittest.TestCase): + def test_instantiate(self): + result = CQLIface() + self.assertIsNotNone(result) + + def test_add_data_model_except_not_dict_type(self): + with self.assertRaises(TypeError): + data_model = "a" + storage = CQLIface() + # Register data models + storage.check_definition(data_model) + + def test_add_data_model_except_invalid_class(self): + with self.assertRaises(TypeError): + data_model = {"type": "a", "value_id": {"k": str}, "fields": {"a": str}} + storage = CQLIface() + # Register data models + storage.check_definition(data_model) + + def test_add_data_model_except_invalid_format(self): + with self.assertRaises(KeyError): + data_model = {"type": mockClass, "": {"k": str}, "fields": {"a": str}} + storage = CQLIface() + # Register data models + storage.check_definition(data_model) + + def test_add_data_different_types(self): + data_model = {"type": mockClass, "value_id": {"k": int}, "fields": {"a": numpy.int64, "b": numpy.ndarray, "c": uuid.UUID}} + raised = False + try: + storage = CQLIface() + # Register data models + storage.check_definition(data_model) + except: + raised = True + self.assertFalse(raised, 'Exception raised') + + def test_add_data_model_new(self): + data_model = {"type": mockClass, "value_id": {"k": int}, "fields": {"a": str}} + storage = CQLIface() + # Register data models + id = storage.add_data_model(data_model) + self.assertTrue(storage.data_models_cache[id]) + + def test_add_data_model_StorageObj(self): + data_model = {"type": StorageObj, "value_id": {"k": int}, "fields": {"a": str}} + storage = CQLIface() + # Register data models + id = storage.add_data_model(data_model) + self.assertTrue(storage.data_models_cache[id]) + + def test_add_data_model_StorageDict(self): + data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": str}} + storage = CQLIface() + # Register data models + id = storage.add_data_model(data_model) + self.assertTrue(storage.data_models_cache[id]) + + def test_add_data_model_StorageNumpy(self): + data_model = {"type": StorageNumpy, "value_id": {"k": int}, "fields": {"a": str}} + storage = CQLIface() + # Register data models + id = storage.add_data_model(data_model) + self.assertTrue(storage.data_models_cache[id]) + + + def test_add_data_model_existing_one(self): + data_model1 = {"type": mockClass, "value_id": {"k": int}, "fields": {"a": str}} + data_model2 = {"type": mockClass, "value_id": {"k": int}, "fields": {"a": str}} + storage = CQLIface() + # Register data models + storage.add_data_model(data_model1) + id2 = storage.add_data_model(data_model1) + self.assertTrue(storage.data_models_cache[id2]) + + def test_add_data_model_complex_types(self): + data_model = {"type": mockClass, "value_id": {"k": int, "k1": int}, "fields": {"a": {"value_id": {"k": int}, "fields": {"f": str}}}} + storage = CQLIface() + # Register data models + id = storage.add_data_model(data_model) + self.assertTrue(storage.data_models_cache[id]) + + def test_add_data_model_complex_structure(self): + data_model = {"type": mockClass, "value_id": {"k": int, "k1": [int, int]}, "fields": {"a": { + "value_id": {"k": (int, str)}, "fields": {"f": str, "f2": (float,)}}}} + storage = CQLIface() + # Register data models + id = storage.add_data_model(data_model) + self.assertTrue(storage.data_models_cache[id]) diff --git a/storage/cql_iface/tests/mockStorageObj.py b/storage/cql_iface/tests/mockStorageObj.py new file mode 100644 index 00000000..c4e5b537 --- /dev/null +++ b/storage/cql_iface/tests/mockStorageObj.py @@ -0,0 +1,50 @@ +from storage.cql_iface.tests.mockIStorage import IStorage +from storage.cql_iface.tests.mocktools import storage_id_from_name, transform_to_dm +import uuid + + +class StorageObj(IStorage): + """ + This class is where information will be stored in Hecuba. + The information can be in memory, stored in a python dictionary or local variables, or saved in a + DB(Cassandra), depending on if it's persistent or not. + """ + + def __new__(cls, name='', *args, **kwargs): + if not cls._data_model_id: + # User data model + keys = {} + try: + cls._data_model_def = kwargs['data_model'] + except KeyError: + pass + cls._data_model_def = dict() + cls._data_model_def["cols"] = transform_to_dm(cls) + cls._data_model_def['value_id'] = {'storage_id': uuid.UUID} + cls._data_model_def['type'] = cls + + toret = super(StorageObj, cls).__new__(cls) + storage_id = kwargs.get('storage_id', None) + if storage_id is None and name: + storage_id = storage_id_from_name(name) + + if name or storage_id: + toret.setID(storage_id) + toret.set_name(name) + toret._is_persistent = True + return toret + + def __init__(self, *args, **kwargs): + """ + Creates a new storageobj. + Args: + name (string): the name of the Cassandra Keyspace + table where information can be found + tokens (list of tuples): token ranges assigned to the new StorageObj + storage_id (string): an unique storageobj identifier + istorage_props dict(string,string): a map with the storage id of each contained istorage object. + kwargs: more optional parameters + """ + # Assign private attributes + # if self._is_persistent: + # self._load_attributes() + super(StorageObj, self).__init__() \ No newline at end of file diff --git a/storage/cql_iface/tests/mockhdict.py b/storage/cql_iface/tests/mockhdict.py new file mode 100644 index 00000000..e5662cc6 --- /dev/null +++ b/storage/cql_iface/tests/mockhdict.py @@ -0,0 +1,59 @@ +from storage.cql_iface.tests.mockIStorage import IStorage +from storage.cql_iface.tests.mocktools import build_remotely, storage_id_from_name, transform_to_dm +import storage + + +class StorageDict(IStorage, dict): + # """ + # Object used to access data from workers. + # """ + + def __new__(cls, name='', *args, **kwargs): + """ + Creates a new StorageDict. + + Args: + name (string): the name of the collection/table (keyspace is optional) + storage_id (string): the storage id identifier + args: arguments for base constructor + kwargs: arguments for base constructor + """ + if not cls._data_model_id: + # User data model + keys = {} + try: + cls._data_model_def = kwargs['data_model'] + except KeyError: + import typing + dms = [] + for ob in cls.__orig_bases__: + if isinstance(ob, typing.GenericMeta): + dms.append(transform_to_dm(ob)) + if len(dms) != 1: + raise ValueError("Different orig bases than expected ({})".format(len(dms))) + + cls._data_model_def = dms[0] + cls._data_model_def['type'] = cls + + # Storage data model + #keys = {k: uuid.UUID if issubclass(v, IStorage) else v for k, v in cls._data_model_def["value_id"]} + #cols = {k: uuid.UUID if issubclass(v, IStorage) else v for k, v in cls._data_model_def["cols"]} + + cls._data_model_id = storage.StorageAPI.add_data_model(cls._data_model_def) + + toret = super(StorageDict, cls).__new__(cls, kwargs) + storage_id = kwargs.get('storage_id', None) + + if storage_id is None and name: + storage_id = storage_id_from_name(name) + + if name or storage_id: + toret.setID(storage_id) + toret.set_name(name) + toret._is_persistent = True + #storage.StorageAPI.register_persistent_object(cls._data_model_id, toret) + return toret + + def __init__(self, *args, **kwargs): + super().__init__(**kwargs) + diff --git a/storage/cql_iface/tests/mockhnumpy.py b/storage/cql_iface/tests/mockhnumpy.py new file mode 100644 index 00000000..237b597d --- /dev/null +++ b/storage/cql_iface/tests/mockhnumpy.py @@ -0,0 +1,79 @@ +from collections import namedtuple +import numpy as np +import uuid + +from storage.cql_iface.tests.mockIStorage import IStorage, AlreadyPersistentError + +import storage + + +class StorageNumpy(IStorage, np.ndarray): + class np_meta(object): + def __init__(self, shape, dtype, block_id): + self.dims = shape + self.type = dtype + self.block_id = block_id + + _build_args = None + _class_name = None + _hcache_params = None + _hcache = None + _ksp = "" + _table = "" + _block_id = None + + args_names = ["storage_id", "class_name", "name", "shape", "dtype", "block_id", "built_remotely"] + args = namedtuple('StorageNumpyArgs', args_names) + + def __new__(cls, input_array=None, storage_id=None, name=None, built_remotely=False, **kwargs): + if storage_id: + # already exists + pass + + if input_array is None and name and storage_id is not None: + result = cls.load_array(storage_id) + input_array = result[0] + obj = np.asarray(input_array).view(cls) + obj._name = name + obj.storage_id = storage_id + obj._is_persistent = True + elif not name and storage_id is not None: + raise RuntimeError("hnumpy received storage id but not a name") + elif (input_array is not None and name and storage_id is not None) \ + or (storage_id is None and name): + obj = np.asarray(input_array).view(cls) + obj.storage_id = storage_id + obj._is_persistent = False + obj.make_persistent(name) + else: + obj = np.asarray(input_array).view(cls) + obj.storage_id = storage_id + obj._is_persistent = storage_id is not None + # Finally, we must return the newly created object: + obj._built_remotely = built_remotely + obj._class_name = '%s.%s' % (cls.__module__, cls.__name__) + return obj + + def __init__(self, *args, **kwargs): + super(StorageNumpy, self).__init__() + + @staticmethod + def load_array(storage_id): + #storage.StorageAPI.get_records(storage_id) + ''' + (ksp, table) = extract_ks_table(name) + hcache_params = (ksp, table, + storage_id, [], ['storage_id', 'cluster_id', 'block_id'], + [{'name': "payload", 'type': 'numpy'}], + {'cache_size': config.max_cache_size, + 'writer_par': config.write_callbacks_number, + 'write_buffer': config.write_buffer_size, + 'timestamped_writes': config.timestamped_writes}) + hcache = HNumpyStore(*hcache_params) + result = hcache.get_numpy([storage_id]) + if len(result) == 1: + return [result[0], hcache, hcache_params] + else: + raise KeyError + ''' + pass diff --git a/storage/storage_iface.py b/storage/storage_iface.py new file mode 100644 index 00000000..99c361c4 --- /dev/null +++ b/storage/storage_iface.py @@ -0,0 +1,15 @@ +from abc import ABCMeta, abstractmethod +from hecuba.IStorage import IStorage +from uuid import UUID +from typing import List, Generator + + +class StorageIface(metaclass=ABCMeta): + @abstractmethod + def add_data_model(self, definition: dict) -> int: + """ + Registers a data model describing the data format that will be passed and retrieved from storage. + :param definition: Describes a data model that will be used to fetch and store data + :return: data_model_id: Unique identifier to refer to the data model + """ + pass From cda67f1872997d1c365db2a21ace0e3bb26b18a7 Mon Sep 17 00:00:00 2001 From: Ismael Date: Wed, 13 Nov 2019 10:54:08 +0100 Subject: [PATCH 04/81] 2 missing files --- storage/cql_iface/tests/mockIStorage.py | 86 +++++++++++++++ storage/cql_iface/tests/mocktools.py | 138 ++++++++++++++++++++++++ 2 files changed, 224 insertions(+) create mode 100644 storage/cql_iface/tests/mockIStorage.py create mode 100644 storage/cql_iface/tests/mocktools.py diff --git a/storage/cql_iface/tests/mockIStorage.py b/storage/cql_iface/tests/mockIStorage.py new file mode 100644 index 00000000..8a78a340 --- /dev/null +++ b/storage/cql_iface/tests/mockIStorage.py @@ -0,0 +1,86 @@ +import uuid +from collections import namedtuple +from .mocktools import storage_id_from_name + + +class AlreadyPersistentError(RuntimeError): + pass + + +class DataModelNode(object): + def __init__(self, name=None, class_name=None, args=None): + self.name = name + self.class_name = class_name + self.args = args + + +class IStorage(object): + args_names = ["storage_id"] + args = namedtuple("IStorage", args_names) + _build_args = args(storage_id="") + + _data_model_def = None + _data_model_id = None + + def getID(self): + return self.__storage_id + + def setID(self, st_id): + if st_id is not None and not isinstance(st_id, uuid.UUID): + raise TypeError("Storage ID must be an instance of UUID") + self.__storage_id = st_id + + storage_id = property(getID, setID) + + def __new__(cls, *args, **kwargs): + toret = super(IStorage, cls).__new__(cls) + toret._ksp = '' + toret._table = '' + toret._is_persistent = False + toret.__storage_id = None + toret._name = '' + return toret + + def __eq__(self, other): + """ + Method to compare a IStorage object with another one. + Args: + other: IStorage to be compared with. + Returns: + boolean (true - equals, false - not equals). + """ + return self.__class__ == other.__class__ and self.getID() == other.getID() + + @staticmethod + def _store_meta(storage_args): + pass + + def make_persistent(self, name): + if not self.storage_id: + self.storage_id = storage_id_from_name(name) + self._is_persistent = True + self._name = name + + def stop_persistent(self): + self.storage_id = None + self._is_persistent = False + + def delete_persistent(self): + self.storage_id = None + self._is_persistent = False + + def split(self): + """ + Method used to divide an object into sub-objects. + Returns: + a subobject everytime is called + """ + raise NotImplemented("Split not supported yet") + + def set_name(self, name): + if not isinstance(name, str): + raise TypeError("Name -{}- should be an instance of str".format(str(name))) + self._name = name + + def get_name(self): + return self._name diff --git a/storage/cql_iface/tests/mocktools.py b/storage/cql_iface/tests/mocktools.py new file mode 100644 index 00000000..aa68ba0e --- /dev/null +++ b/storage/cql_iface/tests/mocktools.py @@ -0,0 +1,138 @@ +import uuid +import typing +from collections import OrderedDict +import hecuba + + +def storage_id_from_name(name): + return uuid.uuid3(uuid.NAMESPACE_DNS, name) + + +def process_path(module_path): + """ + Method to obtain module and class_name from a module path + Args: + module_path(String): path in the format module.class_name + Returns: + tuple containing class_name and module + """ + + if module_path == 'numpy.ndarray': + return 'StorageNumpy', 'hecuba.hnumpy' + if module_path == 'StorageDict': + return 'StorageDict', 'hecuba.hdict' + + res = module_path.split('.') + if len(res) == 1: + mod = "builtins" + class_name = module_path + else: + mod = res[0] + class_name = module_path[len(mod) + 1:] + + return class_name, mod + + +def build_remotely(args): + """ + Takes the information which consists of at least the type, + :raises TypeError if the object class doesn't subclass IStorage + :param obj_info: Contains the information to be used to create the IStorage obj + :return: An IStorage object + """ + if "built_remotely" not in args.keys(): + built_remotely = True + else: + built_remotely = args["built_remotely"] + + obj_type = args.get('class_name', args.get('type', None)) + if obj_type is None: + raise TypeError("Trying to build an IStorage obj without giving the type") + + imported_class = obj_type + + args = {k: v for k, v in args.items() if k in imported_class.args_names} + args.pop('class_name', None) + args["built_remotely"] = built_remotely + + return imported_class(**args) + + +def import_class(module_path): + """ + Method to obtain module and class_name from a module path + Args: + module_path(String): path in the format module.class_name + Returns: + tuple containing class_name and module + """ + class_name, mod = process_path(module_path) + + try: + mod = __import__(mod, globals(), locals(), [class_name], 0) + except ValueError: + raise ValueError("Can't import class {} from module {}".format(class_name, mod)) + + imported_class = getattr(mod, class_name) + return imported_class + + +def build_data_model(description): + res = {} + for k, v in description.items(): + dt = update_type(v["type"]) + try: + keys = build_data_model(v["primary_keys"]) + values = build_data_model(v["columns"]) + res[k] = {"keys": keys, "cols": values, "type": dt} + except KeyError: + res[k] = dt + return res + # {k: update_type(v['type']) for k, v in persistent_props.items()} + + +def update_type(d): + if d == 'text': + return str + res = import_class(d) + return res + + +def transform_to_dm(ob, depth=0): + """ + + :param ob: + :return: List or dict + """ + if issubclass(ob, hecuba.IStorage.IStorage) and depth>0: + return ob + elif issubclass(ob, typing.Dict): + fields = {} + + keys = transform_to_dm(ob.__args__[0], depth+1) # Keys + cols = transform_to_dm(ob.__args__[1], depth+1) # Cols + + if isinstance(keys, list): + keys = {"key{}".format(i): transform_to_dm(v, depth+1) for i, v in enumerate(keys)} + if isinstance(cols, list): + cols = {"col{}".format(i): transform_to_dm(v,depth+1) for i, v in enumerate(cols)} + + fields["value_id"] = keys + fields["cols"] = cols + return fields + + elif hasattr(ob, '__annotations__'): + annot = ob.__annotations__ + if isinstance(annot, OrderedDict): + return {k: transform_to_dm(v, depth+1) for k,v in annot.items()} + elif isinstance(annot, dict): + return {k: transform_to_dm(v, depth+1) for k,v in annot.items()} + else: + raise NotImplemented + + elif hasattr(ob, '__args__'): + if issubclass(ob, typing.Tuple): + t = [transform_to_dm(cl, depth+1) for cl in ob.__args__ if cl != ()] + return tuple(t) + return [transform_to_dm(cl, depth+1) for cl in ob.__args__ if cl != ()] + return ob From 6be87b63dc31a7b7da5266af758c1745838e691d Mon Sep 17 00:00:00 2001 From: Ismael Date: Wed, 13 Nov 2019 10:56:28 +0100 Subject: [PATCH 05/81] travis modification --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 81358c87..783a9b25 100644 --- a/.travis.yml +++ b/.travis.yml @@ -42,7 +42,7 @@ addons: script: #- nosetests --with-coverage -v -s hecuba_py/tests/*.py #- nosetests --with-coverage -v -s hecuba_py/tests/withcassandra - + - nosetests --with-coverage -v -s storage/cql_iface/tests/api_tests.py # Push the results back to codecov after_success: From 51aa636e8ebd5fb48a99e95df18d7ef3522167d9 Mon Sep 17 00:00:00 2001 From: Ismael Date: Wed, 13 Nov 2019 11:47:09 +0100 Subject: [PATCH 06/81] required options --- setup.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/setup.py b/setup.py index 47394078..ba617db5 100644 --- a/setup.py +++ b/setup.py @@ -35,14 +35,22 @@ def cmake_build(): # if subprocess.call(["make", "-j4", "-C", "./build", "install"]) != 0: # raise EnvironmentError("error calling make install") +def get_var(var): + value = os.environ.get(var,'') + return [p for p in value.split(':') if p != ''] + + +PATH_LIBS = get_var('LD_LIBRARY_PATH') +PATH_INCLUDE = get_var('CPATH') + get_var('CPLUS_INCLUDE_PATH') + get_var('C_INCLUDE_PATH') extensions = [ Extension( "hfetch", sources=glob.glob("hecuba_core/src/py_interface/*.cpp"), - include_dirs=['hecuba_core/src/', 'build/include', numpy.get_include()], + include_dirs=['hecuba_core/src/', 'build/include', numpy.get_include()] + PATH_INCLUDE, libraries=['hfetch', 'cassandra'], - library_dirs=['build/lib', 'build/lib64'], + library_dirs=['build/lib', 'build/lib64'] + PATH_LIBS, + extra_compile_args=['-std=c++11'], extra_link_args=['-Wl,-rpath=$ORIGIN'] ), ] @@ -63,8 +71,8 @@ def setup_packages(): # compute which libraries were built metadata = dict(name="Hecuba", version="0.1.3", - package_dir={'hecuba': 'hecuba_py/hecuba', 'storage': 'storage'}, #'pycompss': 'pycompss'}, - packages=['hecuba', 'storage'] + find_packages(), #'pycompss'] + find_packages(), + package_dir={'hecuba': 'hecuba_py/hecuba', 'storage': 'storage'}, + packages=['hecuba', 'storage'] + find_packages(), install_requires=['cassandra-driver>=3.7.1', 'numpy>=1.16'], zip_safe=False, data_files=[('', extra_files)], From febf3295e5ed47624f4edceec21d8b86d838afb1 Mon Sep 17 00:00:00 2001 From: Ismael Date: Thu, 14 Nov 2019 11:15:53 +0100 Subject: [PATCH 07/81] fixing travis --- .travis.yml | 7 ------- storage/__init__.py | 9 +++++++-- storage/cql_iface/tests/api_tests.py | 25 +++++++++++++++++-------- storage/cql_iface/tests/mockIStorage.py | 8 +++++--- storage/cql_iface/tests/mocktools.py | 25 +++++++++++++------------ 5 files changed, 42 insertions(+), 32 deletions(-) diff --git a/.travis.yml b/.travis.yml index 783a9b25..2237b42d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,11 +12,6 @@ env: matrix: - TEST_CASSANDRA_VERSION=3.11.4 -stages: - - test - - build_wheel_manylinux2010 - - build_wheel_manylinux1 - before_install: - source .travis/install_openjdk8.sh @@ -40,8 +35,6 @@ addons: # command to run tests script: - #- nosetests --with-coverage -v -s hecuba_py/tests/*.py - #- nosetests --with-coverage -v -s hecuba_py/tests/withcassandra - nosetests --with-coverage -v -s storage/cql_iface/tests/api_tests.py # Push the results back to codecov diff --git a/storage/__init__.py b/storage/__init__.py index ae2bd0e0..6ab19a36 100644 --- a/storage/__init__.py +++ b/storage/__init__.py @@ -1,7 +1,10 @@ +import os + from cassandra.cluster import Cluster from cassandra.policies import RetryPolicy, RoundRobinPolicy, TokenAwarePolicy from hecuba import log -import os + +from .cas import * class _NRetry(RetryPolicy): @@ -217,4 +220,6 @@ def __init__(self): # connecting c++ bindings connectCassandra(singleton.contact_names, singleton.nodePort) -config = Config() \ No newline at end of file + +# set_up_default_cassandra() +config = Config() diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index 54e012ef..2e8b780a 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -1,14 +1,15 @@ import unittest -import numpy import uuid -from storage.cql_iface.cql_iface import CQLIface +import numpy +from storage.cql_iface.cql_iface import CQLIface from storage.cql_iface.tests.mockIStorage import IStorage -from storage.cql_iface.tests.mocktools import storage_id_from_name -from storage.cql_iface.tests.mockhdict import StorageDict from storage.cql_iface.tests.mockStorageObj import StorageObj +from storage.cql_iface.tests.mockhdict import StorageDict from storage.cql_iface.tests.mockhnumpy import StorageNumpy +from storage.cql_iface.tests.mocktools import storage_id_from_name + class TestClass(IStorage): @@ -27,10 +28,13 @@ def __new__(cls, name='', *args, **kwargs): def __init__(self, *args, **kwargs): super(TestClass, self).__init__() + class mockClass(IStorage): pass + class HfetchTests(unittest.TestCase): + def test_instantiate(self): result = CQLIface() self.assertIsNotNone(result) @@ -57,7 +61,8 @@ def test_add_data_model_except_invalid_format(self): storage.check_definition(data_model) def test_add_data_different_types(self): - data_model = {"type": mockClass, "value_id": {"k": int}, "fields": {"a": numpy.int64, "b": numpy.ndarray, "c": uuid.UUID}} + data_model = {"type": mockClass, "value_id": {"k": int}, + "fields": {"a": numpy.int64, "b": numpy.ndarray, "c": uuid.UUID}} raised = False try: storage = CQLIface() @@ -95,7 +100,6 @@ def test_add_data_model_StorageNumpy(self): id = storage.add_data_model(data_model) self.assertTrue(storage.data_models_cache[id]) - def test_add_data_model_existing_one(self): data_model1 = {"type": mockClass, "value_id": {"k": int}, "fields": {"a": str}} data_model2 = {"type": mockClass, "value_id": {"k": int}, "fields": {"a": str}} @@ -106,7 +110,8 @@ def test_add_data_model_existing_one(self): self.assertTrue(storage.data_models_cache[id2]) def test_add_data_model_complex_types(self): - data_model = {"type": mockClass, "value_id": {"k": int, "k1": int}, "fields": {"a": {"value_id": {"k": int}, "fields": {"f": str}}}} + data_model = {"type": mockClass, "value_id": {"k": int, "k1": int}, + "fields": {"a": {"value_id": {"k": int}, "fields": {"f": str}}}} storage = CQLIface() # Register data models id = storage.add_data_model(data_model) @@ -114,8 +119,12 @@ def test_add_data_model_complex_types(self): def test_add_data_model_complex_structure(self): data_model = {"type": mockClass, "value_id": {"k": int, "k1": [int, int]}, "fields": {"a": { - "value_id": {"k": (int, str)}, "fields": {"f": str, "f2": (float,)}}}} + "value_id": {"k": (int, str)}, "fields": {"f": str, "f2": (float,)}}}} storage = CQLIface() # Register data models id = storage.add_data_model(data_model) self.assertTrue(storage.data_models_cache[id]) + + +if __name__ == "__main__": + unittest.main() diff --git a/storage/cql_iface/tests/mockIStorage.py b/storage/cql_iface/tests/mockIStorage.py index 8a78a340..7c630512 100644 --- a/storage/cql_iface/tests/mockIStorage.py +++ b/storage/cql_iface/tests/mockIStorage.py @@ -1,6 +1,8 @@ import uuid from collections import namedtuple -from .mocktools import storage_id_from_name + + +# from .mocktools import storage_id_from_name class AlreadyPersistentError(RuntimeError): @@ -56,8 +58,8 @@ def _store_meta(storage_args): pass def make_persistent(self, name): - if not self.storage_id: - self.storage_id = storage_id_from_name(name) + # if not self.storage_id: + # self.storage_id = storage_id_from_name(name) self._is_persistent = True self._name = name diff --git a/storage/cql_iface/tests/mocktools.py b/storage/cql_iface/tests/mocktools.py index aa68ba0e..5ef3240e 100644 --- a/storage/cql_iface/tests/mocktools.py +++ b/storage/cql_iface/tests/mocktools.py @@ -1,7 +1,9 @@ -import uuid import typing +import uuid from collections import OrderedDict -import hecuba + +# from .mockIStorage import IStorage +from storage.cql_iface.tests.mockIStorage import IStorage def storage_id_from_name(name): @@ -16,7 +18,6 @@ def process_path(module_path): Returns: tuple containing class_name and module """ - if module_path == 'numpy.ndarray': return 'StorageNumpy', 'hecuba.hnumpy' if module_path == 'StorageDict': @@ -104,18 +105,18 @@ def transform_to_dm(ob, depth=0): :param ob: :return: List or dict """ - if issubclass(ob, hecuba.IStorage.IStorage) and depth>0: + if issubclass(ob, IStorage.IStorage) and depth > 0: return ob elif issubclass(ob, typing.Dict): fields = {} - keys = transform_to_dm(ob.__args__[0], depth+1) # Keys - cols = transform_to_dm(ob.__args__[1], depth+1) # Cols + keys = transform_to_dm(ob.__args__[0], depth + 1) # Keys + cols = transform_to_dm(ob.__args__[1], depth + 1) # Cols if isinstance(keys, list): - keys = {"key{}".format(i): transform_to_dm(v, depth+1) for i, v in enumerate(keys)} + keys = {"key{}".format(i): transform_to_dm(v, depth + 1) for i, v in enumerate(keys)} if isinstance(cols, list): - cols = {"col{}".format(i): transform_to_dm(v,depth+1) for i, v in enumerate(cols)} + cols = {"col{}".format(i): transform_to_dm(v, depth + 1) for i, v in enumerate(cols)} fields["value_id"] = keys fields["cols"] = cols @@ -124,15 +125,15 @@ def transform_to_dm(ob, depth=0): elif hasattr(ob, '__annotations__'): annot = ob.__annotations__ if isinstance(annot, OrderedDict): - return {k: transform_to_dm(v, depth+1) for k,v in annot.items()} + return {k: transform_to_dm(v, depth + 1) for k, v in annot.items()} elif isinstance(annot, dict): - return {k: transform_to_dm(v, depth+1) for k,v in annot.items()} + return {k: transform_to_dm(v, depth + 1) for k, v in annot.items()} else: raise NotImplemented elif hasattr(ob, '__args__'): if issubclass(ob, typing.Tuple): - t = [transform_to_dm(cl, depth+1) for cl in ob.__args__ if cl != ()] + t = [transform_to_dm(cl, depth + 1) for cl in ob.__args__ if cl != ()] return tuple(t) - return [transform_to_dm(cl, depth+1) for cl in ob.__args__ if cl != ()] + return [transform_to_dm(cl, depth + 1) for cl in ob.__args__ if cl != ()] return ob From bebeabc4187e5999c74b828951cc44b8ac65e4a0 Mon Sep 17 00:00:00 2001 From: Ismael Date: Thu, 14 Nov 2019 11:16:38 +0100 Subject: [PATCH 08/81] fixing travis --- storage/cas.py | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 storage/cas.py diff --git a/storage/cas.py b/storage/cas.py new file mode 100644 index 00000000..a155b0ca --- /dev/null +++ b/storage/cas.py @@ -0,0 +1,56 @@ +import atexit +import ccmlib.cluster +import os +import sys +import tempfile +import logging + +from distutils.util import strtobool + +class TestConfig: + pass + + +test_config = TestConfig() +test_config.n_nodes = int(os.environ.get('TEST_CASSANDRA_N_NODES', '2')) +TEST_DEBUG = strtobool(os.environ.get("TEST_DEBUG", "True").lower()) +if TEST_DEBUG: + logging.warning(("You are using TEST_DEBUG=True, a Cassandra cluster must be already running. " + "Keep in mind that the results of the test might be altered by data already existing.")) + + +def set_ccm_cluster(): + global test_config + test_config.ccm_cluster = ccmlib.cluster.Cluster( + tempfile.mkdtemp("tmp_data"), + 'hecuba_test', + cassandra_version=os.environ.get('TEST_CASSANDRA_VERSION', '3.11.4')) + + +def set_up_default_cassandra(): + global test_config + if hasattr(test_config, "ccm_cluster") and any( + map(lambda node: node.is_live(), test_config.ccm_cluster.nodes.values())): + return + + set_ccm_cluster() + try: + test_config.ccm_cluster.populate(test_config.n_nodes).start(allow_root=True,jvm_args=["-Xss512k"]) + except Exception as a: + if TEST_DEBUG: + logging.warning("TEST_DEBUG: ignoring exception") + else: + raise a + + +@atexit.register +def turning_down_cassandra(): + global test_config + if test_config is None or not hasattr(test_config, "ccm_cluster"): + return + + test_config.ccm_cluster.stop() + test_config.ccm_cluster.clear() + + +set_up_default_cassandra() From c9faf845a278753e78e15aa3322718058e378055 Mon Sep 17 00:00:00 2001 From: Ismael Date: Mon, 18 Nov 2019 08:31:49 +0100 Subject: [PATCH 09/81] fixing travis --- storage/__init__.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/storage/__init__.py b/storage/__init__.py index 6ab19a36..985b256b 100644 --- a/storage/__init__.py +++ b/storage/__init__.py @@ -1,8 +1,26 @@ +import logging import os from cassandra.cluster import Cluster from cassandra.policies import RetryPolicy, RoundRobinPolicy, TokenAwarePolicy -from hecuba import log + +# Set default log.handler to avoid "No handler found" warnings. + +stderrLogger = logging.StreamHandler() +f = '%(filename)s: %(levelname)s: %(funcName)s(): %(lineno)d:\t%(message)s' +stderrLogger.setFormatter(logging.Formatter(f)) + +log = logging.getLogger('hecuba') +log.addHandler(stderrLogger) + +if 'DEBUG' in os.environ and os.environ['DEBUG'].lower() == "true": + log.setLevel(logging.DEBUG) +elif 'HECUBA_LOG' in os.environ: + log.setLevel(os.environ['HECUBA_LOG'].upper()) +else: + log.setLevel(logging.ERROR) + + from .cas import * From 00593aef34b2847ec8b0a1e1f77c847fecd14ae6 Mon Sep 17 00:00:00 2001 From: Ismael Date: Mon, 18 Nov 2019 10:06:18 +0100 Subject: [PATCH 10/81] fixing travis --- storage/storage_iface.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/storage/storage_iface.py b/storage/storage_iface.py index 99c361c4..320e7804 100644 --- a/storage/storage_iface.py +++ b/storage/storage_iface.py @@ -1,8 +1,4 @@ from abc import ABCMeta, abstractmethod -from hecuba.IStorage import IStorage -from uuid import UUID -from typing import List, Generator - class StorageIface(metaclass=ABCMeta): @abstractmethod From 721e0cefbaa4b25d098b4d523d9099be4844ab06 Mon Sep 17 00:00:00 2001 From: Ismael Date: Mon, 18 Nov 2019 12:15:17 +0100 Subject: [PATCH 11/81] change in the structure, init initializes storage --- hecuba_py/tests/__init__.py | 2 +- .../withQbeast/qbeast_storagedict_tests.py | 2 +- .../tests/withcassandra/storage_api_tests.py | 4 +- .../withcassandra/storagedict_split_tests.py | 2 +- .../withcassandra/storageobj_split_tests.py | 4 +- .../tests/withcassandra/storageobj_tests.py | 2 +- storage/__init__.py | 243 ------------------ storage/cql_iface/tests/__init__.py | 239 +++++++++++++++++ storage/{ => cql_iface/tests}/cas.py | 0 storage/cql_iface/tests/mockhdict.py | 2 +- storage/cql_iface/tests/mockhnumpy.py | 5 +- 11 files changed, 249 insertions(+), 256 deletions(-) delete mode 100644 storage/__init__.py rename storage/{ => cql_iface/tests}/cas.py (100%) diff --git a/hecuba_py/tests/__init__.py b/hecuba_py/tests/__init__.py index 52262ea4..cd07c5db 100644 --- a/hecuba_py/tests/__init__.py +++ b/hecuba_py/tests/__init__.py @@ -13,7 +13,7 @@ class TestConfig: test_config = TestConfig() test_config.n_nodes = int(os.environ.get('TEST_CASSANDRA_N_NODES', '2')) -TEST_DEBUG = strtobool(os.environ.get("TEST_DEBUG", "False").lower()) +TEST_DEBUG = strtobool(os.environ.get("TEST_DEBUG", "True").lower()) if TEST_DEBUG: logging.warning(("You are using TEST_DEBUG=True, a Cassandra cluster must be already running. " "Keep in mind that the results of the test might be altered by data already existing.")) diff --git a/hecuba_py/tests/withQbeast/qbeast_storagedict_tests.py b/hecuba_py/tests/withQbeast/qbeast_storagedict_tests.py index 41925165..aa96fd1b 100644 --- a/hecuba_py/tests/withQbeast/qbeast_storagedict_tests.py +++ b/hecuba_py/tests/withQbeast/qbeast_storagedict_tests.py @@ -70,7 +70,7 @@ def testCanBeRebuilt(self): time.sleep(1) filtered = filter(lambda row: row.x > 0.02 and row.x < 0.25 and row.y > 0.26 and row.y < 0.45 and row.z > 0.58 and row.z < 0.9, d.items()) - from storage.api import getByID + from storage import getByID for partition in filtered.split(): it2 = getByID(partition.storage_id) self.assertEqual(filtered._qbeast_random, it2._qbeast_random) diff --git a/hecuba_py/tests/withcassandra/storage_api_tests.py b/hecuba_py/tests/withcassandra/storage_api_tests.py index 9e8bd375..9a2c145f 100644 --- a/hecuba_py/tests/withcassandra/storage_api_tests.py +++ b/hecuba_py/tests/withcassandra/storage_api_tests.py @@ -1,8 +1,8 @@ import unittest -from storage.api import getByID +from storage import getByID from ..app.words import Words -from hecuba import config, StorageDict +from hecuba import StorageDict class ApiTestSDict(StorageDict): diff --git a/hecuba_py/tests/withcassandra/storagedict_split_tests.py b/hecuba_py/tests/withcassandra/storagedict_split_tests.py index e2bdfa5f..5b15cce2 100644 --- a/hecuba_py/tests/withcassandra/storagedict_split_tests.py +++ b/hecuba_py/tests/withcassandra/storagedict_split_tests.py @@ -107,7 +107,7 @@ def test_remote_build_iterkeys_split(self): res = set() for partition in pd.split(): id = partition.storage_id - from storage.api import getByID + from storage import getByID rebuild = getByID(id) for val in rebuild.keys(): res.add(val) diff --git a/hecuba_py/tests/withcassandra/storageobj_split_tests.py b/hecuba_py/tests/withcassandra/storageobj_split_tests.py index 5df6b2bb..a648d150 100644 --- a/hecuba_py/tests/withcassandra/storageobj_split_tests.py +++ b/hecuba_py/tests/withcassandra/storageobj_split_tests.py @@ -76,7 +76,7 @@ def test_build_remotely_keys_split_test(self): splits = 0 for partition in pd.split(): id = partition.storage_id - from storage.api import getByID + from storage import getByID rebuild = getByID(id) splits += 1 for val in rebuild.keys(): @@ -144,7 +144,7 @@ def test_build_remotely_keys_split_fromSO_test(self): for partition in sto.split(): splits += 1 id = partition.storage_id - from storage.api import getByID + from storage import getByID rebuild = getByID(id) for val in rebuild.words.keys(): res.add(val) diff --git a/hecuba_py/tests/withcassandra/storageobj_tests.py b/hecuba_py/tests/withcassandra/storageobj_tests.py index a59af19d..44bc05d6 100644 --- a/hecuba_py/tests/withcassandra/storageobj_tests.py +++ b/hecuba_py/tests/withcassandra/storageobj_tests.py @@ -7,7 +7,7 @@ from hecuba import config from hecuba.tools import discrete_token_ranges from hecuba.storageobj import StorageObj -from storage.api import getByID +from storage import getByID from hecuba.IStorage import build_remotely from ..app.words import Words diff --git a/storage/__init__.py b/storage/__init__.py deleted file mode 100644 index 985b256b..00000000 --- a/storage/__init__.py +++ /dev/null @@ -1,243 +0,0 @@ -import logging -import os - -from cassandra.cluster import Cluster -from cassandra.policies import RetryPolicy, RoundRobinPolicy, TokenAwarePolicy - -# Set default log.handler to avoid "No handler found" warnings. - -stderrLogger = logging.StreamHandler() -f = '%(filename)s: %(levelname)s: %(funcName)s(): %(lineno)d:\t%(message)s' -stderrLogger.setFormatter(logging.Formatter(f)) - -log = logging.getLogger('hecuba') -log.addHandler(stderrLogger) - -if 'DEBUG' in os.environ and os.environ['DEBUG'].lower() == "true": - log.setLevel(logging.DEBUG) -elif 'HECUBA_LOG' in os.environ: - log.setLevel(os.environ['HECUBA_LOG'].upper()) -else: - log.setLevel(logging.ERROR) - - - -from .cas import * - - -class _NRetry(RetryPolicy): - def __init__(self, time_to_retry=5): - self.time_to_retry = time_to_retry - - def on_unavailable(self, query, consistency, required_replicas, alive_replicas, retry_num): - if retry_num > self.time_to_retry: - return self.RETHROW, None - else: - return self.RETHROW, None - - def on_write_timeout(self, query, consistency, write_type, required_responses, received_responses, retry_num): - if retry_num > self.time_to_retry: - return self.RETHROW, None - else: - return self.RETHROW, None - - def on_read_timeout(self, query, consistency, required_responses, received_responses, data_retrieved, retry_num): - if retry_num > self.time_to_retry: - return self.RETHROW, None - else: - return self.RETHROW, None - - -class Config(object): - class __Config: - def __init__(self): - self.configured = False - - instance = __Config() - - @staticmethod - def execute(statement, args): - if not Config.instance.configured: - raise RuntimeError("Not configured to contact cassandra on CQL_Comm storage") - - return Config.instance.session.execute(statement, args) - - def __getattr__(self, item): - return getattr(Config.instance, item) - - def __init__(self): - singleton = Config.instance - if singleton.configured: - log.info('setting down') - return - - singleton.configured = True - - if 'CREATE_SCHEMA' in os.environ: - singleton.id_create_schema = int(os.environ['CREATE_SCHEMA']) - else: - singleton.id_create_schema = -1 - - try: - singleton.nodePort = int(os.environ['NODE_PORT']) - log.info('NODE_PORT: %d', singleton.nodePort) - except KeyError: - log.warn('using default NODE_PORT 9042') - singleton.nodePort = 9042 - - try: - singleton.contact_names = os.environ['CONTACT_NAMES'].split(",") - log.info('CONTACT_NAMES: %s', str.join(" ", singleton.contact_names)) - except KeyError: - log.warn('using default contact point localhost') - singleton.contact_names = ['127.0.0.1'] - - if hasattr(singleton, 'session'): - log.warn('Shutting down pre-existent sessions and cluster') - try: - singleton.session.shutdown() - singleton.cluster.shutdown() - except Exception: - log.warn('error shutting down') - try: - singleton.replication_factor = int(os.environ['REPLICA_FACTOR']) - log.info('REPLICA_FACTOR: %d', singleton.replication_factor) - except KeyError: - singleton.replication_factor = 1 - log.warn('using default REPLICA_FACTOR: %d', singleton.replication_factor) - - try: - user_defined_execution_name = os.environ['EXECUTION_NAME'] - if user_defined_execution_name == 'hecuba': - raise RuntimeError('Error: the application keyspace cannot be \'hecuba\'. ' - 'This keyspace is reserved for storing metadata.') - singleton.execution_name = user_defined_execution_name - log.info('EXECUTION_NAME: %s', singleton.execution_name) - except KeyError: - singleton.execution_name = 'my_app' - log.warn('using default EXECUTION_NAME: %s', singleton.execution_name) - try: - singleton.splits_per_node = int(os.environ['SPLITS_PER_NODE']) - log.info('SPLITS_PER_NODE: %d', singleton.splits_per_node) - except KeyError: - singleton.splits_per_node = 32 - log.warn('using default SPLITS_PER_NODE: %d', singleton.splits_per_node) - - try: - singleton.token_range_size = int(os.environ['TOKEN_RANGE_SIZE']) - log.info('TOKEN_RANGE_SIZE: %d', singleton.token_range_size) - singleton.target_token_range_size = None - except KeyError: - singleton.token_range_size = None - - try: - singleton.target_token_range_size = int(os.environ['TARGET_TOKEN_RANGE_SIZE']) - log.info('TARGET_TOKEN_RANGE_SIZE: %d', singleton.target_token_range_size) - except KeyError: - singleton.target_token_range_size = 64 * 1024 - log.warn('using default TARGET_TOKEN_RANGE_SIZE: %d', singleton.target_token_range_size) - - try: - singleton.max_cache_size = int(os.environ['MAX_CACHE_SIZE']) - log.info('MAX_CACHE_SIZE: %d', singleton.max_cache_size) - except KeyError: - singleton.max_cache_size = 1000 - log.warn('using default MAX_CACHE_SIZE: %d', singleton.max_cache_size) - - try: - singleton.replication_strategy = os.environ['REPLICATION_STRATEGY'] - log.info('REPLICATION_STRATEGY: %s', singleton.replication_strategy) - except KeyError: - singleton.replication_strategy = "SimpleStrategy" - log.warn('using default REPLICATION_STRATEGY: %s', singleton.replication_strategy) - - try: - singleton.replication_strategy_options = os.environ['REPLICATION_STRATEGY_OPTIONS'] - log.info('REPLICATION_STRATEGY_OPTIONS: %s', singleton.replication_strategy_options) - except KeyError: - singleton.replication_strategy_options = "" - log.warn('using default REPLICATION_STRATEGY_OPTIONS: %s', singleton.replication_strategy_options) - - if singleton.replication_strategy is "SimpleStrategy": - singleton.replication = "{'class' : 'SimpleStrategy', 'replication_factor': %d}" % \ - singleton.replication_factor - else: - singleton.replication = "{'class' : '%s', %s}" % ( - singleton.replication_strategy, singleton.replication_strategy_options) - try: - singleton.hecuba_print_limit = int(os.environ['HECUBA_PRINT_LIMIT']) - log.info('HECUBA_PRINT_LIMIT: %s', singleton.hecuba_print_limit) - except KeyError: - singleton.hecuba_print_limit = 1000 - log.warn('using default HECUBA_PRINT_LIMIT: %s', singleton.hecuba_print_limit) - - try: - singleton.prefetch_size = int(os.environ['PREFETCH_SIZE']) - log.info('PREFETCH_SIZE: %s', singleton.prefetch_size) - except KeyError: - singleton.prefetch_size = 10000 - log.warn('using default PREFETCH_SIZE: %s', singleton.prefetch_size) - - try: - singleton.write_buffer_size = int(os.environ['WRITE_BUFFER_SIZE']) - log.info('WRITE_BUFFER_SIZE: %s', singleton.write_buffer_size) - except KeyError: - singleton.write_buffer_size = 1000 - log.warn('using default WRITE_BUFFER_SIZE: %s', singleton.write_buffer_size) - - try: - singleton.write_callbacks_number = int(os.environ['WRITE_CALLBACKS_NUMBER']) - log.info('WRITE_CALLBACKS_NUMBER: %s', singleton.write_callbacks_number) - except KeyError: - singleton.write_callbacks_number = 16 - log.warn('using default WRITE_CALLBACKS_NUMBER: %s', singleton.write_callbacks_number) - - try: - env_var = os.environ['TIMESTAMPED_WRITES'].lower() - singleton.timestamped_writes = False if env_var == 'no' or env_var == 'false' else True - log.info('TIMESTAMPED WRITES ENABLED? {}'.format(singleton.timestamped_writes)) - except KeyError: - singleton.timestamped_writes = True - log.warn('using default TIMESTAMPED_WRITES: %s', singleton.timestamped_writes) - - if singleton.max_cache_size < singleton.write_buffer_size: - import warnings - message = "Defining a MAX_CACHE_SIZE smaller than WRITE_BUFFER_SIZE can result " \ - "in reading outdated results from the persistent storage" - warnings.warn(message) - - log.info('Initializing global session') - - singleton.cluster = Cluster(contact_points=singleton.contact_names, - load_balancing_policy=TokenAwarePolicy(RoundRobinPolicy()), - port=singleton.nodePort, - default_retry_policy=_NRetry(5)) - singleton.session = singleton.cluster.connect() - singleton.session.encoder.mapping[tuple] = singleton.session.encoder.cql_encode_tuple - if singleton.id_create_schema == -1: - queries = [ - "CREATE KEYSPACE IF NOT EXISTS hecuba WITH replication = %s" % singleton.replication, - """CREATE TYPE IF NOT EXISTS hecuba.q_meta( - mem_filter text, - from_point frozen>, - to_point frozen>, - precision float); - """, - 'CREATE TYPE IF NOT EXISTS hecuba.np_meta(dims frozen>,type int,block_id int);', - """CREATE TABLE IF NOT EXISTS hecuba.istorage (storage_id uuid, - data_model text, name text, PRIMARY KEY(storage_id)); - """] - for query in queries: - try: - singleton.session.execute(query) - except Exception as e: - log.error("Error executing query %s" % query) - raise e - - from hfetch import connectCassandra - # connecting c++ bindings - connectCassandra(singleton.contact_names, singleton.nodePort) - - -# set_up_default_cassandra() -config = Config() diff --git a/storage/cql_iface/tests/__init__.py b/storage/cql_iface/tests/__init__.py index e69de29b..984fb7bb 100644 --- a/storage/cql_iface/tests/__init__.py +++ b/storage/cql_iface/tests/__init__.py @@ -0,0 +1,239 @@ +import logging +import os + +from cassandra.cluster import Cluster +from cassandra.policies import RetryPolicy, RoundRobinPolicy, TokenAwarePolicy +from .cas import * + +# Set default log.handler to avoid "No handler found" warnings. + +stderrLogger = logging.StreamHandler() +f = '%(filename)s: %(levelname)s: %(funcName)s(): %(lineno)d:\t%(message)s' +stderrLogger.setFormatter(logging.Formatter(f)) + +log = logging.getLogger('hecuba') +log.addHandler(stderrLogger) + +if 'DEBUG' in os.environ and os.environ['DEBUG'].lower() == "true": + log.setLevel(logging.DEBUG) +elif 'HECUBA_LOG' in os.environ: + log.setLevel(os.environ['HECUBA_LOG'].upper()) +else: + log.setLevel(logging.ERROR) + +class _NRetry(RetryPolicy): + def __init__(self, time_to_retry=5): + self.time_to_retry = time_to_retry + + def on_unavailable(self, query, consistency, required_replicas, alive_replicas, retry_num): + if retry_num > self.time_to_retry: + return self.RETHROW, None + else: + return self.RETHROW, None + + def on_write_timeout(self, query, consistency, write_type, required_responses, received_responses, retry_num): + if retry_num > self.time_to_retry: + return self.RETHROW, None + else: + return self.RETHROW, None + + def on_read_timeout(self, query, consistency, required_responses, received_responses, data_retrieved, retry_num): + if retry_num > self.time_to_retry: + return self.RETHROW, None + else: + return self.RETHROW, None + + +class Config(object): + class __Config: + def __init__(self): + self.configured = False + + instance = __Config() + + @staticmethod + def execute(statement, args): + if not Config.instance.configured: + raise RuntimeError("Not configured to contact cassandra on CQL_Comm storage") + + return Config.instance.session.execute(statement, args) + + def __getattr__(self, item): + return getattr(Config.instance, item) + + def __init__(self): + singleton = Config.instance + if singleton.configured: + log.info('setting down') + return + + singleton.configured = True + + if 'CREATE_SCHEMA' in os.environ: + singleton.id_create_schema = int(os.environ['CREATE_SCHEMA']) + else: + singleton.id_create_schema = -1 + + try: + singleton.nodePort = int(os.environ['NODE_PORT']) + log.info('NODE_PORT: %d', singleton.nodePort) + except KeyError: + log.warn('using default NODE_PORT 9042') + singleton.nodePort = 9042 + + try: + singleton.contact_names = os.environ['CONTACT_NAMES'].split(",") + log.info('CONTACT_NAMES: %s', str.join(" ", singleton.contact_names)) + except KeyError: + log.warn('using default contact point localhost') + singleton.contact_names = ['127.0.0.1'] + + if hasattr(singleton, 'session'): + log.warn('Shutting down pre-existent sessions and cluster') + try: + singleton.session.shutdown() + singleton.cluster.shutdown() + except Exception: + log.warn('error shutting down') + try: + singleton.replication_factor = int(os.environ['REPLICA_FACTOR']) + log.info('REPLICA_FACTOR: %d', singleton.replication_factor) + except KeyError: + singleton.replication_factor = 1 + log.warn('using default REPLICA_FACTOR: %d', singleton.replication_factor) + + try: + user_defined_execution_name = os.environ['EXECUTION_NAME'] + if user_defined_execution_name == 'hecuba': + raise RuntimeError('Error: the application keyspace cannot be \'hecuba\'. ' + 'This keyspace is reserved for storing metadata.') + singleton.execution_name = user_defined_execution_name + log.info('EXECUTION_NAME: %s', singleton.execution_name) + except KeyError: + singleton.execution_name = 'my_app' + log.warn('using default EXECUTION_NAME: %s', singleton.execution_name) + try: + singleton.splits_per_node = int(os.environ['SPLITS_PER_NODE']) + log.info('SPLITS_PER_NODE: %d', singleton.splits_per_node) + except KeyError: + singleton.splits_per_node = 32 + log.warn('using default SPLITS_PER_NODE: %d', singleton.splits_per_node) + + try: + singleton.token_range_size = int(os.environ['TOKEN_RANGE_SIZE']) + log.info('TOKEN_RANGE_SIZE: %d', singleton.token_range_size) + singleton.target_token_range_size = None + except KeyError: + singleton.token_range_size = None + + try: + singleton.target_token_range_size = int(os.environ['TARGET_TOKEN_RANGE_SIZE']) + log.info('TARGET_TOKEN_RANGE_SIZE: %d', singleton.target_token_range_size) + except KeyError: + singleton.target_token_range_size = 64 * 1024 + log.warn('using default TARGET_TOKEN_RANGE_SIZE: %d', singleton.target_token_range_size) + + try: + singleton.max_cache_size = int(os.environ['MAX_CACHE_SIZE']) + log.info('MAX_CACHE_SIZE: %d', singleton.max_cache_size) + except KeyError: + singleton.max_cache_size = 1000 + log.warn('using default MAX_CACHE_SIZE: %d', singleton.max_cache_size) + + try: + singleton.replication_strategy = os.environ['REPLICATION_STRATEGY'] + log.info('REPLICATION_STRATEGY: %s', singleton.replication_strategy) + except KeyError: + singleton.replication_strategy = "SimpleStrategy" + log.warn('using default REPLICATION_STRATEGY: %s', singleton.replication_strategy) + + try: + singleton.replication_strategy_options = os.environ['REPLICATION_STRATEGY_OPTIONS'] + log.info('REPLICATION_STRATEGY_OPTIONS: %s', singleton.replication_strategy_options) + except KeyError: + singleton.replication_strategy_options = "" + log.warn('using default REPLICATION_STRATEGY_OPTIONS: %s', singleton.replication_strategy_options) + + if singleton.replication_strategy is "SimpleStrategy": + singleton.replication = "{'class' : 'SimpleStrategy', 'replication_factor': %d}" % \ + singleton.replication_factor + else: + singleton.replication = "{'class' : '%s', %s}" % ( + singleton.replication_strategy, singleton.replication_strategy_options) + try: + singleton.hecuba_print_limit = int(os.environ['HECUBA_PRINT_LIMIT']) + log.info('HECUBA_PRINT_LIMIT: %s', singleton.hecuba_print_limit) + except KeyError: + singleton.hecuba_print_limit = 1000 + log.warn('using default HECUBA_PRINT_LIMIT: %s', singleton.hecuba_print_limit) + + try: + singleton.prefetch_size = int(os.environ['PREFETCH_SIZE']) + log.info('PREFETCH_SIZE: %s', singleton.prefetch_size) + except KeyError: + singleton.prefetch_size = 10000 + log.warn('using default PREFETCH_SIZE: %s', singleton.prefetch_size) + + try: + singleton.write_buffer_size = int(os.environ['WRITE_BUFFER_SIZE']) + log.info('WRITE_BUFFER_SIZE: %s', singleton.write_buffer_size) + except KeyError: + singleton.write_buffer_size = 1000 + log.warn('using default WRITE_BUFFER_SIZE: %s', singleton.write_buffer_size) + + try: + singleton.write_callbacks_number = int(os.environ['WRITE_CALLBACKS_NUMBER']) + log.info('WRITE_CALLBACKS_NUMBER: %s', singleton.write_callbacks_number) + except KeyError: + singleton.write_callbacks_number = 16 + log.warn('using default WRITE_CALLBACKS_NUMBER: %s', singleton.write_callbacks_number) + + try: + env_var = os.environ['TIMESTAMPED_WRITES'].lower() + singleton.timestamped_writes = False if env_var == 'no' or env_var == 'false' else True + log.info('TIMESTAMPED WRITES ENABLED? {}'.format(singleton.timestamped_writes)) + except KeyError: + singleton.timestamped_writes = True + log.warn('using default TIMESTAMPED_WRITES: %s', singleton.timestamped_writes) + + if singleton.max_cache_size < singleton.write_buffer_size: + import warnings + message = "Defining a MAX_CACHE_SIZE smaller than WRITE_BUFFER_SIZE can result " \ + "in reading outdated results from the persistent storage" + warnings.warn(message) + + log.info('Initializing global session') + + singleton.cluster = Cluster(contact_points=singleton.contact_names, + load_balancing_policy=TokenAwarePolicy(RoundRobinPolicy()), + port=singleton.nodePort, + default_retry_policy=_NRetry(5)) + singleton.session = singleton.cluster.connect() + singleton.session.encoder.mapping[tuple] = singleton.session.encoder.cql_encode_tuple + if singleton.id_create_schema == -1: + queries = [ + "CREATE KEYSPACE IF NOT EXISTS hecuba WITH replication = %s" % singleton.replication, + """CREATE TYPE IF NOT EXISTS hecuba.q_meta( + mem_filter text, + from_point frozen>, + to_point frozen>, + precision float); + """, + 'CREATE TYPE IF NOT EXISTS hecuba.np_meta(dims frozen>,type int,block_id int);', + """CREATE TABLE IF NOT EXISTS hecuba.istorage (storage_id uuid, + data_model text, name text, PRIMARY KEY(storage_id)); + """] + for query in queries: + try: + singleton.session.execute(query) + except Exception as e: + log.error("Error executing query %s" % query) + raise e + + from hfetch import connectCassandra + # connecting c++ bindings + connectCassandra(singleton.contact_names, singleton.nodePort) + + +# set_up_default_cassandra() +config = Config() diff --git a/storage/cas.py b/storage/cql_iface/tests/cas.py similarity index 100% rename from storage/cas.py rename to storage/cql_iface/tests/cas.py diff --git a/storage/cql_iface/tests/mockhdict.py b/storage/cql_iface/tests/mockhdict.py index e5662cc6..201e8910 100644 --- a/storage/cql_iface/tests/mockhdict.py +++ b/storage/cql_iface/tests/mockhdict.py @@ -1,5 +1,5 @@ from storage.cql_iface.tests.mockIStorage import IStorage -from storage.cql_iface.tests.mocktools import build_remotely, storage_id_from_name, transform_to_dm +from storage.cql_iface.tests.mocktools import storage_id_from_name, transform_to_dm import storage diff --git a/storage/cql_iface/tests/mockhnumpy.py b/storage/cql_iface/tests/mockhnumpy.py index 237b597d..c35bfefe 100644 --- a/storage/cql_iface/tests/mockhnumpy.py +++ b/storage/cql_iface/tests/mockhnumpy.py @@ -1,10 +1,7 @@ from collections import namedtuple import numpy as np -import uuid -from storage.cql_iface.tests.mockIStorage import IStorage, AlreadyPersistentError - -import storage +from storage.cql_iface.tests.mockIStorage import IStorage class StorageNumpy(IStorage, np.ndarray): From 897b5be0c7c2f54e2cdcb26f31735d27d4741980 Mon Sep 17 00:00:00 2001 From: Ismael Date: Mon, 18 Nov 2019 12:15:53 +0100 Subject: [PATCH 12/81] adding init file --- storage/__init__.py | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 storage/__init__.py diff --git a/storage/__init__.py b/storage/__init__.py new file mode 100644 index 00000000..790ad612 --- /dev/null +++ b/storage/__init__.py @@ -0,0 +1,9 @@ +from .storage_iface import StorageIface + + +def select_storage_api(): + from .cql_iface.cql_iface import CQLIface + return CQLIface() + + +StorageAPI = select_storage_api() \ No newline at end of file From 28bbf15200100cad54eff96d05308675a73cc541 Mon Sep 17 00:00:00 2001 From: Ismael Date: Tue, 19 Nov 2019 09:01:51 +0100 Subject: [PATCH 13/81] changes requested --- hecuba_py/tests/__init__.py | 2 +- hecuba_py/tests/withQbeast/qbeast_storagedict_tests.py | 2 +- hecuba_py/tests/withcassandra/storage_api_tests.py | 2 +- hecuba_py/tests/withcassandra/storagedict_split_tests.py | 2 +- hecuba_py/tests/withcassandra/storageobj_split_tests.py | 4 ++-- hecuba_py/tests/withcassandra/storageobj_tests.py | 2 +- storage/cql_iface/tests/__init__.py | 2 +- .../cql_iface/tests/{cas.py => cassandra_cluster_manager.py} | 0 8 files changed, 8 insertions(+), 8 deletions(-) rename storage/cql_iface/tests/{cas.py => cassandra_cluster_manager.py} (100%) diff --git a/hecuba_py/tests/__init__.py b/hecuba_py/tests/__init__.py index cd07c5db..52262ea4 100644 --- a/hecuba_py/tests/__init__.py +++ b/hecuba_py/tests/__init__.py @@ -13,7 +13,7 @@ class TestConfig: test_config = TestConfig() test_config.n_nodes = int(os.environ.get('TEST_CASSANDRA_N_NODES', '2')) -TEST_DEBUG = strtobool(os.environ.get("TEST_DEBUG", "True").lower()) +TEST_DEBUG = strtobool(os.environ.get("TEST_DEBUG", "False").lower()) if TEST_DEBUG: logging.warning(("You are using TEST_DEBUG=True, a Cassandra cluster must be already running. " "Keep in mind that the results of the test might be altered by data already existing.")) diff --git a/hecuba_py/tests/withQbeast/qbeast_storagedict_tests.py b/hecuba_py/tests/withQbeast/qbeast_storagedict_tests.py index aa96fd1b..41925165 100644 --- a/hecuba_py/tests/withQbeast/qbeast_storagedict_tests.py +++ b/hecuba_py/tests/withQbeast/qbeast_storagedict_tests.py @@ -70,7 +70,7 @@ def testCanBeRebuilt(self): time.sleep(1) filtered = filter(lambda row: row.x > 0.02 and row.x < 0.25 and row.y > 0.26 and row.y < 0.45 and row.z > 0.58 and row.z < 0.9, d.items()) - from storage import getByID + from storage.api import getByID for partition in filtered.split(): it2 = getByID(partition.storage_id) self.assertEqual(filtered._qbeast_random, it2._qbeast_random) diff --git a/hecuba_py/tests/withcassandra/storage_api_tests.py b/hecuba_py/tests/withcassandra/storage_api_tests.py index 9a2c145f..6c33582c 100644 --- a/hecuba_py/tests/withcassandra/storage_api_tests.py +++ b/hecuba_py/tests/withcassandra/storage_api_tests.py @@ -1,6 +1,6 @@ import unittest -from storage import getByID +from storage.api import getByID from ..app.words import Words from hecuba import StorageDict diff --git a/hecuba_py/tests/withcassandra/storagedict_split_tests.py b/hecuba_py/tests/withcassandra/storagedict_split_tests.py index 5b15cce2..e2bdfa5f 100644 --- a/hecuba_py/tests/withcassandra/storagedict_split_tests.py +++ b/hecuba_py/tests/withcassandra/storagedict_split_tests.py @@ -107,7 +107,7 @@ def test_remote_build_iterkeys_split(self): res = set() for partition in pd.split(): id = partition.storage_id - from storage import getByID + from storage.api import getByID rebuild = getByID(id) for val in rebuild.keys(): res.add(val) diff --git a/hecuba_py/tests/withcassandra/storageobj_split_tests.py b/hecuba_py/tests/withcassandra/storageobj_split_tests.py index a648d150..5df6b2bb 100644 --- a/hecuba_py/tests/withcassandra/storageobj_split_tests.py +++ b/hecuba_py/tests/withcassandra/storageobj_split_tests.py @@ -76,7 +76,7 @@ def test_build_remotely_keys_split_test(self): splits = 0 for partition in pd.split(): id = partition.storage_id - from storage import getByID + from storage.api import getByID rebuild = getByID(id) splits += 1 for val in rebuild.keys(): @@ -144,7 +144,7 @@ def test_build_remotely_keys_split_fromSO_test(self): for partition in sto.split(): splits += 1 id = partition.storage_id - from storage import getByID + from storage.api import getByID rebuild = getByID(id) for val in rebuild.words.keys(): res.add(val) diff --git a/hecuba_py/tests/withcassandra/storageobj_tests.py b/hecuba_py/tests/withcassandra/storageobj_tests.py index 44bc05d6..a59af19d 100644 --- a/hecuba_py/tests/withcassandra/storageobj_tests.py +++ b/hecuba_py/tests/withcassandra/storageobj_tests.py @@ -7,7 +7,7 @@ from hecuba import config from hecuba.tools import discrete_token_ranges from hecuba.storageobj import StorageObj -from storage import getByID +from storage.api import getByID from hecuba.IStorage import build_remotely from ..app.words import Words diff --git a/storage/cql_iface/tests/__init__.py b/storage/cql_iface/tests/__init__.py index 984fb7bb..2212badd 100644 --- a/storage/cql_iface/tests/__init__.py +++ b/storage/cql_iface/tests/__init__.py @@ -3,7 +3,7 @@ from cassandra.cluster import Cluster from cassandra.policies import RetryPolicy, RoundRobinPolicy, TokenAwarePolicy -from .cas import * +from .cassandra_cluster_manager import * # Set default log.handler to avoid "No handler found" warnings. diff --git a/storage/cql_iface/tests/cas.py b/storage/cql_iface/tests/cassandra_cluster_manager.py similarity index 100% rename from storage/cql_iface/tests/cas.py rename to storage/cql_iface/tests/cassandra_cluster_manager.py From 28fbedfaea778d2f17d8f2fae26ec6a928abe5f9 Mon Sep 17 00:00:00 2001 From: Pol Santamaria Date: Tue, 19 Nov 2019 11:28:49 +0100 Subject: [PATCH 14/81] Revert setup.py --- setup.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/setup.py b/setup.py index 71ac02a2..76f20d64 100644 --- a/setup.py +++ b/setup.py @@ -35,14 +35,22 @@ def cmake_build(): # if subprocess.call(["make", "-j4", "-C", "./build", "install"]) != 0: # raise EnvironmentError("error calling make install") +def get_var(var): + value = os.environ.get(var,'') + return [p for p in value.split(':') if p != ''] + + +PATH_LIBS = get_var('LD_LIBRARY_PATH') +PATH_INCLUDE = get_var('CPATH') + get_var('CPLUS_INCLUDE_PATH') + get_var('C_INCLUDE_PATH') extensions = [ Extension( "hfetch", sources=glob.glob("hecuba_core/src/py_interface/*.cpp"), - include_dirs=['hecuba_core/src/', 'build/include', numpy.get_include()], + include_dirs=['hecuba_core/src/', 'build/include', numpy.get_include()] + PATH_INCLUDE, libraries=['hfetch', 'cassandra'], - library_dirs=['build/lib', 'build/lib64'], + library_dirs=['build/lib', 'build/lib64'] + PATH_LIBS, + extra_compile_args=['-std=c++11'], extra_link_args=['-Wl,-rpath=$ORIGIN'] ), ] @@ -63,8 +71,8 @@ def setup_packages(): # compute which libraries were built metadata = dict(name="Hecuba", version="0.1.3", - package_dir={'hecuba': 'hecuba_py/hecuba', 'storage': 'storage', 'pycompss': 'pycompss'}, - packages=['hecuba', 'storage', 'pycompss'] + find_packages(), + package_dir={'hecuba': 'hecuba_py/hecuba', 'storage': 'storageAPI/storage'}, + packages=['hecuba', 'storage'], # find_packages(), install_requires=['cassandra-driver>=3.7.1', 'numpy>=1.16'], zip_safe=False, data_files=[('', extra_files)], From 4f1ec634cc9c8cee7e3f1d07b307c5b9e8b68b9b Mon Sep 17 00:00:00 2001 From: Ismael Date: Tue, 19 Nov 2019 12:11:53 +0100 Subject: [PATCH 15/81] requested changes --- .../tests/withcassandra/storage_api_tests.py | 2 +- storage/cql_iface/__init__.py | 239 ++++++++++++++++++ storage/cql_iface/cql_iface.py | 8 +- storage/cql_iface/tests/__init__.py | 239 ------------------ storage/cql_iface/tests/mockIStorage.py | 3 + 5 files changed, 245 insertions(+), 246 deletions(-) diff --git a/hecuba_py/tests/withcassandra/storage_api_tests.py b/hecuba_py/tests/withcassandra/storage_api_tests.py index 6c33582c..9e8bd375 100644 --- a/hecuba_py/tests/withcassandra/storage_api_tests.py +++ b/hecuba_py/tests/withcassandra/storage_api_tests.py @@ -2,7 +2,7 @@ from storage.api import getByID from ..app.words import Words -from hecuba import StorageDict +from hecuba import config, StorageDict class ApiTestSDict(StorageDict): diff --git a/storage/cql_iface/__init__.py b/storage/cql_iface/__init__.py index e69de29b..16b3b72f 100644 --- a/storage/cql_iface/__init__.py +++ b/storage/cql_iface/__init__.py @@ -0,0 +1,239 @@ +import logging +import os + +from cassandra.cluster import Cluster +from cassandra.policies import RetryPolicy, RoundRobinPolicy, TokenAwarePolicy +from .tests.cassandra_cluster_manager import * + +# Set default log.handler to avoid "No handler found" warnings. + +stderrLogger = logging.StreamHandler() +f = '%(filename)s: %(levelname)s: %(funcName)s(): %(lineno)d:\t%(message)s' +stderrLogger.setFormatter(logging.Formatter(f)) + +log = logging.getLogger('hecuba') +log.addHandler(stderrLogger) + +if 'DEBUG' in os.environ and os.environ['DEBUG'].lower() == "true": + log.setLevel(logging.DEBUG) +elif 'HECUBA_LOG' in os.environ: + log.setLevel(os.environ['HECUBA_LOG'].upper()) +else: + log.setLevel(logging.ERROR) + +class _NRetry(RetryPolicy): + def __init__(self, time_to_retry=5): + self.time_to_retry = time_to_retry + + def on_unavailable(self, query, consistency, required_replicas, alive_replicas, retry_num): + if retry_num > self.time_to_retry: + return self.RETHROW, None + else: + return self.RETHROW, None + + def on_write_timeout(self, query, consistency, write_type, required_responses, received_responses, retry_num): + if retry_num > self.time_to_retry: + return self.RETHROW, None + else: + return self.RETHROW, None + + def on_read_timeout(self, query, consistency, required_responses, received_responses, data_retrieved, retry_num): + if retry_num > self.time_to_retry: + return self.RETHROW, None + else: + return self.RETHROW, None + + +class Config(object): + class __Config: + def __init__(self): + self.configured = False + + instance = __Config() + + @staticmethod + def execute(statement, args): + if not Config.instance.configured: + raise RuntimeError("Not configured to contact cassandra on CQL_Comm storage") + + return Config.instance.session.execute(statement, args) + + def __getattr__(self, item): + return getattr(Config.instance, item) + + def __init__(self): + singleton = Config.instance + if singleton.configured: + log.info('setting down') + return + + singleton.configured = True + + if 'CREATE_SCHEMA' in os.environ: + singleton.id_create_schema = int(os.environ['CREATE_SCHEMA']) + else: + singleton.id_create_schema = -1 + + try: + singleton.nodePort = int(os.environ['NODE_PORT']) + log.info('NODE_PORT: %d', singleton.nodePort) + except KeyError: + log.warn('using default NODE_PORT 9042') + singleton.nodePort = 9042 + + try: + singleton.contact_names = os.environ['CONTACT_NAMES'].split(",") + log.info('CONTACT_NAMES: %s', str.join(" ", singleton.contact_names)) + except KeyError: + log.warn('using default contact point localhost') + singleton.contact_names = ['127.0.0.1'] + + if hasattr(singleton, 'session'): + log.warn('Shutting down pre-existent sessions and cluster') + try: + singleton.session.shutdown() + singleton.cluster.shutdown() + except Exception: + log.warn('error shutting down') + try: + singleton.replication_factor = int(os.environ['REPLICA_FACTOR']) + log.info('REPLICA_FACTOR: %d', singleton.replication_factor) + except KeyError: + singleton.replication_factor = 1 + log.warn('using default REPLICA_FACTOR: %d', singleton.replication_factor) + + try: + user_defined_execution_name = os.environ['EXECUTION_NAME'] + if user_defined_execution_name == 'hecuba': + raise RuntimeError('Error: the application keyspace cannot be \'hecuba\'. ' + 'This keyspace is reserved for storing metadata.') + singleton.execution_name = user_defined_execution_name + log.info('EXECUTION_NAME: %s', singleton.execution_name) + except KeyError: + singleton.execution_name = 'my_app' + log.warn('using default EXECUTION_NAME: %s', singleton.execution_name) + try: + singleton.splits_per_node = int(os.environ['SPLITS_PER_NODE']) + log.info('SPLITS_PER_NODE: %d', singleton.splits_per_node) + except KeyError: + singleton.splits_per_node = 32 + log.warn('using default SPLITS_PER_NODE: %d', singleton.splits_per_node) + + try: + singleton.token_range_size = int(os.environ['TOKEN_RANGE_SIZE']) + log.info('TOKEN_RANGE_SIZE: %d', singleton.token_range_size) + singleton.target_token_range_size = None + except KeyError: + singleton.token_range_size = None + + try: + singleton.target_token_range_size = int(os.environ['TARGET_TOKEN_RANGE_SIZE']) + log.info('TARGET_TOKEN_RANGE_SIZE: %d', singleton.target_token_range_size) + except KeyError: + singleton.target_token_range_size = 64 * 1024 + log.warn('using default TARGET_TOKEN_RANGE_SIZE: %d', singleton.target_token_range_size) + + try: + singleton.max_cache_size = int(os.environ['MAX_CACHE_SIZE']) + log.info('MAX_CACHE_SIZE: %d', singleton.max_cache_size) + except KeyError: + singleton.max_cache_size = 1000 + log.warn('using default MAX_CACHE_SIZE: %d', singleton.max_cache_size) + + try: + singleton.replication_strategy = os.environ['REPLICATION_STRATEGY'] + log.info('REPLICATION_STRATEGY: %s', singleton.replication_strategy) + except KeyError: + singleton.replication_strategy = "SimpleStrategy" + log.warn('using default REPLICATION_STRATEGY: %s', singleton.replication_strategy) + + try: + singleton.replication_strategy_options = os.environ['REPLICATION_STRATEGY_OPTIONS'] + log.info('REPLICATION_STRATEGY_OPTIONS: %s', singleton.replication_strategy_options) + except KeyError: + singleton.replication_strategy_options = "" + log.warn('using default REPLICATION_STRATEGY_OPTIONS: %s', singleton.replication_strategy_options) + + if singleton.replication_strategy is "SimpleStrategy": + singleton.replication = "{'class' : 'SimpleStrategy', 'replication_factor': %d}" % \ + singleton.replication_factor + else: + singleton.replication = "{'class' : '%s', %s}" % ( + singleton.replication_strategy, singleton.replication_strategy_options) + try: + singleton.hecuba_print_limit = int(os.environ['HECUBA_PRINT_LIMIT']) + log.info('HECUBA_PRINT_LIMIT: %s', singleton.hecuba_print_limit) + except KeyError: + singleton.hecuba_print_limit = 1000 + log.warn('using default HECUBA_PRINT_LIMIT: %s', singleton.hecuba_print_limit) + + try: + singleton.prefetch_size = int(os.environ['PREFETCH_SIZE']) + log.info('PREFETCH_SIZE: %s', singleton.prefetch_size) + except KeyError: + singleton.prefetch_size = 10000 + log.warn('using default PREFETCH_SIZE: %s', singleton.prefetch_size) + + try: + singleton.write_buffer_size = int(os.environ['WRITE_BUFFER_SIZE']) + log.info('WRITE_BUFFER_SIZE: %s', singleton.write_buffer_size) + except KeyError: + singleton.write_buffer_size = 1000 + log.warn('using default WRITE_BUFFER_SIZE: %s', singleton.write_buffer_size) + + try: + singleton.write_callbacks_number = int(os.environ['WRITE_CALLBACKS_NUMBER']) + log.info('WRITE_CALLBACKS_NUMBER: %s', singleton.write_callbacks_number) + except KeyError: + singleton.write_callbacks_number = 16 + log.warn('using default WRITE_CALLBACKS_NUMBER: %s', singleton.write_callbacks_number) + + try: + env_var = os.environ['TIMESTAMPED_WRITES'].lower() + singleton.timestamped_writes = False if env_var == 'no' or env_var == 'false' else True + log.info('TIMESTAMPED WRITES ENABLED? {}'.format(singleton.timestamped_writes)) + except KeyError: + singleton.timestamped_writes = True + log.warn('using default TIMESTAMPED_WRITES: %s', singleton.timestamped_writes) + + if singleton.max_cache_size < singleton.write_buffer_size: + import warnings + message = "Defining a MAX_CACHE_SIZE smaller than WRITE_BUFFER_SIZE can result " \ + "in reading outdated results from the persistent storage" + warnings.warn(message) + + log.info('Initializing global session') + + singleton.cluster = Cluster(contact_points=singleton.contact_names, + load_balancing_policy=TokenAwarePolicy(RoundRobinPolicy()), + port=singleton.nodePort, + default_retry_policy=_NRetry(5)) + singleton.session = singleton.cluster.connect() + singleton.session.encoder.mapping[tuple] = singleton.session.encoder.cql_encode_tuple + if singleton.id_create_schema == -1: + queries = [ + "CREATE KEYSPACE IF NOT EXISTS hecuba WITH replication = %s" % singleton.replication, + """CREATE TYPE IF NOT EXISTS hecuba.q_meta( + mem_filter text, + from_point frozen>, + to_point frozen>, + precision float); + """, + 'CREATE TYPE IF NOT EXISTS hecuba.np_meta(dims frozen>,type int,block_id int);', + """CREATE TABLE IF NOT EXISTS hecuba.istorage (storage_id uuid, + data_model text, name text, PRIMARY KEY(storage_id)); + """] + for query in queries: + try: + singleton.session.execute(query) + except Exception as e: + log.error("Error executing query %s" % query) + raise e + + from hfetch import connectCassandra + # connecting c++ bindings + connectCassandra(singleton.contact_names, singleton.nodePort) + + +# set_up_default_cassandra() +config = Config() diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index 7479ebd3..0b711890 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -42,16 +42,12 @@ class CQLIface(StorageIface): def __init__(self): pass - @staticmethod - def is_persistent(pyobject): - return pyobject.getID() is not None and pyobject.get_name() is not None - def check_definition(self, definition): if not isinstance(definition, dict): raise TypeError("Expected a dict type as a definition") - elif not all(name in definition for name in ["type", "value_id", "fields"]): + if not all(name in definition for name in ["type", "value_id", "fields"]): raise KeyError("Expected keys 'type', 'value_id' and 'fields'") - elif not issubclass(definition["type"], IStorage): + if not issubclass(definition["type"], IStorage): raise TypeError("Class must inherit IStorage") def add_data_model(self, definition): diff --git a/storage/cql_iface/tests/__init__.py b/storage/cql_iface/tests/__init__.py index 2212badd..e69de29b 100644 --- a/storage/cql_iface/tests/__init__.py +++ b/storage/cql_iface/tests/__init__.py @@ -1,239 +0,0 @@ -import logging -import os - -from cassandra.cluster import Cluster -from cassandra.policies import RetryPolicy, RoundRobinPolicy, TokenAwarePolicy -from .cassandra_cluster_manager import * - -# Set default log.handler to avoid "No handler found" warnings. - -stderrLogger = logging.StreamHandler() -f = '%(filename)s: %(levelname)s: %(funcName)s(): %(lineno)d:\t%(message)s' -stderrLogger.setFormatter(logging.Formatter(f)) - -log = logging.getLogger('hecuba') -log.addHandler(stderrLogger) - -if 'DEBUG' in os.environ and os.environ['DEBUG'].lower() == "true": - log.setLevel(logging.DEBUG) -elif 'HECUBA_LOG' in os.environ: - log.setLevel(os.environ['HECUBA_LOG'].upper()) -else: - log.setLevel(logging.ERROR) - -class _NRetry(RetryPolicy): - def __init__(self, time_to_retry=5): - self.time_to_retry = time_to_retry - - def on_unavailable(self, query, consistency, required_replicas, alive_replicas, retry_num): - if retry_num > self.time_to_retry: - return self.RETHROW, None - else: - return self.RETHROW, None - - def on_write_timeout(self, query, consistency, write_type, required_responses, received_responses, retry_num): - if retry_num > self.time_to_retry: - return self.RETHROW, None - else: - return self.RETHROW, None - - def on_read_timeout(self, query, consistency, required_responses, received_responses, data_retrieved, retry_num): - if retry_num > self.time_to_retry: - return self.RETHROW, None - else: - return self.RETHROW, None - - -class Config(object): - class __Config: - def __init__(self): - self.configured = False - - instance = __Config() - - @staticmethod - def execute(statement, args): - if not Config.instance.configured: - raise RuntimeError("Not configured to contact cassandra on CQL_Comm storage") - - return Config.instance.session.execute(statement, args) - - def __getattr__(self, item): - return getattr(Config.instance, item) - - def __init__(self): - singleton = Config.instance - if singleton.configured: - log.info('setting down') - return - - singleton.configured = True - - if 'CREATE_SCHEMA' in os.environ: - singleton.id_create_schema = int(os.environ['CREATE_SCHEMA']) - else: - singleton.id_create_schema = -1 - - try: - singleton.nodePort = int(os.environ['NODE_PORT']) - log.info('NODE_PORT: %d', singleton.nodePort) - except KeyError: - log.warn('using default NODE_PORT 9042') - singleton.nodePort = 9042 - - try: - singleton.contact_names = os.environ['CONTACT_NAMES'].split(",") - log.info('CONTACT_NAMES: %s', str.join(" ", singleton.contact_names)) - except KeyError: - log.warn('using default contact point localhost') - singleton.contact_names = ['127.0.0.1'] - - if hasattr(singleton, 'session'): - log.warn('Shutting down pre-existent sessions and cluster') - try: - singleton.session.shutdown() - singleton.cluster.shutdown() - except Exception: - log.warn('error shutting down') - try: - singleton.replication_factor = int(os.environ['REPLICA_FACTOR']) - log.info('REPLICA_FACTOR: %d', singleton.replication_factor) - except KeyError: - singleton.replication_factor = 1 - log.warn('using default REPLICA_FACTOR: %d', singleton.replication_factor) - - try: - user_defined_execution_name = os.environ['EXECUTION_NAME'] - if user_defined_execution_name == 'hecuba': - raise RuntimeError('Error: the application keyspace cannot be \'hecuba\'. ' - 'This keyspace is reserved for storing metadata.') - singleton.execution_name = user_defined_execution_name - log.info('EXECUTION_NAME: %s', singleton.execution_name) - except KeyError: - singleton.execution_name = 'my_app' - log.warn('using default EXECUTION_NAME: %s', singleton.execution_name) - try: - singleton.splits_per_node = int(os.environ['SPLITS_PER_NODE']) - log.info('SPLITS_PER_NODE: %d', singleton.splits_per_node) - except KeyError: - singleton.splits_per_node = 32 - log.warn('using default SPLITS_PER_NODE: %d', singleton.splits_per_node) - - try: - singleton.token_range_size = int(os.environ['TOKEN_RANGE_SIZE']) - log.info('TOKEN_RANGE_SIZE: %d', singleton.token_range_size) - singleton.target_token_range_size = None - except KeyError: - singleton.token_range_size = None - - try: - singleton.target_token_range_size = int(os.environ['TARGET_TOKEN_RANGE_SIZE']) - log.info('TARGET_TOKEN_RANGE_SIZE: %d', singleton.target_token_range_size) - except KeyError: - singleton.target_token_range_size = 64 * 1024 - log.warn('using default TARGET_TOKEN_RANGE_SIZE: %d', singleton.target_token_range_size) - - try: - singleton.max_cache_size = int(os.environ['MAX_CACHE_SIZE']) - log.info('MAX_CACHE_SIZE: %d', singleton.max_cache_size) - except KeyError: - singleton.max_cache_size = 1000 - log.warn('using default MAX_CACHE_SIZE: %d', singleton.max_cache_size) - - try: - singleton.replication_strategy = os.environ['REPLICATION_STRATEGY'] - log.info('REPLICATION_STRATEGY: %s', singleton.replication_strategy) - except KeyError: - singleton.replication_strategy = "SimpleStrategy" - log.warn('using default REPLICATION_STRATEGY: %s', singleton.replication_strategy) - - try: - singleton.replication_strategy_options = os.environ['REPLICATION_STRATEGY_OPTIONS'] - log.info('REPLICATION_STRATEGY_OPTIONS: %s', singleton.replication_strategy_options) - except KeyError: - singleton.replication_strategy_options = "" - log.warn('using default REPLICATION_STRATEGY_OPTIONS: %s', singleton.replication_strategy_options) - - if singleton.replication_strategy is "SimpleStrategy": - singleton.replication = "{'class' : 'SimpleStrategy', 'replication_factor': %d}" % \ - singleton.replication_factor - else: - singleton.replication = "{'class' : '%s', %s}" % ( - singleton.replication_strategy, singleton.replication_strategy_options) - try: - singleton.hecuba_print_limit = int(os.environ['HECUBA_PRINT_LIMIT']) - log.info('HECUBA_PRINT_LIMIT: %s', singleton.hecuba_print_limit) - except KeyError: - singleton.hecuba_print_limit = 1000 - log.warn('using default HECUBA_PRINT_LIMIT: %s', singleton.hecuba_print_limit) - - try: - singleton.prefetch_size = int(os.environ['PREFETCH_SIZE']) - log.info('PREFETCH_SIZE: %s', singleton.prefetch_size) - except KeyError: - singleton.prefetch_size = 10000 - log.warn('using default PREFETCH_SIZE: %s', singleton.prefetch_size) - - try: - singleton.write_buffer_size = int(os.environ['WRITE_BUFFER_SIZE']) - log.info('WRITE_BUFFER_SIZE: %s', singleton.write_buffer_size) - except KeyError: - singleton.write_buffer_size = 1000 - log.warn('using default WRITE_BUFFER_SIZE: %s', singleton.write_buffer_size) - - try: - singleton.write_callbacks_number = int(os.environ['WRITE_CALLBACKS_NUMBER']) - log.info('WRITE_CALLBACKS_NUMBER: %s', singleton.write_callbacks_number) - except KeyError: - singleton.write_callbacks_number = 16 - log.warn('using default WRITE_CALLBACKS_NUMBER: %s', singleton.write_callbacks_number) - - try: - env_var = os.environ['TIMESTAMPED_WRITES'].lower() - singleton.timestamped_writes = False if env_var == 'no' or env_var == 'false' else True - log.info('TIMESTAMPED WRITES ENABLED? {}'.format(singleton.timestamped_writes)) - except KeyError: - singleton.timestamped_writes = True - log.warn('using default TIMESTAMPED_WRITES: %s', singleton.timestamped_writes) - - if singleton.max_cache_size < singleton.write_buffer_size: - import warnings - message = "Defining a MAX_CACHE_SIZE smaller than WRITE_BUFFER_SIZE can result " \ - "in reading outdated results from the persistent storage" - warnings.warn(message) - - log.info('Initializing global session') - - singleton.cluster = Cluster(contact_points=singleton.contact_names, - load_balancing_policy=TokenAwarePolicy(RoundRobinPolicy()), - port=singleton.nodePort, - default_retry_policy=_NRetry(5)) - singleton.session = singleton.cluster.connect() - singleton.session.encoder.mapping[tuple] = singleton.session.encoder.cql_encode_tuple - if singleton.id_create_schema == -1: - queries = [ - "CREATE KEYSPACE IF NOT EXISTS hecuba WITH replication = %s" % singleton.replication, - """CREATE TYPE IF NOT EXISTS hecuba.q_meta( - mem_filter text, - from_point frozen>, - to_point frozen>, - precision float); - """, - 'CREATE TYPE IF NOT EXISTS hecuba.np_meta(dims frozen>,type int,block_id int);', - """CREATE TABLE IF NOT EXISTS hecuba.istorage (storage_id uuid, - data_model text, name text, PRIMARY KEY(storage_id)); - """] - for query in queries: - try: - singleton.session.execute(query) - except Exception as e: - log.error("Error executing query %s" % query) - raise e - - from hfetch import connectCassandra - # connecting c++ bindings - connectCassandra(singleton.contact_names, singleton.nodePort) - - -# set_up_default_cassandra() -config = Config() diff --git a/storage/cql_iface/tests/mockIStorage.py b/storage/cql_iface/tests/mockIStorage.py index 7c630512..86df728d 100644 --- a/storage/cql_iface/tests/mockIStorage.py +++ b/storage/cql_iface/tests/mockIStorage.py @@ -53,6 +53,9 @@ def __eq__(self, other): """ return self.__class__ == other.__class__ and self.getID() == other.getID() + def is_persistent(self): + return self.getID() is not None and self.get_name() is not None + @staticmethod def _store_meta(storage_args): pass From 112f43844b7e683da40a8be699ead449b6a3e66a Mon Sep 17 00:00:00 2001 From: Pol Santamaria Date: Tue, 19 Nov 2019 15:43:35 +0100 Subject: [PATCH 16/81] Remove unnecessary code --- storage/cql_iface/tests/api_tests.py | 9 -- storage/cql_iface/tests/mockIStorage.py | 21 ++-- storage/cql_iface/tests/mockStorageObj.py | 25 +--- storage/cql_iface/tests/mockhdict.py | 38 +----- storage/cql_iface/tests/mockhnumpy.py | 11 +- storage/cql_iface/tests/mocktools.py | 139 ---------------------- storage/storage_iface.py | 1 + 7 files changed, 19 insertions(+), 225 deletions(-) diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index 2e8b780a..fe7c5da5 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -8,21 +8,12 @@ from storage.cql_iface.tests.mockStorageObj import StorageObj from storage.cql_iface.tests.mockhdict import StorageDict from storage.cql_iface.tests.mockhnumpy import StorageNumpy -from storage.cql_iface.tests.mocktools import storage_id_from_name class TestClass(IStorage): def __new__(cls, name='', *args, **kwargs): toret = super(TestClass, cls).__new__(cls) - storage_id = kwargs.get('storage_id', None) - if storage_id is None and name: - storage_id = storage_id_from_name(name) - - if name or storage_id: - toret.setID(storage_id) - toret.set_name(name) - toret._is_persistent = True return toret def __init__(self, *args, **kwargs): diff --git a/storage/cql_iface/tests/mockIStorage.py b/storage/cql_iface/tests/mockIStorage.py index 86df728d..6bbd3223 100644 --- a/storage/cql_iface/tests/mockIStorage.py +++ b/storage/cql_iface/tests/mockIStorage.py @@ -2,9 +2,6 @@ from collections import namedtuple -# from .mocktools import storage_id_from_name - - class AlreadyPersistentError(RuntimeError): pass @@ -16,14 +13,15 @@ def __init__(self, name=None, class_name=None, args=None): self.args = args +def storage_id_from_name(name): + return uuid.uuid3(uuid.NAMESPACE_DNS, name) + + class IStorage(object): args_names = ["storage_id"] args = namedtuple("IStorage", args_names) _build_args = args(storage_id="") - _data_model_def = None - _data_model_id = None - def getID(self): return self.__storage_id @@ -34,13 +32,22 @@ def setID(self, st_id): storage_id = property(getID, setID) - def __new__(cls, *args, **kwargs): + def __new__(cls, *args, name='', **kwargs): toret = super(IStorage, cls).__new__(cls) toret._ksp = '' toret._table = '' toret._is_persistent = False toret.__storage_id = None toret._name = '' + storage_id = kwargs.get('storage_id', None) + + if storage_id is None and name: + storage_id = storage_id_from_name(name) + + if name or storage_id: + toret.setID(storage_id) + toret.set_name(name) + toret._is_persistent = True return toret def __eq__(self, other): diff --git a/storage/cql_iface/tests/mockStorageObj.py b/storage/cql_iface/tests/mockStorageObj.py index c4e5b537..23cffcb3 100644 --- a/storage/cql_iface/tests/mockStorageObj.py +++ b/storage/cql_iface/tests/mockStorageObj.py @@ -1,6 +1,4 @@ from storage.cql_iface.tests.mockIStorage import IStorage -from storage.cql_iface.tests.mocktools import storage_id_from_name, transform_to_dm -import uuid class StorageObj(IStorage): @@ -10,28 +8,9 @@ class StorageObj(IStorage): DB(Cassandra), depending on if it's persistent or not. """ - def __new__(cls, name='', *args, **kwargs): - if not cls._data_model_id: - # User data model - keys = {} - try: - cls._data_model_def = kwargs['data_model'] - except KeyError: - pass - cls._data_model_def = dict() - cls._data_model_def["cols"] = transform_to_dm(cls) - cls._data_model_def['value_id'] = {'storage_id': uuid.UUID} - cls._data_model_def['type'] = cls - + def __new__(cls, *args, name='', **kwargs): toret = super(StorageObj, cls).__new__(cls) - storage_id = kwargs.get('storage_id', None) - if storage_id is None and name: - storage_id = storage_id_from_name(name) - if name or storage_id: - toret.setID(storage_id) - toret.set_name(name) - toret._is_persistent = True return toret def __init__(self, *args, **kwargs): @@ -47,4 +26,4 @@ def __init__(self, *args, **kwargs): # Assign private attributes # if self._is_persistent: # self._load_attributes() - super(StorageObj, self).__init__() \ No newline at end of file + super(StorageObj, self).__init__() diff --git a/storage/cql_iface/tests/mockhdict.py b/storage/cql_iface/tests/mockhdict.py index 201e8910..f9806615 100644 --- a/storage/cql_iface/tests/mockhdict.py +++ b/storage/cql_iface/tests/mockhdict.py @@ -1,14 +1,11 @@ from storage.cql_iface.tests.mockIStorage import IStorage -from storage.cql_iface.tests.mocktools import storage_id_from_name, transform_to_dm -import storage - class StorageDict(IStorage, dict): # """ # Object used to access data from workers. # """ - def __new__(cls, name='', *args, **kwargs): + def __new__(cls, *args, name='', **kwargs): """ Creates a new StorageDict. @@ -18,40 +15,7 @@ def __new__(cls, name='', *args, **kwargs): args: arguments for base constructor kwargs: arguments for base constructor """ - if not cls._data_model_id: - # User data model - keys = {} - try: - cls._data_model_def = kwargs['data_model'] - except KeyError: - import typing - dms = [] - for ob in cls.__orig_bases__: - if isinstance(ob, typing.GenericMeta): - dms.append(transform_to_dm(ob)) - if len(dms) != 1: - raise ValueError("Different orig bases than expected ({})".format(len(dms))) - - cls._data_model_def = dms[0] - cls._data_model_def['type'] = cls - - # Storage data model - #keys = {k: uuid.UUID if issubclass(v, IStorage) else v for k, v in cls._data_model_def["value_id"]} - #cols = {k: uuid.UUID if issubclass(v, IStorage) else v for k, v in cls._data_model_def["cols"]} - - cls._data_model_id = storage.StorageAPI.add_data_model(cls._data_model_def) - toret = super(StorageDict, cls).__new__(cls, kwargs) - storage_id = kwargs.get('storage_id', None) - - if storage_id is None and name: - storage_id = storage_id_from_name(name) - - if name or storage_id: - toret.setID(storage_id) - toret.set_name(name) - toret._is_persistent = True - #storage.StorageAPI.register_persistent_object(cls._data_model_id, toret) return toret def __init__(self, *args, **kwargs): diff --git a/storage/cql_iface/tests/mockhnumpy.py b/storage/cql_iface/tests/mockhnumpy.py index c35bfefe..095fcbe6 100644 --- a/storage/cql_iface/tests/mockhnumpy.py +++ b/storage/cql_iface/tests/mockhnumpy.py @@ -5,11 +5,6 @@ class StorageNumpy(IStorage, np.ndarray): - class np_meta(object): - def __init__(self, shape, dtype, block_id): - self.dims = shape - self.type = dtype - self.block_id = block_id _build_args = None _class_name = None @@ -23,10 +18,6 @@ def __init__(self, shape, dtype, block_id): args = namedtuple('StorageNumpyArgs', args_names) def __new__(cls, input_array=None, storage_id=None, name=None, built_remotely=False, **kwargs): - if storage_id: - # already exists - pass - if input_array is None and name and storage_id is not None: result = cls.load_array(storage_id) input_array = result[0] @@ -73,4 +64,4 @@ def load_array(storage_id): else: raise KeyError ''' - pass + return np.zeros(()) diff --git a/storage/cql_iface/tests/mocktools.py b/storage/cql_iface/tests/mocktools.py index 5ef3240e..e69de29b 100644 --- a/storage/cql_iface/tests/mocktools.py +++ b/storage/cql_iface/tests/mocktools.py @@ -1,139 +0,0 @@ -import typing -import uuid -from collections import OrderedDict - -# from .mockIStorage import IStorage -from storage.cql_iface.tests.mockIStorage import IStorage - - -def storage_id_from_name(name): - return uuid.uuid3(uuid.NAMESPACE_DNS, name) - - -def process_path(module_path): - """ - Method to obtain module and class_name from a module path - Args: - module_path(String): path in the format module.class_name - Returns: - tuple containing class_name and module - """ - if module_path == 'numpy.ndarray': - return 'StorageNumpy', 'hecuba.hnumpy' - if module_path == 'StorageDict': - return 'StorageDict', 'hecuba.hdict' - - res = module_path.split('.') - if len(res) == 1: - mod = "builtins" - class_name = module_path - else: - mod = res[0] - class_name = module_path[len(mod) + 1:] - - return class_name, mod - - -def build_remotely(args): - """ - Takes the information which consists of at least the type, - :raises TypeError if the object class doesn't subclass IStorage - :param obj_info: Contains the information to be used to create the IStorage obj - :return: An IStorage object - """ - if "built_remotely" not in args.keys(): - built_remotely = True - else: - built_remotely = args["built_remotely"] - - obj_type = args.get('class_name', args.get('type', None)) - if obj_type is None: - raise TypeError("Trying to build an IStorage obj without giving the type") - - imported_class = obj_type - - args = {k: v for k, v in args.items() if k in imported_class.args_names} - args.pop('class_name', None) - args["built_remotely"] = built_remotely - - return imported_class(**args) - - -def import_class(module_path): - """ - Method to obtain module and class_name from a module path - Args: - module_path(String): path in the format module.class_name - Returns: - tuple containing class_name and module - """ - class_name, mod = process_path(module_path) - - try: - mod = __import__(mod, globals(), locals(), [class_name], 0) - except ValueError: - raise ValueError("Can't import class {} from module {}".format(class_name, mod)) - - imported_class = getattr(mod, class_name) - return imported_class - - -def build_data_model(description): - res = {} - for k, v in description.items(): - dt = update_type(v["type"]) - try: - keys = build_data_model(v["primary_keys"]) - values = build_data_model(v["columns"]) - res[k] = {"keys": keys, "cols": values, "type": dt} - except KeyError: - res[k] = dt - return res - # {k: update_type(v['type']) for k, v in persistent_props.items()} - - -def update_type(d): - if d == 'text': - return str - res = import_class(d) - return res - - -def transform_to_dm(ob, depth=0): - """ - - :param ob: - :return: List or dict - """ - if issubclass(ob, IStorage.IStorage) and depth > 0: - return ob - elif issubclass(ob, typing.Dict): - fields = {} - - keys = transform_to_dm(ob.__args__[0], depth + 1) # Keys - cols = transform_to_dm(ob.__args__[1], depth + 1) # Cols - - if isinstance(keys, list): - keys = {"key{}".format(i): transform_to_dm(v, depth + 1) for i, v in enumerate(keys)} - if isinstance(cols, list): - cols = {"col{}".format(i): transform_to_dm(v, depth + 1) for i, v in enumerate(cols)} - - fields["value_id"] = keys - fields["cols"] = cols - return fields - - elif hasattr(ob, '__annotations__'): - annot = ob.__annotations__ - if isinstance(annot, OrderedDict): - return {k: transform_to_dm(v, depth + 1) for k, v in annot.items()} - elif isinstance(annot, dict): - return {k: transform_to_dm(v, depth + 1) for k, v in annot.items()} - else: - raise NotImplemented - - elif hasattr(ob, '__args__'): - if issubclass(ob, typing.Tuple): - t = [transform_to_dm(cl, depth + 1) for cl in ob.__args__ if cl != ()] - return tuple(t) - return [transform_to_dm(cl, depth + 1) for cl in ob.__args__ if cl != ()] - return ob diff --git a/storage/storage_iface.py b/storage/storage_iface.py index 320e7804..7eb65856 100644 --- a/storage/storage_iface.py +++ b/storage/storage_iface.py @@ -1,5 +1,6 @@ from abc import ABCMeta, abstractmethod + class StorageIface(metaclass=ABCMeta): @abstractmethod def add_data_model(self, definition: dict) -> int: From 084624d7dffdc855192c2d4b4d606f833f4e1370 Mon Sep 17 00:00:00 2001 From: Pol Santamaria Date: Tue, 19 Nov 2019 15:44:34 +0100 Subject: [PATCH 17/81] Remove mocktools --- storage/cql_iface/tests/mocktools.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 storage/cql_iface/tests/mocktools.py diff --git a/storage/cql_iface/tests/mocktools.py b/storage/cql_iface/tests/mocktools.py deleted file mode 100644 index e69de29b..00000000 From 3646766ac9ec2f2aaccb6eda608c66f78397bdf4 Mon Sep 17 00:00:00 2001 From: Ismael Date: Wed, 20 Nov 2019 12:05:10 +0100 Subject: [PATCH 18/81] load array returns a list --- storage/cql_iface/tests/mockhnumpy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/cql_iface/tests/mockhnumpy.py b/storage/cql_iface/tests/mockhnumpy.py index 095fcbe6..2051271c 100644 --- a/storage/cql_iface/tests/mockhnumpy.py +++ b/storage/cql_iface/tests/mockhnumpy.py @@ -64,4 +64,4 @@ def load_array(storage_id): else: raise KeyError ''' - return np.zeros(()) + return [np.zeros(())] From a2e9431a740216b3122bfeea331264db75233ad6 Mon Sep 17 00:00:00 2001 From: Ismael Date: Wed, 20 Nov 2019 12:06:50 +0100 Subject: [PATCH 19/81] load array returns a list / checks inside function --- storage/cql_iface/cql_iface.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index 0b711890..11d5c0a3 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -42,16 +42,13 @@ class CQLIface(StorageIface): def __init__(self): pass - def check_definition(self, definition): + def add_data_model(self, definition): if not isinstance(definition, dict): raise TypeError("Expected a dict type as a definition") if not all(name in definition for name in ["type", "value_id", "fields"]): raise KeyError("Expected keys 'type', 'value_id' and 'fields'") if not issubclass(definition["type"], IStorage): raise TypeError("Class must inherit IStorage") - - def add_data_model(self, definition): - self.check_definition(definition) dm = list(definition.items()) dm.sort() datamodel_id = hash(str(dm)) From 5e447c9a3c2c3bbc5473a08a2079c66b083f9773 Mon Sep 17 00:00:00 2001 From: Ismael Date: Thu, 21 Nov 2019 11:44:27 +0100 Subject: [PATCH 20/81] some tests changed, added type check --- storage/cql_iface/cql_iface.py | 58 +++++++++++++++++++++------- storage/cql_iface/tests/api_tests.py | 32 +++++++++++---- 2 files changed, 67 insertions(+), 23 deletions(-) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index 11d5c0a3..ced96dc5 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -1,8 +1,10 @@ +import datetime +import decimal import uuid import numpy -from storage.cql_iface.tests.mockIStorage import IStorage +from storage.cql_iface.tests.mockIStorage import IStorage from .cql_comm import CqlCOMM from ..storage_iface import StorageIface @@ -25,30 +27,56 @@ class CQLIface(StorageIface): hcache_by_id = {} # User class to Cassandra data type - _hecuba2cassandra_typemap = {str: 'text', - bool: 'boolean', - float: 'float', - int: 'int', - tuple: 'tuple', - list: 'list', - set: 'set', - dict: 'map', - bytearray: 'blob', - bytes: 'blob', - numpy.int64: 'double', - numpy.ndarray: 'hecuba.hnumpy.StorageNumpy', - uuid.UUID: 'uuid'} + _hecuba2cassandra_typemap = { + None: 'NULL', + bool: 'boolean', + int: 'int', + float: 'float', + str: 'text', + bytearray: 'blob', + bytes: 'blob', + tuple: 'tuple', + frozenset: 'set', + decimal.Decimal: 'decimal', + datetime.date: 'date', + datetime.datetime: 'datetime', + datetime.time: 'time', + numpy.int8: 'tinyint', + numpy.int16: 'smallint', + numpy.int64: 'double', + numpy.ndarray: 'hecuba.hnumpy.StorageNumpy', + numpy.unicode: 'varchar', + uuid.UUID: 'uuid' + } def __init__(self): pass - def add_data_model(self, definition): + @staticmethod + def check_values_from_definition(definition): + if isinstance(definition, dict): + for v in definition.values(): + CQLIface.check_values_from_definition(v) + elif isinstance(definition, list) or isinstance(definition, set) or isinstance(definition, tuple): + for v in definition: + CQLIface.check_values_from_definition(v) + else: + try: + CQLIface._hecuba2cassandra_typemap[definition] + except KeyError: + raise TypeError(f"The type {definition} is not supported") + + def add_data_model(self, definition: dict) -> int: if not isinstance(definition, dict): raise TypeError("Expected a dict type as a definition") if not all(name in definition for name in ["type", "value_id", "fields"]): raise KeyError("Expected keys 'type', 'value_id' and 'fields'") + if not (isinstance(definition["value_id"], dict) and isinstance(definition["fields"], dict)): + raise TypeError("Expected keys 'value_id' and 'fields' to be dict") if not issubclass(definition["type"], IStorage): raise TypeError("Class must inherit IStorage") + dict_definition = {k: definition[k] for k in ('value_id', 'fields')} + CQLIface.check_values_from_definition(dict_definition) dm = list(definition.items()) dm.sort() datamodel_id = hash(str(dm)) diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index fe7c5da5..547fdd06 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -1,3 +1,4 @@ +import decimal import unittest import uuid @@ -35,21 +36,35 @@ def test_add_data_model_except_not_dict_type(self): data_model = "a" storage = CQLIface() # Register data models - storage.check_definition(data_model) + storage.add_data_model(data_model) def test_add_data_model_except_invalid_class(self): with self.assertRaises(TypeError): data_model = {"type": "a", "value_id": {"k": str}, "fields": {"a": str}} storage = CQLIface() # Register data models - storage.check_definition(data_model) + storage.add_data_model(data_model) def test_add_data_model_except_invalid_format(self): with self.assertRaises(KeyError): data_model = {"type": mockClass, "": {"k": str}, "fields": {"a": str}} storage = CQLIface() # Register data models - storage.check_definition(data_model) + storage.add_data_model(data_model) + + def test_add_data_model_except_not_value_fields_dict_type(self): + with self.assertRaises(TypeError): + data_model = {"type": mockClass, "value_id": [str], "fields": {"a": str}} + storage = CQLIface() + # Register data models + storage.add_data_model(data_model) + + def test_add_data_model_except_incorrect_type(self): + with self.assertRaises(TypeError): + data_model = {"type": mockClass, "value_id": {"k": dict}, "fields": {"a": str}} + storage = CQLIface() + # Register data models + storage.add_data_model(data_model) def test_add_data_different_types(self): data_model = {"type": mockClass, "value_id": {"k": int}, @@ -58,7 +73,7 @@ def test_add_data_different_types(self): try: storage = CQLIface() # Register data models - storage.check_definition(data_model) + storage.add_data_model(data_model) except: raised = True self.assertFalse(raised, 'Exception raised') @@ -101,16 +116,17 @@ def test_add_data_model_existing_one(self): self.assertTrue(storage.data_models_cache[id2]) def test_add_data_model_complex_types(self): - data_model = {"type": mockClass, "value_id": {"k": int, "k1": int}, - "fields": {"a": {"value_id": {"k": int}, "fields": {"f": str}}}} + data_model = {"type": mockClass, "value_id": {"k": decimal.Decimal, "k1": numpy.ndarray}, + "fields": {"k": numpy.unicode, "f": numpy.int64}} storage = CQLIface() # Register data models id = storage.add_data_model(data_model) self.assertTrue(storage.data_models_cache[id]) def test_add_data_model_complex_structure(self): - data_model = {"type": mockClass, "value_id": {"k": int, "k1": [int, int]}, "fields": {"a": { - "value_id": {"k": (int, str)}, "fields": {"f": str, "f2": (float,)}}}} + data_model = {"type": mockClass, + "value_id": {"k": int, "k1": [int], "k2": (int, uuid.UUID), "k3": {"a": float, "b": (bool, int)}}, + "fields": {"f": [str, (str, str)]}} storage = CQLIface() # Register data models id = storage.add_data_model(data_model) From e4f19e18701baa6b5ee26d93c2f16308a4fe22e9 Mon Sep 17 00:00:00 2001 From: Ismael Date: Thu, 21 Nov 2019 11:46:57 +0100 Subject: [PATCH 21/81] compacting code --- storage/cql_iface/cql_iface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index ced96dc5..7af4112d 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -57,7 +57,7 @@ def check_values_from_definition(definition): if isinstance(definition, dict): for v in definition.values(): CQLIface.check_values_from_definition(v) - elif isinstance(definition, list) or isinstance(definition, set) or isinstance(definition, tuple): + elif isinstance(definition, (list, set, tuple)): for v in definition: CQLIface.check_values_from_definition(v) else: From d071a24c1e4be149cb9475dd48c0597059cd8225 Mon Sep 17 00:00:00 2001 From: Ismael Date: Thu, 21 Nov 2019 12:39:45 +0100 Subject: [PATCH 22/81] requested changes --- storage/cql_iface/cql_iface.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index 7af4112d..4411fb3e 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -28,7 +28,6 @@ class CQLIface(StorageIface): # User class to Cassandra data type _hecuba2cassandra_typemap = { - None: 'NULL', bool: 'boolean', int: 'int', float: 'float', @@ -75,14 +74,13 @@ def add_data_model(self, definition: dict) -> int: raise TypeError("Expected keys 'value_id' and 'fields' to be dict") if not issubclass(definition["type"], IStorage): raise TypeError("Class must inherit IStorage") - dict_definition = {k: definition[k] for k in ('value_id', 'fields')} - CQLIface.check_values_from_definition(dict_definition) - dm = list(definition.items()) - dm.sort() + dm = sorted(definition.items()) datamodel_id = hash(str(dm)) try: self.data_models_cache[datamodel_id] except KeyError: + dict_definition = {k: definition[k] for k in ('value_id', 'fields')} + CQLIface.check_values_from_definition(dict_definition) self.data_models_cache[datamodel_id] = definition CqlCOMM.register_data_model(datamodel_id, definition) return datamodel_id From d6a8755dba05c6c496d2580b0378c841d4666326 Mon Sep 17 00:00:00 2001 From: Ismael Date: Fri, 22 Nov 2019 12:54:20 +0100 Subject: [PATCH 23/81] implementation + tests --- storage/cql_iface/__init__.py | 19 +--- storage/cql_iface/config.py | 42 +++++++++ storage/cql_iface/cql_comm.py | 111 +++++++++++++++++++++- storage/cql_iface/cql_iface.py | 60 ++++++------ storage/cql_iface/queries.py | 7 ++ storage/cql_iface/tests/api_tests.py | 120 +++++++++++++++++++++++- storage/cql_iface/tests/mockIStorage.py | 2 +- storage/storage_iface.py | 16 +++- 8 files changed, 324 insertions(+), 53 deletions(-) create mode 100644 storage/cql_iface/config.py create mode 100644 storage/cql_iface/queries.py diff --git a/storage/cql_iface/__init__.py b/storage/cql_iface/__init__.py index 16b3b72f..4d5ead40 100644 --- a/storage/cql_iface/__init__.py +++ b/storage/cql_iface/__init__.py @@ -1,26 +1,9 @@ -import logging -import os - from cassandra.cluster import Cluster from cassandra.policies import RetryPolicy, RoundRobinPolicy, TokenAwarePolicy from .tests.cassandra_cluster_manager import * - +from .config import log # Set default log.handler to avoid "No handler found" warnings. -stderrLogger = logging.StreamHandler() -f = '%(filename)s: %(levelname)s: %(funcName)s(): %(lineno)d:\t%(message)s' -stderrLogger.setFormatter(logging.Formatter(f)) - -log = logging.getLogger('hecuba') -log.addHandler(stderrLogger) - -if 'DEBUG' in os.environ and os.environ['DEBUG'].lower() == "true": - log.setLevel(logging.DEBUG) -elif 'HECUBA_LOG' in os.environ: - log.setLevel(os.environ['HECUBA_LOG'].upper()) -else: - log.setLevel(logging.ERROR) - class _NRetry(RetryPolicy): def __init__(self, time_to_retry=5): self.time_to_retry = time_to_retry diff --git a/storage/cql_iface/config.py b/storage/cql_iface/config.py new file mode 100644 index 00000000..2dcb8f19 --- /dev/null +++ b/storage/cql_iface/config.py @@ -0,0 +1,42 @@ +import datetime +import decimal +import uuid + +import numpy +import logging +import os +# User class to Cassandra data type +_hecuba2cassandra_typemap = { + bool: 'boolean', + int: 'int', + float: 'float', + str: 'text', + bytearray: 'blob', + bytes: 'blob', + tuple: 'tuple', + frozenset: 'set', + decimal.Decimal: 'decimal', + datetime.date: 'date', + datetime.datetime: 'datetime', + datetime.time: 'time', + numpy.int8: 'tinyint', + numpy.int16: 'smallint', + numpy.int64: 'double', + numpy.ndarray: 'hecuba.hnumpy.StorageNumpy', + numpy.unicode: 'varchar', + uuid.UUID: 'uuid' +} + +stderrLogger = logging.StreamHandler() +f = '%(filename)s: %(levelname)s: %(funcName)s(): %(lineno)d:\t%(message)s' +stderrLogger.setFormatter(logging.Formatter(f)) + +log = logging.getLogger('hecuba') +log.addHandler(stderrLogger) + +if 'DEBUG' in os.environ and os.environ['DEBUG'].lower() == "true": + log.setLevel(logging.DEBUG) +elif 'HECUBA_LOG' in os.environ: + log.setLevel(os.environ['HECUBA_LOG'].upper()) +else: + log.setLevel(logging.ERROR) diff --git a/storage/cql_iface/cql_comm.py b/storage/cql_iface/cql_comm.py index 0f940551..1869da2e 100644 --- a/storage/cql_iface/cql_comm.py +++ b/storage/cql_iface/cql_comm.py @@ -1,9 +1,116 @@ +from typing import Union +from uuid import UUID + +import numpy +from hfetch import Hcache, HNumpyStore + +from . import config +from .config import _hecuba2cassandra_typemap, log +from .queries import istorage_prepared_st, istorage_read_entry +from .tests.mockStorageObj import StorageObj +from .tests.mockhdict import StorageDict + + +def extract_ksp_table(name): + """ + Method used to obtain keyspace and table from a given name + Args: + name: a string containing keyspace name and table name, or only table name + Returns: + a tuple containing keyspace name and table name + """ + + try: + ksp = name[:name.index('.')] + table = name[len(ksp) + 1:] + except ValueError: + ksp = config.execution_name + table = name + return ksp.lower(), table.lower() class CqlCOMM(object): + @staticmethod + def register_istorage(obj_id: UUID, obj_name: str, data_model: dict) -> UUID: + row = config.session.execute(istorage_read_entry, [obj_id]) + if not row: + obj_info = [obj_id, obj_name, str(data_model)] + config.execute(istorage_prepared_st, obj_info) + return obj_id @staticmethod - def register_data_model(data_model_id, definition): + def register_data_model(data_model_id: int, definition: dict) -> None: # extract keys, values and so on - pass \ No newline at end of file + pass + + @staticmethod + def create_table(name: str, definition: dict) -> None: + # StorageObj for now + ksp, table = extract_ksp_table(name) + query_keyspace = "CREATE KEYSPACE IF NOT EXISTS %s WITH replication = %s" % (ksp, config.replication) + config.session.execute(query_keyspace) + + primary_keys = definition['value_id'] + columns = definition['fields'] + + pks = str.join(',', primary_keys.keys()) + if definition["type"] is numpy.ndarray: + pks = "(storage_id, cluster_id),block_id" + + all_keys = ",".join("%s %s" % (k, _hecuba2cassandra_typemap[v]) for k, v in primary_keys.items()) + all_cols = ",".join("%s %s" % (k, _hecuba2cassandra_typemap[v]) for k, v in columns.items()) + if all_cols: + total_cols = all_keys + ',' + all_cols + else: + total_cols = all_keys + + query_table = "CREATE TABLE IF NOT EXISTS %s.%s (%s, PRIMARY KEY (%s));" \ + % (ksp, + table, + total_cols, + pks) + try: + log.debug('MAKE PERSISTENCE: %s', query_table) + config.session.execute(query_table) + except Exception as ex: + log.warn("Error creating the StorageDict table: %s %s", query_table, ex) + raise ex + + @staticmethod + def hcache_parameters_generator(ksp: str, table: str, object_id: UUID, keys: list, columns: list) -> tuple: + hcache_params = (ksp, table, object_id, [(-2 ** 63, 2 ** 63 - 1)], keys, columns, + {'cache_size': config.max_cache_size, + 'writer_par': config.write_callbacks_number, + 'writer_buffer': config.write_buffer_size, + 'timestamped_writes': config.timestamped_writes}) + return hcache_params + + @staticmethod + def create_hcache(object_id: UUID, name: str, definition: dict) -> Union[object, HNumpyStore, Hcache]: + ksp, table = extract_ksp_table(name) + if issubclass(definition.get("type", None), StorageObj): + class HcacheWrapper(object): + def __init__(self, attributes, object_id, ksp, table): + self.internal_caches = {} + self.object_id = object_id + for attr in attributes: + self.internal_caches[attr] = Hcache( + CqlCOMM.hcache_parameters_generator(ksp, table, object_id, ["storage_id"], [attr])) + + def get_row(self, attr): + return self.internal_caches[attr].get_row([self.object_id])[0] + + def put_row(self, attr, val): + self.internal_caches[attr].put_row([self.object_id], [val]) + + return HcacheWrapper(definition["fields"].keys(), object_id, ksp, table) + + else: + keys = [k for k in definition["value_id"].keys()] + columns = [k for k in definition["fields"].keys()] + hcache_params = CqlCOMM.hcache_parameters_generator(ksp, table, object_id, keys, columns) + if definition["type"] is numpy.ndarray: + return HNumpyStore(*hcache_params) + elif issubclass(definition.get("type", None), StorageDict): + return Hcache(*hcache_params) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index 4411fb3e..1ade82fa 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -1,10 +1,7 @@ -import datetime -import decimal -import uuid - -import numpy +from uuid import UUID from storage.cql_iface.tests.mockIStorage import IStorage +from .config import _hecuba2cassandra_typemap from .cql_comm import CqlCOMM from ..storage_iface import StorageIface @@ -16,7 +13,6 @@ class CQLIface(StorageIface): # DataModelID - DataModelDef data_models_cache = {} - # StorageID - DataModelID object_to_data_model = {} # Object Name - Cache @@ -26,28 +22,6 @@ class CQLIface(StorageIface): # StorageID - Cache hcache_by_id = {} - # User class to Cassandra data type - _hecuba2cassandra_typemap = { - bool: 'boolean', - int: 'int', - float: 'float', - str: 'text', - bytearray: 'blob', - bytes: 'blob', - tuple: 'tuple', - frozenset: 'set', - decimal.Decimal: 'decimal', - datetime.date: 'date', - datetime.datetime: 'datetime', - datetime.time: 'time', - numpy.int8: 'tinyint', - numpy.int16: 'smallint', - numpy.int64: 'double', - numpy.ndarray: 'hecuba.hnumpy.StorageNumpy', - numpy.unicode: 'varchar', - uuid.UUID: 'uuid' - } - def __init__(self): pass @@ -61,7 +35,7 @@ def check_values_from_definition(definition): CQLIface.check_values_from_definition(v) else: try: - CQLIface._hecuba2cassandra_typemap[definition] + _hecuba2cassandra_typemap[definition] except KeyError: raise TypeError(f"The type {definition} is not supported") @@ -84,3 +58,31 @@ def add_data_model(self, definition: dict) -> int: self.data_models_cache[datamodel_id] = definition CqlCOMM.register_data_model(datamodel_id, definition) return datamodel_id + + def register_persistent_object(self, datamodel_id: int, pyobject: IStorage) -> UUID: + if not isinstance(pyobject, IStorage): + raise RuntimeError("Class does not inherit IStorage") + elif not pyobject.is_persistent(): + raise ValueError("Class needs to be a persistent object, it needs id and name") + elif datamodel_id is None: + raise ValueError("datamodel_id cannot be None") + try: + data_model = self.data_models_cache[datamodel_id] + except KeyError: + raise KeyError("Before making a pyobject persistent, the data model needs to be registered") + object_id = pyobject.getID() + try: + self.object_to_data_model[object_id] + except KeyError: + self.object_to_data_model[object_id] = datamodel_id + object_name = pyobject.get_name() + CqlCOMM.register_istorage(object_id, object_name, data_model) + CqlCOMM.create_table(object_name, data_model) + obj_class = pyobject.__class__.__name__ + if obj_class not in self.hcache_by_class: + hc = CqlCOMM.create_hcache(object_id, object_name, data_model) + self.hcache_by_class[obj_class] = hc + self.hcache_by_name[pyobject.get_name()] = hc + self.hcache_by_id[object_id] = hc + return object_id + diff --git a/storage/cql_iface/queries.py b/storage/cql_iface/queries.py new file mode 100644 index 00000000..32591ef0 --- /dev/null +++ b/storage/cql_iface/queries.py @@ -0,0 +1,7 @@ +from . import config + +istorage_prepared_st = config.session.prepare('INSERT INTO hecuba.istorage' + '(storage_id, name, data_model)' + 'VALUES (?,?,?)') +istorage_remove_entry = config.session.prepare('DELETE FROM hecuba.istorage WHERE storage_id = ?') +istorage_read_entry = config.session.prepare('SELECT * FROM hecuba.istorage WHERE storage_id = ?') \ No newline at end of file diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index 547fdd06..4226d1fb 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -4,6 +4,7 @@ import numpy +from storage.cql_iface.cql_comm import config from storage.cql_iface.cql_iface import CQLIface from storage.cql_iface.tests.mockIStorage import IStorage from storage.cql_iface.tests.mockStorageObj import StorageObj @@ -14,10 +15,10 @@ class TestClass(IStorage): def __new__(cls, name='', *args, **kwargs): - toret = super(TestClass, cls).__new__(cls) + toret = super(TestClass, cls).__new__(cls, name) return toret - def __init__(self, *args, **kwargs): + def __init__(self): super(TestClass, self).__init__() @@ -25,6 +26,10 @@ class mockClass(IStorage): pass +class mockClassNoInherit: + pass + + class HfetchTests(unittest.TestCase): def test_instantiate(self): @@ -132,6 +137,117 @@ def test_add_data_model_complex_structure(self): id = storage.add_data_model(data_model) self.assertTrue(storage.data_models_cache[id]) + def test_register_persistent_except_data_model_id_none(self): + with self.assertRaises(ValueError): + # Setup object + given_name = 'storage_test.custom_obj' + obj = TestClass(given_name) + data_model = {"type": mockClass, "value_id": {"k": str}, "fields": {"a": int}} + + # Setup persistent storage + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(None, obj) + + def test_register_persistent_except_data_model_obj_not_istorage(self): + with self.assertRaises(RuntimeError): + # Setup object + obj = mockClassNoInherit() + data_model = {"type": mockClass, "value_id": {"k": str}, "fields": {"a": int}} + # Setup persistent storage + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(None, obj) + + def test_register_persistent_except_data_model_obj_not_persistent(self): + with self.assertRaises(ValueError): + # Setup object + obj = mockClass() + data_model = {"type": mockClass, "value_id": {"k": str}, "fields": {"a": int}} + # Setup persistent storage + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(None, obj) + + def test_register_persistent_except_data_model_not_registered(self): + with self.assertRaises(KeyError): + # Setup object + given_name = 'storage_test.custom_obj' + obj = TestClass(given_name) + data_model = {"type": mockClass, "value_id": {"k": str}, "fields": {"a": int}} + + # Setup persistent storage + storage = CQLIface() + storage.register_persistent_object(8, obj) + + def test_register_persistent_obj_dict_ints(self): + given_name = 'storage_test.custom_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + obj = TestClass(given_name) + myid = obj.getID() + name = obj.get_name() + data_model = {"type": TestClass, "value_id": {"k": str}, "fields": {"a": int}} + + # Setup persistent storage + storage = CQLIface() + + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + res = config.session.execute("SELECT * FROM hecuba.istorage WHERE storage_id={}".format(myid)).one() + self.assertEqual(res.name, name) + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + def test_register_persistent_obj_storage_obj(self): + given_name = 'storage_test.custom_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + obj = TestClass(given_name) + myid = obj.getID() + name = obj.get_name() + data_model = {"type": StorageObj, "value_id": {"k": int}, "fields": {"a": str, "b": str}} + + # Setup persistent storage + storage = CQLIface() + + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + res = config.session.execute("SELECT * FROM hecuba.istorage WHERE storage_id={}".format(myid)).one() + self.assertEqual(res.name, name) + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + def test_register_persistent_obj_storage_dict(self): + given_name = 'storage_test.custom_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + obj = TestClass(given_name) + myid = obj.getID() + name = obj.get_name() + data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": str, "b": str}} + + # Setup persistent storage + storage = CQLIface() + + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + res = config.session.execute("SELECT * FROM hecuba.istorage WHERE storage_id={}".format(myid)).one() + self.assertEqual(res.name, name) + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + def test_register_persistent_obj_storage_numpy(self): + given_name = 'storage_test.custom_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + obj = TestClass(given_name) + myid = obj.getID() + name = obj.get_name() + data_model = {"type": StorageNumpy, "value_id": {"k": int}, "fields": {"a": str, "b": str}} + + # Setup persistent storage + storage = CQLIface() + + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + res = config.session.execute("SELECT * FROM hecuba.istorage WHERE storage_id={}".format(myid)).one() + self.assertEqual(res.name, name) + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + if __name__ == "__main__": unittest.main() diff --git a/storage/cql_iface/tests/mockIStorage.py b/storage/cql_iface/tests/mockIStorage.py index 6bbd3223..29e9f8db 100644 --- a/storage/cql_iface/tests/mockIStorage.py +++ b/storage/cql_iface/tests/mockIStorage.py @@ -32,7 +32,7 @@ def setID(self, st_id): storage_id = property(getID, setID) - def __new__(cls, *args, name='', **kwargs): + def __new__(cls, name='', *args, **kwargs): toret = super(IStorage, cls).__new__(cls) toret._ksp = '' toret._table = '' diff --git a/storage/storage_iface.py b/storage/storage_iface.py index 7eb65856..a39fa871 100644 --- a/storage/storage_iface.py +++ b/storage/storage_iface.py @@ -1,5 +1,6 @@ from abc import ABCMeta, abstractmethod - +from uuid import UUID +from storage.cql_iface.tests.mockIStorage import IStorage class StorageIface(metaclass=ABCMeta): @abstractmethod @@ -10,3 +11,16 @@ def add_data_model(self, definition: dict) -> int: :return: data_model_id: Unique identifier to refer to the data model """ pass + + @abstractmethod + def register_persistent_object(self, datamodel_id: int, pyobject: IStorage) -> UUID: + """ + Informs the storage that the Hecuba object `pyobject` will be storing and accessing data + using the data model identified by `datamodel_id`. Returns a unique identifier to identify the object. + If the object has been previously registered nothing happens and its ID is returned. + :param datamodel_id: Identifier of a previously registered data model + :param pyobject: Hecuba persistent object to register with the persistent storage. + :return: object_id: UUID to reference and identify the pyobject in the future. + + """ + pass \ No newline at end of file From 2a315c408c2f60f5241d2408fb7321a5dd3d16ed Mon Sep 17 00:00:00 2001 From: Ismael Date: Fri, 22 Nov 2019 13:13:36 +0100 Subject: [PATCH 24/81] fix class --- storage/cql_iface/tests/api_tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index 4226d1fb..7cbc6481 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -18,7 +18,7 @@ def __new__(cls, name='', *args, **kwargs): toret = super(TestClass, cls).__new__(cls, name) return toret - def __init__(self): + def __init__(self, *args, **kwargs): super(TestClass, self).__init__() From 633f9ff5bbbd42e687c923f71953d493a21ec3d6 Mon Sep 17 00:00:00 2001 From: Ismael Date: Mon, 25 Nov 2019 10:03:36 +0100 Subject: [PATCH 25/81] delete persistent added --- storage/cql_iface/cql_comm.py | 7 ++++- storage/cql_iface/cql_iface.py | 11 +++++++ storage/cql_iface/tests/api_tests.py | 44 +++++++++++++++++++++++++++- 3 files changed, 60 insertions(+), 2 deletions(-) diff --git a/storage/cql_iface/cql_comm.py b/storage/cql_iface/cql_comm.py index 1869da2e..6fef55f3 100644 --- a/storage/cql_iface/cql_comm.py +++ b/storage/cql_iface/cql_comm.py @@ -6,7 +6,7 @@ from . import config from .config import _hecuba2cassandra_typemap, log -from .queries import istorage_prepared_st, istorage_read_entry +from .queries import istorage_prepared_st, istorage_read_entry, istorage_remove_entry from .tests.mockStorageObj import StorageObj from .tests.mockhdict import StorageDict @@ -114,3 +114,8 @@ def put_row(self, attr, val): return HNumpyStore(*hcache_params) elif issubclass(definition.get("type", None), StorageDict): return Hcache(*hcache_params) + + @staticmethod + def delete_data(object_id): + config.execute(istorage_remove_entry, [object_id]) + # TODO Use res to delete the appropriate data, maybe async diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index 1ade82fa..7bb876c4 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -1,3 +1,4 @@ +import uuid from uuid import UUID from storage.cql_iface.tests.mockIStorage import IStorage @@ -86,3 +87,13 @@ def register_persistent_object(self, datamodel_id: int, pyobject: IStorage) -> U self.hcache_by_id[object_id] = hc return object_id + def delete_persistent_object(self, object_id: UUID): + try: + uuid.UUID(str(object_id)) + except ValueError: + raise ValueError("The object_id is not an UUID") + try: + CqlCOMM.delete_data(object_id) + except Exception: + return False + return True diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index 7cbc6481..1235d4ef 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -4,12 +4,12 @@ import numpy -from storage.cql_iface.cql_comm import config from storage.cql_iface.cql_iface import CQLIface from storage.cql_iface.tests.mockIStorage import IStorage from storage.cql_iface.tests.mockStorageObj import StorageObj from storage.cql_iface.tests.mockhdict import StorageDict from storage.cql_iface.tests.mockhnumpy import StorageNumpy +from .. import config class TestClass(IStorage): @@ -248,6 +248,48 @@ def test_register_persistent_obj_storage_numpy(self): self.assertEqual(res.name, name) config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + def test_delete_persistent_except_object_id_not_uuid(self): + with self.assertRaises(ValueError): + given_name = 'storage_test.dict' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + # Setup object + obj = TestClass(given_name) + myid = obj.getID() + name = obj.get_name() + data_model = {"type": StorageNumpy, "value_id": {"k": int}, "fields": {"a": str, "b": str}} + + # Setup persistent storage + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + + # Setup persistent storage + storage = CQLIface() + storage.register_persistent_object(data_model_id, obj) + + storage.delete_persistent_object('exc') + + def test_delete_persistent_object(self): + given_name = 'storage_test.dict' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + # Setup object + obj = TestClass(given_name) + myid = obj.getID() + name = obj.get_name() + data_model = {"type": StorageNumpy, "value_id": {"k": int}, "fields": {"a": str, "b": str}} + + # Setup persistent storage + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + + # Setup persistent storage + storage = CQLIface() + storage.register_persistent_object(data_model_id, obj) + storage.delete_persistent_object(myid) + res = config.session.execute("SELECT * FROM hecuba.istorage WHERE storage_id={}".format(myid)) + self.assertIsNone(res.one()) + if __name__ == "__main__": unittest.main() From 7be7ebfabe7fe93957d3d1445ed2772a2ba9456d Mon Sep 17 00:00:00 2001 From: Ismael Date: Mon, 25 Nov 2019 10:55:53 +0100 Subject: [PATCH 26/81] initial version, (to be modified) --- storage/cql_iface/cql_comm.py | 4 ++-- storage/cql_iface/cql_iface.py | 8 +++++++ storage/cql_iface/tests/api_tests.py | 32 ++++++++++++++++++++++++++++ storage/storage_iface.py | 13 +++++++++++ 4 files changed, 55 insertions(+), 2 deletions(-) diff --git a/storage/cql_iface/cql_comm.py b/storage/cql_iface/cql_comm.py index 1869da2e..85bdd9e2 100644 --- a/storage/cql_iface/cql_comm.py +++ b/storage/cql_iface/cql_comm.py @@ -95,8 +95,8 @@ def __init__(self, attributes, object_id, ksp, table): self.internal_caches = {} self.object_id = object_id for attr in attributes: - self.internal_caches[attr] = Hcache( - CqlCOMM.hcache_parameters_generator(ksp, table, object_id, ["storage_id"], [attr])) + hcache_params = CqlCOMM.hcache_parameters_generator(ksp, table, object_id, ["storage_id"], [attr]) + self.internal_caches[attr] = Hcache(*hcache_params) def get_row(self, attr): return self.internal_caches[attr].get_row([self.object_id])[0] diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index 1ade82fa..472d85ec 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -1,3 +1,4 @@ +from typing import List from uuid import UUID from storage.cql_iface.tests.mockIStorage import IStorage @@ -86,3 +87,10 @@ def register_persistent_object(self, datamodel_id: int, pyobject: IStorage) -> U self.hcache_by_id[object_id] = hc return object_id + def put_records(self, object_id, key_list: List[object], value_list: List[object]) -> None: + + if not key_list: + return + + for key, value in zip(key_list, value_list): + self.hcache_by_id[object_id].put_row(key, value) diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index 7cbc6481..27001853 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -248,6 +248,38 @@ def test_register_persistent_obj_storage_numpy(self): self.assertEqual(res.name, name) config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + def test_put_records(self): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass(given_name) + myid = obj.getID() + data_model = {"type": StorageObj, "value_id": {"k": int}, "fields": {"a": int, "b": str, "c": float}} + given_name = 'storage_test.dict' + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + fields_ids = [] + values = [] + ninserts = 10 + for i in range(ninserts): + fields_ids.append([i * 10]) + values.append([i, "someText{}".format(i), i / 10.0]) + + storage.put_records(myid, fields_ids, values) + + returned_values = [] + hcache = storage.hcache_by_id[myid] + for key in fields_ids: + returned_values.append(hcache.get_row(key)) + + self.assertEqual(len(values), len(returned_values)) + + for val, ret_val in zip(values, returned_values): + self.assertEqual(val, ret_val) + + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) if __name__ == "__main__": unittest.main() diff --git a/storage/storage_iface.py b/storage/storage_iface.py index a39fa871..e0fb1170 100644 --- a/storage/storage_iface.py +++ b/storage/storage_iface.py @@ -1,4 +1,5 @@ from abc import ABCMeta, abstractmethod +from typing import List from uuid import UUID from storage.cql_iface.tests.mockIStorage import IStorage @@ -22,5 +23,17 @@ def register_persistent_object(self, datamodel_id: int, pyobject: IStorage) -> U :param pyobject: Hecuba persistent object to register with the persistent storage. :return: object_id: UUID to reference and identify the pyobject in the future. + """ + pass + + @abstractmethod + def put_records(self, object_id, key_list: List[object], value_list: List[object]): + """ + Stores the records contained in value_list, which correspond to the keys in key_list + for the Hecuba object referenced by `object_id`. + :param object_id: Hecuba object identifier + :param key_list: List with the keys of the records to be stored. + :param value_list: List with the records to be stored. + :return: - """ pass \ No newline at end of file From f799965f8c7175022641526ac8ca6557aa2582ed Mon Sep 17 00:00:00 2001 From: Ismael Date: Mon, 25 Nov 2019 13:33:13 +0100 Subject: [PATCH 27/81] create_hcache fixed, added new tests and check --- storage/cql_iface/cql_comm.py | 15 ++++++++++----- storage/cql_iface/cql_iface.py | 9 ++++++--- storage/cql_iface/tests/api_tests.py | 11 +++++++++-- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/storage/cql_iface/cql_comm.py b/storage/cql_iface/cql_comm.py index 1869da2e..9c2dc13b 100644 --- a/storage/cql_iface/cql_comm.py +++ b/storage/cql_iface/cql_comm.py @@ -91,12 +91,17 @@ def create_hcache(object_id: UUID, name: str, definition: dict) -> Union[object, ksp, table = extract_ksp_table(name) if issubclass(definition.get("type", None), StorageObj): class HcacheWrapper(object): - def __init__(self, attributes, object_id, ksp, table): + def __init__(self, definition, object_id, ksp, table): self.internal_caches = {} self.object_id = object_id - for attr in attributes: - self.internal_caches[attr] = Hcache( - CqlCOMM.hcache_parameters_generator(ksp, table, object_id, ["storage_id"], [attr])) + for col in definition["fields"].keys(): + hc = Hcache(ksp, table, object_id, [(-2 ** 63, 2 ** 63 - 1)], list(definition["value_id"].keys()), [col], + {'cache_size': config.max_cache_size, + 'writer_par': config.write_callbacks_number, + 'writer_buffer': config.write_buffer_size, + 'timestamped_writes': config.timestamped_writes}) + + self.internal_caches[col] = hc def get_row(self, attr): return self.internal_caches[attr].get_row([self.object_id])[0] @@ -104,7 +109,7 @@ def get_row(self, attr): def put_row(self, attr, val): self.internal_caches[attr].put_row([self.object_id], [val]) - return HcacheWrapper(definition["fields"].keys(), object_id, ksp, table) + return HcacheWrapper(definition, object_id, ksp, table) else: keys = [k for k in definition["value_id"].keys()] diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index 1ade82fa..ec290ec7 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -1,9 +1,10 @@ -from uuid import UUID +import uuid from storage.cql_iface.tests.mockIStorage import IStorage from .config import _hecuba2cassandra_typemap from .cql_comm import CqlCOMM from ..storage_iface import StorageIface +from .tests.mockStorageObj import StorageObj """ Mockup on how the Cassandra implementation of the interface could work. @@ -46,6 +47,8 @@ def add_data_model(self, definition: dict) -> int: raise KeyError("Expected keys 'type', 'value_id' and 'fields'") if not (isinstance(definition["value_id"], dict) and isinstance(definition["fields"], dict)): raise TypeError("Expected keys 'value_id' and 'fields' to be dict") + if definition["type"] is StorageObj and not all([definition["value_id"][k] is uuid.UUID for k in definition["value_id"].keys()]): + raise TypeError("If the type is StorageObj the value_id values must be of type uuid") if not issubclass(definition["type"], IStorage): raise TypeError("Class must inherit IStorage") dm = sorted(definition.items()) @@ -59,7 +62,7 @@ def add_data_model(self, definition: dict) -> int: CqlCOMM.register_data_model(datamodel_id, definition) return datamodel_id - def register_persistent_object(self, datamodel_id: int, pyobject: IStorage) -> UUID: + def register_persistent_object(self, datamodel_id: int, pyobject: IStorage) -> uuid.UUID: if not isinstance(pyobject, IStorage): raise RuntimeError("Class does not inherit IStorage") elif not pyobject.is_persistent(): @@ -79,7 +82,7 @@ def register_persistent_object(self, datamodel_id: int, pyobject: IStorage) -> U CqlCOMM.register_istorage(object_id, object_name, data_model) CqlCOMM.create_table(object_name, data_model) obj_class = pyobject.__class__.__name__ - if obj_class not in self.hcache_by_class: + if obj_class not in (self.hcache_by_class, self.hcache_by_name, self.hcache_by_id): hc = CqlCOMM.create_hcache(object_id, object_name, data_model) self.hcache_by_class[obj_class] = hc self.hcache_by_name[pyobject.get_name()] = hc diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index 7cbc6481..883aed06 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -71,6 +71,13 @@ def test_add_data_model_except_incorrect_type(self): # Register data models storage.add_data_model(data_model) + def test_add_data_model_except_incorrect_value_id(self): + with self.assertRaises(TypeError): + data_model = {"type": StorageObj, "value_id": {"k": dict}, "fields": {"a": str}} + storage = CQLIface() + # Register data models + storage.add_data_model(data_model) + def test_add_data_different_types(self): data_model = {"type": mockClass, "value_id": {"k": int}, "fields": {"a": numpy.int64, "b": numpy.ndarray, "c": uuid.UUID}} @@ -91,7 +98,7 @@ def test_add_data_model_new(self): self.assertTrue(storage.data_models_cache[id]) def test_add_data_model_StorageObj(self): - data_model = {"type": StorageObj, "value_id": {"k": int}, "fields": {"a": str}} + data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": str}} storage = CQLIface() # Register data models id = storage.add_data_model(data_model) @@ -203,7 +210,7 @@ def test_register_persistent_obj_storage_obj(self): obj = TestClass(given_name) myid = obj.getID() name = obj.get_name() - data_model = {"type": StorageObj, "value_id": {"k": int}, "fields": {"a": str, "b": str}} + data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": str, "b": str}} # Setup persistent storage storage = CQLIface() From 5e3e2d9915aa6aac8c0769b0e8121586ace28e40 Mon Sep 17 00:00:00 2001 From: Ismael Date: Mon, 25 Nov 2019 13:41:00 +0100 Subject: [PATCH 28/81] create hcache re-structure --- storage/cql_iface/cql_comm.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/storage/cql_iface/cql_comm.py b/storage/cql_iface/cql_comm.py index 9c2dc13b..704f80f1 100644 --- a/storage/cql_iface/cql_comm.py +++ b/storage/cql_iface/cql_comm.py @@ -95,13 +95,7 @@ def __init__(self, definition, object_id, ksp, table): self.internal_caches = {} self.object_id = object_id for col in definition["fields"].keys(): - hc = Hcache(ksp, table, object_id, [(-2 ** 63, 2 ** 63 - 1)], list(definition["value_id"].keys()), [col], - {'cache_size': config.max_cache_size, - 'writer_par': config.write_callbacks_number, - 'writer_buffer': config.write_buffer_size, - 'timestamped_writes': config.timestamped_writes}) - - self.internal_caches[col] = hc + self.internal_caches[col] = Hcache(*CqlCOMM.hcache_parameters_generator(ksp, table, object_id, list(definition["value_id"].keys()), [col])) def get_row(self, attr): return self.internal_caches[attr].get_row([self.object_id])[0] From f4bf8641b12b0205cc2604dc11e24c363bca8863 Mon Sep 17 00:00:00 2001 From: Ismael Date: Tue, 26 Nov 2019 08:53:08 +0100 Subject: [PATCH 29/81] we support str->text, only check hcache_by_class and some tests modified --- storage/cql_iface/config.py | 1 - storage/cql_iface/cql_iface.py | 2 +- storage/cql_iface/tests/api_tests.py | 14 +++++++------- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/storage/cql_iface/config.py b/storage/cql_iface/config.py index 2dcb8f19..3d21b966 100644 --- a/storage/cql_iface/config.py +++ b/storage/cql_iface/config.py @@ -23,7 +23,6 @@ numpy.int16: 'smallint', numpy.int64: 'double', numpy.ndarray: 'hecuba.hnumpy.StorageNumpy', - numpy.unicode: 'varchar', uuid.UUID: 'uuid' } diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index ec290ec7..22365c4c 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -82,7 +82,7 @@ def register_persistent_object(self, datamodel_id: int, pyobject: IStorage) -> u CqlCOMM.register_istorage(object_id, object_name, data_model) CqlCOMM.create_table(object_name, data_model) obj_class = pyobject.__class__.__name__ - if obj_class not in (self.hcache_by_class, self.hcache_by_name, self.hcache_by_id): + if obj_class not in self.hcache_by_class: hc = CqlCOMM.create_hcache(object_id, object_name, data_model) self.hcache_by_class[obj_class] = hc self.hcache_by_name[pyobject.get_name()] = hc diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index 883aed06..a5814956 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -14,7 +14,7 @@ class TestClass(IStorage): - def __new__(cls, name='', *args, **kwargs): + def __new__(cls, *args, name='', **kwargs): toret = super(TestClass, cls).__new__(cls, name) return toret @@ -148,7 +148,7 @@ def test_register_persistent_except_data_model_id_none(self): with self.assertRaises(ValueError): # Setup object given_name = 'storage_test.custom_obj' - obj = TestClass(given_name) + obj = TestClass(name=given_name) data_model = {"type": mockClass, "value_id": {"k": str}, "fields": {"a": int}} # Setup persistent storage @@ -180,7 +180,7 @@ def test_register_persistent_except_data_model_not_registered(self): with self.assertRaises(KeyError): # Setup object given_name = 'storage_test.custom_obj' - obj = TestClass(given_name) + obj = TestClass(name=given_name) data_model = {"type": mockClass, "value_id": {"k": str}, "fields": {"a": int}} # Setup persistent storage @@ -190,7 +190,7 @@ def test_register_persistent_except_data_model_not_registered(self): def test_register_persistent_obj_dict_ints(self): given_name = 'storage_test.custom_obj' config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - obj = TestClass(given_name) + obj = TestClass(name=given_name) myid = obj.getID() name = obj.get_name() data_model = {"type": TestClass, "value_id": {"k": str}, "fields": {"a": int}} @@ -207,7 +207,7 @@ def test_register_persistent_obj_dict_ints(self): def test_register_persistent_obj_storage_obj(self): given_name = 'storage_test.custom_obj' config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - obj = TestClass(given_name) + obj = TestClass(name=given_name) myid = obj.getID() name = obj.get_name() data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": str, "b": str}} @@ -224,7 +224,7 @@ def test_register_persistent_obj_storage_obj(self): def test_register_persistent_obj_storage_dict(self): given_name = 'storage_test.custom_obj' config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - obj = TestClass(given_name) + obj = TestClass(name=given_name) myid = obj.getID() name = obj.get_name() data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": str, "b": str}} @@ -241,7 +241,7 @@ def test_register_persistent_obj_storage_dict(self): def test_register_persistent_obj_storage_numpy(self): given_name = 'storage_test.custom_obj' config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - obj = TestClass(given_name) + obj = TestClass(name=given_name) myid = obj.getID() name = obj.get_name() data_model = {"type": StorageNumpy, "value_id": {"k": int}, "fields": {"a": str, "b": str}} From 202d1e6287be113d999f3d5ce572a77a998d3759 Mon Sep 17 00:00:00 2001 From: Ismael Date: Wed, 27 Nov 2019 12:28:58 +0100 Subject: [PATCH 30/81] register modification --- storage/cql_iface/cql_iface.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index 22365c4c..b582ab3a 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -1,4 +1,4 @@ -import uuid +from uuid import UUID from storage.cql_iface.tests.mockIStorage import IStorage from .config import _hecuba2cassandra_typemap @@ -12,6 +12,7 @@ class CQLIface(StorageIface): + data_model_hcache = [] # DataModelID - DataModelDef data_models_cache = {} # StorageID - DataModelID @@ -47,7 +48,7 @@ def add_data_model(self, definition: dict) -> int: raise KeyError("Expected keys 'type', 'value_id' and 'fields'") if not (isinstance(definition["value_id"], dict) and isinstance(definition["fields"], dict)): raise TypeError("Expected keys 'value_id' and 'fields' to be dict") - if definition["type"] is StorageObj and not all([definition["value_id"][k] is uuid.UUID for k in definition["value_id"].keys()]): + if definition["type"] is StorageObj and not all([definition["value_id"][k] is UUID for k in definition["value_id"].keys()]): raise TypeError("If the type is StorageObj the value_id values must be of type uuid") if not issubclass(definition["type"], IStorage): raise TypeError("Class must inherit IStorage") @@ -62,7 +63,7 @@ def add_data_model(self, definition: dict) -> int: CqlCOMM.register_data_model(datamodel_id, definition) return datamodel_id - def register_persistent_object(self, datamodel_id: int, pyobject: IStorage) -> uuid.UUID: + def register_persistent_object(self, datamodel_id: int, pyobject: IStorage) -> UUID: if not isinstance(pyobject, IStorage): raise RuntimeError("Class does not inherit IStorage") elif not pyobject.is_persistent(): @@ -74,18 +75,18 @@ def register_persistent_object(self, datamodel_id: int, pyobject: IStorage) -> u except KeyError: raise KeyError("Before making a pyobject persistent, the data model needs to be registered") object_id = pyobject.getID() - try: - self.object_to_data_model[object_id] - except KeyError: - self.object_to_data_model[object_id] = datamodel_id + # TODO an object to data model can have more than 1 data model id, because the class and name can be the same one for different datamodels, for now we replace AND we change the name of the class in order to create hcache (another problem) + self.object_to_data_model[object_id] = datamodel_id object_name = pyobject.get_name() CqlCOMM.register_istorage(object_id, object_name, data_model) CqlCOMM.create_table(object_name, data_model) obj_class = pyobject.__class__.__name__ - if obj_class not in self.hcache_by_class: + if datamodel_id not in self.data_model_hcache or obj_class not in self.hcache_by_class or object_name \ + not in self.hcache_by_name or not object_id in self.hcache_by_id: hc = CqlCOMM.create_hcache(object_id, object_name, data_model) self.hcache_by_class[obj_class] = hc - self.hcache_by_name[pyobject.get_name()] = hc + self.hcache_by_name[object_name] = hc self.hcache_by_id[object_id] = hc + self.data_model_hcache.append(datamodel_id) return object_id From 9fde14e9ec116591da9e5b9c845a461a76b3ebcb Mon Sep 17 00:00:00 2001 From: Ismael Date: Wed, 27 Nov 2019 13:44:54 +0100 Subject: [PATCH 31/81] basic implementation + tests --- storage/cql_iface/cql_comm.py | 19 ++++++--- storage/cql_iface/cql_iface.py | 62 ++++++++++++++++++++++++---- storage/cql_iface/tests/api_tests.py | 26 ++++++++++-- 3 files changed, 90 insertions(+), 17 deletions(-) diff --git a/storage/cql_iface/cql_comm.py b/storage/cql_iface/cql_comm.py index 6fef55f3..f5d01341 100644 --- a/storage/cql_iface/cql_comm.py +++ b/storage/cql_iface/cql_comm.py @@ -91,12 +91,14 @@ def create_hcache(object_id: UUID, name: str, definition: dict) -> Union[object, ksp, table = extract_ksp_table(name) if issubclass(definition.get("type", None), StorageObj): class HcacheWrapper(object): - def __init__(self, attributes, object_id, ksp, table): + def __init__(self, definition, object_id, ksp, table): self.internal_caches = {} self.object_id = object_id - for attr in attributes: - self.internal_caches[attr] = Hcache( - CqlCOMM.hcache_parameters_generator(ksp, table, object_id, ["storage_id"], [attr])) + for col in definition["fields"].keys(): + self.internal_caches[col] = Hcache(*CqlCOMM.hcache_parameters_generator(ksp, table, object_id, + list(definition[ + "value_id"].keys()), + [col])) def get_row(self, attr): return self.internal_caches[attr].get_row([self.object_id])[0] @@ -104,7 +106,7 @@ def get_row(self, attr): def put_row(self, attr, val): self.internal_caches[attr].put_row([self.object_id], [val]) - return HcacheWrapper(definition["fields"].keys(), object_id, ksp, table) + return HcacheWrapper(definition, object_id, ksp, table) else: keys = [k for k in definition["value_id"].keys()] @@ -117,5 +119,10 @@ def put_row(self, attr, val): @staticmethod def delete_data(object_id): + res = config.execute(istorage_read_entry, [object_id]) + if res: + res = res.one() + else: + raise ValueError("There are no records with the specified object_id") config.execute(istorage_remove_entry, [object_id]) - # TODO Use res to delete the appropriate data, maybe async + config.execute(f'TRUNCATE TABLE {res.name}', None) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index 7bb876c4..de38256c 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -1,4 +1,5 @@ import uuid +from typing import List from uuid import UUID from storage.cql_iface.tests.mockIStorage import IStorage @@ -6,12 +7,17 @@ from .cql_comm import CqlCOMM from ..storage_iface import StorageIface +from storage.cql_iface.tests.mockhnumpy import StorageNumpy + +from storage.cql_iface.tests.mockhdict import StorageDict +from .tests.mockStorageObj import StorageObj """ Mockup on how the Cassandra implementation of the interface could work. """ class CQLIface(StorageIface): + data_model_hcache = [] # DataModelID - DataModelDef data_models_cache = {} # StorageID - DataModelID @@ -72,19 +78,19 @@ def register_persistent_object(self, datamodel_id: int, pyobject: IStorage) -> U except KeyError: raise KeyError("Before making a pyobject persistent, the data model needs to be registered") object_id = pyobject.getID() - try: - self.object_to_data_model[object_id] - except KeyError: - self.object_to_data_model[object_id] = datamodel_id + # TODO an object to data model can have more than 1 data model id, because the class and name can be the same one for different datamodels, for now we replace AND we change the name of the class in order to create hcache (another problem) + self.object_to_data_model[object_id] = datamodel_id object_name = pyobject.get_name() CqlCOMM.register_istorage(object_id, object_name, data_model) CqlCOMM.create_table(object_name, data_model) obj_class = pyobject.__class__.__name__ - if obj_class not in self.hcache_by_class: + if datamodel_id not in self.data_model_hcache or obj_class not in self.hcache_by_class or object_name \ + not in self.hcache_by_name or not object_id in self.hcache_by_id: hc = CqlCOMM.create_hcache(object_id, object_name, data_model) self.hcache_by_class[obj_class] = hc - self.hcache_by_name[pyobject.get_name()] = hc + self.hcache_by_name[object_name] = hc self.hcache_by_id[object_id] = hc + self.data_model_hcache.append(datamodel_id) return object_id def delete_persistent_object(self, object_id: UUID): @@ -94,6 +100,48 @@ def delete_persistent_object(self, object_id: UUID): raise ValueError("The object_id is not an UUID") try: CqlCOMM.delete_data(object_id) - except Exception: + except ValueError: return False return True + + def put_record(self, object_id: UUID, key_list: List[object], value_list: List[object]) -> None: + try: + UUID(str(object_id)) + except ValueError: + raise ValueError("The object_id is not an UUID") + try: + self.hcache_by_id[object_id] + except KeyError: + raise KeyError("hcache must be registered before in the function register_persistent_object") + if not isinstance(key_list, list) and not isinstance(value_list, list): + raise TypeError("key_list and value_list must be lists") + if not (key_list and value_list): + raise ValueError("key_list and value_list cannot be None") + data_model = self.data_models_cache[self.object_to_data_model[object_id]] + + if issubclass(data_model["type"], StorageObj): + if not len(key_list) == len(value_list): + raise ValueError("key_list and value_list must have the same length") + if not (all(x in data_model["fields"].keys() for x in key_list)): + raise KeyError("value_list must have the keys that exist in the data model") + dict_of_kv = dict(zip(key_list, value_list)) + if not all([isinstance(dict_of_kv[k], data_model["fields"][k]) for k in + key_list]): + raise TypeError("the value types must be of the same class types as the data model") + for key, value in zip(key_list, value_list): + self.hcache_by_id[object_id].put_row(key, value) + elif issubclass(data_model["type"], StorageDict): + if len(key_list) != len(data_model["value_id"].keys()) or len(value_list) != len( + data_model["fields"].keys()): + raise ValueError( + "The length of the keys and values should be the same one as the data model definition") + if not all([isinstance(ke, kc) for ke, kc in zip(key_list, data_model["value_id"].values())]): + raise TypeError("The key types don't match the data model specification") + if not all([isinstance(ke, kc) for ke, kc in zip(value_list, data_model["fields"].values())]): + raise TypeError("The value types don't match the data model specification") + self.hcache_by_id[object_id].put_row(key_list, value_list) + + elif issubclass(data_model["type"], StorageNumpy): + raise NotImplemented("The class type is not supported") + else: + raise NotImplemented("The class type is not supported") \ No newline at end of file diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index 1235d4ef..b694c3ed 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -263,13 +263,11 @@ def test_delete_persistent_except_object_id_not_uuid(self): storage = CQLIface() data_model_id = storage.add_data_model(data_model) - # Setup persistent storage - storage = CQLIface() storage.register_persistent_object(data_model_id, obj) storage.delete_persistent_object('exc') - def test_delete_persistent_object(self): + def test_delete_persistent_except_no_records_object_id(self): given_name = 'storage_test.dict' config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) @@ -277,15 +275,35 @@ def test_delete_persistent_object(self): obj = TestClass(given_name) myid = obj.getID() name = obj.get_name() - data_model = {"type": StorageNumpy, "value_id": {"k": int}, "fields": {"a": str, "b": str}} + data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": str, "b": str}} # Setup persistent storage storage = CQLIface() data_model_id = storage.add_data_model(data_model) + is_correct = storage.delete_persistent_object(myid) + self.assertFalse(is_correct) + + def test_delete_persistent_object(self): + given_name = 'storage_test.dict' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + # Setup object + obj = TestClass(given_name) + myid = obj.getID() + name = obj.get_name() + data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": str, "b": str}} + # Setup persistent storage storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + fields_ids = [8] + values = ["a", "b"] + storage.put_record(myid, fields_ids, values) + storage.delete_persistent_object(myid) res = config.session.execute("SELECT * FROM hecuba.istorage WHERE storage_id={}".format(myid)) self.assertIsNone(res.one()) From 03fc691eb2182ebd807d983389a135dcc6eda7ef Mon Sep 17 00:00:00 2001 From: Ismael Date: Thu, 28 Nov 2019 09:03:52 +0100 Subject: [PATCH 32/81] get record code --- storage/cql_iface/cql_iface.py | 26 +++++++++++++++++++++++--- storage/storage_iface.py | 10 ++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index 65cd8df1..c2e98716 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -117,7 +117,7 @@ def put_record(self, object_id: UUID, key_list: List[object], value_list: List[o if not (all(x in data_model["fields"].keys() for x in key_list)): raise KeyError("value_list must have the keys that exist in the data model") dict_of_kv = dict(zip(key_list, value_list)) - if not all([isinstance(dict_of_kv[k], data_model["fields"][k]) for k in + if not all([isinstance(dict_of_kv[k], data_model["fields"][k]) or dict_of_kv[k] is None for k in key_list]): raise TypeError("the value types must be of the same class types as the data model") for key, value in zip(key_list, value_list): @@ -127,11 +127,31 @@ def put_record(self, object_id: UUID, key_list: List[object], value_list: List[o raise ValueError("The length of the keys and values should be the same one as the data model definition") if not all([isinstance(ke, kc) for ke, kc in zip(key_list, data_model["value_id"].values())]): raise TypeError("The key types don't match the data model specification") - if not all([isinstance(ke, kc) for ke, kc in zip(value_list, data_model["fields"].values())]): + if not all([isinstance(ke, kc) or ke is None for ke, kc in zip(value_list, data_model["fields"].values())]): raise TypeError("The value types don't match the data model specification") self.hcache_by_id[object_id].put_row(key_list, value_list) elif issubclass(data_model["type"], StorageNumpy): raise NotImplemented("The class type is not supported") else: - raise NotImplemented("The class type is not supported") \ No newline at end of file + raise NotImplemented("The class type is not supported") + + def get_record(self, object_id: UUID, key_list: List[object]) -> List[object]: + results = [] + try: + UUID(str(object_id)) + except ValueError: + raise ValueError("The object_id is not an UUID") + if not key_list: + raise TypeError("key_list cannot be None") + if not isinstance(key_list, list): + raise TypeError("key_list must be a list") + try: + hcache = self.hcache_by_id[object_id] + except KeyError: + raise KeyError("The object_id is not registered as a persistent object") + try: + results.append(hcache.get_row(key_list)) + except Exception: + results.append([]) + return results diff --git a/storage/storage_iface.py b/storage/storage_iface.py index a9d5f233..22f4f303 100644 --- a/storage/storage_iface.py +++ b/storage/storage_iface.py @@ -36,4 +36,14 @@ def put_record(self, object_id: UUID, key_list: List[object], value_list: List[o :param value_list: List with the records to be stored. :return: - """ + pass + + @abstractmethod + def get_record(self, object_id: UUID, key_list: List[object]) -> List[object]: + """ + Returns a list with the records corresponding to the key_list for the Hecuba object referenced by `object_id`. + :param object_id: Hecuba object identifier + :param key_list: List with the keys of the records to be retrieved. + :return: List of the records corresponding to the keys contained in key_list + """ pass \ No newline at end of file From 1852ddce2566f26e022cc05b4eac18ad5e589758 Mon Sep 17 00:00:00 2001 From: Ismael Date: Thu, 28 Nov 2019 09:05:16 +0100 Subject: [PATCH 33/81] Revert "get record code" This reverts commit 03fc691eb2182ebd807d983389a135dcc6eda7ef. --- storage/cql_iface/cql_iface.py | 26 +++----------------------- storage/storage_iface.py | 10 ---------- 2 files changed, 3 insertions(+), 33 deletions(-) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index c2e98716..65cd8df1 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -117,7 +117,7 @@ def put_record(self, object_id: UUID, key_list: List[object], value_list: List[o if not (all(x in data_model["fields"].keys() for x in key_list)): raise KeyError("value_list must have the keys that exist in the data model") dict_of_kv = dict(zip(key_list, value_list)) - if not all([isinstance(dict_of_kv[k], data_model["fields"][k]) or dict_of_kv[k] is None for k in + if not all([isinstance(dict_of_kv[k], data_model["fields"][k]) for k in key_list]): raise TypeError("the value types must be of the same class types as the data model") for key, value in zip(key_list, value_list): @@ -127,31 +127,11 @@ def put_record(self, object_id: UUID, key_list: List[object], value_list: List[o raise ValueError("The length of the keys and values should be the same one as the data model definition") if not all([isinstance(ke, kc) for ke, kc in zip(key_list, data_model["value_id"].values())]): raise TypeError("The key types don't match the data model specification") - if not all([isinstance(ke, kc) or ke is None for ke, kc in zip(value_list, data_model["fields"].values())]): + if not all([isinstance(ke, kc) for ke, kc in zip(value_list, data_model["fields"].values())]): raise TypeError("The value types don't match the data model specification") self.hcache_by_id[object_id].put_row(key_list, value_list) elif issubclass(data_model["type"], StorageNumpy): raise NotImplemented("The class type is not supported") else: - raise NotImplemented("The class type is not supported") - - def get_record(self, object_id: UUID, key_list: List[object]) -> List[object]: - results = [] - try: - UUID(str(object_id)) - except ValueError: - raise ValueError("The object_id is not an UUID") - if not key_list: - raise TypeError("key_list cannot be None") - if not isinstance(key_list, list): - raise TypeError("key_list must be a list") - try: - hcache = self.hcache_by_id[object_id] - except KeyError: - raise KeyError("The object_id is not registered as a persistent object") - try: - results.append(hcache.get_row(key_list)) - except Exception: - results.append([]) - return results + raise NotImplemented("The class type is not supported") \ No newline at end of file diff --git a/storage/storage_iface.py b/storage/storage_iface.py index 22f4f303..a9d5f233 100644 --- a/storage/storage_iface.py +++ b/storage/storage_iface.py @@ -36,14 +36,4 @@ def put_record(self, object_id: UUID, key_list: List[object], value_list: List[o :param value_list: List with the records to be stored. :return: - """ - pass - - @abstractmethod - def get_record(self, object_id: UUID, key_list: List[object]) -> List[object]: - """ - Returns a list with the records corresponding to the key_list for the Hecuba object referenced by `object_id`. - :param object_id: Hecuba object identifier - :param key_list: List with the keys of the records to be retrieved. - :return: List of the records corresponding to the keys contained in key_list - """ pass \ No newline at end of file From a309da30f67e3c92d2b3a8cd0cb00a0ec62e2d2c Mon Sep 17 00:00:00 2001 From: Ismael Date: Fri, 29 Nov 2019 10:04:18 +0100 Subject: [PATCH 34/81] some functions fixed + tests, 1 will fail --- storage/cql_iface/config.py | 5 +- storage/cql_iface/cql_comm.py | 22 +++++- storage/cql_iface/cql_iface.py | 56 +++++++++---- storage/cql_iface/tests/api_tests.py | 113 ++++++++++++++++++++++++++- 4 files changed, 170 insertions(+), 26 deletions(-) diff --git a/storage/cql_iface/config.py b/storage/cql_iface/config.py index 3d21b966..161c680e 100644 --- a/storage/cql_iface/config.py +++ b/storage/cql_iface/config.py @@ -1,6 +1,7 @@ import datetime import decimal import uuid +from typing import FrozenSet, Tuple import numpy import logging @@ -13,8 +14,8 @@ str: 'text', bytearray: 'blob', bytes: 'blob', - tuple: 'tuple', - frozenset: 'set', + Tuple: 'tuple', + FrozenSet: 'set', decimal.Decimal: 'decimal', datetime.date: 'date', datetime.datetime: 'datetime', diff --git a/storage/cql_iface/cql_comm.py b/storage/cql_iface/cql_comm.py index 29a84f36..0f7cce9d 100644 --- a/storage/cql_iface/cql_comm.py +++ b/storage/cql_iface/cql_comm.py @@ -1,4 +1,4 @@ -from typing import Union +from typing import Union, Tuple, FrozenSet from uuid import UUID import numpy @@ -44,6 +44,20 @@ def register_data_model(data_model_id: int, definition: dict) -> None: # extract keys, values and so on pass + @staticmethod + def parse_definition_to_cass_format(fields_dict): + all_values = "" + for k, v in fields_dict.items(): + try: + all_values = all_values + "%s %s," % (k, _hecuba2cassandra_typemap[v]) + except KeyError: + val = str(v) + if issubclass(v.__origin__, Tuple): + all_values = all_values + str(k) + f" tuple<{val[val.find('[') + 1:val.rfind(']')]}>," + elif issubclass(v.__origin__, FrozenSet): + all_values = all_values + str(k) + f" frozen >," + return all_values[:-1] + @staticmethod def create_table(name: str, definition: dict) -> None: # StorageObj for now @@ -58,9 +72,9 @@ def create_table(name: str, definition: dict) -> None: if definition["type"] is numpy.ndarray: pks = "(storage_id, cluster_id),block_id" - all_keys = ",".join("%s %s" % (k, _hecuba2cassandra_typemap[v]) for k, v in primary_keys.items()) - all_cols = ",".join("%s %s" % (k, _hecuba2cassandra_typemap[v]) for k, v in columns.items()) - if all_cols: + all_keys = CqlCOMM.parse_definition_to_cass_format(primary_keys) + if columns: + all_cols = CqlCOMM.parse_definition_to_cass_format(columns) total_cols = all_keys + ',' + all_cols else: total_cols = all_keys diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index 65cd8df1..a6c0a8b4 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -1,5 +1,5 @@ import itertools -from typing import List +from typing import List, Tuple, FrozenSet from uuid import UUID from storage.cql_iface.tests.mockhnumpy import StorageNumpy @@ -18,7 +18,7 @@ class CQLIface(StorageIface): - data_model_hcache = [] + hcache_datamodel = [] # DataModelID - DataModelDef data_models_cache = {} # StorageID - DataModelID @@ -43,9 +43,16 @@ def check_values_from_definition(definition): CQLIface.check_values_from_definition(v) else: try: - _hecuba2cassandra_typemap[definition] - except KeyError: - raise TypeError(f"The type {definition} is not supported") + if isinstance(definition.__origin__, (Tuple, FrozenSet)): + try: + _hecuba2cassandra_typemap[definition.__origin__] + except KeyError: + raise TypeError(f"The type {definition} is not supported") + except AttributeError: + try: + _hecuba2cassandra_typemap[definition] + except KeyError: + raise TypeError(f"The type {definition} is not supported") def add_data_model(self, definition: dict) -> int: if not isinstance(definition, dict): @@ -60,6 +67,8 @@ def add_data_model(self, definition: dict) -> int: raise TypeError("Class must inherit IStorage") dm = sorted(definition.items()) datamodel_id = hash(str(dm)) + print(datamodel_id) + print(self.data_models_cache.keys()) try: self.data_models_cache[datamodel_id] except KeyError: @@ -81,19 +90,17 @@ def register_persistent_object(self, datamodel_id: int, pyobject: IStorage) -> U except KeyError: raise KeyError("Before making a pyobject persistent, the data model needs to be registered") object_id = pyobject.getID() - #TODO an object to data model can have more than 1 data model id, because the class and name can be the same one for different datamodels, for now we replace AND we change the name of the class in order to create hcache (another problem) self.object_to_data_model[object_id] = datamodel_id object_name = pyobject.get_name() CqlCOMM.register_istorage(object_id, object_name, data_model) CqlCOMM.create_table(object_name, data_model) obj_class = pyobject.__class__.__name__ - if datamodel_id not in self.data_model_hcache or obj_class not in self.hcache_by_class or object_name \ - not in self.hcache_by_name or not object_id in self.hcache_by_id: + if datamodel_id not in self.well or obj_class not in self.hcache_by_class or object_name not in self.hcache_by_name or object_id not in self.hcache_by_id: + self.hcache_datamodel.append(datamodel_id) hc = CqlCOMM.create_hcache(object_id, object_name, data_model) self.hcache_by_class[obj_class] = hc self.hcache_by_name[object_name] = hc self.hcache_by_id[object_id] = hc - self.data_model_hcache.append(datamodel_id) return object_id def put_record(self, object_id: UUID, key_list: List[object], value_list: List[object]) -> None: @@ -117,20 +124,37 @@ def put_record(self, object_id: UUID, key_list: List[object], value_list: List[o if not (all(x in data_model["fields"].keys() for x in key_list)): raise KeyError("value_list must have the keys that exist in the data model") dict_of_kv = dict(zip(key_list, value_list)) - if not all([isinstance(dict_of_kv[k], data_model["fields"][k]) for k in - key_list]): - raise TypeError("the value types must be of the same class types as the data model") + for k in key_list: + try: + if not isinstance(dict_of_kv[k], data_model["fields"][k]) and dict_of_kv[k] is not None: + raise Exception("the value types must be of the same class types as the data model") + except TypeError: + if not isinstance(dict_of_kv[k], data_model["fields"][k].__origin__): + raise TypeError("The value types don't match the data model specification") for key, value in zip(key_list, value_list): self.hcache_by_id[object_id].put_row(key, value) elif issubclass(data_model["type"], StorageDict): if len(key_list) != len(data_model["value_id"].keys()) or len(value_list) != len(data_model["fields"].keys()): raise ValueError("The length of the keys and values should be the same one as the data model definition") - if not all([isinstance(ke, kc) for ke, kc in zip(key_list, data_model["value_id"].values())]): - raise TypeError("The key types don't match the data model specification") - if not all([isinstance(ke, kc) for ke, kc in zip(value_list, data_model["fields"].values())]): - raise TypeError("The value types don't match the data model specification") + + for ke, kc in zip(key_list, data_model["value_id"].values()): + try: + if not isinstance(ke, kc): + raise Exception("The key types don't match the data model specification") + except TypeError: + if not isinstance(ke, kc.__origin__): + raise TypeError("The key types don't match the data model specification") + + for ke, kc in zip(value_list, data_model["fields"].values()): + try: + if not isinstance(ke, kc) and ke is not None: + raise Exception("The value types don't match the data model specification") + except TypeError: + if not isinstance(ke, kc.__origin__): + raise TypeError("The value types don't match the data model specification") self.hcache_by_id[object_id].put_row(key_list, value_list) + elif issubclass(data_model["type"], StorageNumpy): raise NotImplemented("The class type is not supported") else: diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index 4e800305..333d8e3e 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -2,6 +2,7 @@ import time import unittest import uuid +from typing import Tuple, FrozenSet import numpy @@ -15,7 +16,7 @@ class TestClass(IStorage): - def __new__(cls, *args, name='', **kwargs): + def __new__(cls, name='', *args, **kwargs): toret = super(TestClass, cls).__new__(cls, name) return toret @@ -357,7 +358,7 @@ def test_put_record_except_key_not_exist(self): storage.put_record(myid, ["d"], ["a"]) def test_put_record_except_values_not_same_class(self): - with self.assertRaises(TypeError): + with self.assertRaises(Exception): given_name = 'storage_test.complex_obj' config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) @@ -398,6 +399,32 @@ def test_put_record_StorageObj(self): for val, ret_val in zip(values, returned_values): self.assertEqual(val, ret_val) + def test_put_record_StorageObj_val_nones(self): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass2(name=given_name) + myid = obj.getID() + data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} + given_name = 'storage_test.dict' + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + fields_ids = ["a", "b", "c"] + values = [None, None, None] + storage.put_record(myid, fields_ids, values) + + returned_values = [] + hcache = storage.hcache_by_id[myid] + for key in fields_ids: + returned_values.append(hcache.get_row(key)) + + self.assertEqual(len(values), len(returned_values)) + + for val, ret_val in zip(values, returned_values): + self.assertEqual(val, ret_val) + def test_put_record_except_values_fields_not_same_size_as_data_model(self): with self.assertRaises(ValueError): given_name = 'storage_test.complex_obj' @@ -426,7 +453,7 @@ def test_put_record_except_values_fields_not_same_size_as_data_model(self): self.assertEqual(val, ret_val) def test_put_record_except_keys_not_mach_data_model_type(self): - with self.assertRaises(TypeError): + with self.assertRaises(Exception): given_name = 'storage_test.complex_obj' config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) @@ -453,7 +480,7 @@ def test_put_record_except_keys_not_mach_data_model_type(self): self.assertEqual(val, ret_val) def test_put_record_except_values_not_mach_data_model_type(self): - with self.assertRaises(TypeError): + with self.assertRaises(Exception): given_name = 'storage_test.complex_obj' config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) @@ -505,6 +532,84 @@ def test_put_record_StorageDict(self): for val, ret_val in zip(values, returned_values[0]): self.assertEqual(val, ret_val) + def test_put_record_StorageDict_with_val_nones(self): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass(name=given_name) + myid = obj.getID() + data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": int, "b": str, "c": float}} + given_name = 'storage_test.dict' + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + fields_ids = [8] + values = [None, None, None] + storage.put_record(myid, fields_ids, values) + + returned_values = [] + hcache = storage.hcache_by_id[myid] + for key in fields_ids: + returned_values.append(hcache.get_row([key])) + + self.assertEqual(len(values), len(returned_values[0])) + + for val, ret_val in zip(values, returned_values[0]): + self.assertEqual(val, ret_val) + + def test_put_record_StorageDict_except_with_key_nones(self): + with self.assertRaises(Exception): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass(name=given_name) + myid = obj.getID() + data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": int, "b": str, "c": float}} + given_name = 'storage_test.dict' + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + fields_ids = [None] + values = [9, 'a', 9.0] + storage.put_record(myid, fields_ids, values) + + returned_values = [] + hcache = storage.hcache_by_id[myid] + for key in fields_ids: + returned_values.append(hcache.get_row([key])) + + self.assertEqual(len(values), len(returned_values[0])) + + for val, ret_val in zip(values, returned_values[0]): + self.assertEqual(val, ret_val) + + def test_put_record_StorageDict_complex(self): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass(name=given_name) + myid = obj.getID() + data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": Tuple[int, int], "b": bool, "c": str}} + given_name = 'storage_test.dict' + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + fields_ids = [8] + values = [(3, 4), True, "test"] + storage.put_record(myid, fields_ids, values) + + returned_values = [] + hcache = storage.hcache_by_id[myid] + for key in fields_ids: + returned_values.append(hcache.get_row([key])) + + self.assertEqual(len(values), len(returned_values[0])) + + for val, ret_val in zip(values, returned_values[0]): + self.assertEqual(val, ret_val) if __name__ == "__main__": unittest.main() From 9696aa0e8566585be0e4404275ae8bc8c2288037 Mon Sep 17 00:00:00 2001 From: Ismael Date: Fri, 29 Nov 2019 11:12:26 +0100 Subject: [PATCH 35/81] register modif --- storage/cql_iface/cql_iface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index a6c0a8b4..188a7c53 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -95,7 +95,7 @@ def register_persistent_object(self, datamodel_id: int, pyobject: IStorage) -> U CqlCOMM.register_istorage(object_id, object_name, data_model) CqlCOMM.create_table(object_name, data_model) obj_class = pyobject.__class__.__name__ - if datamodel_id not in self.well or obj_class not in self.hcache_by_class or object_name not in self.hcache_by_name or object_id not in self.hcache_by_id: + if data_model not in self.hcache_datamodel or object_name not in self.hcache_by_name or object_id not in self.hcache_by_id: self.hcache_datamodel.append(datamodel_id) hc = CqlCOMM.create_hcache(object_id, object_name, data_model) self.hcache_by_class[obj_class] = hc From 7944f633cca9106ad60e87946a69f9f626d0bf3c Mon Sep 17 00:00:00 2001 From: Ismael Date: Fri, 29 Nov 2019 11:14:15 +0100 Subject: [PATCH 36/81] register modif --- storage/cql_iface/cql_iface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index e11a8a28..ca4c539d 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -91,7 +91,7 @@ def register_persistent_object(self, datamodel_id: int, pyobject: IStorage) -> U CqlCOMM.register_istorage(object_id, object_name, data_model) CqlCOMM.create_table(object_name, data_model) obj_class = pyobject.__class__.__name__ - if datamodel_id not in self.hcache_datamodel or obj_class not in self.hcache_by_class or object_name not in self.hcache_by_name or object_id not in self.hcache_by_id: + if data_model not in self.hcache_datamodel or object_name not in self.hcache_by_name or object_id not in self.hcache_by_id: self.hcache_datamodel.append(datamodel_id) hc = CqlCOMM.create_hcache(object_id, object_name, data_model) self.hcache_by_class[obj_class] = hc From 44a86ddccde98609058ae9987f969d6ffb1f8dce Mon Sep 17 00:00:00 2001 From: Ismael Date: Mon, 2 Dec 2019 10:00:42 +0100 Subject: [PATCH 37/81] reg changes --- storage/cql_iface/cql_iface.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index 188a7c53..f87b37d3 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -67,8 +67,6 @@ def add_data_model(self, definition: dict) -> int: raise TypeError("Class must inherit IStorage") dm = sorted(definition.items()) datamodel_id = hash(str(dm)) - print(datamodel_id) - print(self.data_models_cache.keys()) try: self.data_models_cache[datamodel_id] except KeyError: From 1fdf8d3e6d1db0bbb6b8253cf826d272eb008c7a Mon Sep 17 00:00:00 2001 From: Ismael Date: Mon, 2 Dec 2019 10:21:34 +0100 Subject: [PATCH 38/81] discuss StorageObj case --- storage/cql_iface/cql_comm.py | 5 ++++- storage/cql_iface/cql_iface.py | 8 +++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/storage/cql_iface/cql_comm.py b/storage/cql_iface/cql_comm.py index f5d01341..efcebb61 100644 --- a/storage/cql_iface/cql_comm.py +++ b/storage/cql_iface/cql_comm.py @@ -125,4 +125,7 @@ def delete_data(object_id): else: raise ValueError("There are no records with the specified object_id") config.execute(istorage_remove_entry, [object_id]) - config.execute(f'TRUNCATE TABLE {res.name}', None) + if res[1].find('StorageObj') != -1: + pass + else: + config.execute(f'TRUNCATE TABLE {res.name}', None) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index de38256c..c3b50485 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -17,7 +17,7 @@ class CQLIface(StorageIface): - data_model_hcache = [] + hcache_datamodel = [] # DataModelID - DataModelDef data_models_cache = {} # StorageID - DataModelID @@ -78,19 +78,17 @@ def register_persistent_object(self, datamodel_id: int, pyobject: IStorage) -> U except KeyError: raise KeyError("Before making a pyobject persistent, the data model needs to be registered") object_id = pyobject.getID() - # TODO an object to data model can have more than 1 data model id, because the class and name can be the same one for different datamodels, for now we replace AND we change the name of the class in order to create hcache (another problem) self.object_to_data_model[object_id] = datamodel_id object_name = pyobject.get_name() CqlCOMM.register_istorage(object_id, object_name, data_model) CqlCOMM.create_table(object_name, data_model) obj_class = pyobject.__class__.__name__ - if datamodel_id not in self.data_model_hcache or obj_class not in self.hcache_by_class or object_name \ - not in self.hcache_by_name or not object_id in self.hcache_by_id: + if data_model not in self.hcache_datamodel or object_name not in self.hcache_by_name or object_id not in self.hcache_by_id: + self.hcache_datamodel.append(datamodel_id) hc = CqlCOMM.create_hcache(object_id, object_name, data_model) self.hcache_by_class[obj_class] = hc self.hcache_by_name[object_name] = hc self.hcache_by_id[object_id] = hc - self.data_model_hcache.append(datamodel_id) return object_id def delete_persistent_object(self, object_id: UUID): From 9fd1c16822e76b3c8c8353fe86409da0d00747b9 Mon Sep 17 00:00:00 2001 From: Ismael Date: Tue, 3 Dec 2019 09:18:06 +0100 Subject: [PATCH 39/81] added NameTuple in the tests --- storage/cql_iface/cql_iface.py | 56 ++-- storage/cql_iface/tests/api_tests.py | 383 ++++++++++++++------------- 2 files changed, 232 insertions(+), 207 deletions(-) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index f87b37d3..f0d607e4 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -1,4 +1,5 @@ import itertools +from collections import OrderedDict from typing import List, Tuple, FrozenSet from uuid import UUID @@ -101,7 +102,7 @@ def register_persistent_object(self, datamodel_id: int, pyobject: IStorage) -> U self.hcache_by_id[object_id] = hc return object_id - def put_record(self, object_id: UUID, key_list: List[object], value_list: List[object]) -> None: + def put_record(self, object_id: UUID, key_list: OrderedDict, value_list: OrderedDict) -> None: try: UUID(str(object_id)) except ValueError: @@ -110,47 +111,48 @@ def put_record(self, object_id: UUID, key_list: List[object], value_list: List[o self.hcache_by_id[object_id] except KeyError: raise KeyError("hcache must be registered before in the function register_persistent_object") - if not isinstance(key_list, list) and not isinstance(value_list, list): - raise TypeError("key_list and value_list must be lists") + if not isinstance(key_list, OrderedDict) and not isinstance(value_list, OrderedDict): + raise TypeError("key_list and value_list must be OrderedDict") if not (key_list and value_list): raise ValueError("key_list and value_list cannot be None") data_model = self.data_models_cache[self.object_to_data_model[object_id]] - if issubclass(data_model["type"], StorageObj): - if not len(key_list) == len(value_list): - raise ValueError("key_list and value_list must have the same length") - if not (all(x in data_model["fields"].keys() for x in key_list)): - raise KeyError("value_list must have the keys that exist in the data model") - dict_of_kv = dict(zip(key_list, value_list)) - for k in key_list: - try: - if not isinstance(dict_of_kv[k], data_model["fields"][k]) and dict_of_kv[k] is not None: - raise Exception("the value types must be of the same class types as the data model") - except TypeError: - if not isinstance(dict_of_kv[k], data_model["fields"][k].__origin__): - raise TypeError("The value types don't match the data model specification") - for key, value in zip(key_list, value_list): - self.hcache_by_id[object_id].put_row(key, value) - elif issubclass(data_model["type"], StorageDict): + # if issubclass(data_model["type"], StorageObj): + # if not len(key_list) == len(value_list): + # raise ValueError("key_list and value_list must have the same length") + # if not (all(x in data_model["fields"].keys() for x in key_list)): + # raise KeyError("value_list must have the keys that exist in the data model") + # dict_of_kv = dict(zip(key_list, value_list)) + # for k in key_list: + # try: + # if not isinstance(dict_of_kv[k], data_model["fields"][k]) and dict_of_kv[k] is not None: + # raise Exception("the value types must be of the same class types as the data model") + # except TypeError: + # if not isinstance(dict_of_kv[k], data_model["fields"][k].__origin__): + # raise TypeError("The value types don't match the data model specification") + # for key, value in zip(key_list, value_list): + # self.hcache_by_id[object_id].put_row(key, value) + if issubclass(data_model["type"], StorageDict): if len(key_list) != len(data_model["value_id"].keys()) or len(value_list) != len(data_model["fields"].keys()): raise ValueError("The length of the keys and values should be the same one as the data model definition") - for ke, kc in zip(key_list, data_model["value_id"].values()): + for k, v in zip(key_list, value_list): try: - if not isinstance(ke, kc): + if not isinstance(key_list[k], data_model["value_id"][k]): raise Exception("The key types don't match the data model specification") except TypeError: - if not isinstance(ke, kc.__origin__): + if not isinstance(key_list[k], data_model["value_id"][k].__origin__): raise TypeError("The key types don't match the data model specification") - - for ke, kc in zip(value_list, data_model["fields"].values()): try: - if not isinstance(ke, kc) and ke is not None: + if not isinstance(value_list[v], data_model["fields"][v]) and value_list[v] is not None: raise Exception("The value types don't match the data model specification") except TypeError: - if not isinstance(ke, kc.__origin__): + if not isinstance(value_list[v], data_model["fields"][v].__origin__): raise TypeError("The value types don't match the data model specification") - self.hcache_by_id[object_id].put_row(key_list, value_list) + + # TODO After c++ works with OrderedDicts we will change the following line + + self.hcache_by_id[object_id].put_row(list(key_list.values()), list(value_list.values())) elif issubclass(data_model["type"], StorageNumpy): diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index 333d8e3e..f924de13 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -2,7 +2,7 @@ import time import unittest import uuid -from typing import Tuple, FrozenSet +from typing import Tuple, FrozenSet, NamedTuple import numpy @@ -293,137 +293,139 @@ def test_put_record_except_hcache_not_registered(self): values = [None, None, None] storage.put_record("", fields_ids, values) - def test_put_record_except_key_value_list_none(self): - with self.assertRaises(ValueError): - given_name = 'storage_test.complex_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - obj = TestClass(name=given_name) - myid = obj.getID() - data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} - storage = CQLIface() - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(data_model_id, obj) - - fields_ids = ["a", "b", "c"] - values = [None, None, None] - storage.put_record(myid, [], []) - - def test_put_record_except_key_value_list_type_list(self): - with self.assertRaises(TypeError): - given_name = 'storage_test.complex_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - obj = TestClass(name=given_name) - myid = obj.getID() - data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} - storage = CQLIface() - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(data_model_id, obj) - - fields_ids = ["a", "b", "c"] - values = [None, None, None] - storage.put_record(myid, ("b"), ("a")) - - def test_put_record_except_keys_values_list_not_same_length(self): - with self.assertRaises(ValueError): - given_name = 'storage_test.complex_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - obj = TestClass(name=given_name) - myid = obj.getID() - data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} - storage = CQLIface() - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(data_model_id, obj) - - fields_ids = ["a", "b", "c"] - values = [None, None] - storage.put_record(myid, fields_ids, values) - - def test_put_record_except_key_not_exist(self): - with self.assertRaises(KeyError): - given_name = 'storage_test.complex_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - obj = TestClass(name=given_name) - myid = obj.getID() - data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} - storage = CQLIface() - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(data_model_id, obj) - - fields_ids = ["a", "b", "c"] - values = [None, None, None] - storage.put_record(myid, ["d"], ["a"]) - - def test_put_record_except_values_not_same_class(self): - with self.assertRaises(Exception): - given_name = 'storage_test.complex_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - obj = TestClass(name=given_name) - myid = obj.getID() - data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} - storage = CQLIface() - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(data_model_id, obj) - - fields_ids = ["a", "b", "c"] - values = [None, None, None] - storage.put_record(myid, ["c"], ["a"]) - - def test_put_record_StorageObj(self): - given_name = 'storage_test.complex_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - obj = TestClass2(name=given_name) - myid = obj.getID() - data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} - given_name = 'storage_test.dict' - storage = CQLIface() - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(data_model_id, obj) - - fields_ids = ["a", "b", "c"] - values = [9, "a", 9.0] - storage.put_record(myid, fields_ids, values) - - returned_values = [] - hcache = storage.hcache_by_id[myid] - for key in fields_ids: - returned_values.append(hcache.get_row(key)) - - self.assertEqual(len(values), len(returned_values)) - - for val, ret_val in zip(values, returned_values): - self.assertEqual(val, ret_val) - - def test_put_record_StorageObj_val_nones(self): - given_name = 'storage_test.complex_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - obj = TestClass2(name=given_name) - myid = obj.getID() - data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} - given_name = 'storage_test.dict' - storage = CQLIface() - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(data_model_id, obj) - - fields_ids = ["a", "b", "c"] - values = [None, None, None] - storage.put_record(myid, fields_ids, values) - - returned_values = [] - hcache = storage.hcache_by_id[myid] - for key in fields_ids: - returned_values.append(hcache.get_row(key)) - - self.assertEqual(len(values), len(returned_values)) - - for val, ret_val in zip(values, returned_values): - self.assertEqual(val, ret_val) + # def test_put_record_except_key_value_list_none(self): + # with self.assertRaises(ValueError): + # given_name = 'storage_test.complex_obj' + # config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + # + # obj = TestClass(name=given_name) + # myid = obj.getID() + # data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} + # storage = CQLIface() + # data_model_id = storage.add_data_model(data_model) + # storage.register_persistent_object(data_model_id, obj) + # + # keys = NamedTuple('keys', [('k', uuid.UUID)]) + # keys = keys('a') + # fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', float)]) + # fields = fields('aname', 4, 3.8) + # storage.put_record(myid, keys, []) + # + # def test_put_record_except_key_value_list_type_list(self): + # with self.assertRaises(TypeError): + # given_name = 'storage_test.complex_obj' + # config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + # + # obj = TestClass(name=given_name) + # myid = obj.getID() + # data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} + # storage = CQLIface() + # data_model_id = storage.add_data_model(data_model) + # storage.register_persistent_object(data_model_id, obj) + # + # fields_ids = ["a", "b", "c"] + # values = [None, None, None] + # storage.put_record(myid, ("b"), ("a")) + # + # def test_put_record_except_keys_values_list_not_same_length(self): + # with self.assertRaises(ValueError): + # given_name = 'storage_test.complex_obj' + # config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + # + # obj = TestClass(name=given_name) + # myid = obj.getID() + # data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} + # storage = CQLIface() + # data_model_id = storage.add_data_model(data_model) + # storage.register_persistent_object(data_model_id, obj) + # + # fields_ids = ["a", "b", "c"] + # values = [None, None] + # storage.put_record(myid, fields_ids, values) + # + # def test_put_record_except_key_not_exist(self): + # with self.assertRaises(KeyError): + # given_name = 'storage_test.complex_obj' + # config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + # + # obj = TestClass(name=given_name) + # myid = obj.getID() + # data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} + # storage = CQLIface() + # data_model_id = storage.add_data_model(data_model) + # storage.register_persistent_object(data_model_id, obj) + # + # fields_ids = ["a", "b", "c"] + # values = [None, None, None] + # storage.put_record(myid, ["d"], ["a"]) + # + # def test_put_record_except_values_not_same_class(self): + # with self.assertRaises(Exception): + # given_name = 'storage_test.complex_obj' + # config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + # + # obj = TestClass(name=given_name) + # myid = obj.getID() + # data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} + # storage = CQLIface() + # data_model_id = storage.add_data_model(data_model) + # storage.register_persistent_object(data_model_id, obj) + # + # fields_ids = ["a", "b", "c"] + # values = [None, None, None] + # storage.put_record(myid, ["c"], ["a"]) + # + # def test_put_record_StorageObj(self): + # given_name = 'storage_test.complex_obj' + # config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + # + # obj = TestClass2(name=given_name) + # myid = obj.getID() + # data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} + # given_name = 'storage_test.dict' + # storage = CQLIface() + # data_model_id = storage.add_data_model(data_model) + # storage.register_persistent_object(data_model_id, obj) + # + # fields_ids = ["a", "b", "c"] + # values = [9, "a", 9.0] + # storage.put_record(myid, fields_ids, values) + # + # returned_values = [] + # hcache = storage.hcache_by_id[myid] + # for key in fields_ids: + # returned_values.append(hcache.get_row(key)) + # + # self.assertEqual(len(values), len(returned_values)) + # + # for val, ret_val in zip(values, returned_values): + # self.assertEqual(val, ret_val) + # + # def test_put_record_StorageObj_val_nones(self): + # given_name = 'storage_test.complex_obj' + # config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + # + # obj = TestClass2(name=given_name) + # myid = obj.getID() + # data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} + # given_name = 'storage_test.dict' + # storage = CQLIface() + # data_model_id = storage.add_data_model(data_model) + # storage.register_persistent_object(data_model_id, obj) + # + # fields_ids = ["a", "b", "c"] + # values = [None, None, None] + # storage.put_record(myid, fields_ids, values) + # + # returned_values = [] + # hcache = storage.hcache_by_id[myid] + # for key in fields_ids: + # returned_values.append(hcache.get_row(key)) + # + # self.assertEqual(len(values), len(returned_values)) + # + # for val, ret_val in zip(values, returned_values): + # self.assertEqual(val, ret_val) def test_put_record_except_values_fields_not_same_size_as_data_model(self): with self.assertRaises(ValueError): @@ -438,19 +440,22 @@ def test_put_record_except_values_fields_not_same_size_as_data_model(self): data_model_id = storage.add_data_model(data_model) storage.register_persistent_object(data_model_id, obj) - fields_ids = [8, 8] - values = [9, 'a', 9.0, 'a'] - storage.put_record(myid, fields_ids, values) + keys = NamedTuple('keys', [('k', int)]) + keys = keys(8)._asdict() + fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', float), ('d', str)]) + fields = fields(4, 'hola', 3.8, 'adeu')._asdict() + + storage.put_record(myid, keys, fields) returned_values = [] hcache = storage.hcache_by_id[myid] - for key in fields_ids: + for key in keys.values(): returned_values.append(hcache.get_row([key])) - self.assertEqual(len(values), len(returned_values[0])) + self.assertEqual(len(fields.values()), len(returned_values[0])) - for val, ret_val in zip(values, returned_values[0]): - self.assertEqual(val, ret_val) + for val, ret_val in zip(fields.values(), returned_values[0]): + self.assertAlmostEqual(val, ret_val) def test_put_record_except_keys_not_mach_data_model_type(self): with self.assertRaises(Exception): @@ -465,19 +470,22 @@ def test_put_record_except_keys_not_mach_data_model_type(self): data_model_id = storage.add_data_model(data_model) storage.register_persistent_object(data_model_id, obj) - fields_ids = ['a'] - values = [9, 'a', 9.0] - storage.put_record(myid, fields_ids, values) + keys = NamedTuple('keys', [('k', int)]) + keys = keys(8)._asdict() + fields = NamedTuple('fields', [('z', int), ('b', 'name'), ('c', float)]) + fields = fields(4, 'hola', 3.8)._asdict() + + storage.put_record(myid, keys, fields) returned_values = [] hcache = storage.hcache_by_id[myid] - for key in fields_ids: + for key in keys.values(): returned_values.append(hcache.get_row([key])) - self.assertEqual(len(values), len(returned_values[0])) + self.assertEqual(len(fields.values()), len(returned_values[0])) - for val, ret_val in zip(values, returned_values[0]): - self.assertEqual(val, ret_val) + for val, ret_val in zip(fields.values(), returned_values[0]): + self.assertAlmostEqual(val, ret_val) def test_put_record_except_values_not_mach_data_model_type(self): with self.assertRaises(Exception): @@ -492,19 +500,22 @@ def test_put_record_except_values_not_mach_data_model_type(self): data_model_id = storage.add_data_model(data_model) storage.register_persistent_object(data_model_id, obj) - fields_ids = [5] - values = ['b', 'a', 9.0] - storage.put_record(myid, fields_ids, values) + keys = NamedTuple('keys', [('k', int)]) + keys = keys(8)._asdict() + fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', float)]) + fields = fields(4, 'hola', 'adeu')._asdict() + + storage.put_record(myid, keys, fields) returned_values = [] hcache = storage.hcache_by_id[myid] - for key in fields_ids: + for key in keys.values(): returned_values.append(hcache.get_row([key])) - self.assertEqual(len(values), len(returned_values[0])) + self.assertEqual(len(fields.values()), len(returned_values[0])) - for val, ret_val in zip(values, returned_values[0]): - self.assertEqual(val, ret_val) + for val, ret_val in zip(fields.values(), returned_values[0]): + self.assertAlmostEqual(val, ret_val) def test_put_record_StorageDict(self): given_name = 'storage_test.complex_obj' @@ -518,19 +529,22 @@ def test_put_record_StorageDict(self): data_model_id = storage.add_data_model(data_model) storage.register_persistent_object(data_model_id, obj) - fields_ids = [8] - values = [9, 'a', 9.0] - storage.put_record(myid, fields_ids, values) + keys = NamedTuple('keys', [('k', int)]) + keys = keys(8)._asdict() + fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', float)]) + fields = fields(4, 'hola', 3.8)._asdict() + + storage.put_record(myid, keys, fields) returned_values = [] hcache = storage.hcache_by_id[myid] - for key in fields_ids: + for key in keys.values(): returned_values.append(hcache.get_row([key])) - self.assertEqual(len(values), len(returned_values[0])) + self.assertEqual(len(fields.values()), len(returned_values[0])) - for val, ret_val in zip(values, returned_values[0]): - self.assertEqual(val, ret_val) + for val, ret_val in zip(fields.values(), returned_values[0]): + self.assertAlmostEqual(val, ret_val) def test_put_record_StorageDict_with_val_nones(self): given_name = 'storage_test.complex_obj' @@ -544,19 +558,22 @@ def test_put_record_StorageDict_with_val_nones(self): data_model_id = storage.add_data_model(data_model) storage.register_persistent_object(data_model_id, obj) - fields_ids = [8] - values = [None, None, None] - storage.put_record(myid, fields_ids, values) + keys = NamedTuple('keys', [('k', int)]) + keys = keys(8)._asdict() + fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', float)]) + fields = fields(None, None, None)._asdict() + + storage.put_record(myid, keys, fields) returned_values = [] hcache = storage.hcache_by_id[myid] - for key in fields_ids: + for key in keys.values(): returned_values.append(hcache.get_row([key])) - self.assertEqual(len(values), len(returned_values[0])) + self.assertEqual(len(fields.values()), len(returned_values[0])) - for val, ret_val in zip(values, returned_values[0]): - self.assertEqual(val, ret_val) + for val, ret_val in zip(fields.values(), returned_values[0]): + self.assertAlmostEqual(val, ret_val) def test_put_record_StorageDict_except_with_key_nones(self): with self.assertRaises(Exception): @@ -571,19 +588,22 @@ def test_put_record_StorageDict_except_with_key_nones(self): data_model_id = storage.add_data_model(data_model) storage.register_persistent_object(data_model_id, obj) - fields_ids = [None] - values = [9, 'a', 9.0] - storage.put_record(myid, fields_ids, values) + keys = NamedTuple('keys', [('k', int)]) + keys = keys(None)._asdict() + fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', float)]) + fields = fields(4, 'hola', 3.8)._asdict() + + storage.put_record(myid, keys, fields) returned_values = [] hcache = storage.hcache_by_id[myid] - for key in fields_ids: + for key in keys.values(): returned_values.append(hcache.get_row([key])) - self.assertEqual(len(values), len(returned_values[0])) + self.assertEqual(len(fields.values()), len(returned_values[0])) - for val, ret_val in zip(values, returned_values[0]): - self.assertEqual(val, ret_val) + for val, ret_val in zip(fields.values(), returned_values[0]): + self.assertAlmostEqual(val, ret_val) def test_put_record_StorageDict_complex(self): given_name = 'storage_test.complex_obj' @@ -597,18 +617,21 @@ def test_put_record_StorageDict_complex(self): data_model_id = storage.add_data_model(data_model) storage.register_persistent_object(data_model_id, obj) - fields_ids = [8] - values = [(3, 4), True, "test"] - storage.put_record(myid, fields_ids, values) + keys = NamedTuple('keys', [('k', int)]) + keys = keys(8)._asdict() + fields = NamedTuple('fields', [('a', Tuple[int, int]), ('b', bool), ('c', str)]) + fields = fields((3, 4), True, 'adeu')._asdict() + + storage.put_record(myid, keys, fields) returned_values = [] hcache = storage.hcache_by_id[myid] - for key in fields_ids: + for key in keys.values(): returned_values.append(hcache.get_row([key])) - self.assertEqual(len(values), len(returned_values[0])) + self.assertEqual(len(fields.values()), len(returned_values[0])) - for val, ret_val in zip(values, returned_values[0]): + for val, ret_val in zip(fields.values(), returned_values[0]): self.assertEqual(val, ret_val) if __name__ == "__main__": From a79c7b1778394e997f4c7d0ada598cdc2097373e Mon Sep 17 00:00:00 2001 From: Ismael Date: Tue, 3 Dec 2019 10:36:46 +0100 Subject: [PATCH 40/81] get_record implemented (base) + tests --- storage/cql_iface/cql_iface.py | 38 +++++++- storage/cql_iface/tests/api_tests.py | 138 ++++++++++++++++++++++++++- storage/storage_iface.py | 13 ++- 3 files changed, 183 insertions(+), 6 deletions(-) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index f0d607e4..a5ccc32c 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -154,8 +154,42 @@ def put_record(self, object_id: UUID, key_list: OrderedDict, value_list: Ordered self.hcache_by_id[object_id].put_row(list(key_list.values()), list(value_list.values())) - elif issubclass(data_model["type"], StorageNumpy): raise NotImplemented("The class type is not supported") else: - raise NotImplemented("The class type is not supported") \ No newline at end of file + raise NotImplemented("The class type is not supported") + + def get_record(self, object_id: UUID, key_list: OrderedDict) -> List[object]: + try: + UUID(str(object_id)) + except ValueError: + raise ValueError("The object_id is not an UUID") + try: + self.hcache_by_id[object_id] + except KeyError: + raise KeyError("hcache must be registered before in the function register_persistent_object") + + if not key_list: + raise ValueError("key_list and value_list cannot be None") + + data_model = self.data_models_cache[self.object_to_data_model[object_id]] + + if len(key_list) != len(data_model["value_id"].keys()): + raise ValueError("The length of the keys should be the same one as the data model definition") + + if not all([k in data_model["value_id"].keys()for k in list(key_list.keys())]) : + raise KeyError("The keys in key_list must exist in the specified data model") + + for k in key_list: + try: + if not isinstance(key_list[k], data_model["value_id"][k]): + raise Exception("The key types don't match the data model specification") + except TypeError: + if not isinstance(key_list[k], data_model["value_id"][k].__origin__): + raise TypeError("The key types don't match the data model specification") + + try: + result = self.hcache_by_id[object_id].get_row(list(key_list.values())) + except Exception: + result = [] + return result \ No newline at end of file diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index f924de13..1b4bf64f 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -1,8 +1,7 @@ import decimal -import time import unittest import uuid -from typing import Tuple, FrozenSet, NamedTuple +from typing import Tuple, NamedTuple import numpy @@ -23,6 +22,7 @@ def __new__(cls, name='', *args, **kwargs): def __init__(self, *args, **kwargs): super(TestClass, self).__init__() + class TestClass2(IStorage): def __new__(cls, *args, name='', **kwargs): @@ -32,6 +32,7 @@ def __new__(cls, *args, name='', **kwargs): def __init__(self, *args, **kwargs): super(TestClass2, self).__init__() + class mockClass(IStorage): pass @@ -273,6 +274,8 @@ def test_put_record_except_invalid_uuid(self): obj = TestClass(name=given_name) data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} storage = CQLIface() + myid = obj.getID() + storage.hcache_by_id.pop(myid, None) data_model_id = storage.add_data_model(data_model) storage.register_persistent_object(data_model_id, obj) @@ -611,7 +614,8 @@ def test_put_record_StorageDict_complex(self): obj = TestClass(name=given_name) myid = obj.getID() - data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": Tuple[int, int], "b": bool, "c": str}} + data_model = {"type": StorageDict, "value_id": {"k": int}, + "fields": {"a": Tuple[int, int], "b": bool, "c": str}} given_name = 'storage_test.dict' storage = CQLIface() data_model_id = storage.add_data_model(data_model) @@ -634,5 +638,133 @@ def test_put_record_StorageDict_complex(self): for val, ret_val in zip(fields.values(), returned_values[0]): self.assertEqual(val, ret_val) + def test_get_record_except_invalid_uuid(self): + with self.assertRaises(ValueError): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass(name=given_name) + myid = obj.getID() + data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": int, "b": str, "c": float}} + given_name = 'storage_test.dict' + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + keys = NamedTuple('keys', [('k', int)]) + keys = keys(8)._asdict() + fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', float)]) + fields = fields(4, 'hola', 3.8)._asdict() + + storage.put_record(myid, keys, fields) + keys = NamedTuple('keys', [('k', str)]) + keys = keys('hola')._asdict() + storage.get_record('invalid', keys) + + def test_get_record_except_hcache_not_registered(self): + with self.assertRaises(KeyError): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + obj = TestClass(name=given_name) + myid = obj.getID() + data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": int, "b": str, "c": float}} + storage = CQLIface() + storage.hcache_by_id.pop(myid, None) + keys = NamedTuple('keys', [('k', int)]) + keys = keys(8)._asdict() + storage.get_record(myid, keys) + + def test_get_record_except_invalid_keys(self): + with self.assertRaises(ValueError): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass(name=given_name) + myid = obj.getID() + data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": int, "b": str, "c": float}} + given_name = 'storage_test.dict' + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + keys = NamedTuple('keys', [('k', int)]) + keys = keys(8)._asdict() + fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', float)]) + fields = fields(4, 'hola', 3.8)._asdict() + + storage.put_record(myid, keys, fields) + keys = NamedTuple('keys', [('k', str)]) + keys = keys('hola')._asdict() + storage.get_record(myid, None) + + def test_get_record_except_invalid_keys_size(self): + with self.assertRaises(ValueError): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass(name=given_name) + myid = obj.getID() + data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": int, "b": str, "c": float}} + given_name = 'storage_test.dict' + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + keys = NamedTuple('keys', [('k', int)]) + keys = keys(8)._asdict() + fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', float)]) + fields = fields(4, 'hola', 3.8)._asdict() + + storage.put_record(myid, keys, fields) + keys = NamedTuple('keys', [('k', str), ('a', str)]) + keys = keys('hola', 'abc')._asdict() + storage.get_record(myid, keys) + + def test_get_record(self): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass(name=given_name) + myid = obj.getID() + data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": int, "b": str, "c": int}} + given_name = 'storage_test.dict' + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + keys = NamedTuple('keys', [('k', int)]) + keys = keys(8)._asdict() + fields = NamedTuple('fields', [('a', int), ('b', str), ('c', int)]) + fields = fields(4, 'hola', 4)._asdict() + + storage.put_record(myid, keys, fields) + keys = NamedTuple('keys', [('k', int)]) + keys = keys(8)._asdict() + result = storage.get_record(myid, keys) + self.assertEqual(result, [4, 'hola', 4]) + + def test_get_record_tuple(self): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass(name=given_name) + myid = obj.getID() + data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": int, "b": Tuple[int, int], "c": int}} + given_name = 'storage_test.dict' + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + keys = NamedTuple('keys', [('k', int)]) + keys = keys(8)._asdict() + fields = NamedTuple('fields', [('a', int), ('b', Tuple[int, int]), ('c', int)]) + fields = fields(4, (6, 6), 4)._asdict() + + storage.put_record(myid, keys, fields) + keys = NamedTuple('keys', [('k', int)]) + keys = keys(8)._asdict() + result = storage.get_record(myid, keys) + self.assertEqual(result, [4, (6, 6), 4]) + if __name__ == "__main__": unittest.main() diff --git a/storage/storage_iface.py b/storage/storage_iface.py index a9d5f233..7d7326af 100644 --- a/storage/storage_iface.py +++ b/storage/storage_iface.py @@ -1,4 +1,5 @@ from abc import ABCMeta, abstractmethod +from collections import OrderedDict from typing import List from uuid import UUID from storage.cql_iface.tests.mockIStorage import IStorage @@ -27,7 +28,7 @@ def register_persistent_object(self, datamodel_id: int, pyobject: IStorage) -> U pass @abstractmethod - def put_record(self, object_id: UUID, key_list: List[object], value_list: List[object]): + def put_record(self, object_id: UUID, key_list: OrderedDict, value_list: OrderedDict): """ Stores the records contained in value_list, which correspond to the keys in key_list for the Hecuba object referenced by `object_id`. @@ -36,4 +37,14 @@ def put_record(self, object_id: UUID, key_list: List[object], value_list: List[o :param value_list: List with the records to be stored. :return: - """ + pass + + @abstractmethod + def get_record(self, object_id: UUID, key_list: OrderedDict) -> List[object]: + """ + Returns a list with the records corresponding to the key_list for the Hecuba object referenced by `object_id`. + :param object_id: Hecuba object identifier + :param key_list: List with the keys of the records to be retrieved. + :return: List of the records corresponding to the keys contained in key_list + """ pass \ No newline at end of file From 8c4536b0af8adaf183ef4b2650ab79c816bb8a7d Mon Sep 17 00:00:00 2001 From: Ismael Date: Tue, 3 Dec 2019 11:31:23 +0100 Subject: [PATCH 41/81] put_record accepts StorageObj --- storage/cql_iface/cql_comm.py | 26 +-- storage/cql_iface/cql_iface.py | 51 ++---- storage/cql_iface/tests/api_tests.py | 265 +++++++++++++-------------- 3 files changed, 147 insertions(+), 195 deletions(-) diff --git a/storage/cql_iface/cql_comm.py b/storage/cql_iface/cql_comm.py index 0f7cce9d..4bdac33d 100644 --- a/storage/cql_iface/cql_comm.py +++ b/storage/cql_iface/cql_comm.py @@ -103,25 +103,9 @@ def hcache_parameters_generator(ksp: str, table: str, object_id: UUID, keys: lis @staticmethod def create_hcache(object_id: UUID, name: str, definition: dict) -> Union[object, HNumpyStore, Hcache]: ksp, table = extract_ksp_table(name) - if issubclass(definition.get("type", None), StorageObj): - class HcacheWrapper(object): - def __init__(self, definition, object_id, ksp, table): - self.internal_caches = {} - self.object_id = object_id - for col in definition["fields"].keys(): - self.internal_caches[col] = Hcache(*CqlCOMM.hcache_parameters_generator(ksp, table, object_id, list(definition["value_id"].keys()), [col])) - - def get_row(self, attr): - return self.internal_caches[attr].get_row([self.object_id])[0] - - def put_row(self, attr, val): - self.internal_caches[attr].put_row([self.object_id], [val]) - - return HcacheWrapper(definition, object_id, ksp, table) - + hcache_params = CqlCOMM.hcache_parameters_generator(ksp, table, object_id, list(definition["value_id"].keys()), + list(definition["fields"].keys())) + if definition["type"] is numpy.ndarray: + return HNumpyStore(*hcache_params) else: - hcache_params = CqlCOMM.hcache_parameters_generator(ksp, table, object_id, list(definition["value_id"].keys()), list(definition["fields"].keys())) - if definition["type"] is numpy.ndarray: - return HNumpyStore(*hcache_params) - elif issubclass(definition.get("type", None), StorageDict): - return Hcache(*hcache_params) + return Hcache(*hcache_params) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index f0d607e4..08506341 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -2,7 +2,7 @@ from collections import OrderedDict from typing import List, Tuple, FrozenSet from uuid import UUID - +import uuid from storage.cql_iface.tests.mockhnumpy import StorageNumpy from storage.cql_iface.tests.mockhdict import StorageDict @@ -113,48 +113,33 @@ def put_record(self, object_id: UUID, key_list: OrderedDict, value_list: Ordered raise KeyError("hcache must be registered before in the function register_persistent_object") if not isinstance(key_list, OrderedDict) and not isinstance(value_list, OrderedDict): raise TypeError("key_list and value_list must be OrderedDict") - if not (key_list and value_list): - raise ValueError("key_list and value_list cannot be None") data_model = self.data_models_cache[self.object_to_data_model[object_id]] + if len(key_list) != len(data_model["value_id"].keys()) or len(value_list) != len(data_model["fields"].keys()): + raise ValueError("The length of the keys and values should be the same one as the data model definition") + for v in value_list: + try: + if not isinstance(value_list[v], data_model["fields"][v]) and value_list[v] is not None: + raise Exception("The value types don't match the data model specification") + except TypeError: + if not isinstance(value_list[v], data_model["fields"][v].__origin__): + raise TypeError("The value types don't match the data model specification") + + if issubclass(data_model["type"], StorageObj): + for k in key_list: + if not isinstance(key_list[k], data_model["value_id"][k]): + raise Exception("The key types don't match the data model specification") + self.hcache_by_id[object_id].put_row(list(key_list.values()), list(value_list.values())) - # if issubclass(data_model["type"], StorageObj): - # if not len(key_list) == len(value_list): - # raise ValueError("key_list and value_list must have the same length") - # if not (all(x in data_model["fields"].keys() for x in key_list)): - # raise KeyError("value_list must have the keys that exist in the data model") - # dict_of_kv = dict(zip(key_list, value_list)) - # for k in key_list: - # try: - # if not isinstance(dict_of_kv[k], data_model["fields"][k]) and dict_of_kv[k] is not None: - # raise Exception("the value types must be of the same class types as the data model") - # except TypeError: - # if not isinstance(dict_of_kv[k], data_model["fields"][k].__origin__): - # raise TypeError("The value types don't match the data model specification") - # for key, value in zip(key_list, value_list): - # self.hcache_by_id[object_id].put_row(key, value) - if issubclass(data_model["type"], StorageDict): - if len(key_list) != len(data_model["value_id"].keys()) or len(value_list) != len(data_model["fields"].keys()): - raise ValueError("The length of the keys and values should be the same one as the data model definition") - - for k, v in zip(key_list, value_list): + elif issubclass(data_model["type"], StorageDict): + for k in key_list: try: if not isinstance(key_list[k], data_model["value_id"][k]): raise Exception("The key types don't match the data model specification") except TypeError: if not isinstance(key_list[k], data_model["value_id"][k].__origin__): raise TypeError("The key types don't match the data model specification") - try: - if not isinstance(value_list[v], data_model["fields"][v]) and value_list[v] is not None: - raise Exception("The value types don't match the data model specification") - except TypeError: - if not isinstance(value_list[v], data_model["fields"][v].__origin__): - raise TypeError("The value types don't match the data model specification") - - # TODO After c++ works with OrderedDicts we will change the following line - self.hcache_by_id[object_id].put_row(list(key_list.values()), list(value_list.values())) - elif issubclass(data_model["type"], StorageNumpy): raise NotImplemented("The class type is not supported") else: diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index f924de13..4faa07cd 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -275,10 +275,7 @@ def test_put_record_except_invalid_uuid(self): storage = CQLIface() data_model_id = storage.add_data_model(data_model) storage.register_persistent_object(data_model_id, obj) - - fields_ids = ["a", "b", "c"] - values = [None, None, None] - storage.put_record("", fields_ids, values) + storage.put_record("", None, None) def test_put_record_except_hcache_not_registered(self): with self.assertRaises(ValueError): @@ -289,143 +286,129 @@ def test_put_record_except_hcache_not_registered(self): data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} storage = CQLIface() data_model_id = storage.add_data_model(data_model) - fields_ids = ["a", "b", "c"] - values = [None, None, None] - storage.put_record("", fields_ids, values) - - # def test_put_record_except_key_value_list_none(self): - # with self.assertRaises(ValueError): - # given_name = 'storage_test.complex_obj' - # config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - # - # obj = TestClass(name=given_name) - # myid = obj.getID() - # data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} - # storage = CQLIface() - # data_model_id = storage.add_data_model(data_model) - # storage.register_persistent_object(data_model_id, obj) - # - # keys = NamedTuple('keys', [('k', uuid.UUID)]) - # keys = keys('a') - # fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', float)]) - # fields = fields('aname', 4, 3.8) - # storage.put_record(myid, keys, []) - # - # def test_put_record_except_key_value_list_type_list(self): - # with self.assertRaises(TypeError): - # given_name = 'storage_test.complex_obj' - # config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - # - # obj = TestClass(name=given_name) - # myid = obj.getID() - # data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} - # storage = CQLIface() - # data_model_id = storage.add_data_model(data_model) - # storage.register_persistent_object(data_model_id, obj) - # - # fields_ids = ["a", "b", "c"] - # values = [None, None, None] - # storage.put_record(myid, ("b"), ("a")) - # - # def test_put_record_except_keys_values_list_not_same_length(self): - # with self.assertRaises(ValueError): - # given_name = 'storage_test.complex_obj' - # config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - # - # obj = TestClass(name=given_name) - # myid = obj.getID() - # data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} - # storage = CQLIface() - # data_model_id = storage.add_data_model(data_model) - # storage.register_persistent_object(data_model_id, obj) - # - # fields_ids = ["a", "b", "c"] - # values = [None, None] - # storage.put_record(myid, fields_ids, values) - # - # def test_put_record_except_key_not_exist(self): - # with self.assertRaises(KeyError): - # given_name = 'storage_test.complex_obj' - # config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - # - # obj = TestClass(name=given_name) - # myid = obj.getID() - # data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} - # storage = CQLIface() - # data_model_id = storage.add_data_model(data_model) - # storage.register_persistent_object(data_model_id, obj) - # - # fields_ids = ["a", "b", "c"] - # values = [None, None, None] - # storage.put_record(myid, ["d"], ["a"]) - # - # def test_put_record_except_values_not_same_class(self): - # with self.assertRaises(Exception): - # given_name = 'storage_test.complex_obj' - # config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - # - # obj = TestClass(name=given_name) - # myid = obj.getID() - # data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} - # storage = CQLIface() - # data_model_id = storage.add_data_model(data_model) - # storage.register_persistent_object(data_model_id, obj) - # - # fields_ids = ["a", "b", "c"] - # values = [None, None, None] - # storage.put_record(myid, ["c"], ["a"]) - # - # def test_put_record_StorageObj(self): - # given_name = 'storage_test.complex_obj' - # config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - # - # obj = TestClass2(name=given_name) - # myid = obj.getID() - # data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} - # given_name = 'storage_test.dict' - # storage = CQLIface() - # data_model_id = storage.add_data_model(data_model) - # storage.register_persistent_object(data_model_id, obj) - # - # fields_ids = ["a", "b", "c"] - # values = [9, "a", 9.0] - # storage.put_record(myid, fields_ids, values) - # - # returned_values = [] - # hcache = storage.hcache_by_id[myid] - # for key in fields_ids: - # returned_values.append(hcache.get_row(key)) - # - # self.assertEqual(len(values), len(returned_values)) - # - # for val, ret_val in zip(values, returned_values): - # self.assertEqual(val, ret_val) - # - # def test_put_record_StorageObj_val_nones(self): - # given_name = 'storage_test.complex_obj' - # config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - # - # obj = TestClass2(name=given_name) - # myid = obj.getID() - # data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} - # given_name = 'storage_test.dict' - # storage = CQLIface() - # data_model_id = storage.add_data_model(data_model) - # storage.register_persistent_object(data_model_id, obj) - # - # fields_ids = ["a", "b", "c"] - # values = [None, None, None] - # storage.put_record(myid, fields_ids, values) - # - # returned_values = [] - # hcache = storage.hcache_by_id[myid] - # for key in fields_ids: - # returned_values.append(hcache.get_row(key)) - # - # self.assertEqual(len(values), len(returned_values)) - # - # for val, ret_val in zip(values, returned_values): - # self.assertEqual(val, ret_val) + storage.put_record("", None, None) + + def test_put_record_except_key_value_must_be_ordered_dict(self): + with self.assertRaises(TypeError): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass(name=given_name) + myid = obj.getID() + data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + storage.put_record(myid, None, None) + + def test_put_record_except_keys_values_list_not_same_length(self): + with self.assertRaises(ValueError): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass(name=given_name) + myid = obj.getID() + data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + keys = NamedTuple('keys', [('k', uuid.UUID)]) + keys = keys(myid)._asdict() + fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', str), ('d', str)]) + fields = fields(4, 4, 'ab', 'hola')._asdict() + storage.put_record(myid, keys, fields) + + def test_put_record_except_key_not_exist(self): + with self.assertRaises(KeyError): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass(name=given_name) + myid = obj.getID() + data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + keys = NamedTuple('keys', [('k', uuid.UUID)]) + keys = keys(myid)._asdict() + fields = NamedTuple('fields', [('a', int), ('b', str), ('d', float)]) + fields = fields(4, 'ab', 3.4)._asdict() + storage.put_record(myid, keys, fields) + + def test_put_record_except_values_not_same_class(self): + with self.assertRaises(Exception): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass(name=given_name) + myid = obj.getID() + data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + keys = NamedTuple('keys', [('k', uuid.UUID)]) + keys = keys(myid)._asdict() + fields = NamedTuple('fields', [('a', int), ('b', str), ('c', int)]) + fields = fields(4, 'ab', 3)._asdict() + storage.put_record(myid, keys, fields) + + def test_put_record_StorageObj(self): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass2(name=given_name) + myid = obj.getID() + data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} + given_name = 'storage_test.dict' + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + keys = NamedTuple('keys', [('k', uuid.UUID)]) + keys = keys(myid)._asdict() + fields = NamedTuple('fields', [('a', int), ('b', str), ('c', float)]) + fields = fields(44, 'zasd', 8.0)._asdict() + + storage.put_record(myid, keys, fields) + hcache = storage.hcache_by_id[myid] + + returned_values = hcache.get_row([myid]) + + self.assertEqual(len([44, 'zasd', 8.0]), len(returned_values)) + + for val, ret_val in zip([44, 'zasd', 8.0], returned_values): + self.assertAlmostEqual(val, ret_val) + + def test_put_record_StorageObj_val_nones(self): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass2(name=given_name) + myid = obj.getID() + data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} + given_name = 'storage_test.dict' + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + keys = NamedTuple('keys', [('k', uuid.UUID)]) + keys = keys(myid)._asdict() + fields = NamedTuple('fields', [('a', int), ('b', str), ('c', float)]) + fields = fields(None, None, None)._asdict() + storage.put_record(myid, keys, fields) + + returned_values = [] + hcache = storage.hcache_by_id[myid] + for key in keys.values(): + returned_values.append(hcache.get_row([key])) + + self.assertEqual(len(fields.values()), len(returned_values[0])) + + for val, ret_val in zip(fields.values(), returned_values[0]): + self.assertAlmostEqual(val, ret_val) def test_put_record_except_values_fields_not_same_size_as_data_model(self): with self.assertRaises(ValueError): From c091c641b418261fc593cac15dbe05e6be6f986b Mon Sep 17 00:00:00 2001 From: Ismael Date: Tue, 3 Dec 2019 11:50:58 +0100 Subject: [PATCH 42/81] tests get_record using storageobj --- storage/cql_iface/tests/api_tests.py | 70 ++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index b1f3647c..092baabf 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -749,5 +749,75 @@ def test_get_record_tuple(self): result = storage.get_record(myid, keys) self.assertEqual(result, [4, (6, 6), 4]) + def test_get_record_except_key_not_uuid(self): + with self.assertRaises(Exception): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass(name=given_name) + myid = obj.getID() + data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": int}} + given_name = 'storage_test.dict' + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + keys = NamedTuple('keys', [('k', uuid.UUID)]) + keys = keys(myid)._asdict() + fields = NamedTuple('fields', [('a', int), ('b', str), ('c', int)]) + fields = fields(4, 'abc', 4)._asdict() + + storage.put_record(myid, keys, fields) + keys = NamedTuple('keys', [('k', uuid.UUID)]) + keys = keys('abc')._asdict() + result = storage.get_record(myid, keys) + self.assertEqual(result, [4, 'abc', 4]) + + def test_get_record_so(self): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass(name=given_name) + myid = obj.getID() + data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": int}} + given_name = 'storage_test.dict' + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + keys = NamedTuple('keys', [('k', uuid.UUID)]) + keys = keys(myid)._asdict() + fields = NamedTuple('fields', [('a', int), ('b', str), ('c', int)]) + fields = fields(4, 'abc', 4)._asdict() + + storage.put_record(myid, keys, fields) + keys = NamedTuple('keys', [('k', uuid.UUID)]) + keys = keys(myid)._asdict() + result = storage.get_record(myid, keys) + self.assertEqual(result, [4, 'abc', 4]) + + def test_get_record_tuple_so(self): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass(name=given_name) + myid = obj.getID() + data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": Tuple[int, int], "c": int}} + given_name = 'storage_test.dict' + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + keys = NamedTuple('keys', [('k', uuid.UUID)]) + keys = keys(myid)._asdict() + fields = NamedTuple('fields', [('a', int), ('b', Tuple[int, int]), ('c', int)]) + fields = fields(4, (6, 6), 4)._asdict() + + storage.put_record(myid, keys, fields) + keys = NamedTuple('keys', [('k', uuid.UUID)]) + keys = keys(myid)._asdict() + result = storage.get_record(myid, keys) + self.assertEqual(result, [4, (6, 6), 4]) + if __name__ == "__main__": unittest.main() From 891b61aa55e3ed50b016c94e95e309aa324c608f Mon Sep 17 00:00:00 2001 From: Ismael Date: Tue, 3 Dec 2019 12:04:02 +0100 Subject: [PATCH 43/81] create hcache modified, support so --- storage/cql_iface/cql_comm.py | 31 +++++-------------------------- 1 file changed, 5 insertions(+), 26 deletions(-) diff --git a/storage/cql_iface/cql_comm.py b/storage/cql_iface/cql_comm.py index 5208c51e..4bdac33d 100644 --- a/storage/cql_iface/cql_comm.py +++ b/storage/cql_iface/cql_comm.py @@ -103,30 +103,9 @@ def hcache_parameters_generator(ksp: str, table: str, object_id: UUID, keys: lis @staticmethod def create_hcache(object_id: UUID, name: str, definition: dict) -> Union[object, HNumpyStore, Hcache]: ksp, table = extract_ksp_table(name) - if issubclass(definition.get("type", None), StorageObj): - class HcacheWrapper(object): - def __init__(self, definition, object_id, ksp, table): - self.internal_caches = {} - self.object_id = object_id - for col in definition["fields"].keys(): - self.internal_caches[col] = Hcache(*CqlCOMM.hcache_parameters_generator(ksp, table, object_id, - list(definition[ - "value_id"].keys()), - [col])) - - def get_row(self, attr): - return self.internal_caches[attr].get_row([self.object_id])[0] - - def put_row(self, attr, val): - self.internal_caches[attr].put_row([self.object_id], [val]) - - return HcacheWrapper(definition, object_id, ksp, table) - + hcache_params = CqlCOMM.hcache_parameters_generator(ksp, table, object_id, list(definition["value_id"].keys()), + list(definition["fields"].keys())) + if definition["type"] is numpy.ndarray: + return HNumpyStore(*hcache_params) else: - hcache_params = CqlCOMM.hcache_parameters_generator(ksp, table, object_id, - list(definition["value_id"].keys()), - list(definition["fields"].keys())) - if definition["type"] is numpy.ndarray: - return HNumpyStore(*hcache_params) - elif issubclass(definition.get("type", None), StorageDict): - return Hcache(*hcache_params) + return Hcache(*hcache_params) From 2b6886065b76582ed148bf4d9c684b0964382a8a Mon Sep 17 00:00:00 2001 From: Ismael Date: Tue, 3 Dec 2019 12:07:09 +0100 Subject: [PATCH 44/81] abstract method fixed --- storage/storage_iface.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/storage/storage_iface.py b/storage/storage_iface.py index a9d5f233..1af2aca4 100644 --- a/storage/storage_iface.py +++ b/storage/storage_iface.py @@ -1,5 +1,5 @@ from abc import ABCMeta, abstractmethod -from typing import List +from collections import OrderedDict from uuid import UUID from storage.cql_iface.tests.mockIStorage import IStorage @@ -27,7 +27,7 @@ def register_persistent_object(self, datamodel_id: int, pyobject: IStorage) -> U pass @abstractmethod - def put_record(self, object_id: UUID, key_list: List[object], value_list: List[object]): + def put_record(self, object_id: UUID, key_list: OrderedDict, value_list: OrderedDict) -> None: """ Stores the records contained in value_list, which correspond to the keys in key_list for the Hecuba object referenced by `object_id`. From 754aa5c5b3701e63df99813ac73f2126c7796db7 Mon Sep 17 00:00:00 2001 From: Ismael Date: Tue, 3 Dec 2019 12:08:06 +0100 Subject: [PATCH 45/81] abstract method fixed --- storage/storage_iface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/storage_iface.py b/storage/storage_iface.py index 7d7326af..370ec9a3 100644 --- a/storage/storage_iface.py +++ b/storage/storage_iface.py @@ -28,7 +28,7 @@ def register_persistent_object(self, datamodel_id: int, pyobject: IStorage) -> U pass @abstractmethod - def put_record(self, object_id: UUID, key_list: OrderedDict, value_list: OrderedDict): + def put_record(self, object_id: UUID, key_list: OrderedDict, value_list: OrderedDict) -> None: """ Stores the records contained in value_list, which correspond to the keys in key_list for the Hecuba object referenced by `object_id`. From 3fae7ea2778c67b33ad6d7da394ff33c01e36230 Mon Sep 17 00:00:00 2001 From: Ismael Date: Wed, 4 Dec 2019 09:17:23 +0100 Subject: [PATCH 46/81] put record supports less values, some tests fixed --- hecuba_core/src/TupleRowFactory.cpp | 3 ++- storage/cql_iface/cql_iface.py | 22 ++++++++++------------ storage/cql_iface/tests/api_tests.py | 8 ++++---- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/hecuba_core/src/TupleRowFactory.cpp b/hecuba_core/src/TupleRowFactory.cpp index 8cac605c..121d525c 100644 --- a/hecuba_core/src/TupleRowFactory.cpp +++ b/hecuba_core/src/TupleRowFactory.cpp @@ -364,7 +364,8 @@ TupleRowFactory::bind(CassStatement *statement, const TupleRow *row, u_int16_t o for (uint16_t i = 0; i < row->n_elem(); ++i) { uint16_t bind_pos = offset + i; const void *element_i = row->get_element(i); - if (element_i != nullptr && !row->isNull(i)) { + if (element_i != nullptr && !row->isNull(i)) { //if the element is null, the bind will use the default behaviour (if the table have data, + //the bind will not touch it, if the table does not have data will insert null) switch (metadata->at(i).type) { case CASS_VALUE_TYPE_VARCHAR: case CASS_VALUE_TYPE_TEXT: diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index 9ac4e99e..d392509f 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -102,6 +102,11 @@ def register_persistent_object(self, datamodel_id: int, pyobject: IStorage) -> U self.hcache_by_id[object_id] = hc return object_id + @staticmethod + def fill_empty_keys_with_None(keys_dict, data_model): + data_model = {k: None for k in data_model.keys()} + return {**data_model, **keys_dict} + def put_record(self, object_id: UUID, key_list: OrderedDict, value_list: OrderedDict) -> None: try: UUID(str(object_id)) @@ -114,8 +119,8 @@ def put_record(self, object_id: UUID, key_list: OrderedDict, value_list: Ordered if not isinstance(key_list, OrderedDict) and not isinstance(value_list, OrderedDict): raise TypeError("key_list and value_list must be OrderedDict") data_model = self.data_models_cache[self.object_to_data_model[object_id]] - if len(key_list) != len(data_model["value_id"].keys()) or len(value_list) != len(data_model["fields"].keys()): - raise ValueError("The length of the keys and values should be the same one as the data model definition") + if len(key_list) != len(data_model["value_id"].keys()): + raise ValueError("The length of the keys should be the same as the keys length in the data model definition") for v in value_list: try: if not isinstance(value_list[v], data_model["fields"][v]) and value_list[v] is not None: @@ -124,13 +129,7 @@ def put_record(self, object_id: UUID, key_list: OrderedDict, value_list: Ordered if not isinstance(value_list[v], data_model["fields"][v].__origin__): raise TypeError("The value types don't match the data model specification") - if issubclass(data_model["type"], StorageObj): - for k in key_list: - if not isinstance(key_list[k], data_model["value_id"][k]): - raise Exception("The key types don't match the data model specification") - self.hcache_by_id[object_id].put_row(list(key_list.values()), list(value_list.values())) - - elif issubclass(data_model["type"], StorageDict): + if issubclass(data_model["type"], StorageObj) or issubclass(data_model["type"], StorageDict): for k in key_list: try: if not isinstance(key_list[k], data_model["value_id"][k]): @@ -138,8 +137,8 @@ def put_record(self, object_id: UUID, key_list: OrderedDict, value_list: Ordered except TypeError: if not isinstance(key_list[k], data_model["value_id"][k].__origin__): raise TypeError("The key types don't match the data model specification") - self.hcache_by_id[object_id].put_row(list(key_list.values()), list(value_list.values())) - + values_dict = CQLIface.fill_empty_keys_with_None(value_list, data_model["fields"]) + self.hcache_by_id[object_id].put_row(list(key_list.values()), list(values_dict.values())) elif issubclass(data_model["type"], StorageNumpy): raise NotImplemented("The class type is not supported") else: @@ -157,7 +156,6 @@ def get_record(self, object_id: UUID, key_list: OrderedDict) -> List[object]: if not key_list: raise ValueError("key_list and value_list cannot be None") - data_model = self.data_models_cache[self.object_to_data_model[object_id]] if len(key_list) != len(data_model["value_id"].keys()): diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index 092baabf..31c6ab1b 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -304,7 +304,7 @@ def test_put_record_except_key_value_must_be_ordered_dict(self): storage.register_persistent_object(data_model_id, obj) storage.put_record(myid, None, None) - def test_put_record_except_keys_values_list_not_same_length(self): + def test_put_record_except_values_list_not_same_length(self): with self.assertRaises(ValueError): given_name = 'storage_test.complex_obj' config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) @@ -316,8 +316,8 @@ def test_put_record_except_keys_values_list_not_same_length(self): data_model_id = storage.add_data_model(data_model) storage.register_persistent_object(data_model_id, obj) - keys = NamedTuple('keys', [('k', uuid.UUID)]) - keys = keys(myid)._asdict() + keys = NamedTuple('keys', [('k', uuid.UUID), ('k1', int)]) + keys = keys(myid, 8)._asdict() fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', str), ('d', str)]) fields = fields(4, 4, 'ab', 'hola')._asdict() storage.put_record(myid, keys, fields) @@ -414,7 +414,7 @@ def test_put_record_StorageObj_val_nones(self): self.assertAlmostEqual(val, ret_val) def test_put_record_except_values_fields_not_same_size_as_data_model(self): - with self.assertRaises(ValueError): + with self.assertRaises(Exception): given_name = 'storage_test.complex_obj' config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) From fb3c3eb26da06599dc625e436c1f9cb3b7317640 Mon Sep 17 00:00:00 2001 From: Ismael Date: Wed, 4 Dec 2019 12:13:20 +0100 Subject: [PATCH 47/81] cache desactivated --- hecuba_core/src/py_interface/UnitParser.cpp | 2 +- storage/cql_iface/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hecuba_core/src/py_interface/UnitParser.cpp b/hecuba_core/src/py_interface/UnitParser.cpp index ab3d5541..e72dfed3 100644 --- a/hecuba_core/src/py_interface/UnitParser.cpp +++ b/hecuba_core/src/py_interface/UnitParser.cpp @@ -323,7 +323,7 @@ TupleParser::TupleParser(const ColumnMeta &CM) : UnitParser(CM) { int16_t TupleParser::py_to_c(PyObject *obj, void *payload) const { - if (obj == Py_None) throw ModuleException("Error parsing PyObject from py to c, expected a non-none object"); + if (obj == Py_None) return -1; if (!PyTuple_Check(obj)) throw ModuleException("Error parsing PyObject from py to c, expected a tuple object"); if (PyTuple_Size(obj) != col_meta.pointer->size()) throw ModuleException( diff --git a/storage/cql_iface/__init__.py b/storage/cql_iface/__init__.py index 4d5ead40..2118da72 100644 --- a/storage/cql_iface/__init__.py +++ b/storage/cql_iface/__init__.py @@ -120,7 +120,7 @@ def __init__(self): singleton.max_cache_size = int(os.environ['MAX_CACHE_SIZE']) log.info('MAX_CACHE_SIZE: %d', singleton.max_cache_size) except KeyError: - singleton.max_cache_size = 1000 + singleton.max_cache_size = 0 #TODO: when the data is inserted into cassandra we should merge the new data and the one that is already in the cache log.warn('using default MAX_CACHE_SIZE: %d', singleton.max_cache_size) try: From 7004dd3de42e0b59e02e5a46f8e2a2662f31025a Mon Sep 17 00:00:00 2001 From: Ismael Date: Wed, 4 Dec 2019 12:14:58 +0100 Subject: [PATCH 48/81] cache desactivated --- hecuba_core/src/TupleRowFactory.cpp | 7 ++- storage/cql_iface/cql_iface.py | 22 +++---- storage/cql_iface/tests/api_tests.py | 92 ++++++++++++++++++++++------ 3 files changed, 88 insertions(+), 33 deletions(-) diff --git a/hecuba_core/src/TupleRowFactory.cpp b/hecuba_core/src/TupleRowFactory.cpp index 8cac605c..557e4bc3 100644 --- a/hecuba_core/src/TupleRowFactory.cpp +++ b/hecuba_core/src/TupleRowFactory.cpp @@ -497,10 +497,11 @@ TupleRowFactory::bind(CassStatement *statement, const TupleRow *row, u_int16_t o throw ModuleException("Default behaviour not supported"); } } else { + std::cout << "null elem" << std::endl; //Element is a nullptr - CassError rc = cass_statement_bind_null(statement, bind_pos); - CHECK_CASS("TupleRowFactory: Cassandra binding query unsuccessful [Null value], column:" + - metadata->at(i).info.begin()->second); + //CassError rc = cass_statement_bind_null(statement, bind_pos); + //CHECK_CASS("TupleRowFactory: Cassandra binding query unsuccessful [Null value], column:" + + // metadata->at(i).info.begin()->second); } } } diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index 08506341..6cf278f3 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -102,6 +102,11 @@ def register_persistent_object(self, datamodel_id: int, pyobject: IStorage) -> U self.hcache_by_id[object_id] = hc return object_id + @staticmethod + def fill_empty_keys_with_None(keys_dict, data_model): + data_model = {k: None for k in data_model.keys()} + return {**data_model, **keys_dict} + def put_record(self, object_id: UUID, key_list: OrderedDict, value_list: OrderedDict) -> None: try: UUID(str(object_id)) @@ -114,8 +119,9 @@ def put_record(self, object_id: UUID, key_list: OrderedDict, value_list: Ordered if not isinstance(key_list, OrderedDict) and not isinstance(value_list, OrderedDict): raise TypeError("key_list and value_list must be OrderedDict") data_model = self.data_models_cache[self.object_to_data_model[object_id]] - if len(key_list) != len(data_model["value_id"].keys()) or len(value_list) != len(data_model["fields"].keys()): - raise ValueError("The length of the keys and values should be the same one as the data model definition") + if len(key_list) != len(data_model["value_id"].keys()): + raise ValueError( + "The length of the keys should be the same as the keys length in the data model definition") for v in value_list: try: if not isinstance(value_list[v], data_model["fields"][v]) and value_list[v] is not None: @@ -124,13 +130,7 @@ def put_record(self, object_id: UUID, key_list: OrderedDict, value_list: Ordered if not isinstance(value_list[v], data_model["fields"][v].__origin__): raise TypeError("The value types don't match the data model specification") - if issubclass(data_model["type"], StorageObj): - for k in key_list: - if not isinstance(key_list[k], data_model["value_id"][k]): - raise Exception("The key types don't match the data model specification") - self.hcache_by_id[object_id].put_row(list(key_list.values()), list(value_list.values())) - - elif issubclass(data_model["type"], StorageDict): + if issubclass(data_model["type"], StorageObj) or issubclass(data_model["type"], StorageDict): for k in key_list: try: if not isinstance(key_list[k], data_model["value_id"][k]): @@ -138,8 +138,8 @@ def put_record(self, object_id: UUID, key_list: OrderedDict, value_list: Ordered except TypeError: if not isinstance(key_list[k], data_model["value_id"][k].__origin__): raise TypeError("The key types don't match the data model specification") - self.hcache_by_id[object_id].put_row(list(key_list.values()), list(value_list.values())) - + values_dict = CQLIface.fill_empty_keys_with_None(value_list, data_model["fields"]) + self.hcache_by_id[object_id].put_row(list(key_list.values()), list(values_dict.values())) elif issubclass(data_model["type"], StorageNumpy): raise NotImplemented("The class type is not supported") else: diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index 4faa07cd..b6e848d1 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -301,24 +301,6 @@ def test_put_record_except_key_value_must_be_ordered_dict(self): storage.register_persistent_object(data_model_id, obj) storage.put_record(myid, None, None) - def test_put_record_except_keys_values_list_not_same_length(self): - with self.assertRaises(ValueError): - given_name = 'storage_test.complex_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - obj = TestClass(name=given_name) - myid = obj.getID() - data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} - storage = CQLIface() - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(data_model_id, obj) - - keys = NamedTuple('keys', [('k', uuid.UUID)]) - keys = keys(myid)._asdict() - fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', str), ('d', str)]) - fields = fields(4, 4, 'ab', 'hola')._asdict() - storage.put_record(myid, keys, fields) - def test_put_record_except_key_not_exist(self): with self.assertRaises(KeyError): given_name = 'storage_test.complex_obj' @@ -411,7 +393,7 @@ def test_put_record_StorageObj_val_nones(self): self.assertAlmostEqual(val, ret_val) def test_put_record_except_values_fields_not_same_size_as_data_model(self): - with self.assertRaises(ValueError): + with self.assertRaises(Exception): given_name = 'storage_test.complex_obj' config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) @@ -617,5 +599,77 @@ def test_put_record_StorageDict_complex(self): for val, ret_val in zip(fields.values(), returned_values[0]): self.assertEqual(val, ret_val) + def test_put_record_StorageDict_complex_less_values(self): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass(name=given_name) + myid = obj.getID() + data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": Tuple[int, int], "b": bool, "c": str, "d": int}} + given_name = 'storage_test.dict' + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + keys = NamedTuple('keys', [('k', int)]) + keys = keys(8)._asdict() + fields = NamedTuple('fields', [('a', Tuple[int, int]), ('b', bool), ('c', str)]) + fields = fields((3, 4), True, 'adeu')._asdict() + + storage.put_record(myid, keys, fields) + + returned_values = [] + hcache = storage.hcache_by_id[myid] + for key in keys.values(): + returned_values.append(hcache.get_row([key])) + + self.assertEqual(len(data_model["fields"]), len(returned_values[0])) + + for val, ret_val in zip(fields.values(), returned_values[0]): + self.assertEqual(val, ret_val) + + def test_put_record_StorageDict_complex_less_values_2_inserts(self): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass(name=given_name) + myid = obj.getID() + data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": Tuple[int, int], "b": bool, "c": str, "d": int}} + given_name = 'storage_test.dict' + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + keys = NamedTuple('keys', [('k', int)]) + keys = keys(8)._asdict() + fields = NamedTuple('fields', [('a', Tuple[int, int]), ('b', bool), ('c', str)]) + fields = fields((3, 4), True, 'adeu')._asdict() + + storage.put_record(myid, keys, fields) + + returned_values = [] + hcache = storage.hcache_by_id[myid] + for key in keys.values(): + returned_values.append(hcache.get_row([key])) + + self.assertEqual(len(data_model["fields"]), len(returned_values[0])) + + for val, ret_val in zip(fields.values(), returned_values[0]): + self.assertEqual(val, ret_val) + + fields = NamedTuple('fields', [('d', int)]) + fields = fields(8)._asdict() + + storage.put_record(myid, keys, fields) + + returned_values = [] + hcache = storage.hcache_by_id[myid] + for key in keys.values(): + returned_values.append(hcache.get_row([key])) + + self.assertEqual(len(data_model["fields"]), len(returned_values[0])) + + for val, ret_val in zip(fields.values(), returned_values[0]): + self.assertEqual(val, ret_val) if __name__ == "__main__": unittest.main() From 16eac112b4caa9c0f4665f441464ca827c3a6e45 Mon Sep 17 00:00:00 2001 From: Ismael Date: Wed, 4 Dec 2019 12:22:48 +0100 Subject: [PATCH 49/81] tests working --- hecuba_core/src/TupleRowFactory.cpp | 10 ---------- storage/cql_iface/tests/api_tests.py | 8 ++++---- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/hecuba_core/src/TupleRowFactory.cpp b/hecuba_core/src/TupleRowFactory.cpp index 557e4bc3..170f492c 100644 --- a/hecuba_core/src/TupleRowFactory.cpp +++ b/hecuba_core/src/TupleRowFactory.cpp @@ -341,10 +341,6 @@ TupleRowFactory::bind(CassTuple *tuple, const TupleRow *row) const { default: throw ModuleException("Default behaviour not supported"); } - } else { - //Element is a nullptr - CassError rc = cass_tuple_set_null(tuple, bind_pos); - CHECK_CASS("TupleRowFactory: Cassandra binding query unsuccessful [Null value]"); } } } @@ -496,12 +492,6 @@ TupleRowFactory::bind(CassStatement *statement, const TupleRow *row, u_int16_t o default: throw ModuleException("Default behaviour not supported"); } - } else { - std::cout << "null elem" << std::endl; - //Element is a nullptr - //CassError rc = cass_statement_bind_null(statement, bind_pos); - //CHECK_CASS("TupleRowFactory: Cassandra binding query unsuccessful [Null value], column:" + - // metadata->at(i).info.begin()->second); } } } diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index b6e848d1..10b7c311 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -643,9 +643,9 @@ def test_put_record_StorageDict_complex_less_values_2_inserts(self): keys = NamedTuple('keys', [('k', int)]) keys = keys(8)._asdict() fields = NamedTuple('fields', [('a', Tuple[int, int]), ('b', bool), ('c', str)]) - fields = fields((3, 4), True, 'adeu')._asdict() + fields1 = fields((3, 4), True, 'adeu')._asdict() - storage.put_record(myid, keys, fields) + storage.put_record(myid, keys, fields1) returned_values = [] hcache = storage.hcache_by_id[myid] @@ -654,7 +654,7 @@ def test_put_record_StorageDict_complex_less_values_2_inserts(self): self.assertEqual(len(data_model["fields"]), len(returned_values[0])) - for val, ret_val in zip(fields.values(), returned_values[0]): + for val, ret_val in zip(fields1.values(), returned_values[0]): self.assertEqual(val, ret_val) fields = NamedTuple('fields', [('d', int)]) @@ -669,7 +669,7 @@ def test_put_record_StorageDict_complex_less_values_2_inserts(self): self.assertEqual(len(data_model["fields"]), len(returned_values[0])) - for val, ret_val in zip(fields.values(), returned_values[0]): + for val, ret_val in zip(fields1.values(), returned_values[0]): self.assertEqual(val, ret_val) if __name__ == "__main__": unittest.main() From 46f6be955f939a88c27aab39249e3bb29fddf1f2 Mon Sep 17 00:00:00 2001 From: Ismael Date: Wed, 4 Dec 2019 12:32:32 +0100 Subject: [PATCH 50/81] tests modifying a tuple --- storage/cql_iface/tests/api_tests.py | 57 +++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index 10b7c311..84c0370b 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -1,8 +1,7 @@ import decimal -import time import unittest import uuid -from typing import Tuple, FrozenSet, NamedTuple +from typing import Tuple, NamedTuple import numpy @@ -23,6 +22,7 @@ def __new__(cls, name='', *args, **kwargs): def __init__(self, *args, **kwargs): super(TestClass, self).__init__() + class TestClass2(IStorage): def __new__(cls, *args, name='', **kwargs): @@ -32,6 +32,7 @@ def __new__(cls, *args, name='', **kwargs): def __init__(self, *args, **kwargs): super(TestClass2, self).__init__() + class mockClass(IStorage): pass @@ -576,7 +577,8 @@ def test_put_record_StorageDict_complex(self): obj = TestClass(name=given_name) myid = obj.getID() - data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": Tuple[int, int], "b": bool, "c": str}} + data_model = {"type": StorageDict, "value_id": {"k": int}, + "fields": {"a": Tuple[int, int], "b": bool, "c": str}} given_name = 'storage_test.dict' storage = CQLIface() data_model_id = storage.add_data_model(data_model) @@ -605,7 +607,8 @@ def test_put_record_StorageDict_complex_less_values(self): obj = TestClass(name=given_name) myid = obj.getID() - data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": Tuple[int, int], "b": bool, "c": str, "d": int}} + data_model = {"type": StorageDict, "value_id": {"k": int}, + "fields": {"a": Tuple[int, int], "b": bool, "c": str, "d": int}} given_name = 'storage_test.dict' storage = CQLIface() data_model_id = storage.add_data_model(data_model) @@ -634,7 +637,8 @@ def test_put_record_StorageDict_complex_less_values_2_inserts(self): obj = TestClass(name=given_name) myid = obj.getID() - data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": Tuple[int, int], "b": bool, "c": str, "d": int}} + data_model = {"type": StorageDict, "value_id": {"k": int}, + "fields": {"a": Tuple[int, int], "b": bool, "c": str, "d": int}} given_name = 'storage_test.dict' storage = CQLIface() data_model_id = storage.add_data_model(data_model) @@ -671,5 +675,48 @@ def test_put_record_StorageDict_complex_less_values_2_inserts(self): for val, ret_val in zip(fields1.values(), returned_values[0]): self.assertEqual(val, ret_val) + + def test_put_record_StorageDict_complex_less_values_2_inserts_tuple_modif(self): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass(name=given_name) + myid = obj.getID() + data_model = {"type": StorageDict, "value_id": {"k": int}, + "fields": {"a": Tuple[int, int], "b": bool, "c": str, "d": int}} + given_name = 'storage_test.dict' + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + keys = NamedTuple('keys', [('k', int)]) + keys = keys(8)._asdict() + fields = NamedTuple('fields', [('a', Tuple[int, int]), ('b', bool), ('c', str)]) + fields1 = fields((3, None), True, 'adeu')._asdict() + + storage.put_record(myid, keys, fields1) + returned_values = [] + hcache = storage.hcache_by_id[myid] + for key in keys.values(): + returned_values.append(hcache.get_row([key])) + + self.assertEqual(len(data_model["fields"]), len(returned_values[0])) + + for val, ret_val in zip(fields1.values(), returned_values[0]): + self.assertEqual(val, ret_val) + fields = NamedTuple('fields', [('a', Tuple[int, int])]) + fields = fields((3, 4))._asdict() + + storage.put_record(myid, keys, fields) + + returned_values = [] + hcache = storage.hcache_by_id[myid] + for key in keys.values(): + returned_values.append(hcache.get_row([key])) + + self.assertEqual(len(data_model["fields"]), len(returned_values[0])) + self.assertEqual([(3, 4), True, 'adeu', None], returned_values[0]) + + if __name__ == "__main__": unittest.main() From 066135c4f71256f432f5335ab4bc25ea567cfb58 Mon Sep 17 00:00:00 2001 From: Ismael Date: Mon, 9 Dec 2019 11:00:33 +0100 Subject: [PATCH 51/81] can bind nulls --- hecuba_core/src/TupleRow.h | 20 +++++++++++-- hecuba_core/src/TupleRowFactory.cpp | 29 ++++++++++++------- hecuba_core/src/py_interface/HCache.cpp | 12 ++++++-- hecuba_core/src/py_interface/PythonParser.cpp | 2 -- storage/cql_iface/cql_iface.py | 3 +- storage/cql_iface/tests/api_tests.py | 4 +-- 6 files changed, 51 insertions(+), 19 deletions(-) diff --git a/hecuba_core/src/TupleRow.h b/hecuba_core/src/TupleRow.h index 7b0cb924..0534500c 100644 --- a/hecuba_core/src/TupleRow.h +++ b/hecuba_core/src/TupleRow.h @@ -8,7 +8,7 @@ #include #include #include - +#include #include "TableMetadata.h" @@ -35,6 +35,10 @@ class TupleRow { /* Set methods */ + inline void set_keys(std::set keys) { + this->payload->set_keys(keys); + } + inline void setNull(uint32_t position) { this->payload->setNull(position); } @@ -47,8 +51,11 @@ class TupleRow { this->payload->setTimestamp(timestamp); } - /* Get methods */ + inline const std::set get_keys() const { + return this->payload->get_keys(); + } + inline bool isNull(uint32_t position) const { return this->payload->isNull(position); } @@ -100,6 +107,7 @@ class TupleRow { size_t ptr_length; std::vector null_values; int64_t timestamp; + std::set keys; /* Constructors */ @@ -122,6 +130,11 @@ class TupleRow { * we need to access the position must be divided by 32. This is accomplished by * doing bit shifting (5 positions to the right since 2^5=32). */ + + void set_keys(std::set keys) { + this->keys = keys; + } + void setNull(uint32_t position) { if (!null_values.empty()) this->null_values[position >> 5] |= (0x1 << (position % 32)); } @@ -144,6 +157,9 @@ class TupleRow { return this->timestamp; } + std::set get_keys() const { + return this->keys; + } /* Comparators */ bool operator<(TupleRowData &rhs) { diff --git a/hecuba_core/src/TupleRowFactory.cpp b/hecuba_core/src/TupleRowFactory.cpp index 170f492c..930519b5 100644 --- a/hecuba_core/src/TupleRowFactory.cpp +++ b/hecuba_core/src/TupleRowFactory.cpp @@ -341,6 +341,10 @@ TupleRowFactory::bind(CassTuple *tuple, const TupleRow *row) const { default: throw ModuleException("Default behaviour not supported"); } + } else { + //Element is a nullptr + CassError rc = cass_tuple_set_null(tuple, bind_pos); + CHECK_CASS("TupleRowFactory: Cassandra binding query unsuccessful [Null value]"); } } } @@ -349,14 +353,12 @@ TupleRowFactory::bind(CassTuple *tuple, const TupleRow *row) const { void TupleRowFactory::bind(CassStatement *statement, const TupleRow *row, u_int16_t offset) const { - if (!row || !statement) throw ModuleException("Statement bind: Null tuple row or statement received"); - if (metadata->size() != row->n_elem()) throw ModuleException("Statement bind: Found " + std::to_string(row->n_elem()) + ", expected " + std::to_string(metadata->size())); - + std::set keys = row->get_keys(); for (uint16_t i = 0; i < row->n_elem(); ++i) { uint16_t bind_pos = offset + i; const void *element_i = row->get_element(i); @@ -369,7 +371,7 @@ TupleRowFactory::bind(CassStatement *statement, const TupleRow *row, u_int16_t o const char *d = reinterpret_cast(*addr); CassError rc = cass_statement_bind_string(statement, bind_pos, d); CHECK_CASS("TupleRowFactory: Cassandra binding query unsuccessful [text], column:" + - metadata->at(i).info.begin()->second); + metadata->at(i).info.begin()->second); break; } case CASS_VALUE_TYPE_VARINT: @@ -378,7 +380,7 @@ TupleRowFactory::bind(CassStatement *statement, const TupleRow *row, u_int16_t o CassError rc = cass_statement_bind_int64(statement, bind_pos, *data);//L means long long, K unsigned long long CHECK_CASS("TupleRowFactory: Cassandra binding query unsuccessful [bigint/varint], column:" + - metadata->at(i).info.begin()->second); + metadata->at(i).info.begin()->second); break; } case CASS_VALUE_TYPE_BLOB: { @@ -413,7 +415,7 @@ TupleRowFactory::bind(CassStatement *statement, const TupleRow *row, u_int16_t o const double *data = static_cast(element_i); CassError rc = cass_statement_bind_double(statement, bind_pos, *data); CHECK_CASS("TupleRowFactory: Cassandra binding query unsuccessful [double], column:" + - metadata->at(i).info.begin()->second); + metadata->at(i).info.begin()->second); break; } @@ -422,7 +424,7 @@ TupleRowFactory::bind(CassStatement *statement, const TupleRow *row, u_int16_t o CassError rc = cass_statement_bind_float(statement, bind_pos, *data); CHECK_CASS("TupleRowFactory: Cassandra binding query unsuccessful [float], column:" + - metadata->at(i).info.begin()->second); + metadata->at(i).info.begin()->second); break; } @@ -431,7 +433,7 @@ TupleRowFactory::bind(CassStatement *statement, const TupleRow *row, u_int16_t o CassError rc = cass_statement_bind_int32(statement, bind_pos, *data); CHECK_CASS("TupleRowFactory: Cassandra binding query unsuccessful [int32], column:" + - metadata->at(i).info.begin()->second); + metadata->at(i).info.begin()->second); break; } @@ -445,7 +447,7 @@ TupleRowFactory::bind(CassStatement *statement, const TupleRow *row, u_int16_t o CassError rc = cass_statement_bind_uuid(statement, bind_pos, cass_uuid); CHECK_CASS("TupleRowFactory: Cassandra binding query unsuccessful [UUID], column:" + - metadata->at(i).info.begin()->second); + metadata->at(i).info.begin()->second); break; } @@ -462,7 +464,7 @@ TupleRowFactory::bind(CassStatement *statement, const TupleRow *row, u_int16_t o const int8_t *data = static_cast(element_i); CassError rc = cass_statement_bind_int8(statement, bind_pos, *data); CHECK_CASS("TupleRowFactory: Cassandra binding query unsuccessful [tiny int as int8], column:" + - metadata->at(i).info.begin()->second); + metadata->at(i).info.begin()->second); break; } @@ -492,6 +494,13 @@ TupleRowFactory::bind(CassStatement *statement, const TupleRow *row, u_int16_t o default: throw ModuleException("Default behaviour not supported"); } + } else { + if (keys.find(metadata->at(i).info.find("name")->second) != keys.end()) { + //Element is a nullptr + CassError rc = cass_statement_bind_null(statement, bind_pos); + CHECK_CASS("TupleRowFactory: Cassandra binding query unsuccessful [Null value], column:" + + metadata->at(i).info.begin()->second); + } } } } diff --git a/hecuba_core/src/py_interface/HCache.cpp b/hecuba_core/src/py_interface/HCache.cpp index 7f5d6283..c466d5f0 100644 --- a/hecuba_core/src/py_interface/HCache.cpp +++ b/hecuba_core/src/py_interface/HCache.cpp @@ -52,8 +52,8 @@ static PyObject *disconnectCassandra(PyObject *self) { /*** HCACHE DATA TYPE METHODS AND SETUP ***/ static PyObject *put_row(HCache *self, PyObject *args) { - PyObject *py_keys, *py_values; - if (!PyArg_ParseTuple(args, "OO", &py_keys, &py_values)) { + PyObject *py_keys, *py_values, *py_union_k; + if (!PyArg_ParseTuple(args, "OOO", &py_keys, &py_values, &py_union_k)) { return NULL; } for (uint16_t key_i = 0; key_i < PyList_Size(py_keys); ++key_i) { @@ -63,9 +63,16 @@ static PyObject *put_row(HCache *self, PyObject *args) { return NULL; } } + std::set keys; + PyObject *elem = NULL, *format_text = NULL; + for (uint16_t value_i = 0; value_i < PyList_Size(py_union_k); ++value_i) { + format_text = PyUnicode_AsUTF8String(PyList_GetItem(py_union_k, value_i)); + keys.insert(PyBytes_AS_STRING(format_text)); + } TupleRow *k; try { k = self->keysParser->make_tuple(py_keys); + k->set_keys(keys); } catch (TypeErrorException &e) { PyErr_SetString(PyExc_TypeError, e.what()); @@ -78,6 +85,7 @@ static PyObject *put_row(HCache *self, PyObject *args) { } try { TupleRow *v = self->valuesParser->make_tuple(py_values); + v->set_keys(keys); self->T->put_crow(k, v); delete (k); delete (v); diff --git a/hecuba_core/src/py_interface/PythonParser.cpp b/hecuba_core/src/py_interface/PythonParser.cpp index 3b48ada5..a1a75f79 100644 --- a/hecuba_core/src/py_interface/PythonParser.cpp +++ b/hecuba_core/src/py_interface/PythonParser.cpp @@ -51,8 +51,6 @@ PythonParser::~PythonParser() { */ TupleRow *PythonParser::make_tuple(PyObject *obj) const { if (!PyList_Check(obj)) throw ModuleException("PythonParser: Make tuple: Expected python list"); - if (size_t(PyList_Size(obj)) != parsers.size()) - throw ModuleException("PythonParser: Got less python elements than columns configured"); uint32_t total_bytes = 0; char *buffer = nullptr; if (!metas->empty()) { diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index 6cf278f3..f4258f3b 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -139,7 +139,8 @@ def put_record(self, object_id: UUID, key_list: OrderedDict, value_list: Ordered if not isinstance(key_list[k], data_model["value_id"][k].__origin__): raise TypeError("The key types don't match the data model specification") values_dict = CQLIface.fill_empty_keys_with_None(value_list, data_model["fields"]) - self.hcache_by_id[object_id].put_row(list(key_list.values()), list(values_dict.values())) + self.hcache_by_id[object_id].put_row(list(key_list.values()), list(values_dict.values()), list(value_list.keys())) + elif issubclass(data_model["type"], StorageNumpy): raise NotImplemented("The class type is not supported") else: diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index 84c0370b..89b145be 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -705,7 +705,7 @@ def test_put_record_StorageDict_complex_less_values_2_inserts_tuple_modif(self): for val, ret_val in zip(fields1.values(), returned_values[0]): self.assertEqual(val, ret_val) fields = NamedTuple('fields', [('a', Tuple[int, int])]) - fields = fields((3, 4))._asdict() + fields = fields((3, 5))._asdict() storage.put_record(myid, keys, fields) @@ -715,7 +715,7 @@ def test_put_record_StorageDict_complex_less_values_2_inserts_tuple_modif(self): returned_values.append(hcache.get_row([key])) self.assertEqual(len(data_model["fields"]), len(returned_values[0])) - self.assertEqual([(3, 4), True, 'adeu', None], returned_values[0]) + self.assertEqual([(3, 5), True, 'adeu', None], returned_values[0]) if __name__ == "__main__": From e9f826001784466459ccc29fb0e2fb13843d4621 Mon Sep 17 00:00:00 2001 From: Ismael Date: Mon, 9 Dec 2019 11:21:38 +0100 Subject: [PATCH 52/81] in python 3.8 dicts are already ordered --- storage/cql_iface/cql_iface.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index d392509f..476339a3 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -107,7 +107,7 @@ def fill_empty_keys_with_None(keys_dict, data_model): data_model = {k: None for k in data_model.keys()} return {**data_model, **keys_dict} - def put_record(self, object_id: UUID, key_list: OrderedDict, value_list: OrderedDict) -> None: + def put_record(self, object_id: UUID, key_list: dict, value_list: dict) -> None: try: UUID(str(object_id)) except ValueError: @@ -116,7 +116,7 @@ def put_record(self, object_id: UUID, key_list: OrderedDict, value_list: Ordered self.hcache_by_id[object_id] except KeyError: raise KeyError("hcache must be registered before in the function register_persistent_object") - if not isinstance(key_list, OrderedDict) and not isinstance(value_list, OrderedDict): + if not isinstance(key_list, dict) and not isinstance(value_list, dict): raise TypeError("key_list and value_list must be OrderedDict") data_model = self.data_models_cache[self.object_to_data_model[object_id]] if len(key_list) != len(data_model["value_id"].keys()): From fd50c1b688c254f44b83bc9e2e0c27770d9b46eb Mon Sep 17 00:00:00 2001 From: Ismael Date: Mon, 9 Dec 2019 11:24:36 +0100 Subject: [PATCH 53/81] in python 3.8 dicts are already ordered --- storage/cql_iface/cql_iface.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index f4258f3b..f0992f45 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -107,7 +107,7 @@ def fill_empty_keys_with_None(keys_dict, data_model): data_model = {k: None for k in data_model.keys()} return {**data_model, **keys_dict} - def put_record(self, object_id: UUID, key_list: OrderedDict, value_list: OrderedDict) -> None: + def put_record(self, object_id: UUID, key_list: dict, value_list: dict) -> None: try: UUID(str(object_id)) except ValueError: @@ -116,7 +116,7 @@ def put_record(self, object_id: UUID, key_list: OrderedDict, value_list: Ordered self.hcache_by_id[object_id] except KeyError: raise KeyError("hcache must be registered before in the function register_persistent_object") - if not isinstance(key_list, OrderedDict) and not isinstance(value_list, OrderedDict): + if not isinstance(key_list, dict) and not isinstance(value_list, dict): raise TypeError("key_list and value_list must be OrderedDict") data_model = self.data_models_cache[self.object_to_data_model[object_id]] if len(key_list) != len(data_model["value_id"].keys()): From d313c74d1f6c36b8c1f7d828229888732c092810 Mon Sep 17 00:00:00 2001 From: Ismael Date: Wed, 11 Dec 2019 12:23:34 +0100 Subject: [PATCH 54/81] it does not work, we need the values --- storage/cql_iface/cql_iface.py | 29 +- storage/cql_iface/tests/api_tests.py | 530 +-------------------------- storage/storage_iface.py | 14 +- 3 files changed, 57 insertions(+), 516 deletions(-) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index f0992f45..84f29fcb 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -11,8 +11,11 @@ from .config import _hecuba2cassandra_typemap from .cql_comm import CqlCOMM from ..storage_iface import StorageIface +from typing import Generator +from uuid import UUID from .tests.mockStorageObj import StorageObj - +from .tools import generate_token_ring_ranges, get_istorage_attrs +from . import log """ Mockup on how the Cassandra implementation of the interface could work. """ @@ -144,4 +147,26 @@ def put_record(self, object_id: UUID, key_list: dict, value_list: dict) -> None: elif issubclass(data_model["type"], StorageNumpy): raise NotImplemented("The class type is not supported") else: - raise NotImplemented("The class type is not supported") \ No newline at end of file + raise NotImplemented("The class type is not supported") + + def split(self, object_id: UUID, subsets: int):# -> Generator[UUID, int]: + try: + UUID(str(object_id)) + except ValueError: + raise ValueError("The object_id is not an UUID") + if not isinstance(subsets, int): + raise TypeError("subsets parameter should be an integer") + from .tools import tokens_partitions, build_remotely + try: + tokens = get_istorage_attrs(object_id)[0].tokens + except AttributeError: + tokens = generate_token_ring_ranges() + + for token_split in tokens_partitions(get_istorage_attrs(object_id)[0].name.split('.')[0], get_istorage_attrs(object_id)[0].name.split('.')[1], tokens, subsets): + storage_id = uuid.uuid4() + log.debug('assigning to {} num tokens {}'.format(str(storage_id), len(token_split))) + args_dict = self.data_models_cache[self.object_to_data_model[object_id]] + args_dict['value_id'] = storage_id + args_dict['tokens'] = token_split + args_dict["built_remotely"] = True + yield build_remotely(args_dict) \ No newline at end of file diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index 89b145be..a6d6c4f8 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -15,7 +15,7 @@ class TestClass(IStorage): - def __new__(cls, name='', *args, **kwargs): + def __new__(cls, *args, name='', **kwargs): toret = super(TestClass, cls).__new__(cls, name) return toret @@ -155,276 +155,8 @@ def test_add_data_model_complex_structure(self): id = storage.add_data_model(data_model) self.assertTrue(storage.data_models_cache[id]) - def test_register_persistent_except_data_model_id_none(self): + def test_put_record_StorageDict_split_except_uuid_wrong_format(self): with self.assertRaises(ValueError): - # Setup object - given_name = 'storage_test.custom_obj' - obj = TestClass(name=given_name) - data_model = {"type": mockClass, "value_id": {"k": str}, "fields": {"a": int}} - - # Setup persistent storage - storage = CQLIface() - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(None, obj) - - def test_register_persistent_except_data_model_obj_not_istorage(self): - with self.assertRaises(RuntimeError): - # Setup object - obj = mockClassNoInherit() - data_model = {"type": mockClass, "value_id": {"k": str}, "fields": {"a": int}} - # Setup persistent storage - storage = CQLIface() - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(None, obj) - - def test_register_persistent_except_data_model_obj_not_persistent(self): - with self.assertRaises(ValueError): - # Setup object - obj = mockClass() - data_model = {"type": mockClass, "value_id": {"k": str}, "fields": {"a": int}} - # Setup persistent storage - storage = CQLIface() - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(None, obj) - - def test_register_persistent_except_data_model_not_registered(self): - with self.assertRaises(KeyError): - # Setup object - given_name = 'storage_test.custom_obj' - obj = TestClass(name=given_name) - data_model = {"type": mockClass, "value_id": {"k": str}, "fields": {"a": int}} - - # Setup persistent storage - storage = CQLIface() - storage.register_persistent_object(8, obj) - - def test_register_persistent_obj_dict_ints(self): - given_name = 'storage_test.custom_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - obj = TestClass(name=given_name) - myid = obj.getID() - name = obj.get_name() - data_model = {"type": TestClass, "value_id": {"k": str}, "fields": {"a": int}} - - # Setup persistent storage - storage = CQLIface() - - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(data_model_id, obj) - res = config.session.execute("SELECT * FROM hecuba.istorage WHERE storage_id={}".format(myid)).one() - self.assertEqual(res.name, name) - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - def test_register_persistent_obj_storage_obj(self): - given_name = 'storage_test.custom_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - obj = TestClass(name=given_name) - myid = obj.getID() - name = obj.get_name() - data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": str, "b": str}} - - # Setup persistent storage - storage = CQLIface() - - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(data_model_id, obj) - res = config.session.execute("SELECT * FROM hecuba.istorage WHERE storage_id={}".format(myid)).one() - self.assertEqual(res.name, name) - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - def test_register_persistent_obj_storage_dict(self): - given_name = 'storage_test.custom_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - obj = TestClass(name=given_name) - myid = obj.getID() - name = obj.get_name() - data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": str, "b": str}} - - # Setup persistent storage - storage = CQLIface() - - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(data_model_id, obj) - res = config.session.execute("SELECT * FROM hecuba.istorage WHERE storage_id={}".format(myid)).one() - self.assertEqual(res.name, name) - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - def test_register_persistent_obj_storage_numpy(self): - given_name = 'storage_test.custom_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - obj = TestClass(name=given_name) - myid = obj.getID() - name = obj.get_name() - data_model = {"type": StorageNumpy, "value_id": {"k": int}, "fields": {"a": str, "b": str}} - - # Setup persistent storage - storage = CQLIface() - - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(data_model_id, obj) - res = config.session.execute("SELECT * FROM hecuba.istorage WHERE storage_id={}".format(myid)).one() - self.assertEqual(res.name, name) - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - def test_put_record_except_invalid_uuid(self): - with self.assertRaises(ValueError): - given_name = 'storage_test.complex_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - obj = TestClass(name=given_name) - data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} - storage = CQLIface() - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(data_model_id, obj) - storage.put_record("", None, None) - - def test_put_record_except_hcache_not_registered(self): - with self.assertRaises(ValueError): - given_name = 'storage_test.complex_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - obj = TestClass(name=given_name) - data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} - storage = CQLIface() - data_model_id = storage.add_data_model(data_model) - storage.put_record("", None, None) - - def test_put_record_except_key_value_must_be_ordered_dict(self): - with self.assertRaises(TypeError): - given_name = 'storage_test.complex_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - obj = TestClass(name=given_name) - myid = obj.getID() - data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} - storage = CQLIface() - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(data_model_id, obj) - storage.put_record(myid, None, None) - - def test_put_record_except_key_not_exist(self): - with self.assertRaises(KeyError): - given_name = 'storage_test.complex_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - obj = TestClass(name=given_name) - myid = obj.getID() - data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} - storage = CQLIface() - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(data_model_id, obj) - - keys = NamedTuple('keys', [('k', uuid.UUID)]) - keys = keys(myid)._asdict() - fields = NamedTuple('fields', [('a', int), ('b', str), ('d', float)]) - fields = fields(4, 'ab', 3.4)._asdict() - storage.put_record(myid, keys, fields) - - def test_put_record_except_values_not_same_class(self): - with self.assertRaises(Exception): - given_name = 'storage_test.complex_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - obj = TestClass(name=given_name) - myid = obj.getID() - data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} - storage = CQLIface() - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(data_model_id, obj) - - keys = NamedTuple('keys', [('k', uuid.UUID)]) - keys = keys(myid)._asdict() - fields = NamedTuple('fields', [('a', int), ('b', str), ('c', int)]) - fields = fields(4, 'ab', 3)._asdict() - storage.put_record(myid, keys, fields) - - def test_put_record_StorageObj(self): - given_name = 'storage_test.complex_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - obj = TestClass2(name=given_name) - myid = obj.getID() - data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} - given_name = 'storage_test.dict' - storage = CQLIface() - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(data_model_id, obj) - - keys = NamedTuple('keys', [('k', uuid.UUID)]) - keys = keys(myid)._asdict() - fields = NamedTuple('fields', [('a', int), ('b', str), ('c', float)]) - fields = fields(44, 'zasd', 8.0)._asdict() - - storage.put_record(myid, keys, fields) - hcache = storage.hcache_by_id[myid] - - returned_values = hcache.get_row([myid]) - - self.assertEqual(len([44, 'zasd', 8.0]), len(returned_values)) - - for val, ret_val in zip([44, 'zasd', 8.0], returned_values): - self.assertAlmostEqual(val, ret_val) - - def test_put_record_StorageObj_val_nones(self): - given_name = 'storage_test.complex_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - obj = TestClass2(name=given_name) - myid = obj.getID() - data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": str, "c": float}} - given_name = 'storage_test.dict' - storage = CQLIface() - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(data_model_id, obj) - - keys = NamedTuple('keys', [('k', uuid.UUID)]) - keys = keys(myid)._asdict() - fields = NamedTuple('fields', [('a', int), ('b', str), ('c', float)]) - fields = fields(None, None, None)._asdict() - storage.put_record(myid, keys, fields) - - returned_values = [] - hcache = storage.hcache_by_id[myid] - for key in keys.values(): - returned_values.append(hcache.get_row([key])) - - self.assertEqual(len(fields.values()), len(returned_values[0])) - - for val, ret_val in zip(fields.values(), returned_values[0]): - self.assertAlmostEqual(val, ret_val) - - def test_put_record_except_values_fields_not_same_size_as_data_model(self): - with self.assertRaises(Exception): - given_name = 'storage_test.complex_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - obj = TestClass(name=given_name) - myid = obj.getID() - data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": int, "b": str, "c": float}} - given_name = 'storage_test.dict' - storage = CQLIface() - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(data_model_id, obj) - - keys = NamedTuple('keys', [('k', int)]) - keys = keys(8)._asdict() - fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', float), ('d', str)]) - fields = fields(4, 'hola', 3.8, 'adeu')._asdict() - - storage.put_record(myid, keys, fields) - - returned_values = [] - hcache = storage.hcache_by_id[myid] - for key in keys.values(): - returned_values.append(hcache.get_row([key])) - - self.assertEqual(len(fields.values()), len(returned_values[0])) - - for val, ret_val in zip(fields.values(), returned_values[0]): - self.assertAlmostEqual(val, ret_val) - - def test_put_record_except_keys_not_mach_data_model_type(self): - with self.assertRaises(Exception): given_name = 'storage_test.complex_obj' config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) @@ -438,23 +170,16 @@ def test_put_record_except_keys_not_mach_data_model_type(self): keys = NamedTuple('keys', [('k', int)]) keys = keys(8)._asdict() - fields = NamedTuple('fields', [('z', int), ('b', 'name'), ('c', float)]) - fields = fields(4, 'hola', 3.8)._asdict() + fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', float)]) + fields = fields(None, None, None)._asdict() storage.put_record(myid, keys, fields) + for partition in storage.split(4, 8): + for val in partition.keys(): + print(val) - returned_values = [] - hcache = storage.hcache_by_id[myid] - for key in keys.values(): - returned_values.append(hcache.get_row([key])) - - self.assertEqual(len(fields.values()), len(returned_values[0])) - - for val, ret_val in zip(fields.values(), returned_values[0]): - self.assertAlmostEqual(val, ret_val) - - def test_put_record_except_values_not_mach_data_model_type(self): - with self.assertRaises(Exception): + def test_put_record_StorageDict_split_except_subsets_wrong_type(self): + with self.assertRaises(TypeError): given_name = 'storage_test.complex_obj' config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) @@ -469,50 +194,14 @@ def test_put_record_except_values_not_mach_data_model_type(self): keys = NamedTuple('keys', [('k', int)]) keys = keys(8)._asdict() fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', float)]) - fields = fields(4, 'hola', 'adeu')._asdict() + fields = fields(None, None, None)._asdict() storage.put_record(myid, keys, fields) + for partition in storage.split(myid, 4.8): + for val in partition.keys(): + print(val) - returned_values = [] - hcache = storage.hcache_by_id[myid] - for key in keys.values(): - returned_values.append(hcache.get_row([key])) - - self.assertEqual(len(fields.values()), len(returned_values[0])) - - for val, ret_val in zip(fields.values(), returned_values[0]): - self.assertAlmostEqual(val, ret_val) - - def test_put_record_StorageDict(self): - given_name = 'storage_test.complex_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - obj = TestClass(name=given_name) - myid = obj.getID() - data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": int, "b": str, "c": float}} - given_name = 'storage_test.dict' - storage = CQLIface() - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(data_model_id, obj) - - keys = NamedTuple('keys', [('k', int)]) - keys = keys(8)._asdict() - fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', float)]) - fields = fields(4, 'hola', 3.8)._asdict() - - storage.put_record(myid, keys, fields) - - returned_values = [] - hcache = storage.hcache_by_id[myid] - for key in keys.values(): - returned_values.append(hcache.get_row([key])) - - self.assertEqual(len(fields.values()), len(returned_values[0])) - - for val, ret_val in zip(fields.values(), returned_values[0]): - self.assertAlmostEqual(val, ret_val) - - def test_put_record_StorageDict_with_val_nones(self): + def test_put_record_StorageDict_split(self): given_name = 'storage_test.complex_obj' config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) @@ -530,193 +219,8 @@ def test_put_record_StorageDict_with_val_nones(self): fields = fields(None, None, None)._asdict() storage.put_record(myid, keys, fields) - - returned_values = [] - hcache = storage.hcache_by_id[myid] - for key in keys.values(): - returned_values.append(hcache.get_row([key])) - - self.assertEqual(len(fields.values()), len(returned_values[0])) - - for val, ret_val in zip(fields.values(), returned_values[0]): - self.assertAlmostEqual(val, ret_val) - - def test_put_record_StorageDict_except_with_key_nones(self): - with self.assertRaises(Exception): - given_name = 'storage_test.complex_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - obj = TestClass(name=given_name) - myid = obj.getID() - data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": int, "b": str, "c": float}} - given_name = 'storage_test.dict' - storage = CQLIface() - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(data_model_id, obj) - - keys = NamedTuple('keys', [('k', int)]) - keys = keys(None)._asdict() - fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', float)]) - fields = fields(4, 'hola', 3.8)._asdict() - - storage.put_record(myid, keys, fields) - - returned_values = [] - hcache = storage.hcache_by_id[myid] - for key in keys.values(): - returned_values.append(hcache.get_row([key])) - - self.assertEqual(len(fields.values()), len(returned_values[0])) - - for val, ret_val in zip(fields.values(), returned_values[0]): - self.assertAlmostEqual(val, ret_val) - - def test_put_record_StorageDict_complex(self): - given_name = 'storage_test.complex_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - obj = TestClass(name=given_name) - myid = obj.getID() - data_model = {"type": StorageDict, "value_id": {"k": int}, - "fields": {"a": Tuple[int, int], "b": bool, "c": str}} - given_name = 'storage_test.dict' - storage = CQLIface() - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(data_model_id, obj) - - keys = NamedTuple('keys', [('k', int)]) - keys = keys(8)._asdict() - fields = NamedTuple('fields', [('a', Tuple[int, int]), ('b', bool), ('c', str)]) - fields = fields((3, 4), True, 'adeu')._asdict() - - storage.put_record(myid, keys, fields) - - returned_values = [] - hcache = storage.hcache_by_id[myid] - for key in keys.values(): - returned_values.append(hcache.get_row([key])) - - self.assertEqual(len(fields.values()), len(returned_values[0])) - - for val, ret_val in zip(fields.values(), returned_values[0]): - self.assertEqual(val, ret_val) - - def test_put_record_StorageDict_complex_less_values(self): - given_name = 'storage_test.complex_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - obj = TestClass(name=given_name) - myid = obj.getID() - data_model = {"type": StorageDict, "value_id": {"k": int}, - "fields": {"a": Tuple[int, int], "b": bool, "c": str, "d": int}} - given_name = 'storage_test.dict' - storage = CQLIface() - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(data_model_id, obj) - - keys = NamedTuple('keys', [('k', int)]) - keys = keys(8)._asdict() - fields = NamedTuple('fields', [('a', Tuple[int, int]), ('b', bool), ('c', str)]) - fields = fields((3, 4), True, 'adeu')._asdict() - - storage.put_record(myid, keys, fields) - - returned_values = [] - hcache = storage.hcache_by_id[myid] - for key in keys.values(): - returned_values.append(hcache.get_row([key])) - - self.assertEqual(len(data_model["fields"]), len(returned_values[0])) - - for val, ret_val in zip(fields.values(), returned_values[0]): - self.assertEqual(val, ret_val) - - def test_put_record_StorageDict_complex_less_values_2_inserts(self): - given_name = 'storage_test.complex_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - obj = TestClass(name=given_name) - myid = obj.getID() - data_model = {"type": StorageDict, "value_id": {"k": int}, - "fields": {"a": Tuple[int, int], "b": bool, "c": str, "d": int}} - given_name = 'storage_test.dict' - storage = CQLIface() - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(data_model_id, obj) - - keys = NamedTuple('keys', [('k', int)]) - keys = keys(8)._asdict() - fields = NamedTuple('fields', [('a', Tuple[int, int]), ('b', bool), ('c', str)]) - fields1 = fields((3, 4), True, 'adeu')._asdict() - - storage.put_record(myid, keys, fields1) - - returned_values = [] - hcache = storage.hcache_by_id[myid] - for key in keys.values(): - returned_values.append(hcache.get_row([key])) - - self.assertEqual(len(data_model["fields"]), len(returned_values[0])) - - for val, ret_val in zip(fields1.values(), returned_values[0]): - self.assertEqual(val, ret_val) - - fields = NamedTuple('fields', [('d', int)]) - fields = fields(8)._asdict() - - storage.put_record(myid, keys, fields) - - returned_values = [] - hcache = storage.hcache_by_id[myid] - for key in keys.values(): - returned_values.append(hcache.get_row([key])) - - self.assertEqual(len(data_model["fields"]), len(returned_values[0])) - - for val, ret_val in zip(fields1.values(), returned_values[0]): - self.assertEqual(val, ret_val) - - def test_put_record_StorageDict_complex_less_values_2_inserts_tuple_modif(self): - given_name = 'storage_test.complex_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - obj = TestClass(name=given_name) - myid = obj.getID() - data_model = {"type": StorageDict, "value_id": {"k": int}, - "fields": {"a": Tuple[int, int], "b": bool, "c": str, "d": int}} - given_name = 'storage_test.dict' - storage = CQLIface() - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(data_model_id, obj) - - keys = NamedTuple('keys', [('k', int)]) - keys = keys(8)._asdict() - fields = NamedTuple('fields', [('a', Tuple[int, int]), ('b', bool), ('c', str)]) - fields1 = fields((3, None), True, 'adeu')._asdict() - - storage.put_record(myid, keys, fields1) - returned_values = [] - hcache = storage.hcache_by_id[myid] - for key in keys.values(): - returned_values.append(hcache.get_row([key])) - - self.assertEqual(len(data_model["fields"]), len(returned_values[0])) - - for val, ret_val in zip(fields1.values(), returned_values[0]): - self.assertEqual(val, ret_val) - fields = NamedTuple('fields', [('a', Tuple[int, int])]) - fields = fields((3, 5))._asdict() - - storage.put_record(myid, keys, fields) - - returned_values = [] - hcache = storage.hcache_by_id[myid] - for key in keys.values(): - returned_values.append(hcache.get_row([key])) - - self.assertEqual(len(data_model["fields"]), len(returned_values[0])) - self.assertEqual([(3, 5), True, 'adeu', None], returned_values[0]) - - + for partition in storage.split(myid, 8): + for val in partition.keys(): + print(val) if __name__ == "__main__": unittest.main() diff --git a/storage/storage_iface.py b/storage/storage_iface.py index 1af2aca4..abace904 100644 --- a/storage/storage_iface.py +++ b/storage/storage_iface.py @@ -1,4 +1,7 @@ from abc import ABCMeta, abstractmethod +from typing import Generator +from uuid import UUID + from collections import OrderedDict from uuid import UUID from storage.cql_iface.tests.mockIStorage import IStorage @@ -36,4 +39,13 @@ def put_record(self, object_id: UUID, key_list: OrderedDict, value_list: Ordered :param value_list: List with the records to be stored. :return: - """ - pass \ No newline at end of file + pass + @abstractmethod + def split(self, object_id: UUID, subsets: int):# -> Generator[UUID]: + """ + Partitions the data of the Hecuba object referenced by `object_id` following the same data model. + Each partition is assigned an UUID. + :param object_id: Hecuba object identifier + :return: Yield an `object_id` referencing a subset of the data. + """ + pass From bea4db5714e2e4fd9ad8002c854e30e9acf8d80e Mon Sep 17 00:00:00 2001 From: Ismael Date: Mon, 16 Dec 2019 08:26:36 +0100 Subject: [PATCH 55/81] first approach --- storage/cql_iface/cql_iface.py | 13 +++++++------ storage/cql_iface/tests/api_tests.py | 3 +-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index 84f29fcb..3a4584cc 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -156,11 +156,11 @@ def split(self, object_id: UUID, subsets: int):# -> Generator[UUID, int]: raise ValueError("The object_id is not an UUID") if not isinstance(subsets, int): raise TypeError("subsets parameter should be an integer") - from .tools import tokens_partitions, build_remotely - try: - tokens = get_istorage_attrs(object_id)[0].tokens - except AttributeError: - tokens = generate_token_ring_ranges() + from .tools import tokens_partitions + #try: + # tokens = get_istorage_attrs(object_id)[0].tokens + #except AttributeError: + tokens = generate_token_ring_ranges() for token_split in tokens_partitions(get_istorage_attrs(object_id)[0].name.split('.')[0], get_istorage_attrs(object_id)[0].name.split('.')[1], tokens, subsets): storage_id = uuid.uuid4() @@ -169,4 +169,5 @@ def split(self, object_id: UUID, subsets: int):# -> Generator[UUID, int]: args_dict['value_id'] = storage_id args_dict['tokens'] = token_split args_dict["built_remotely"] = True - yield build_remotely(args_dict) \ No newline at end of file + yield storage_id + diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index a6d6c4f8..b01e856f 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -220,7 +220,6 @@ def test_put_record_StorageDict_split(self): storage.put_record(myid, keys, fields) for partition in storage.split(myid, 8): - for val in partition.keys(): - print(val) + print(partition) if __name__ == "__main__": unittest.main() From 0febc5873d39557de2d3653fbd0b495afea513ef Mon Sep 17 00:00:00 2001 From: Ismael Date: Mon, 16 Dec 2019 09:13:56 +0100 Subject: [PATCH 56/81] first approach --- storage/cql_iface/tests/api_tests.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index b01e856f..aaca6b35 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -162,13 +162,13 @@ def test_put_record_StorageDict_split_except_uuid_wrong_format(self): obj = TestClass(name=given_name) myid = obj.getID() - data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": int, "b": str, "c": float}} + data_model = {"type": StorageDict, "value_id": {"k1": int}, "fields": {"a": int, "b": str, "c": float}} given_name = 'storage_test.dict' storage = CQLIface() data_model_id = storage.add_data_model(data_model) storage.register_persistent_object(data_model_id, obj) - keys = NamedTuple('keys', [('k', int)]) + keys = NamedTuple('keys', [('k1', int)]) keys = keys(8)._asdict() fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', float)]) fields = fields(None, None, None)._asdict() @@ -185,13 +185,13 @@ def test_put_record_StorageDict_split_except_subsets_wrong_type(self): obj = TestClass(name=given_name) myid = obj.getID() - data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": int, "b": str, "c": float}} + data_model = {"type": StorageDict, "value_id": {"k1": int}, "fields": {"a": int, "b": str, "c": float}} given_name = 'storage_test.dict' storage = CQLIface() data_model_id = storage.add_data_model(data_model) storage.register_persistent_object(data_model_id, obj) - keys = NamedTuple('keys', [('k', int)]) + keys = NamedTuple('keys', [('k1', int)]) keys = keys(8)._asdict() fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', float)]) fields = fields(None, None, None)._asdict() @@ -219,7 +219,10 @@ def test_put_record_StorageDict_split(self): fields = fields(None, None, None)._asdict() storage.put_record(myid, keys, fields) - for partition in storage.split(myid, 8): - print(partition) + parts = [] + for partition in storage.split(myid, 9): + parts.append(partition) + self.assertTrue(len(parts) == 10) + if __name__ == "__main__": unittest.main() From 207800665e3e17df2d4760e881f4ffe5eb5121a7 Mon Sep 17 00:00:00 2001 From: Ismael Date: Mon, 16 Dec 2019 11:08:49 +0100 Subject: [PATCH 57/81] chaging the structure --- storage/cql_iface/cql_iface.py | 43 ++++++++++++++++++++++++---- storage/cql_iface/tests/api_tests.py | 2 +- 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index 3a4584cc..8717c99e 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -149,6 +149,40 @@ def put_record(self, object_id: UUID, key_list: dict, value_list: dict) -> None: else: raise NotImplemented("The class type is not supported") + def get_record(self, object_id: UUID, key_list: OrderedDict) -> List[object]: + try: + UUID(str(object_id)) + except ValueError: + raise ValueError("The object_id is not an UUID") + try: + self.hcache_by_id[object_id] + except KeyError: + raise KeyError("hcache must be registered before in the function register_persistent_object") + + if not key_list: + raise ValueError("key_list and value_list cannot be None") + data_model = self.data_models_cache[self.object_to_data_model[object_id]] + + if len(key_list) != len(data_model["value_id"].keys()): + raise ValueError("The length of the keys should be the same one as the data model definition") + + if not all([k in data_model["value_id"].keys() for k in list(key_list.keys())]): + raise KeyError("The keys in key_list must exist in the specified data model") + + for k in key_list: + try: + if not isinstance(key_list[k], data_model["value_id"][k]): + raise Exception("The key types don't match the data model specification") + except TypeError: + if not isinstance(key_list[k], data_model["value_id"][k].__origin__): + raise TypeError("The key types don't match the data model specification") + + try: + result = self.hcache_by_id[object_id].get_row(list(key_list.values())) + except Exception: + result = [] + return result + def split(self, object_id: UUID, subsets: int):# -> Generator[UUID, int]: try: UUID(str(object_id)) @@ -157,17 +191,16 @@ def split(self, object_id: UUID, subsets: int):# -> Generator[UUID, int]: if not isinstance(subsets, int): raise TypeError("subsets parameter should be an integer") from .tools import tokens_partitions - #try: - # tokens = get_istorage_attrs(object_id)[0].tokens - #except AttributeError: + tokens = generate_token_ring_ranges() for token_split in tokens_partitions(get_istorage_attrs(object_id)[0].name.split('.')[0], get_istorage_attrs(object_id)[0].name.split('.')[1], tokens, subsets): storage_id = uuid.uuid4() log.debug('assigning to {} num tokens {}'.format(str(storage_id), len(token_split))) + self.hcache_by_id[storage_id] = self.hcache_by_id[object_id] args_dict = self.data_models_cache[self.object_to_data_model[object_id]] - args_dict['value_id'] = storage_id args_dict['tokens'] = token_split - args_dict["built_remotely"] = True + self.object_to_data_model[storage_id] = self.object_to_data_model[object_id] + self.data_models_cache[self.object_to_data_model[storage_id]] = args_dict yield storage_id diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index aaca6b35..75f8f6f7 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -216,7 +216,7 @@ def test_put_record_StorageDict_split(self): keys = NamedTuple('keys', [('k', int)]) keys = keys(8)._asdict() fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', float)]) - fields = fields(None, None, None)._asdict() + fields = fields(1, 'a', 3.0)._asdict() storage.put_record(myid, keys, fields) parts = [] From fdcd47537bde68afd8551632b237ddffe086870d Mon Sep 17 00:00:00 2001 From: Ismael Date: Mon, 16 Dec 2019 13:10:15 +0100 Subject: [PATCH 58/81] no check for StorageObj --- storage/cql_iface/cql_comm.py | 13 +++++++++++++ storage/cql_iface/cql_iface.py | 6 ------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/storage/cql_iface/cql_comm.py b/storage/cql_iface/cql_comm.py index 4bdac33d..3ae6759a 100644 --- a/storage/cql_iface/cql_comm.py +++ b/storage/cql_iface/cql_comm.py @@ -109,3 +109,16 @@ def create_hcache(object_id: UUID, name: str, definition: dict) -> Union[object, return HNumpyStore(*hcache_params) else: return Hcache(*hcache_params) + + @staticmethod + def delete_data(object_id): + res = config.execute(istorage_read_entry, [object_id]) + if res: + res = res.one() + else: + raise ValueError("There are no records with the specified object_id") + config.execute(config.session.prepare('DELETE FROM hecuba.istorage WHERE storage_id = ?'), [object_id]) + if res[1].find('StorageObj') != -1: + pass + else: + config.execute(f'TRUNCATE TABLE {res.name}', None) \ No newline at end of file diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index ca4c539d..04cb00f7 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -2,11 +2,8 @@ from uuid import UUID from storage.cql_iface.tests.mockIStorage import IStorage -from storage.cql_iface.tests.mockhdict import StorageDict -from storage.cql_iface.tests.mockhnumpy import StorageNumpy from .config import _hecuba2cassandra_typemap from .cql_comm import CqlCOMM -from .tests.mockStorageObj import StorageObj from ..storage_iface import StorageIface """ @@ -58,9 +55,6 @@ def add_data_model(self, definition: dict) -> int: raise KeyError("Expected keys 'type', 'value_id' and 'fields'") if not (isinstance(definition["value_id"], dict) and isinstance(definition["fields"], dict)): raise TypeError("Expected keys 'value_id' and 'fields' to be dict") - if definition["type"] is StorageObj and not all( - [definition["value_id"][k] is UUID for k in definition["value_id"].keys()]): - raise TypeError("If the type is StorageObj the value_id values must be of type uuid") if not issubclass(definition["type"], IStorage): raise TypeError("Class must inherit IStorage") dm = sorted(definition.items()) From 0807587284e7d6e45aa67f88fd1244eb021e615c Mon Sep 17 00:00:00 2001 From: Ismael Date: Mon, 16 Dec 2019 13:21:28 +0100 Subject: [PATCH 59/81] removed some uncessary checks --- storage/cql_iface/cql_iface.py | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index f0992f45..b70a4886 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -62,8 +62,6 @@ def add_data_model(self, definition: dict) -> int: raise KeyError("Expected keys 'type', 'value_id' and 'fields'") if not (isinstance(definition["value_id"], dict) and isinstance(definition["fields"], dict)): raise TypeError("Expected keys 'value_id' and 'fields' to be dict") - if definition["type"] is StorageObj and not all([definition["value_id"][k] is UUID for k in definition["value_id"].keys()]): - raise TypeError("If the type is StorageObj the value_id values must be of type uuid") if not issubclass(definition["type"], IStorage): raise TypeError("Class must inherit IStorage") dm = sorted(definition.items()) @@ -119,9 +117,7 @@ def put_record(self, object_id: UUID, key_list: dict, value_list: dict) -> None: if not isinstance(key_list, dict) and not isinstance(value_list, dict): raise TypeError("key_list and value_list must be OrderedDict") data_model = self.data_models_cache[self.object_to_data_model[object_id]] - if len(key_list) != len(data_model["value_id"].keys()): - raise ValueError( - "The length of the keys should be the same as the keys length in the data model definition") + for v in value_list: try: if not isinstance(value_list[v], data_model["fields"][v]) and value_list[v] is not None: @@ -130,18 +126,17 @@ def put_record(self, object_id: UUID, key_list: dict, value_list: dict) -> None: if not isinstance(value_list[v], data_model["fields"][v].__origin__): raise TypeError("The value types don't match the data model specification") - if issubclass(data_model["type"], StorageObj) or issubclass(data_model["type"], StorageDict): - for k in key_list: - try: - if not isinstance(key_list[k], data_model["value_id"][k]): - raise Exception("The key types don't match the data model specification") - except TypeError: - if not isinstance(key_list[k], data_model["value_id"][k].__origin__): - raise TypeError("The key types don't match the data model specification") - values_dict = CQLIface.fill_empty_keys_with_None(value_list, data_model["fields"]) - self.hcache_by_id[object_id].put_row(list(key_list.values()), list(values_dict.values()), list(value_list.keys())) + for k in key_list: + try: + if not isinstance(key_list[k], data_model["value_id"][k]): + raise Exception("The key types don't match the data model specification") + except TypeError: + if not isinstance(key_list[k], data_model["value_id"][k].__origin__): + raise TypeError("The key types don't match the data model specification") - elif issubclass(data_model["type"], StorageNumpy): - raise NotImplemented("The class type is not supported") - else: - raise NotImplemented("The class type is not supported") \ No newline at end of file + values_dict = CQLIface.fill_empty_keys_with_None(value_list, data_model["fields"]) + try: + self.hcache_by_id[object_id].put_row(list(key_list.values()), list(values_dict.values()), + list(value_list.keys())) + except Exception: + raise Exception("key_list or value_list have some parameter that does not correspond with the data model") \ No newline at end of file From 8afb77afca1ee02bf0315d9a16300c365dd2ddf3 Mon Sep 17 00:00:00 2001 From: Ismael Date: Mon, 16 Dec 2019 13:36:54 +0100 Subject: [PATCH 60/81] get record simplified --- storage/cql_iface/cql_iface.py | 16 ---------------- storage/cql_iface/tests/api_tests.py | 5 +++-- 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index 476339a3..dc3978f2 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -156,22 +156,6 @@ def get_record(self, object_id: UUID, key_list: OrderedDict) -> List[object]: if not key_list: raise ValueError("key_list and value_list cannot be None") - data_model = self.data_models_cache[self.object_to_data_model[object_id]] - - if len(key_list) != len(data_model["value_id"].keys()): - raise ValueError("The length of the keys should be the same one as the data model definition") - - if not all([k in data_model["value_id"].keys()for k in list(key_list.keys())]) : - raise KeyError("The keys in key_list must exist in the specified data model") - - for k in key_list: - try: - if not isinstance(key_list[k], data_model["value_id"][k]): - raise Exception("The key types don't match the data model specification") - except TypeError: - if not isinstance(key_list[k], data_model["value_id"][k].__origin__): - raise TypeError("The key types don't match the data model specification") - try: result = self.hcache_by_id[object_id].get_row(list(key_list.values())) except Exception: diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index 31c6ab1b..8d167be0 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -681,7 +681,6 @@ def test_get_record_except_invalid_keys(self): storage.get_record(myid, None) def test_get_record_except_invalid_keys_size(self): - with self.assertRaises(ValueError): given_name = 'storage_test.complex_obj' config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) @@ -701,7 +700,9 @@ def test_get_record_except_invalid_keys_size(self): storage.put_record(myid, keys, fields) keys = NamedTuple('keys', [('k', str), ('a', str)]) keys = keys('hola', 'abc')._asdict() - storage.get_record(myid, keys) + result = storage.get_record(myid, keys) + self.assertEqual(result, []) + def test_get_record(self): given_name = 'storage_test.complex_obj' From 284465dfdb4b2cdd388f3d98f00310c0b60995df Mon Sep 17 00:00:00 2001 From: Ismael Date: Wed, 18 Dec 2019 09:03:26 +0100 Subject: [PATCH 61/81] fixes --- .../tests/withcassandra/storagenumpy_tests.py | 38 ++++++++++++++++++- storage/cql_iface/cql_iface.py | 17 +++++---- 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/hecuba_py/tests/withcassandra/storagenumpy_tests.py b/hecuba_py/tests/withcassandra/storagenumpy_tests.py index 76f325c9..103cf9a3 100644 --- a/hecuba_py/tests/withcassandra/storagenumpy_tests.py +++ b/hecuba_py/tests/withcassandra/storagenumpy_tests.py @@ -1,8 +1,15 @@ import unittest - -from hecuba import config, StorageNumpy import uuid + import numpy as np +from cassandra.metadata import Token +from hecuba import config, StorageNumpy, StorageDict + + +class Prueba(StorageDict): + ''' + @TypeSpec dict<, val:str> + ''' class StorageNumpyTest(unittest.TestCase): @@ -125,6 +132,33 @@ def test_read_all(self): chunk = casted[slice(None, None, None)] self.assertTrue(np.allclose(chunk.view(np.ndarray), test_numpy)) + def test_locality(self): + + def get_hosts(tokens): + # type : (List[Long]) -> Host + + tm = config.cluster.metadata.token_map + hosts = set() + for token in tokens: + t = Token(token) + hosts.add(tm.get_replicas("my_app", t)[0]) + + + #hosts = set(map(lambda token: tm.get_replicas("my_app", token)[0], + # map(lambda a: Token(a), tokens))) + + return list(hosts)[0] + + prueba = Prueba("my_app.prueba") + + config.splits_per_node = 2 + + for partition in prueba.split(): + tokens = partition._tokens + + hosts = set([get_hosts(worker_partition) for worker_partition in tokens]) + print(hosts) + if __name__ == '__main__': unittest.main() diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index 0a052b67..7286bb99 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -1,16 +1,15 @@ +import uuid from collections import OrderedDict from typing import List, Tuple, FrozenSet, Generator from uuid import UUID -import uuid - from storage.cql_iface.tests.mockIStorage import IStorage from .config import _hecuba2cassandra_typemap from .cql_comm import CqlCOMM -from ..storage_iface import StorageIface -from .tools import generate_token_ring_ranges from .queries import istorage_read_entry, istorage_prepared_st -from .tools import config +from .tools import generate_token_ring_ranges, config +from ..storage_iface import StorageIface + """ Mockup on how the Cassandra implementation of the interface could work. """ @@ -171,10 +170,12 @@ def split(self, object_id: UUID, subsets: int) -> Generator[UUID, UUID, None]: else: raise ValueError("The istorage that identifies the object_id is not registered in the IStorage") tokens = generate_token_ring_ranges() if not res.tokens else res.tokens - for token_split in tokens_partitions(res.table_name.split('.')[0], res.table_name.split('.')[1], tokens, subsets): + for token_split in tokens_partitions(res.table_name.split('.')[0], res.table_name.split('.')[1], tokens, + subsets): storage_id = uuid.uuid4() try: - config.execute(istorage_prepared_st, [storage_id, res.table_name, res.obj_name+'_block', res.data_model, token_split]) + config.execute(istorage_prepared_st, + [storage_id, res.table_name, res.obj_name + '_block', res.data_model, token_split]) except Exception: raise Exception("The IStorage parameters could not be inserted into the IStorage table") - yield storage_id \ No newline at end of file + yield storage_id From d059fbe4978ebfcf9e3d5d96f6b0b1234bd22008 Mon Sep 17 00:00:00 2001 From: Ismael Date: Wed, 18 Dec 2019 10:34:00 +0100 Subject: [PATCH 62/81] get data locality first approach --- storage/cql_iface/cql_iface.py | 16 ++++++++- storage/cql_iface/tests/api_tests.py | 52 ++++++++++++++++++++++++++-- 2 files changed, 65 insertions(+), 3 deletions(-) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index 7286bb99..b0629525 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -7,7 +7,7 @@ from .config import _hecuba2cassandra_typemap from .cql_comm import CqlCOMM from .queries import istorage_read_entry, istorage_prepared_st -from .tools import generate_token_ring_ranges, config +from .tools import generate_token_ring_ranges, config, get_hosts from ..storage_iface import StorageIface """ @@ -179,3 +179,17 @@ def split(self, object_id: UUID, subsets: int) -> Generator[UUID, UUID, None]: except Exception: raise Exception("The IStorage parameters could not be inserted into the IStorage table") yield storage_id + + def get_data_locality(self, object_id: UUID) -> List[str]: + hosts_list = [] + try: + UUID(str(object_id)) + except ValueError: + raise ValueError("The object_id is not an UUID") + res = config.execute(istorage_read_entry, [object_id]) + if not res.one().tokens: + raise ValueError("The istorage identifies that the object_id is not registered in the IStorage") + tokens = res.one().tokens + hosts = set([get_hosts(worker_partition, res.one().table_name) for worker_partition in tokens]) + hosts_list.append(str(hosts)) + return hosts_list \ No newline at end of file diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index b72bb377..b04cd1e5 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -401,7 +401,55 @@ def test_put_record_StorageDict_split_except_subsets_wrong_type(self): for val in partition.keys(): print(val) - def test_put_record_StorageDict_split(self): + def test_put_record_StorageDict_split_and_get_data_locality_except(self): + with self.assertRaises(ValueError): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass(name=given_name) + myid = obj.getID() + data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": int, "b": str, "c": float}} + given_name = 'storage_test.dict' + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + keys = NamedTuple('keys', [('k', int)]) + keys = keys(8)._asdict() + fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', float)]) + fields = fields(1, 'a', 3.0)._asdict() + + storage.put_record(myid, keys, fields) + parts = [] + for partition in storage.split(myid, 9): + parts.append(partition) + self.assertTrue(storage.get_data_locality(None)) + + def test_put_record_StorageDict_split_and_get_data_locality_except(self): + with self.assertRaises(ValueError): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass(name=given_name) + myid = obj.getID() + data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": int, "b": str, "c": float}} + given_name = 'storage_test.dict' + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + keys = NamedTuple('keys', [('k', int)]) + keys = keys(8)._asdict() + fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', float)]) + fields = fields(1, 'a', 3.0)._asdict() + + storage.put_record(myid, keys, fields) + parts = [] + for partition in storage.split(myid, 9): + parts.append(partition) + self.assertTrue(storage.get_data_locality(myid)) + + def test_put_record_StorageDict_split_and_get_data_locality(self): given_name = 'storage_test.complex_obj' config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) @@ -422,7 +470,7 @@ def test_put_record_StorageDict_split(self): parts = [] for partition in storage.split(myid, 9): parts.append(partition) - self.assertTrue(len(parts) == 10) + self.assertTrue(storage.get_data_locality(parts[0])) if __name__ == "__main__": unittest.main() From 4b2ae322c7744a8a5140c96f2295c7b8fa5ab5df Mon Sep 17 00:00:00 2001 From: Ismael Date: Wed, 18 Dec 2019 10:40:04 +0100 Subject: [PATCH 63/81] tools file --- storage/cql_iface/tools.py | 215 +++++++++++++++++++++++++++++++++++++ 1 file changed, 215 insertions(+) create mode 100644 storage/cql_iface/tools.py diff --git a/storage/cql_iface/tools.py b/storage/cql_iface/tools.py new file mode 100644 index 00000000..1a8145c1 --- /dev/null +++ b/storage/cql_iface/tools.py @@ -0,0 +1,215 @@ +import uuid + +from cassandra.metadata import Token + +from . import config + +valid_types = ['counter', 'text', 'boolean', 'decimal', 'double', 'int', 'list', 'set', 'map', 'bigint', 'blob', + 'tuple', 'dict', 'float', 'numpy.ndarray'] + +basic_types = valid_types[:-1] + + +def storage_id_from_name(name): + return uuid.uuid3(uuid.NAMESPACE_DNS, name) + + +def process_path(module_path): + """ + Method to obtain module and class_name from a module path + Args: + module_path(String): path in the format module.class_name + Returns: + tuple containing class_name and module + """ + + if module_path == 'numpy.ndarray': + return 'StorageNumpy', 'hecuba.hnumpy' + if module_path == 'StorageDict': + return 'StorageDict', 'hecuba.hdict' + last = 0 + for key, i in enumerate(module_path): + if i == '.' and key > last: + last = key + module = module_path[:last] + class_name = module_path[last + 1:] + return class_name, module + + +""" + Cassandra related methods +""" + +_size_estimates = config.session.prepare(("SELECT mean_partition_size, partitions_count " + "FROM system.size_estimates WHERE keyspace_name=? and table_name=?")) +_max_token = int(((2 ** 63) - 1)) # type: int +_min_token = int(-2 ** 63) # type: int + +_select_istorage_meta = config.session.prepare("SELECT * FROM hecuba.istorage WHERE storage_id = ?") + + +def extract_ks_tab(name): + """ + Method used to obtain keyspace and table from a given name + Args: + name: a string containing keyspace name and table name, or only table name + Returns: + a tuple containing keyspace name and table name + """ + if not name: + return None, None + + sp = name.split(".") + if len(sp) == 2: + ksp = sp[0] + table = sp[1] + else: + ksp = config.execution_name + table = name + return ksp.lower(), table.lower() + + +def tokens_partitions(ksp, table, tokens_ranges, subsets): + """ + Method that calculates the new token partitions for a given object + Args: + tokens: current number of tokens of the object + min_tokens_per_worker: defined minimum number of tokens + number_of_workers: defined + Returns: + a partition every time it's called + :type tokens_ranges: list[(long,long)] + """ + from collections import defaultdict + from bisect import bisect_right + from cassandra.metadata import Murmur3Token + + splits_per_node = config.splits_per_node + token_range_size = config.token_range_size + target_token_range_size = config.target_token_range_size + + tm = config.cluster.metadata.token_map + tmap = tm.tokens_to_hosts_by_ks.get(ksp, None) + + tokens_murmur3 = map(lambda a: (Murmur3Token(a[0]), a[1]), tokens_ranges) + if not tmap: + tm.rebuild_keyspace(ksp, build_if_absent=True) + tmap = tm.tokens_to_hosts_by_ks[ksp] + + tokens_per_node = defaultdict(list) + for tmumur, t_to in tokens_murmur3: + point = bisect_right(tm.ring, tmumur) + if point == len(tm.ring): + tokens_per_node[tmap[tm.ring[0]][0]].append((tmumur.value, t_to)) + else: + tokens_per_node[tmap[tm.ring[point]][0]].append((tmumur.value, t_to)) + + n_nodes = len(tokens_per_node) + step_size = _max_token // subsets + if token_range_size: + step_size = token_range_size + elif target_token_range_size: + one = config.session.execute(_size_estimates, [ksp, table]).one() + if one: + (mean_p_size, p_count) = one + estimated_size = mean_p_size * p_count + if estimated_size > 0: + step_size = _max_token // ( + max(estimated_size / target_token_range_size, + subsets) + ) + + for tokens_in_node in tokens_per_node.values(): + partition = [] + for fraction, to in tokens_in_node: + while fraction < to - step_size: + partition.append((fraction, fraction + step_size)) + fraction += step_size + partition.append((fraction, to)) + group_size = max(len(partition) // (subsets // n_nodes), 1) + for i in range(0, len(partition), group_size): + yield partition[i:i + group_size] + + +def generate_token_ring_ranges(): + ring = config.cluster.metadata.token_map.ring + tokens = [token.value for token in ring] + return discrete_token_ranges(tokens) + +def get_hosts(tokens, table_name): + tm = config.cluster.metadata.token_map + hosts = set() + for token in tokens: + t = Token(token) + hosts.add(tm.get_replicas(table_name.split('.')[0], t)[0]) + return list(hosts)[0] + +def discrete_token_ranges(tokens): + """ + Makes proper tokens ranges ensuring that in a tuple (a,b) a <= b + Args: + tokens: a list of tokens [1, 0, 10] + Returns: + a rationalized list [(-1, 0),(0,10),(10, max)] + """ + tokens.sort() + if len(tokens) == 0: + return tokens + if tokens[0] > _min_token: + token_ranges = [(_min_token, tokens[0])] + else: + token_ranges = [] + n_tns = len(tokens) + for i in range(0, n_tns - 1): + token_ranges.append((tokens[i], tokens[i + 1])) + token_ranges.append((tokens[n_tns - 1], _max_token)) + return token_ranges + + +def count_name_collision(ksp, table, attribute): + import re + m = re.compile("^%s_%s(_[0-9]+)?$" % (table, attribute)) + q = config.session.execute("SELECT table_name FROM system_schema.tables WHERE keyspace_name = %s", + [ksp]) + return sum(1 for elem in q if m.match(elem[0])) + + +def get_istorage_attrs(storage_id): + return list(config.session.execute(_select_istorage_meta, [storage_id])) + + +def build_remotely(args): + """ + Takes the information which consists of at least the type, + :raises TypeError if the object class doesn't subclass IStorage + :param obj_info: Contains the information to be used to create the IStorage obj + :return: An IStorage object + """ + if "built_remotely" not in args.keys(): + built_remotely = True + else: + built_remotely = args["built_remotely"] + + obj_type = args.get('class_name', args.get('type', None)) + if obj_type is None: + raise TypeError("Trying to build an IStorage obj without giving the type") + + # Import the class defined by obj_type + cname, module = process_path(obj_type) + + ''' + if obj_type == str(StorageNumpy.__class__): + return StorageNumpy(name=args["name"], storage_id=args["storage_id"]) + ''' + try: + mod = __import__(module, globals(), locals(), [cname], 0) + except ValueError: + raise ValueError("Can't import class {} from module {}".format(cname, module)) + + imported_class = getattr(mod, cname) + + args = {k: v for k, v in args.items() if k in imported_class.args_names} + args.pop('class_name', None) + args["built_remotely"] = built_remotely + + return imported_class(**args) From ca66777092710f8367a78e23eeb9f5f023fe5719 Mon Sep 17 00:00:00 2001 From: Ismael Date: Wed, 18 Dec 2019 10:53:47 +0100 Subject: [PATCH 64/81] tools file added, hope now it works --- storage/cql_iface/tools.py | 215 +++++++++++++++++++++++++++++++++++++ 1 file changed, 215 insertions(+) create mode 100644 storage/cql_iface/tools.py diff --git a/storage/cql_iface/tools.py b/storage/cql_iface/tools.py new file mode 100644 index 00000000..1a8145c1 --- /dev/null +++ b/storage/cql_iface/tools.py @@ -0,0 +1,215 @@ +import uuid + +from cassandra.metadata import Token + +from . import config + +valid_types = ['counter', 'text', 'boolean', 'decimal', 'double', 'int', 'list', 'set', 'map', 'bigint', 'blob', + 'tuple', 'dict', 'float', 'numpy.ndarray'] + +basic_types = valid_types[:-1] + + +def storage_id_from_name(name): + return uuid.uuid3(uuid.NAMESPACE_DNS, name) + + +def process_path(module_path): + """ + Method to obtain module and class_name from a module path + Args: + module_path(String): path in the format module.class_name + Returns: + tuple containing class_name and module + """ + + if module_path == 'numpy.ndarray': + return 'StorageNumpy', 'hecuba.hnumpy' + if module_path == 'StorageDict': + return 'StorageDict', 'hecuba.hdict' + last = 0 + for key, i in enumerate(module_path): + if i == '.' and key > last: + last = key + module = module_path[:last] + class_name = module_path[last + 1:] + return class_name, module + + +""" + Cassandra related methods +""" + +_size_estimates = config.session.prepare(("SELECT mean_partition_size, partitions_count " + "FROM system.size_estimates WHERE keyspace_name=? and table_name=?")) +_max_token = int(((2 ** 63) - 1)) # type: int +_min_token = int(-2 ** 63) # type: int + +_select_istorage_meta = config.session.prepare("SELECT * FROM hecuba.istorage WHERE storage_id = ?") + + +def extract_ks_tab(name): + """ + Method used to obtain keyspace and table from a given name + Args: + name: a string containing keyspace name and table name, or only table name + Returns: + a tuple containing keyspace name and table name + """ + if not name: + return None, None + + sp = name.split(".") + if len(sp) == 2: + ksp = sp[0] + table = sp[1] + else: + ksp = config.execution_name + table = name + return ksp.lower(), table.lower() + + +def tokens_partitions(ksp, table, tokens_ranges, subsets): + """ + Method that calculates the new token partitions for a given object + Args: + tokens: current number of tokens of the object + min_tokens_per_worker: defined minimum number of tokens + number_of_workers: defined + Returns: + a partition every time it's called + :type tokens_ranges: list[(long,long)] + """ + from collections import defaultdict + from bisect import bisect_right + from cassandra.metadata import Murmur3Token + + splits_per_node = config.splits_per_node + token_range_size = config.token_range_size + target_token_range_size = config.target_token_range_size + + tm = config.cluster.metadata.token_map + tmap = tm.tokens_to_hosts_by_ks.get(ksp, None) + + tokens_murmur3 = map(lambda a: (Murmur3Token(a[0]), a[1]), tokens_ranges) + if not tmap: + tm.rebuild_keyspace(ksp, build_if_absent=True) + tmap = tm.tokens_to_hosts_by_ks[ksp] + + tokens_per_node = defaultdict(list) + for tmumur, t_to in tokens_murmur3: + point = bisect_right(tm.ring, tmumur) + if point == len(tm.ring): + tokens_per_node[tmap[tm.ring[0]][0]].append((tmumur.value, t_to)) + else: + tokens_per_node[tmap[tm.ring[point]][0]].append((tmumur.value, t_to)) + + n_nodes = len(tokens_per_node) + step_size = _max_token // subsets + if token_range_size: + step_size = token_range_size + elif target_token_range_size: + one = config.session.execute(_size_estimates, [ksp, table]).one() + if one: + (mean_p_size, p_count) = one + estimated_size = mean_p_size * p_count + if estimated_size > 0: + step_size = _max_token // ( + max(estimated_size / target_token_range_size, + subsets) + ) + + for tokens_in_node in tokens_per_node.values(): + partition = [] + for fraction, to in tokens_in_node: + while fraction < to - step_size: + partition.append((fraction, fraction + step_size)) + fraction += step_size + partition.append((fraction, to)) + group_size = max(len(partition) // (subsets // n_nodes), 1) + for i in range(0, len(partition), group_size): + yield partition[i:i + group_size] + + +def generate_token_ring_ranges(): + ring = config.cluster.metadata.token_map.ring + tokens = [token.value for token in ring] + return discrete_token_ranges(tokens) + +def get_hosts(tokens, table_name): + tm = config.cluster.metadata.token_map + hosts = set() + for token in tokens: + t = Token(token) + hosts.add(tm.get_replicas(table_name.split('.')[0], t)[0]) + return list(hosts)[0] + +def discrete_token_ranges(tokens): + """ + Makes proper tokens ranges ensuring that in a tuple (a,b) a <= b + Args: + tokens: a list of tokens [1, 0, 10] + Returns: + a rationalized list [(-1, 0),(0,10),(10, max)] + """ + tokens.sort() + if len(tokens) == 0: + return tokens + if tokens[0] > _min_token: + token_ranges = [(_min_token, tokens[0])] + else: + token_ranges = [] + n_tns = len(tokens) + for i in range(0, n_tns - 1): + token_ranges.append((tokens[i], tokens[i + 1])) + token_ranges.append((tokens[n_tns - 1], _max_token)) + return token_ranges + + +def count_name_collision(ksp, table, attribute): + import re + m = re.compile("^%s_%s(_[0-9]+)?$" % (table, attribute)) + q = config.session.execute("SELECT table_name FROM system_schema.tables WHERE keyspace_name = %s", + [ksp]) + return sum(1 for elem in q if m.match(elem[0])) + + +def get_istorage_attrs(storage_id): + return list(config.session.execute(_select_istorage_meta, [storage_id])) + + +def build_remotely(args): + """ + Takes the information which consists of at least the type, + :raises TypeError if the object class doesn't subclass IStorage + :param obj_info: Contains the information to be used to create the IStorage obj + :return: An IStorage object + """ + if "built_remotely" not in args.keys(): + built_remotely = True + else: + built_remotely = args["built_remotely"] + + obj_type = args.get('class_name', args.get('type', None)) + if obj_type is None: + raise TypeError("Trying to build an IStorage obj without giving the type") + + # Import the class defined by obj_type + cname, module = process_path(obj_type) + + ''' + if obj_type == str(StorageNumpy.__class__): + return StorageNumpy(name=args["name"], storage_id=args["storage_id"]) + ''' + try: + mod = __import__(module, globals(), locals(), [cname], 0) + except ValueError: + raise ValueError("Can't import class {} from module {}".format(cname, module)) + + imported_class = getattr(mod, cname) + + args = {k: v for k, v in args.items() if k in imported_class.args_names} + args.pop('class_name', None) + args["built_remotely"] = built_remotely + + return imported_class(**args) From 0bee18eca71f6a0716ec16cab6b6029cd0687061 Mon Sep 17 00:00:00 2001 From: Ismael Date: Wed, 18 Dec 2019 13:47:27 +0100 Subject: [PATCH 65/81] changes requested --- storage/cql_iface/config.py | 4 ++-- storage/cql_iface/cql_comm.py | 30 +++--------------------------- storage/cql_iface/cql_iface.py | 22 +++++++--------------- 3 files changed, 12 insertions(+), 44 deletions(-) diff --git a/storage/cql_iface/config.py b/storage/cql_iface/config.py index 5dd96a9f..c8312f60 100644 --- a/storage/cql_iface/config.py +++ b/storage/cql_iface/config.py @@ -15,8 +15,8 @@ str: 'text', bytearray: 'blob', bytes: 'blob', - Tuple: 'tuple', - FrozenSet: 'set', + #Tuple: 'tuple', + #FrozenSet: 'set', decimal.Decimal: 'decimal', datetime.date: 'date', datetime.datetime: 'datetime', diff --git a/storage/cql_iface/cql_comm.py b/storage/cql_iface/cql_comm.py index 3ae6759a..de3f9b5e 100644 --- a/storage/cql_iface/cql_comm.py +++ b/storage/cql_iface/cql_comm.py @@ -7,9 +7,6 @@ from . import config from .config import _hecuba2cassandra_typemap, log from .queries import istorage_prepared_st, istorage_read_entry -from .tests.mockStorageObj import StorageObj -from .tests.mockhdict import StorageDict - def extract_ksp_table(name): """ @@ -48,19 +45,11 @@ def register_data_model(data_model_id: int, definition: dict) -> None: def parse_definition_to_cass_format(fields_dict): all_values = "" for k, v in fields_dict.items(): - try: - all_values = all_values + "%s %s," % (k, _hecuba2cassandra_typemap[v]) - except KeyError: - val = str(v) - if issubclass(v.__origin__, Tuple): - all_values = all_values + str(k) + f" tuple<{val[val.find('[') + 1:val.rfind(']')]}>," - elif issubclass(v.__origin__, FrozenSet): - all_values = all_values + str(k) + f" frozen >," + all_values = all_values + "%s %s," % (k, _hecuba2cassandra_typemap[v]) return all_values[:-1] @staticmethod def create_table(name: str, definition: dict) -> None: - # StorageObj for now ksp, table = extract_ksp_table(name) query_keyspace = "CREATE KEYSPACE IF NOT EXISTS %s WITH replication = %s" % (ksp, config.replication) config.session.execute(query_keyspace) @@ -88,7 +77,7 @@ def create_table(name: str, definition: dict) -> None: log.debug('MAKE PERSISTENCE: %s', query_table) config.session.execute(query_table) except Exception as ex: - log.warn("Error creating the StorageDict table: %s %s", query_table, ex) + log.warn("Error creating the table: %s %s", query_table, ex) raise ex @staticmethod @@ -108,17 +97,4 @@ def create_hcache(object_id: UUID, name: str, definition: dict) -> Union[object, if definition["type"] is numpy.ndarray: return HNumpyStore(*hcache_params) else: - return Hcache(*hcache_params) - - @staticmethod - def delete_data(object_id): - res = config.execute(istorage_read_entry, [object_id]) - if res: - res = res.one() - else: - raise ValueError("There are no records with the specified object_id") - config.execute(config.session.prepare('DELETE FROM hecuba.istorage WHERE storage_id = ?'), [object_id]) - if res[1].find('StorageObj') != -1: - pass - else: - config.execute(f'TRUNCATE TABLE {res.name}', None) \ No newline at end of file + return Hcache(*hcache_params) \ No newline at end of file diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index 04cb00f7..6e1b8412 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -1,4 +1,3 @@ -from typing import List, Tuple, FrozenSet from uuid import UUID from storage.cql_iface.tests.mockIStorage import IStorage @@ -28,25 +27,18 @@ def __init__(self): pass @staticmethod - def check_values_from_definition(definition): + def _check_values_from_definition(definition): if isinstance(definition, dict): for v in definition.values(): - CQLIface.check_values_from_definition(v) + CQLIface._check_values_from_definition(v) elif isinstance(definition, (list, set, tuple)): for v in definition: - CQLIface.check_values_from_definition(v) + CQLIface._check_values_from_definition(v) else: try: - if isinstance(definition.__origin__, (Tuple, FrozenSet)): - try: - _hecuba2cassandra_typemap[definition.__origin__] - except KeyError: - raise TypeError(f"The type {definition} is not supported") - except AttributeError: - try: - _hecuba2cassandra_typemap[definition] - except KeyError: - raise TypeError(f"The type {definition} is not supported") + _hecuba2cassandra_typemap[definition] + except KeyError: + raise TypeError(f"The type {definition} is not supported") def add_data_model(self, definition: dict) -> int: if not isinstance(definition, dict): @@ -63,7 +55,7 @@ def add_data_model(self, definition: dict) -> int: self.data_models_cache[datamodel_id] except KeyError: dict_definition = {k: definition[k] for k in ('value_id', 'fields')} - CQLIface.check_values_from_definition(dict_definition) + CQLIface._check_values_from_definition(dict_definition) self.data_models_cache[datamodel_id] = definition CqlCOMM.register_data_model(datamodel_id, definition) return datamodel_id From b3aac82c3a8d6f8235b65159ded6721de5717f8e Mon Sep 17 00:00:00 2001 From: Ismael Date: Thu, 19 Dec 2019 08:54:52 +0100 Subject: [PATCH 66/81] changes requested commited --- storage/cql_iface/config.py | 6 +++--- storage/cql_iface/cql_comm.py | 12 +++++++++--- storage/cql_iface/cql_iface.py | 14 +++++++++++--- storage/cql_iface/tests/api_tests.py | 25 +++++++++++++++++++++++++ 4 files changed, 48 insertions(+), 9 deletions(-) diff --git a/storage/cql_iface/config.py b/storage/cql_iface/config.py index c8312f60..2f3e6e0a 100644 --- a/storage/cql_iface/config.py +++ b/storage/cql_iface/config.py @@ -3,7 +3,7 @@ import logging import os import uuid -from typing import FrozenSet, Tuple +from typing import Tuple import numpy @@ -15,8 +15,8 @@ str: 'text', bytearray: 'blob', bytes: 'blob', - #Tuple: 'tuple', - #FrozenSet: 'set', + Tuple: 'tuple', + # FrozenSet: 'set', decimal.Decimal: 'decimal', datetime.date: 'date', datetime.datetime: 'datetime', diff --git a/storage/cql_iface/cql_comm.py b/storage/cql_iface/cql_comm.py index de3f9b5e..e1821a6f 100644 --- a/storage/cql_iface/cql_comm.py +++ b/storage/cql_iface/cql_comm.py @@ -1,4 +1,4 @@ -from typing import Union, Tuple, FrozenSet +from typing import Union, Tuple from uuid import UUID import numpy @@ -8,6 +8,7 @@ from .config import _hecuba2cassandra_typemap, log from .queries import istorage_prepared_st, istorage_read_entry + def extract_ksp_table(name): """ Method used to obtain keyspace and table from a given name @@ -45,7 +46,12 @@ def register_data_model(data_model_id: int, definition: dict) -> None: def parse_definition_to_cass_format(fields_dict): all_values = "" for k, v in fields_dict.items(): - all_values = all_values + "%s %s," % (k, _hecuba2cassandra_typemap[v]) + try: + all_values = all_values + "%s %s," % (k, _hecuba2cassandra_typemap[v]) + except KeyError: + val = str(v) + if issubclass(v, Tuple): + all_values = all_values + str(k) + f" tuple<{val[val.find('[') + 1:val.rfind(']')]}>," return all_values[:-1] @staticmethod @@ -97,4 +103,4 @@ def create_hcache(object_id: UUID, name: str, definition: dict) -> Union[object, if definition["type"] is numpy.ndarray: return HNumpyStore(*hcache_params) else: - return Hcache(*hcache_params) \ No newline at end of file + return Hcache(*hcache_params) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index 6e1b8412..348200ad 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -1,3 +1,4 @@ +from typing import Tuple from uuid import UUID from storage.cql_iface.tests.mockIStorage import IStorage @@ -36,9 +37,16 @@ def _check_values_from_definition(definition): CQLIface._check_values_from_definition(v) else: try: - _hecuba2cassandra_typemap[definition] - except KeyError: - raise TypeError(f"The type {definition} is not supported") + if isinstance(definition.__origin__, Tuple): + try: + _hecuba2cassandra_typemap[definition.__origin__] + except KeyError: + raise TypeError(f"The type {definition} is not supported") + except AttributeError: + try: + _hecuba2cassandra_typemap[definition] + except KeyError: + raise TypeError(f"The type {definition} is not supported") def add_data_model(self, definition: dict) -> int: if not isinstance(definition, dict): diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index 9514d304..12cc5b9f 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -1,6 +1,7 @@ import decimal import unittest import uuid +from typing import Tuple import numpy @@ -114,6 +115,13 @@ def test_add_data_model_StorageObj(self): id = storage.add_data_model(data_model) self.assertTrue(storage.data_models_cache[id]) + def test_add_data_model_StorageObj2(self): + data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": Tuple[int]}} + storage = CQLIface() + # Register data models + id = storage.add_data_model(data_model) + self.assertTrue(storage.data_models_cache[id]) + def test_add_data_model_StorageDict(self): data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": str}} storage = CQLIface() @@ -231,6 +239,23 @@ def test_register_persistent_obj_storage_obj(self): self.assertEqual(res.name, name) config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + def test_register_persistent_obj_storage_obj_tuple(self): + given_name = 'storage_test.custom_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + obj = TestClass(name=given_name) + myid = obj.getID() + name = obj.get_name() + data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": Tuple[int], "b": str}} + + # Setup persistent storage + storage = CQLIface() + + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + res = config.session.execute("SELECT * FROM hecuba.istorage WHERE storage_id={}".format(myid)).one() + self.assertEqual(res.name, name) + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + def test_register_persistent_obj_storage_dict(self): given_name = 'storage_test.custom_obj' config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) From 9927806f710fa94c4f263d3dc777f6a60177d288 Mon Sep 17 00:00:00 2001 From: Ismael Date: Thu, 19 Dec 2019 09:06:35 +0100 Subject: [PATCH 67/81] tuple comparison --- storage/cql_iface/cql_comm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/cql_iface/cql_comm.py b/storage/cql_iface/cql_comm.py index e1821a6f..e23dccaf 100644 --- a/storage/cql_iface/cql_comm.py +++ b/storage/cql_iface/cql_comm.py @@ -50,7 +50,7 @@ def parse_definition_to_cass_format(fields_dict): all_values = all_values + "%s %s," % (k, _hecuba2cassandra_typemap[v]) except KeyError: val = str(v) - if issubclass(v, Tuple): + if issubclass(v, tuple): all_values = all_values + str(k) + f" tuple<{val[val.find('[') + 1:val.rfind(']')]}>," return all_values[:-1] From 80e2edc224505701420b84acfedb6de373c1b46b Mon Sep 17 00:00:00 2001 From: Ismael Date: Thu, 19 Dec 2019 09:16:45 +0100 Subject: [PATCH 68/81] origin --- storage/cql_iface/cql_comm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/cql_iface/cql_comm.py b/storage/cql_iface/cql_comm.py index e23dccaf..ff1e0faf 100644 --- a/storage/cql_iface/cql_comm.py +++ b/storage/cql_iface/cql_comm.py @@ -50,7 +50,7 @@ def parse_definition_to_cass_format(fields_dict): all_values = all_values + "%s %s," % (k, _hecuba2cassandra_typemap[v]) except KeyError: val = str(v) - if issubclass(v, tuple): + if issubclass(v.__origin__, Tuple): all_values = all_values + str(k) + f" tuple<{val[val.find('[') + 1:val.rfind(']')]}>," return all_values[:-1] From 3101d013e5998e6bd50d657918b06dde790a3c76 Mon Sep 17 00:00:00 2001 From: Ismael Date: Thu, 19 Dec 2019 11:36:30 +0100 Subject: [PATCH 69/81] branch like the base one --- storage/cql_iface/config.py | 9 +++++---- storage/cql_iface/cql_comm.py | 9 ++------- storage/cql_iface/cql_iface.py | 19 ++++++------------- storage/cql_iface/tests/api_tests.py | 24 ++++++++++++++++++++++++ 4 files changed, 37 insertions(+), 24 deletions(-) diff --git a/storage/cql_iface/config.py b/storage/cql_iface/config.py index 161c680e..2f3e6e0a 100644 --- a/storage/cql_iface/config.py +++ b/storage/cql_iface/config.py @@ -1,11 +1,12 @@ import datetime import decimal +import logging +import os import uuid -from typing import FrozenSet, Tuple +from typing import Tuple import numpy -import logging -import os + # User class to Cassandra data type _hecuba2cassandra_typemap = { bool: 'boolean', @@ -15,7 +16,7 @@ bytearray: 'blob', bytes: 'blob', Tuple: 'tuple', - FrozenSet: 'set', + # FrozenSet: 'set', decimal.Decimal: 'decimal', datetime.date: 'date', datetime.datetime: 'datetime', diff --git a/storage/cql_iface/cql_comm.py b/storage/cql_iface/cql_comm.py index 4bdac33d..ff1e0faf 100644 --- a/storage/cql_iface/cql_comm.py +++ b/storage/cql_iface/cql_comm.py @@ -1,4 +1,4 @@ -from typing import Union, Tuple, FrozenSet +from typing import Union, Tuple from uuid import UUID import numpy @@ -7,8 +7,6 @@ from . import config from .config import _hecuba2cassandra_typemap, log from .queries import istorage_prepared_st, istorage_read_entry -from .tests.mockStorageObj import StorageObj -from .tests.mockhdict import StorageDict def extract_ksp_table(name): @@ -54,13 +52,10 @@ def parse_definition_to_cass_format(fields_dict): val = str(v) if issubclass(v.__origin__, Tuple): all_values = all_values + str(k) + f" tuple<{val[val.find('[') + 1:val.rfind(']')]}>," - elif issubclass(v.__origin__, FrozenSet): - all_values = all_values + str(k) + f" frozen >," return all_values[:-1] @staticmethod def create_table(name: str, definition: dict) -> None: - # StorageObj for now ksp, table = extract_ksp_table(name) query_keyspace = "CREATE KEYSPACE IF NOT EXISTS %s WITH replication = %s" % (ksp, config.replication) config.session.execute(query_keyspace) @@ -88,7 +83,7 @@ def create_table(name: str, definition: dict) -> None: log.debug('MAKE PERSISTENCE: %s', query_table) config.session.execute(query_table) except Exception as ex: - log.warn("Error creating the StorageDict table: %s %s", query_table, ex) + log.warn("Error creating the table: %s %s", query_table, ex) raise ex @staticmethod diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index b70a4886..7a7a2ad8 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -1,17 +1,10 @@ -import itertools -from collections import OrderedDict -from typing import List, Tuple, FrozenSet +from typing import Tuple from uuid import UUID -import uuid -from storage.cql_iface.tests.mockhnumpy import StorageNumpy - -from storage.cql_iface.tests.mockhdict import StorageDict from storage.cql_iface.tests.mockIStorage import IStorage from .config import _hecuba2cassandra_typemap from .cql_comm import CqlCOMM from ..storage_iface import StorageIface -from .tests.mockStorageObj import StorageObj """ Mockup on how the Cassandra implementation of the interface could work. @@ -35,16 +28,16 @@ def __init__(self): pass @staticmethod - def check_values_from_definition(definition): + def _check_values_from_definition(definition): if isinstance(definition, dict): for v in definition.values(): - CQLIface.check_values_from_definition(v) + CQLIface._check_values_from_definition(v) elif isinstance(definition, (list, set, tuple)): for v in definition: - CQLIface.check_values_from_definition(v) + CQLIface._check_values_from_definition(v) else: try: - if isinstance(definition.__origin__, (Tuple, FrozenSet)): + if isinstance(definition.__origin__, Tuple): try: _hecuba2cassandra_typemap[definition.__origin__] except KeyError: @@ -70,7 +63,7 @@ def add_data_model(self, definition: dict) -> int: self.data_models_cache[datamodel_id] except KeyError: dict_definition = {k: definition[k] for k in ('value_id', 'fields')} - CQLIface.check_values_from_definition(dict_definition) + CQLIface._check_values_from_definition(dict_definition) self.data_models_cache[datamodel_id] = definition CqlCOMM.register_data_model(datamodel_id, definition) return datamodel_id diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index 89b145be..5ecfd919 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -115,6 +115,13 @@ def test_add_data_model_StorageObj(self): id = storage.add_data_model(data_model) self.assertTrue(storage.data_models_cache[id]) + def test_add_data_model_StorageObj2(self): + data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": Tuple[int]}} + storage = CQLIface() + # Register data models + id = storage.add_data_model(data_model) + self.assertTrue(storage.data_models_cache[id]) + def test_add_data_model_StorageDict(self): data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": str}} storage = CQLIface() @@ -232,6 +239,23 @@ def test_register_persistent_obj_storage_obj(self): self.assertEqual(res.name, name) config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + def test_register_persistent_obj_storage_obj_tuple(self): + given_name = 'storage_test.custom_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + obj = TestClass(name=given_name) + myid = obj.getID() + name = obj.get_name() + data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": Tuple[int], "b": str}} + + # Setup persistent storage + storage = CQLIface() + + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + res = config.session.execute("SELECT * FROM hecuba.istorage WHERE storage_id={}".format(myid)).one() + self.assertEqual(res.name, name) + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + def test_register_persistent_obj_storage_dict(self): given_name = 'storage_test.custom_obj' config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) From 1c28670db5f4fb531705973b1e9ec72c1e4ac45b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ismael=20Juli=C3=A0?= Date: Tue, 7 Jan 2020 11:11:43 +0100 Subject: [PATCH 70/81] Update CMakeLists.txt --- hecuba_core/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hecuba_core/CMakeLists.txt b/hecuba_core/CMakeLists.txt index 328aae27..62fae408 100644 --- a/hecuba_core/CMakeLists.txt +++ b/hecuba_core/CMakeLists.txt @@ -211,7 +211,7 @@ if (NOT TBB_FOUND) TBB DOWNLOAD_DIR ${CMAKE_CURRENT_LIST_DIR}/dependencies URL "https://www.threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb2017_20161128oss_src.tgz" - URL_HASH SHA1=2c451a5bcf6fc31487b98b4b29651c369874277c + URL_HASH SHA1=1dff5db26fadd8f27111eae92fa4effa95568b85 CMAKE_COMMAND echo BUILD_COMMAND make tbb tbb_build_prefix=${build_prefix} BUILD_IN_SOURCE 1 From 0f835fbf5005550de90a86e5c75f4f9c0492bacf Mon Sep 17 00:00:00 2001 From: Ismael Date: Tue, 7 Jan 2020 11:49:20 +0100 Subject: [PATCH 71/81] Revert "Update CMakeLists.txt" This reverts commit 1c28670db5f4fb531705973b1e9ec72c1e4ac45b. --- hecuba_core/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hecuba_core/CMakeLists.txt b/hecuba_core/CMakeLists.txt index 62fae408..328aae27 100644 --- a/hecuba_core/CMakeLists.txt +++ b/hecuba_core/CMakeLists.txt @@ -211,7 +211,7 @@ if (NOT TBB_FOUND) TBB DOWNLOAD_DIR ${CMAKE_CURRENT_LIST_DIR}/dependencies URL "https://www.threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb2017_20161128oss_src.tgz" - URL_HASH SHA1=1dff5db26fadd8f27111eae92fa4effa95568b85 + URL_HASH SHA1=2c451a5bcf6fc31487b98b4b29651c369874277c CMAKE_COMMAND echo BUILD_COMMAND make tbb tbb_build_prefix=${build_prefix} BUILD_IN_SOURCE 1 From 19d2eb207b5cbcd8898f1ffeee16eeecd0944660 Mon Sep 17 00:00:00 2001 From: Ismael Date: Wed, 8 Jan 2020 13:06:34 +0100 Subject: [PATCH 72/81] cmake updated --- hecuba_core/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hecuba_core/CMakeLists.txt b/hecuba_core/CMakeLists.txt index 328aae27..763ba76d 100644 --- a/hecuba_core/CMakeLists.txt +++ b/hecuba_core/CMakeLists.txt @@ -210,8 +210,8 @@ if (NOT TBB_FOUND) ExternalProject_Add( TBB DOWNLOAD_DIR ${CMAKE_CURRENT_LIST_DIR}/dependencies - URL "https://www.threadingbuildingblocks.org/sites/default/files/software_releases/source/tbb2017_20161128oss_src.tgz" - URL_HASH SHA1=2c451a5bcf6fc31487b98b4b29651c369874277c + URL "https://github.com/intel/tbb/archive/v2020.0.tar.gz" + URL_HASH SHA1=0b8e9db0c7672eea6207e6749e14ec80b1b4eaa7 CMAKE_COMMAND echo BUILD_COMMAND make tbb tbb_build_prefix=${build_prefix} BUILD_IN_SOURCE 1 From 8b9ed62a577bd08c9e519e4f2f2a907b4fc2219d Mon Sep 17 00:00:00 2001 From: Ismael Date: Wed, 8 Jan 2020 13:16:29 +0100 Subject: [PATCH 73/81] fix some errors during the merge --- storage/cql_iface/cql_iface.py | 4 ++-- storage/storage_iface.py | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index b28d0b1d..c797d158 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -1,4 +1,4 @@ -from typing import Tuple +from typing import Tuple, List from uuid import UUID from storage.cql_iface.tests.mockIStorage import IStorage @@ -134,7 +134,7 @@ def put_record(self, object_id: UUID, key_list: dict, value_list: dict) -> None: except Exception: raise Exception("key_list or value_list have some parameter that does not correspond with the data model") - def get_record(self, object_id: UUID, key_list: OrderedDict) -> List[object]: + def get_record(self, object_id: UUID, key_list: dict) -> List[object]: try: UUID(str(object_id)) except ValueError: diff --git a/storage/storage_iface.py b/storage/storage_iface.py index 370ec9a3..96970288 100644 --- a/storage/storage_iface.py +++ b/storage/storage_iface.py @@ -1,5 +1,4 @@ from abc import ABCMeta, abstractmethod -from collections import OrderedDict from typing import List from uuid import UUID from storage.cql_iface.tests.mockIStorage import IStorage @@ -28,7 +27,7 @@ def register_persistent_object(self, datamodel_id: int, pyobject: IStorage) -> U pass @abstractmethod - def put_record(self, object_id: UUID, key_list: OrderedDict, value_list: OrderedDict) -> None: + def put_record(self, object_id: UUID, key_list: dict, value_list: dict) -> None: """ Stores the records contained in value_list, which correspond to the keys in key_list for the Hecuba object referenced by `object_id`. @@ -40,7 +39,7 @@ def put_record(self, object_id: UUID, key_list: OrderedDict, value_list: Ordered pass @abstractmethod - def get_record(self, object_id: UUID, key_list: OrderedDict) -> List[object]: + def get_record(self, object_id: UUID, key_list: dict) -> List[object]: """ Returns a list with the records corresponding to the key_list for the Hecuba object referenced by `object_id`. :param object_id: Hecuba object identifier From 14bb946ebed953fef46a3549f9307ab03f4f50aa Mon Sep 17 00:00:00 2001 From: Ismael Date: Fri, 24 Jan 2020 13:22:39 +0100 Subject: [PATCH 74/81] uuid checking method changed --- storage/cql_iface/cql_iface.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index a167b467..3ace2058 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -101,9 +101,7 @@ def fill_empty_keys_with_None(keys_dict, data_model): def delete_persistent_object(self, object_id: UUID): - try: - uuid.UUID(str(object_id)) - except ValueError: + if not isinstance(object_id, UUID): raise ValueError("The object_id is not an UUID") try: CqlCOMM.delete_data(object_id) @@ -112,9 +110,7 @@ def delete_persistent_object(self, object_id: UUID): return True def put_record(self, object_id: UUID, key_list: dict, value_list: dict) -> None: - try: - UUID(str(object_id)) - except ValueError: + if not isinstance(object_id, UUID): raise ValueError("The object_id is not an UUID") try: self.hcache_by_id[object_id] From d64c03b454d86170c082a8f751f94f38937a58d1 Mon Sep 17 00:00:00 2001 From: Ismael Date: Fri, 24 Jan 2020 13:25:38 +0100 Subject: [PATCH 75/81] review --- .../tests/withcassandra/storagenumpy_tests.py | 38 +------------------ 1 file changed, 2 insertions(+), 36 deletions(-) diff --git a/hecuba_py/tests/withcassandra/storagenumpy_tests.py b/hecuba_py/tests/withcassandra/storagenumpy_tests.py index 103cf9a3..76f325c9 100644 --- a/hecuba_py/tests/withcassandra/storagenumpy_tests.py +++ b/hecuba_py/tests/withcassandra/storagenumpy_tests.py @@ -1,15 +1,8 @@ import unittest -import uuid +from hecuba import config, StorageNumpy +import uuid import numpy as np -from cassandra.metadata import Token -from hecuba import config, StorageNumpy, StorageDict - - -class Prueba(StorageDict): - ''' - @TypeSpec dict<, val:str> - ''' class StorageNumpyTest(unittest.TestCase): @@ -132,33 +125,6 @@ def test_read_all(self): chunk = casted[slice(None, None, None)] self.assertTrue(np.allclose(chunk.view(np.ndarray), test_numpy)) - def test_locality(self): - - def get_hosts(tokens): - # type : (List[Long]) -> Host - - tm = config.cluster.metadata.token_map - hosts = set() - for token in tokens: - t = Token(token) - hosts.add(tm.get_replicas("my_app", t)[0]) - - - #hosts = set(map(lambda token: tm.get_replicas("my_app", token)[0], - # map(lambda a: Token(a), tokens))) - - return list(hosts)[0] - - prueba = Prueba("my_app.prueba") - - config.splits_per_node = 2 - - for partition in prueba.split(): - tokens = partition._tokens - - hosts = set([get_hosts(worker_partition) for worker_partition in tokens]) - print(hosts) - if __name__ == '__main__': unittest.main() From ab855371a427f1b5e582a9ab7f862ad18b68968f Mon Sep 17 00:00:00 2001 From: Ismael Date: Tue, 28 Jan 2020 11:41:35 +0100 Subject: [PATCH 76/81] req changes --- storage/cql_iface/cql_comm.py | 7 ++++--- storage/cql_iface/cql_iface.py | 6 +----- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/storage/cql_iface/cql_comm.py b/storage/cql_iface/cql_comm.py index fbe2e73f..7fbb6062 100644 --- a/storage/cql_iface/cql_comm.py +++ b/storage/cql_iface/cql_comm.py @@ -113,7 +113,8 @@ def create_hcache(object_id: UUID, name: str, definition: dict) -> Union[object, def delete_data(object_id): res = config.execute(istorage_read_entry, [object_id]) if res: - res = res.one() + config.execute(istorage_remove_entry, [object_id]) + return True else: - raise ValueError("There are no records with the specified object_id") - config.execute(istorage_remove_entry, [object_id]) + return False + diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index 3ace2058..24718468 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -103,11 +103,7 @@ def fill_empty_keys_with_None(keys_dict, data_model): def delete_persistent_object(self, object_id: UUID): if not isinstance(object_id, UUID): raise ValueError("The object_id is not an UUID") - try: - CqlCOMM.delete_data(object_id) - except ValueError: - return False - return True + return CqlCOMM.delete_data(object_id) def put_record(self, object_id: UUID, key_list: dict, value_list: dict) -> None: if not isinstance(object_id, UUID): From 51ca59ab091626e71e4446a8238d5d4d35bd5865 Mon Sep 17 00:00:00 2001 From: Ismael Date: Wed, 29 Jan 2020 09:35:34 +0100 Subject: [PATCH 77/81] review changes --- hecuba_core/src/py_interface/HCache.cpp | 15 +++++++++-- storage/cql_iface/cql_iface.py | 35 +++++++++++-------------- storage/cql_iface/tests/api_tests.py | 2 +- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/hecuba_core/src/py_interface/HCache.cpp b/hecuba_core/src/py_interface/HCache.cpp index c466d5f0..85802837 100644 --- a/hecuba_core/src/py_interface/HCache.cpp +++ b/hecuba_core/src/py_interface/HCache.cpp @@ -65,9 +65,20 @@ static PyObject *put_row(HCache *self, PyObject *args) { } std::set keys; PyObject *elem = NULL, *format_text = NULL; + Py_ssize_t l_size; + char *permanent; + const char *l_temp; for (uint16_t value_i = 0; value_i < PyList_Size(py_union_k); ++value_i) { - format_text = PyUnicode_AsUTF8String(PyList_GetItem(py_union_k, value_i)); - keys.insert(PyBytes_AS_STRING(format_text)); + l_temp = PyUnicode_AsUTF8AndSize(PyList_GetItem(py_union_k, value_i), &l_size); + if (!l_temp) { + std::string error_msg = "PyString cannot be parsed"; + PyErr_SetString(PyExc_TypeError, error_msg.c_str()); + return NULL; + } + permanent = (char *) malloc(l_size + 1); + memcpy(permanent, l_temp, l_size); + permanent[l_size] = '\0'; + keys.insert(std::string(permanent)); } TupleRow *k; try { diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index c797d158..ac43fbd7 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -29,24 +29,23 @@ def __init__(self): @staticmethod def _check_values_from_definition(definition): + value_iter = None if isinstance(definition, dict): - for v in definition.values(): - CQLIface._check_values_from_definition(v) + value_iter = definition.values() elif isinstance(definition, (list, set, tuple)): - for v in definition: + value_iter = iter(definition) + + if value_iter is not None: + for v in value_iter: CQLIface._check_values_from_definition(v) else: try: - if isinstance(definition.__origin__, Tuple): - try: - _hecuba2cassandra_typemap[definition.__origin__] - except KeyError: - raise TypeError(f"The type {definition} is not supported") + my_type = definition.__origin__ except AttributeError: - try: - _hecuba2cassandra_typemap[definition] - except KeyError: - raise TypeError(f"The type {definition} is not supported") + my_type = definition + + if my_type not in _hecuba2cassandra_typemap: + raise TypeError(f"The type {definition} is not supported") def add_data_model(self, definition: dict) -> int: if not isinstance(definition, dict): @@ -99,9 +98,7 @@ def fill_empty_keys_with_None(keys_dict, data_model): return {**data_model, **keys_dict} def put_record(self, object_id: UUID, key_list: dict, value_list: dict) -> None: - try: - UUID(str(object_id)) - except ValueError: + if not isinstance(object_id, UUID): raise ValueError("The object_id is not an UUID") try: self.hcache_by_id[object_id] @@ -114,7 +111,7 @@ def put_record(self, object_id: UUID, key_list: dict, value_list: dict) -> None: for v in value_list: try: if not isinstance(value_list[v], data_model["fields"][v]) and value_list[v] is not None: - raise Exception("The value types don't match the data model specification") + raise TypeError("The value types don't match the data model specification") except TypeError: if not isinstance(value_list[v], data_model["fields"][v].__origin__): raise TypeError("The value types don't match the data model specification") @@ -122,7 +119,7 @@ def put_record(self, object_id: UUID, key_list: dict, value_list: dict) -> None: for k in key_list: try: if not isinstance(key_list[k], data_model["value_id"][k]): - raise Exception("The key types don't match the data model specification") + raise TypeError("The key types don't match the data model specification") except TypeError: if not isinstance(key_list[k], data_model["value_id"][k].__origin__): raise TypeError("The key types don't match the data model specification") @@ -135,9 +132,7 @@ def put_record(self, object_id: UUID, key_list: dict, value_list: dict) -> None: raise Exception("key_list or value_list have some parameter that does not correspond with the data model") def get_record(self, object_id: UUID, key_list: dict) -> List[object]: - try: - UUID(str(object_id)) - except ValueError: + if not isinstance(object_id, UUID): raise ValueError("The object_id is not an UUID") try: self.hcache_by_id[object_id] diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index 2d384e82..1a760cd9 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -134,7 +134,7 @@ def test_add_data_model_existing_one(self): # Register data models storage.add_data_model(data_model1) id2 = storage.add_data_model(data_model1) - self.assertTrue(storage.data_models_cache[id2]) + self.assertTrue(id2 in storage.data_models_cache) def test_add_data_model_complex_types(self): data_model = {"type": mockClass, "value_id": {"k": decimal.Decimal, "k1": numpy.ndarray}, From a54be5cba5e99289a40e3850112455ccbbfa5afd Mon Sep 17 00:00:00 2001 From: Ismael Date: Wed, 29 Jan 2020 11:23:13 +0100 Subject: [PATCH 78/81] fix --- storage/cql_iface/config.py | 1 + storage/cql_iface/cql_comm.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/storage/cql_iface/config.py b/storage/cql_iface/config.py index 2f3e6e0a..2eb59728 100644 --- a/storage/cql_iface/config.py +++ b/storage/cql_iface/config.py @@ -16,6 +16,7 @@ bytearray: 'blob', bytes: 'blob', Tuple: 'tuple', + tuple: 'tuple', # FrozenSet: 'set', decimal.Decimal: 'decimal', datetime.date: 'date', diff --git a/storage/cql_iface/cql_comm.py b/storage/cql_iface/cql_comm.py index ff1e0faf..465d52f8 100644 --- a/storage/cql_iface/cql_comm.py +++ b/storage/cql_iface/cql_comm.py @@ -49,8 +49,8 @@ def parse_definition_to_cass_format(fields_dict): try: all_values = all_values + "%s %s," % (k, _hecuba2cassandra_typemap[v]) except KeyError: - val = str(v) - if issubclass(v.__origin__, Tuple): + if v.__origin__ in _hecuba2cassandra_typemap: + val = str(v) all_values = all_values + str(k) + f" tuple<{val[val.find('[') + 1:val.rfind(']')]}>," return all_values[:-1] From 54f758fb912f5170ffb54c4a9dafb31bb53eb872 Mon Sep 17 00:00:00 2001 From: Ismael Date: Thu, 30 Jan 2020 11:20:59 +0100 Subject: [PATCH 79/81] add more tests --- hecuba_py/tests/__init__.py | 2 +- storage/cql_iface/__init__.py | 7 +- storage/cql_iface/cql_comm.py | 7 +- storage/cql_iface/cql_iface.py | 17 +-- storage/cql_iface/queries.py | 10 +- storage/cql_iface/tests/api_tests.py | 150 +++++++++++++++++++++------ storage/cql_iface/tools.py | 2 + 7 files changed, 148 insertions(+), 47 deletions(-) diff --git a/hecuba_py/tests/__init__.py b/hecuba_py/tests/__init__.py index 52262ea4..cd07c5db 100644 --- a/hecuba_py/tests/__init__.py +++ b/hecuba_py/tests/__init__.py @@ -13,7 +13,7 @@ class TestConfig: test_config = TestConfig() test_config.n_nodes = int(os.environ.get('TEST_CASSANDRA_N_NODES', '2')) -TEST_DEBUG = strtobool(os.environ.get("TEST_DEBUG", "False").lower()) +TEST_DEBUG = strtobool(os.environ.get("TEST_DEBUG", "True").lower()) if TEST_DEBUG: logging.warning(("You are using TEST_DEBUG=True, a Cassandra cluster must be already running. " "Keep in mind that the results of the test might be altered by data already existing.")) diff --git a/storage/cql_iface/__init__.py b/storage/cql_iface/__init__.py index 85314a2d..1c854eb1 100644 --- a/storage/cql_iface/__init__.py +++ b/storage/cql_iface/__init__.py @@ -1,7 +1,10 @@ from cassandra.cluster import Cluster from cassandra.policies import RetryPolicy, RoundRobinPolicy, TokenAwarePolicy -from .tests.cassandra_cluster_manager import * + from .config import log +from .tests.cassandra_cluster_manager import * + + # Set default log.handler to avoid "No handler found" warnings. class _NRetry(RetryPolicy): @@ -120,7 +123,7 @@ def __init__(self): singleton.max_cache_size = int(os.environ['MAX_CACHE_SIZE']) log.info('MAX_CACHE_SIZE: %d', singleton.max_cache_size) except KeyError: - singleton.max_cache_size = 0 #TODO: when the data is inserted into cassandra we should merge the new data and the one that is already in the cache + singleton.max_cache_size = 0 # TODO: when the data is inserted into cassandra we should merge the new data and the one that is already in the cache log.warn('using default MAX_CACHE_SIZE: %d', singleton.max_cache_size) try: diff --git a/storage/cql_iface/cql_comm.py b/storage/cql_iface/cql_comm.py index ea41cba4..64e0c1be 100644 --- a/storage/cql_iface/cql_comm.py +++ b/storage/cql_iface/cql_comm.py @@ -1,8 +1,8 @@ -from typing import Union, Tuple +import pickle +from typing import Union from uuid import UUID import numpy -import pickle from hfetch import Hcache, HNumpyStore from . import config @@ -31,7 +31,7 @@ def extract_ksp_table(name): class CqlCOMM(object): @staticmethod - def register_istorage(obj_id: UUID, table_name: str, obj_name:str, data_model: dict) -> UUID: + def register_istorage(obj_id: UUID, table_name: str, obj_name: str, data_model: dict) -> UUID: row = config.session.execute(istorage_read_entry, [obj_id]) if not row: obj_info = [obj_id, table_name, obj_name, pickle.dumps(data_model)] @@ -114,4 +114,3 @@ def delete_data(object_id): return True else: return False - diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index f36b8324..096d0a41 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -1,5 +1,5 @@ -from typing import List, Generator import uuid +from typing import List, Generator from uuid import UUID from storage.cql_iface.tests.mockIStorage import IStorage @@ -100,7 +100,6 @@ def fill_empty_keys_with_None(keys_dict, data_model): data_model = {k: None for k in data_model.keys()} return {**data_model, **keys_dict} - def delete_persistent_object(self, object_id: UUID): if not isinstance(object_id, UUID): raise ValueError("The object_id is not an UUID") @@ -122,7 +121,10 @@ def put_record(self, object_id: UUID, key_list: dict, value_list: dict) -> None: if not isinstance(value_list[v], data_model["fields"][v]) and value_list[v] is not None: raise TypeError("The value types don't match the data model specification") except TypeError: - if not isinstance(value_list[v], data_model["fields"][v].__origin__): + try: + if not isinstance(value_list[v], data_model["fields"][v].__origin__): + raise TypeError("The value types don't match the data model specification") + except AttributeError: raise TypeError("The value types don't match the data model specification") for k in key_list: @@ -130,8 +132,11 @@ def put_record(self, object_id: UUID, key_list: dict, value_list: dict) -> None: if not isinstance(key_list[k], data_model["value_id"][k]): raise TypeError("The key types don't match the data model specification") except TypeError: - if not isinstance(key_list[k], data_model["value_id"][k].__origin__): - raise TypeError("The key types don't match the data model specification") + try: + if not isinstance(key_list[k], data_model["value_id"][k].__origin__): + raise TypeError("The value types don't match the data model specification") + except AttributeError: + raise TypeError("The value types don't match the data model specification") values_dict = CQLIface.fill_empty_keys_with_None(value_list, data_model["fields"]) try: @@ -188,4 +193,4 @@ def get_data_locality(self, object_id: UUID) -> List[str]: tokens = res.one().tokens hosts = set([get_hosts(worker_partition, res.one().table_name) for worker_partition in tokens]) hosts_list.append(str(hosts)) - return hosts_list \ No newline at end of file + return hosts_list diff --git a/storage/cql_iface/queries.py b/storage/cql_iface/queries.py index b9d9f57b..7bb98612 100644 --- a/storage/cql_iface/queries.py +++ b/storage/cql_iface/queries.py @@ -1,10 +1,10 @@ from . import config istorage_prepared_st = config.session.prepare('INSERT INTO hecuba.istorage' - '(storage_id, table_name, obj_name, data_model, tokens)' - 'VALUES (?,?,?,?,?)') + '(storage_id, table_name, obj_name, data_model, tokens)' + 'VALUES (?,?,?,?,?)') istorage_insert_tokens = config.session.prepare('INSERT INTO hecuba.istorage' - '(storage_id, tokens)' - 'VALUES (?,?)') + '(storage_id, tokens)' + 'VALUES (?,?)') istorage_remove_entry = config.session.prepare('DELETE FROM hecuba.istorage WHERE storage_id = ?') -istorage_read_entry = config.session.prepare('SELECT * FROM hecuba.istorage WHERE storage_id = ?') \ No newline at end of file +istorage_read_entry = config.session.prepare('SELECT * FROM hecuba.istorage WHERE storage_id = ?') diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index 9b9e3a50..00ac2694 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -89,6 +89,13 @@ def test_add_data_model_except_incorrect_value_id(self): # Register data models storage.add_data_model(data_model) + def test_add_data_model_except_incorrect_inheritance(self): + with self.assertRaises(TypeError): + data_model = {"type": mockClassNoInherit, "value_id": {"k": dict}, "fields": {"a": str}} + storage = CQLIface() + # Register data models + storage.add_data_model(data_model) + def test_add_data_different_types(self): data_model = {"type": mockClass, "value_id": {"k": int}, "fields": {"a": numpy.int64, "b": numpy.ndarray, "c": uuid.UUID}} @@ -483,6 +490,26 @@ def test_put_record_except_values_not_mach_data_model_type(self): for val, ret_val in zip(fields.values(), returned_values[0]): self.assertAlmostEqual(val, ret_val) + def test_put_record_except_values_not_mach_data_model_type(self): + with self.assertRaises(KeyError): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass(name=given_name) + myid = obj.getID() + data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": int, "b": str, "c": float}} + given_name = 'storage_test.dict' + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + keys = NamedTuple('keys', [('k', int)]) + keys = keys(8)._asdict() + fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', float)]) + fields = fields(4, 'hola', 'adeu')._asdict() + + storage.put_record(uuid.UUID('123e4567-0000-0000-0000-426655440000'), keys, fields) + def test_put_record_StorageDict(self): given_name = 'storage_test.complex_obj' config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) @@ -617,28 +644,27 @@ def test_get_record_except_invalid_keys(self): storage.get_record(myid, None) def test_get_record_except_invalid_keys_size(self): - given_name = 'storage_test.complex_obj' - config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - - obj = TestClass(name=given_name) - myid = obj.getID() - data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": int, "b": str, "c": float}} - given_name = 'storage_test.dict' - storage = CQLIface() - data_model_id = storage.add_data_model(data_model) - storage.register_persistent_object(data_model_id, obj) + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) - keys = NamedTuple('keys', [('k', int)]) - keys = keys(8)._asdict() - fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', float)]) - fields = fields(4, 'hola', 3.8)._asdict() + obj = TestClass(name=given_name) + myid = obj.getID() + data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": int, "b": str, "c": float}} + given_name = 'storage_test.dict' + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) - storage.put_record(myid, keys, fields) - keys = NamedTuple('keys', [('k', str), ('a', str)]) - keys = keys('hola', 'abc')._asdict() - result = storage.get_record(myid, keys) - self.assertEqual(result, []) + keys = NamedTuple('keys', [('k', int)]) + keys = keys(8)._asdict() + fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', float)]) + fields = fields(4, 'hola', 3.8)._asdict() + storage.put_record(myid, keys, fields) + keys = NamedTuple('keys', [('k', str), ('a', str)]) + keys = keys('hola', 'abc')._asdict() + result = storage.get_record(myid, keys) + self.assertEqual(result, []) def test_get_record(self): given_name = 'storage_test.complex_obj' @@ -739,7 +765,8 @@ def test_get_record_tuple_so(self): obj = TestClass(name=given_name) myid = obj.getID() - data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, "fields": {"a": int, "b": Tuple[int, int], "c": int}} + data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, + "fields": {"a": int, "b": Tuple[int, int], "c": int}} given_name = 'storage_test.dict' storage = CQLIface() data_model_id = storage.add_data_model(data_model) @@ -756,7 +783,6 @@ def test_get_record_tuple_so(self): result = storage.get_record(myid, keys) self.assertEqual(result, [4, (6, 6), 4]) - def test_put_record_StorageDict_split_except_uuid_wrong_format(self): with self.assertRaises(ValueError): given_name = 'storage_test.complex_obj' @@ -803,7 +829,7 @@ def test_put_record_StorageDict_split_except_subsets_wrong_type(self): for val in partition.keys(): print(val) - def test_put_record_StorageDict_split_and_get_data_locality_except(self): + def test_put_record_StorageDict_split_and_get_data_locality_except_None(self): with self.assertRaises(ValueError): given_name = 'storage_test.complex_obj' config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) @@ -824,7 +850,7 @@ def test_put_record_StorageDict_split_and_get_data_locality_except(self): storage.put_record(myid, keys, fields) parts = [] for partition in storage.split(myid, 9): - parts.append(partition) + parts.append(partition) self.assertTrue(storage.get_data_locality(None)) def test_put_record_StorageDict_split_and_get_data_locality_except(self): @@ -848,9 +874,53 @@ def test_put_record_StorageDict_split_and_get_data_locality_except(self): storage.put_record(myid, keys, fields) parts = [] for partition in storage.split(myid, 9): - parts.append(partition) + parts.append(partition) + self.assertTrue(storage.get_data_locality(myid)) + + def test_put_record_StorageDict_split_and_get_data_locality_except_wrong_UUID(self): + with self.assertRaises(ValueError): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass(name=given_name) + myid = obj.getID() + data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": int, "b": str, "c": float}} + given_name = 'storage_test.dict' + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + keys = NamedTuple('keys', [('k', int)]) + keys = keys(8)._asdict() + fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', float)]) + fields = fields(1, 'a', 3.0)._asdict() + + storage.put_record(myid, keys, fields) + parts = [] + for partition in storage.split(uuid.UUID('123e4567-e89b-12d3-a456-426655440000'), 9): + parts.append(partition) self.assertTrue(storage.get_data_locality(myid)) + def test_put_record_StorageDict_split_and_get_data_locality_except_wrong_UUID(self): + with self.assertRaises(TypeError): + given_name = 'storage_test.complex_obj' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + obj = TestClass(name=given_name) + myid = obj.getID() + data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": int, "b": str, "c": float}} + given_name = 'storage_test.dict' + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + storage.register_persistent_object(data_model_id, obj) + + keys = NamedTuple('keys', [('k', int)]) + keys = keys(8)._asdict() + fields = NamedTuple('fields', [('a', int), ('b', 'name'), ('c', float)]) + fields = fields(1, 'a', 3.0)._asdict() + + storage.put_record(myid, {'k': '3'}, fields) + def test_put_record_StorageDict_split_and_get_data_locality(self): given_name = 'storage_test.complex_obj' config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) @@ -871,7 +941,7 @@ def test_put_record_StorageDict_split_and_get_data_locality(self): storage.put_record(myid, keys, fields) parts = [] for partition in storage.split(myid, 9): - parts.append(partition) + parts.append(partition) self.assertTrue(storage.get_data_locality(parts[0])) def test_delete_persistent_except_object_id_not_uuid(self): @@ -893,7 +963,31 @@ def test_delete_persistent_except_object_id_not_uuid(self): storage.delete_persistent_object('exc') - def test_delete_persistent_object(self): + def test_delete_persistent_object_return_false(self): + given_name = 'storage_test.dict' + config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) + + # Setup object + obj = TestClass(given_name) + myid = obj.getID() + name = obj.get_name() + data_model = {"type": StorageDict, "value_id": {"k": int}, "fields": {"a": str, "b": str}} + + # Setup persistent storage + storage = CQLIface() + data_model_id = storage.add_data_model(data_model) + + storage.register_persistent_object(data_model_id, obj) + + keys = NamedTuple('keys', [('k', int)]) + keys = keys(8)._asdict() + fields = NamedTuple('fields', [('a', str), ('b', str)]) + fields = fields('a', 'a')._asdict() + + storage.put_record(myid, keys, fields) + self.assertFalse(storage.delete_persistent_object(uuid.UUID('123e4567-0000-0000-0000-426655440000'))) + + def test_delete_persistent_object_return_true(self): given_name = 'storage_test.dict' config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) @@ -915,10 +1009,8 @@ def test_delete_persistent_object(self): fields = fields('a', 'a')._asdict() storage.put_record(myid, keys, fields) + self.assertTrue(storage.delete_persistent_object(myid)) - storage.delete_persistent_object(myid) - res = config.session.execute("SELECT * FROM hecuba.istorage WHERE storage_id={}".format(myid)) - self.assertIsNone(res.one()) if __name__ == "__main__": unittest.main() diff --git a/storage/cql_iface/tools.py b/storage/cql_iface/tools.py index 1a8145c1..e4297baf 100644 --- a/storage/cql_iface/tools.py +++ b/storage/cql_iface/tools.py @@ -136,6 +136,7 @@ def generate_token_ring_ranges(): tokens = [token.value for token in ring] return discrete_token_ranges(tokens) + def get_hosts(tokens, table_name): tm = config.cluster.metadata.token_map hosts = set() @@ -144,6 +145,7 @@ def get_hosts(tokens, table_name): hosts.add(tm.get_replicas(table_name.split('.')[0], t)[0]) return list(hosts)[0] + def discrete_token_ranges(tokens): """ Makes proper tokens ranges ensuring that in a tuple (a,b) a <= b From a16240b37c88848ce52ef296af0f3c3b32ffff7d Mon Sep 17 00:00:00 2001 From: Ismael Date: Tue, 11 Feb 2020 10:55:22 +0100 Subject: [PATCH 80/81] testing .. --- ccm/ccm | 1 + hecuba_py/hecuba/IStorage.py | 119 +- hecuba_py/hecuba/SO_tests.py | 18 + hecuba_py/hecuba/__init__.py | 59 +- hecuba_py/hecuba/hdict.py | 742 +- hecuba_py/hecuba/hfilter.py | 257 - hecuba_py/hecuba/hnumpy.py | 198 - hecuba_py/hecuba/parser.py | 313 - hecuba_py/hecuba/qbeast.py | 173 - hecuba_py/hecuba/storageiter.py | 49 - hecuba_py/hecuba/storageobj.py | 320 +- hecuba_py/hecuba/tools.py | 105 +- out.txt | 10623 +++++++++++++++++++++++++ storage/cql_iface/config.py | 2 +- storage/cql_iface/cql_comm.py | 16 +- storage/cql_iface/cql_iface.py | 54 +- storage/cql_iface/tests/api_tests.py | 10 +- 17 files changed, 11018 insertions(+), 2041 deletions(-) create mode 160000 ccm/ccm create mode 100644 hecuba_py/hecuba/SO_tests.py delete mode 100644 hecuba_py/hecuba/hfilter.py delete mode 100644 hecuba_py/hecuba/hnumpy.py delete mode 100644 hecuba_py/hecuba/parser.py delete mode 100644 hecuba_py/hecuba/qbeast.py delete mode 100644 hecuba_py/hecuba/storageiter.py create mode 100644 out.txt diff --git a/ccm/ccm b/ccm/ccm new file mode 160000 index 00000000..275699f7 --- /dev/null +++ b/ccm/ccm @@ -0,0 +1 @@ +Subproject commit 275699f79d102b5039b79cc17fa6305dccf18412 diff --git a/hecuba_py/hecuba/IStorage.py b/hecuba_py/hecuba/IStorage.py index ff8e9eb7..2928bcf9 100644 --- a/hecuba_py/hecuba/IStorage.py +++ b/hecuba_py/hecuba/IStorage.py @@ -1,38 +1,45 @@ import uuid -from . import log -from .tools import extract_ks_tab, build_remotely, storage_id_from_name, get_istorage_attrs, generate_token_ring_ranges +from collections import namedtuple +from .tools import storage_id_from_name class AlreadyPersistentError(RuntimeError): pass +class DataModelNode(object): + def __init__(self, name=None, class_name=None, args=None): + self.name = name + self.class_name = class_name + self.args = args + + class IStorage(object): + args_names = ["storage_id"] + args = namedtuple("IStorage", args_names) + _build_args = args(storage_id="") - @property - def storage_id(self): + _data_model_def = None + _data_model_id = None + + def getID(self): return self.__storage_id - @storage_id.setter - def storage_id(self, st_id): + def setID(self, st_id): if st_id is not None and not isinstance(st_id, uuid.UUID): raise TypeError("Storage ID must be an instance of UUID") self.__storage_id = st_id - def __init__(self, *args, **kwargs): - super().__init__() - self._ksp = None - self._table = None - given_name = kwargs.pop("name", None) - if given_name: - self._ksp, self._table = extract_ks_tab(given_name) - name = self._ksp + '.' + self._table - self._set_name(name) - - self.storage_id = kwargs.pop("storage_id", None) - self._built_remotely = kwargs.pop("built_remotely", False) - self._tokens = kwargs.pop("tokens", None) - self._is_persistent = False + storage_id = property(getID, setID) + + def __new__(cls, *args, **kwargs): + toret = super(IStorage, cls).__new__(cls) + toret._ksp = '' + toret._table = '' + toret._is_persistent = False + toret.__storage_id = None + toret._name = '' + return toret def __eq__(self, other): """ @@ -42,76 +49,38 @@ def __eq__(self, other): Returns: boolean (true - equals, false - not equals). """ - return self.__class__ == other.__class__ and self.storage_id == other.storage_id - - def make_persistent(self, name): - if self._is_persistent: - raise AlreadyPersistentError("This Object is already persistent [Before:{}.{}][After:{}]", - self._ksp, self._table, name) + return self.__class__ == other.__class__ and self.getID() == other.getID() - self._ksp, self._table = extract_ks_tab(name) - name = self._ksp + '.' + self._table - self._set_name(name) + @staticmethod + def _store_meta(storage_args): + pass + def make_persistent(self, name): if not self.storage_id: self.storage_id = storage_id_from_name(name) - - # If found data, replace the constructor data - if self._tokens is None: - metas = get_istorage_attrs(self.storage_id) - try: - self._tokens = metas[0].tokens - except IndexError: - self._tokens = generate_token_ring_ranges() - self._is_persistent = True + self._name = name def stop_persistent(self): - if not self._is_persistent: - raise RuntimeError("This Object is not persistent") - + self.storage_id = None self._is_persistent = False def delete_persistent(self): - if not self._is_persistent: - raise RuntimeError("This Object is not persistent") - + self.storage_id = None self._is_persistent = False - def _set_name(self, name): - if not isinstance(name, str): - raise TypeError("Name -{}- should be an instance of str".format(str(name))) - self._name = name - - def _get_name(self): - try: - return self._name - except AttributeError: - return '' - - def getID(self): - """ - Method to retrieve the storage id as string. Used by PyCOMPSs solely. - :return: Storage_id as str - """ - return str(self.storage_id) - def split(self): """ Method used to divide an object into sub-objects. Returns: a subobject everytime is called """ - from .tools import tokens_partitions - try: - tokens = self._build_args.tokens - except AttributeError as ex: - raise RuntimeError("Object {} does not have tokens".format(self._get_name())) - - for token_split in tokens_partitions(self._ksp, self._table, tokens): - storage_id = uuid.uuid4() - log.debug('assigning to {} num tokens {}'.format(str(storage_id), len(token_split))) - new_args = self._build_args._replace(tokens=token_split, storage_id=storage_id) - args_dict = new_args._asdict() - args_dict["built_remotely"] = True - yield build_remotely(args_dict) + raise NotImplemented("Split not supported yet") + + def set_name(self, name): + if not isinstance(name, str): + raise TypeError("Name -{}- should be an instance of str".format(str(name))) + self._name = name + + def get_name(self): + return self._name diff --git a/hecuba_py/hecuba/SO_tests.py b/hecuba_py/hecuba/SO_tests.py new file mode 100644 index 00000000..e18ea87b --- /dev/null +++ b/hecuba_py/hecuba/SO_tests.py @@ -0,0 +1,18 @@ +import unittest + +from hecuba import StorageObj +from datetime import time + +class TestAttributes(StorageObj): + attr1: time + +class MyTestCase(unittest.TestCase): + def test_something(self): + a = TestAttributes("test1") + a.attr1 = time(12, 10, 30) + a = TestAttributes("test1") + self.assertEqual(a.attr1, time(12, 10, 30)) + + +if __name__ == '__main__': + unittest.main() diff --git a/hecuba_py/hecuba/__init__.py b/hecuba_py/hecuba/__init__.py index 9ae57abf..85a8769c 100755 --- a/hecuba_py/hecuba/__init__.py +++ b/hecuba_py/hecuba/__init__.py @@ -1,25 +1,11 @@ -import logging -import os - from cassandra.cluster import Cluster from cassandra.policies import RetryPolicy, RoundRobinPolicy, TokenAwarePolicy -# Set default log.handler to avoid "No handler found" warnings. - -stderrLogger = logging.StreamHandler() -f = '%(filename)s: %(levelname)s: %(funcName)s(): %(lineno)d:\t%(message)s' -stderrLogger.setFormatter(logging.Formatter(f)) +from storage.cql_iface.config import log +from storage.cql_iface.tests.cassandra_cluster_manager import * -log = logging.getLogger('hecuba') -log.addHandler(stderrLogger) - -if 'DEBUG' in os.environ and os.environ['DEBUG'].lower() == "true": - log.setLevel(logging.DEBUG) -elif 'HECUBA_LOG' in os.environ: - log.setLevel(os.environ['HECUBA_LOG'].upper()) -else: - log.setLevel(logging.ERROR) +# Set default log.handler to avoid "No handler found" warnings. class _NRetry(RetryPolicy): def __init__(self, time_to_retry=5): @@ -44,13 +30,20 @@ def on_read_timeout(self, query, consistency, required_responses, received_respo return self.RETHROW, None -class Config: +class Config(object): class __Config: def __init__(self): self.configured = False instance = __Config() + @staticmethod + def execute(statement, args): + if not Config.instance.configured: + raise RuntimeError("Not configured to contact cassandra on CQL_Comm storage") + + return Config.instance.session.execute(statement, args) + def __getattr__(self, item): return getattr(Config.instance, item) @@ -213,18 +206,8 @@ def __init__(self): precision float); """, 'CREATE TYPE IF NOT EXISTS hecuba.np_meta(dims frozen>,type int,block_id int);', - """CREATE TABLE IF NOT EXISTS hecuba - .istorage (storage_id uuid, - class_name text,name text, - istorage_props map, - tokens list>>, - indexed_on list, - qbeast_random text, - qbeast_meta frozen, - numpy_meta frozen, - primary_keys list>>, - columns list>>, - PRIMARY KEY(storage_id)); + """CREATE TABLE IF NOT EXISTS hecuba.istorage (storage_id uuid,table_name text, obj_name text, + data_model blob, tokens list>>, PRIMARY KEY(storage_id)); """] for query in queries: try: @@ -238,19 +221,7 @@ def __init__(self): connectCassandra(singleton.contact_names, singleton.nodePort) -global config +# set_up_default_cassandra() config = Config() - -from .parser import Parser from .storageobj import StorageObj -from .hdict import StorageDict -from .hnumpy import StorageNumpy -from .hfilter import hfilter - -if not filter == hfilter: - import builtins - - builtins.python_filter = filter - builtins.filter = hfilter - -__all__ = ['StorageObj', 'StorageDict', 'StorageNumpy', 'Parser'] +__all__ = ['StorageObj'] \ No newline at end of file diff --git a/hecuba_py/hecuba/hdict.py b/hecuba_py/hecuba/hdict.py index 1861f1ca..e68642df 100644 --- a/hecuba_py/hecuba/hdict.py +++ b/hecuba_py/hecuba/hdict.py @@ -1,201 +1,7 @@ -import uuid -from collections import Iterable, defaultdict -from collections import Mapping -from collections import namedtuple - -import numpy as np -from . import config, log, Parser -from .storageiter import NamedItemsIterator, NamedIterator -from .hnumpy import StorageNumpy -from hfetch import Hcache - -from .IStorage import IStorage -from .tools import get_istorage_attrs, count_name_collision, build_remotely, basic_types - - -class EmbeddedSet(set): - ''' - father is the dictionary containing the set - keys are the keys names of the set in the dictionary - values is the initializing set - ''' - - def __init__(self, father, keys, values=None): - super(EmbeddedSet, self).__init__() - self._father = father - self._keys = keys - if values is not None: - if len(self) != 0: - self.clear() - if isinstance(values, set): - for value in values: - self.add(value) - else: - raise Exception("Set expected.") - - def add(self, value): - keys = self._keys[:] - if not isinstance(value, Iterable) or isinstance(value, str): - keys.append(value) - else: - keys += list(value) - return self._father.__setitem__(keys, []) - - def remove(self, value): - if value in self: - keys = self._keys[:] - if not isinstance(value, Iterable) or isinstance(value, str): - keys.append(value) - else: - keys += list(value) - return self._father.__delitem__(keys) - else: - raise KeyError - - def discard(self, value): - try: - if value in self: - keys = self._keys[:] - if not isinstance(value, Iterable) or isinstance(value, str): - keys.append(value) - else: - keys += list(value) - return self._father.__delitem__(keys) - except KeyError as ex: - pass - - def __len__(self): - query = "SELECT COUNT(*) FROM %s.%s WHERE " % (self._father._ksp, self._father._table) - query = ''.join([query, self._join_keys_query()]) - - try: - result = config.session.execute(query) - return result[0][0] - except Exception as ir: - log.error("Unable to execute %s", query) - raise ir - - def __contains__(self, value): - keys = self._keys[:] - if not isinstance(value, Iterable) or isinstance(value, str): - keys.append(value) - else: - keys += list(value) - return self._father.__contains__(keys) - - def __iter__(self): - keys_set = "" - for key in self._father._get_set_types(): - keys_set += key[0] + ", " - query = "SELECT %s FROM %s.%s WHERE " % (keys_set[:-2], self._father._ksp, self._father._table) - query = ''.join([query, self._join_keys_query()]) - - try: - result = config.session.execute(query) - if len(self._father._get_set_types()) == 1: - result = map(lambda x: x[0], result) - else: - result = map(lambda x: tuple(x), result) - return iter(result) - except Exception as ir: - log.error("Unable to execute %s", query) - raise ir - - def _join_keys_query(self): - keys = [] - for pkey, key in zip(self._father._primary_keys, self._keys): - if pkey["type"] == "text": - actual_key = "'%s'" % key - else: - actual_key = "%s" % key - keys.append(" = ".join([pkey["name"], actual_key])) - all_keys = " and ".join(keys) - - return all_keys - - def union(self, *others): - result = set() - for value in self: - result.add(value) - for other in others: - for value in other: - result.add(value) - return result - - def intersection(self, *others): - result = set() - for value in self: - in_all_others = True - for other in others: - try: - if value not in other: - in_all_others = False - break - except KeyError: - in_all_others = False - break - if in_all_others: - result.add(value) - return result - - def difference(self, *others): - result = set() - for value in self: - in_any_other = False - for other in others: - try: - if value in other: - in_any_other = True - break - except KeyError: - pass - if not in_any_other: - result.add(value) - return result - - def update(self, *others): - for other in others: - for value in other: - self.add(value) - return self - - def issubset(self, other): - if len(self) > len(other): - return False - for value in self: - if value not in other: - return False - return True - - def issuperset(self, other): - if len(self) < len(other): - return False - for value in other: - if value not in self: - return False - return True - - def __eq__(self, other): - return self._father.__eq__(other._father) and self._keys == other._keys - - def __ne__(self, other): - return not (self.__eq__(other)) - - def __lt__(self, other): - return self.__ne__(other) and self.issubset(other) - - def __le__(self, other): - return self.issubset(other) - - def __gt__(self, other): - return self.__ne__(other) and self.issuperset(other) - - def __ge__(self, other): - return self.issuperset(other) - - def clear(self): - for value in self._father[tuple(self._keys)]: - self.remove(value) +from .IStorage import IStorage, AlreadyPersistentError +from .tools import build_remotely, storage_id_from_name, transform_to_dm +import storage +from storage.cql_iface import log class StorageDict(IStorage, dict): @@ -203,279 +9,63 @@ class StorageDict(IStorage, dict): # Object used to access data from workers. # """ - args_names = ["name", "primary_keys", "columns", "tokens", "storage_id", "indexed_on", "class_name", - "built_remotely"] - args = namedtuple('StorageDictArgs', args_names) - _prepared_store_meta = config.session.prepare('INSERT INTO hecuba.istorage' - '(storage_id, class_name, name, tokens, ' - 'primary_keys, columns, indexed_on)' - 'VALUES (?,?,?,?,?,?,?)') - - @staticmethod - def _store_meta(storage_args): - """ - Method to update the info about the StorageDict in the DB metadata table - Args: - storage_args: structure with all data needed to update the metadata - """ - log.debug("StorageDict: storing metas %s", storage_args) - - try: - config.session.execute(StorageDict._prepared_store_meta, - [storage_args.storage_id, storage_args.class_name, - storage_args.name, - storage_args.tokens, storage_args.primary_keys, - storage_args.columns, storage_args.indexed_on]) - except Exception as ex: - log.error("Error creating the StorageDict metadata: %s %s", storage_args, ex) - raise ex - - def __init__(self, name='', primary_keys=None, columns=None, indexed_on=None, storage_id=None, **kwargs): + def __new__(cls, name='', *args, **kwargs): """ Creates a new StorageDict. Args: name (string): the name of the collection/table (keyspace is optional) - primary_keys (list(tuple)): a list of (key,type) primary keys (primary + clustering). - columns (list(tuple)): a list of (key,type) columns - tokens (list): list of tokens storage_id (string): the storage id identifier - indexed_on (list): values that will be used as index - kwargs: other parameters + args: arguments for base constructor + kwargs: arguments for base constructor """ - super().__init__((), name=name, storage_id=storage_id, **kwargs) - - log.debug("CREATED StorageDict(%s,%s)", primary_keys, columns) - - if self.__doc__ is not None: - self._persistent_props = self._parse_comments(self.__doc__) - self._primary_keys = self._persistent_props['primary_keys'] - self._columns = self._persistent_props['columns'] - self._indexed_on = self._persistent_props.get('indexed_on', indexed_on) - else: - self._primary_keys = primary_keys - set_pks = [] - normal_columns = [] - for column_name, column_type in columns: - if column_name.find("_set_") != -1: - set_pks.append((column_name.replace("_set_", ""), column_type)) - else: - normal_columns.append((column_name, column_type)) - if set_pks: - self._columns = [{"type": "set", "columns": set_pks}] - else: - self._columns = columns - self._indexed_on = indexed_on - - self._has_embedded_set = False - build_column = [] - columns = [] - for col in self._columns: - if isinstance(col, dict): - types = col["columns"] - if col["type"] == "set": - self._has_embedded_set = True - for t in types: - build_column.append(("_set_" + t[0], t[1])) - else: - build_column.append((col["name"], col["type"])) - columns.append(col) - else: - columns.append({"type": col[1], "name": col[0]}) - build_column.append(col) - - self._columns = columns[:] - self._primary_keys = [{"type": key[1], "name": key[0]} if isinstance(key, tuple) else key - for key in self._primary_keys] - build_keys = [(key["name"], key["type"]) for key in self._primary_keys] - - key_names = [col["name"] for col in self._primary_keys] - column_names = [col["name"] for col in self._columns] - self._item_builder = namedtuple('row', key_names + column_names) - - if len(key_names) > 1: - self._key_builder = namedtuple('row', key_names) - else: - self._key_builder = None - if self._has_embedded_set: - set_names = [colname for (colname, dt) in self._get_set_types()] - self._column_builder = namedtuple('row', set_names) - elif len(column_names) > 1: - self._column_builder = namedtuple('row', column_names) - else: - self._column_builder = None + if not cls._data_model_id: + # User data model + keys = {} + try: + cls._data_model_def = kwargs['data_model'] + except KeyError: + import typing + dms = [] + for ob in cls.__orig_bases__: + if isinstance(ob, typing.GenericMeta): + dms.append(transform_to_dm(ob)) + if len(dms) != 1: + raise ValueError("Different orig bases than expected ({})".format(len(dms))) - self._k_size = len(key_names) + cls._data_model_def = dms[0] + cls._data_model_def['type'] = cls - class_name = '%s.%s' % (self.__class__.__module__, self.__class__.__name__) + # Storage data model + #keys = {k: uuid.UUID if issubclass(v, IStorage) else v for k, v in cls._data_model_def["value_id"]} + #cols = {k: uuid.UUID if issubclass(v, IStorage) else v for k, v in cls._data_model_def["cols"]} - if build_column is None: - build_column = self._columns[:] + cls._data_model_id = storage.StorageAPI.add_data_model(cls._data_model_def) - self._build_args = self.args(self._get_name(), build_keys, build_column, self._tokens, - self.storage_id, self._indexed_on, class_name, self._built_remotely) + toret = super(StorageDict, cls).__new__(cls, kwargs) + storage_id = kwargs.get('storage_id', None) - if storage_id and not name: - name = get_istorage_attrs(storage_id)[0].name + if storage_id is None and name: + storage_id = storage_id_from_name(name) if name or storage_id: - self.make_persistent(name) - - @classmethod - def _parse_comments(self, comments): - parser = Parser("TypeSpec") - return parser._parse_comments(comments) + toret.setID(storage_id) + toret.set_name(name) + toret._is_persistent = True + storage.StorageAPI.register_persistent_object(cls._data_model_id, toret) + return toret - def __contains__(self, key): - """ - Method that checks if a given key exists in a StorageDict. - Args: - key: the position that we want to check if exists. - Returns: - boolean (true - exists, false - doesn't exist). - """ - if not self.storage_id: - return dict.__contains__(self, key) - else: - try: - # TODO we should save this value in a cache - self._hcache.get_row(self._make_key(key)) - return True - except Exception as ex: - log.warn("persistentDict.__contains__ ex %s", ex) - return False - - def _create_tables(self): - # Prepare data - persistent_keys = [(key["name"], "tuple<" + ",".join(key["columns"]) + ">") if key["type"] == "tuple" - else (key["name"], key["type"]) for key in self._primary_keys] + self._get_set_types() - persistent_values = [] - if not self._has_embedded_set: - for col in self._columns: - if col["type"] == "tuple": - persistent_values.append({"name": col["name"], "type": "tuple<" + ",".join(col["columns"]) + ">"}) - elif col["type"] not in basic_types: - persistent_values.append({"name": col["name"], "type": "uuid"}) - else: - persistent_values.append({"name": col["name"], "type": col["type"]}) - - key_names = [col[0] if isinstance(col, tuple) else col["name"] for col in persistent_keys] - - query_keyspace = "CREATE KEYSPACE IF NOT EXISTS %s WITH replication = %s" % (self._ksp, config.replication) - try: - log.debug('MAKE PERSISTENCE: %s', query_keyspace) - config.session.execute(query_keyspace) - except Exception as ex: - log.warn("Error creating the StorageDict keyspace %s, %s", (query_keyspace), ex) - raise ex - - persistent_columns = [(col["name"], col["type"]) for col in persistent_values] - - query_table = "CREATE TABLE IF NOT EXISTS %s.%s (%s, PRIMARY KEY (%s));" \ - % (self._ksp, - self._table, - ",".join("%s %s" % tup for tup in persistent_keys + persistent_columns), - str.join(',', key_names)) - try: - log.debug('MAKE PERSISTENCE: %s', query_table) - config.session.execute(query_table) - except Exception as ex: - log.warn("Error creating the StorageDict table: %s %s", query_table, ex) - raise ex - - if hasattr(self, '_indexed_on') and self._indexed_on is not None: - index_query = 'CREATE CUSTOM INDEX IF NOT EXISTS ' + self._table + '_idx ON ' - index_query += self._ksp + '.' + self._table + ' (' + str.join(',', self._indexed_on) + ') ' - index_query += "using 'es.bsc.qbeast.index.QbeastIndex';" - try: - config.session.execute(index_query) - except Exception as ex: - log.error("Error creating the Qbeast custom index: %s %s", index_query, ex) - raise ex - trigger_query = "CREATE TRIGGER IF NOT EXISTS %s%s_qtr ON %s.%s USING 'es.bsc.qbeast.index.QbeastTrigger';" % \ - (self._ksp, self._table, self._ksp, self._table) - try: - config.session.execute(trigger_query) - except Exception as ex: - log.error("Error creating the Qbeast trigger: %s %s", trigger_query, ex) - raise ex - - def _flush_data(self): - for k, v in super().items(): - self[k] = v - super().clear() - - def _setup_hcache(self): - key_names = [key["name"] for key in self._primary_keys] - key_names = key_names + [name for name, dt in self._get_set_types()] - - persistent_values = [] - if not self._has_embedded_set: - persistent_values = [{"name": col["name"]} for col in self._columns] - if self._tokens is None: - raise RuntimeError("Tokens for object {} are null".format(self._get_name())) - self._hcache_params = (self._ksp, self._table, - self.storage_id, - self._tokens, key_names, persistent_values, - {'cache_size': config.max_cache_size, - 'writer_par': config.write_callbacks_number, - 'writer_buffer': config.write_buffer_size, - 'timestamped_writes': config.timestamped_writes}) - log.debug("HCACHE params %s", self._hcache_params) - self._hcache = Hcache(*self._hcache_params) - - def _make_key(self, key): - """ - Method used to pass the key data to the StorageDict cache in a proper way. - Args: - key: the data that needs to get the correct format - """ - if isinstance(key, str) or not isinstance(key, Iterable): - if len(self._primary_keys) == 1: - return [key] - else: - raise Exception('missing a primary key') - - if isinstance(key, Iterable) and len(key) == len(self._primary_keys): - return list(key) - elif self._has_embedded_set and isinstance(key, Iterable) and len(key) == ( - len(self._primary_keys) + len(self._get_set_types())): - return list(key) - else: - raise Exception('wrong primary key') - - @staticmethod - def _make_value(value): - """ - Method used to pass the value data to the StorageDict cache in a proper way. - Args: - value: the data that needs to get the correct format - """ - if issubclass(value.__class__, IStorage): - return [value.storage_id] - elif isinstance(value, str) or not isinstance(value, Iterable) or isinstance(value, np.ndarray): - return [value] - elif isinstance(value, tuple): - return [value] - elif isinstance(value, Iterable): - val = [] - for v in value: - if isinstance(v, IStorage): - val.append(v.storage_id) - else: - val.append(v) - return val - else: - return list(value) + def __init__(self, *args, **kwargs): + super().__init__(**kwargs) def __iter__(self): """ Method that overloads the python dict basic iteration, which returns an iterator over the dictionary keys. """ - return self.keys() + return self.keys def make_persistent(self, name): """ @@ -485,41 +75,42 @@ def make_persistent(self, name): Args: name: """ - super().make_persistent(name) + if self._is_persistent: + raise AlreadyPersistentError("This StorageDict is already persistent {}", name) + # Update local StorageDict metadata - self._build_args = self._build_args._replace(storage_id=self.storage_id, name=self._ksp + "." + self._table, - tokens=self._tokens) + super().make_persistent(name) - if not self._built_remotely: - self._create_tables() + storage.StorageAPI.register_persistent_object(self.__class__._data_model_id, self) - self._setup_hcache() + keys = [] + values = [] + # Storing all in-memory values to cassandra + for i, (key, value) in enumerate(dict.items(self)): + keys.append(key) + if isinstance(value, IStorage): + if not value._is_persistent: + sd_name = name + '_' + i + value.make_persistent(sd_name) + values.append(value.getID()) + else: + values.append(value) - self._flush_data() + storage.StorageAPI.put_records(self.storage_id, keys, values) - StorageDict._store_meta(self._build_args) + super(StorageDict, self).clear() def stop_persistent(self): """ Method to turn a StorageDict into non-persistent. """ - super().stop_persistent() - log.debug('STOP PERSISTENCE: %s', self._table) - self._hcache = None - self.storage_id = None + log.debug('STOP PERSISTENCE') + for obj in self.values(): + if isinstance(obj, IStorage): + obj.stop_persistent() - def delete_persistent(self): - """ - Method to empty all data assigned to a StorageDict. - """ - super().delete_persistent() - log.debug('DELETE PERSISTENT: %s', self._table) - query = "TRUNCATE TABLE %s.%s;" % (self._ksp, self._table) - config.session.execute(query) + super().stop_persistent() - query = "DELETE FROM hecuba.istorage where storage_id={}".format(self.storage_id) - config.session.execute(query) - self.storage_id = None def __delitem__(self, key): """ @@ -529,16 +120,8 @@ def __delitem__(self, key): """ if not self.storage_id: dict.__delitem__(self, key) - elif self._has_embedded_set: - self._hcache.delete_row(key) - else: - self._hcache.delete_row([key]) - - def __create_embeddedset(self, key, val=None): - if not isinstance(key, Iterable) or isinstance(key, str): - return EmbeddedSet(self, [key], val) else: - return EmbeddedSet(self, list(key), val) + storage.StorageAPI.put_records(self.storage_id, [key], []) def __getitem__(self, key): """ @@ -552,46 +135,27 @@ def __getitem__(self, key): if not self.storage_id: return dict.__getitem__(self, key) - elif self._has_embedded_set: - return self.__create_embeddedset(key=key) - else: - # Returns always a list with a single entry for the key - persistent_result = self._hcache.get_row(self._make_key(key)) - log.debug("GET ITEM %s[%s]", persistent_result, persistent_result.__class__) - - # we need to transform UUIDs belonging to IStorage objects and rebuild them - # TODO hcache should return objects of the class uuid, not str - final_results = [] - for index, col in enumerate(self._columns): - col_type = col["type"] - element = persistent_result[index] - if col_type not in basic_types: - # element is not a built-in type - info = {"storage_id": element, "tokens": self._build_args.tokens, "class_name": col_type} - element = build_remotely(info) - - final_results.append(element) - - if self._column_builder is not None: - return self._column_builder(*final_results) - else: - return final_results[0] - - def __make_val_persistent(self, val, col=0): - if isinstance(val, list): - for index, element in enumerate(val): - val[index] = self.__make_val_persistent(element, index) - elif isinstance(val, IStorage) and not val._is_persistent: - val.storage_id = uuid.uuid4() - attribute = self._columns[col]["name"] - count = count_name_collision(self._ksp, self._table, attribute) - if count == 0: - name = self._ksp + "." + self._table + "_" + attribute - else: - name = self._ksp + "." + self._table + "_" + attribute + "_" + str(count - 1) - # new name as ksp+table+obj_class_name - val.make_persistent(name) - return val + + if not isinstance(key, list): + key = [key] + + # Returns always a list with a single entry for the key + persistent_result = storage.StorageAPI.get_records(self.storage_id, [key]) + + # we need to transform UUIDs belonging to IStorage objects and rebuild them + final_results = [] + + for i, element in enumerate(persistent_result): + col_type = self.__class__._data_model_def['cols'][i] + if issubclass(col_type, IStorage): + # element is not a built-in type + table_name = self.storage_id + '_' + str(key) + info = {"name": table_name, "storage_id": element, "class_name": col_type} + element = build_remotely(info) + + final_results.append(element) + + return final_results def __setitem__(self, key, val): """ @@ -600,28 +164,18 @@ def __setitem__(self, key, val): key: the position of the value that we want to save val: the value that we want to save in that position """ - if isinstance(val, list): - vals_istorage = [] - for element in val: - if isinstance(element, np.ndarray): - val_istorage = StorageNumpy(element) - else: - val_istorage = element - vals_istorage.append(val_istorage) - - val = vals_istorage - elif isinstance(val, np.ndarray): - val = StorageNumpy(val) - elif isinstance(val, set): - val = self.__create_embeddedset(key=key, val=val) - log.debug('SET ITEM %s->%s', key, val) - if self.storage_id is None: - dict.__setitem__(self, key, val) - elif not isinstance(val, EmbeddedSet): - # Not needed because it is made persistent and inserted to hcache when calling to self.__create_embeddedset - val = self.__make_val_persistent(val) - self._hcache.put_row(self._make_key(key), self._make_value(val)) + + if not isinstance(val, list): + val = [val] + + keys = [def_type(val[i]) for i, def_type in enumerate(self._data_model_def['value_id'].values())] + vals = [def_type(val[i]) for i, def_type in enumerate(self._data_model_def['cols'].values())] + + if not self._is_persistent: + dict.__setitem__(self, keys, vals) + else: + storage.StorageAPI.put_records(self.storage_id, [keys], [vals]) def __repr__(self): """ @@ -632,112 +186,8 @@ def __repr__(self): to_return = {} for item in self.items(): to_return[item[0]] = item[1] - if len(to_return) == config.hecuba_print_limit: + if len(to_return) == 20: return str(to_return) if len(to_return) > 0: return str(to_return) return "" - - def update(self, other=None, **kwargs): - """ - Updates the current dict with a new dictionary or set of attr,value pairs - (those must follow the current dict data model). - Args: - other: python dictionary or StorageDict. All key,val values in it will - be inserted in the current dict. - **kwargs: set of attr:val pairs, to be treated as key,val and inserted - in the current dict. - """ - if other is not None: - if isinstance(other, StorageDict): - for k, v in other.items(): - self[k] = v - else: - for k, v in other.items() if isinstance(other, Mapping) else other: - self[k] = v - for k, v in kwargs.items(): - self[k] = v - - def keys(self): - """ - Obtains the iterator for the keys of the StorageDict - Returns: - if persistent: - iterkeys(self): list of keys - if not persistent: - dict.keys(self) - """ - if self.storage_id: - ik = self._hcache.iterkeys(config.prefetch_size) - iterator = NamedIterator(ik, self._key_builder, self) - if self._has_embedded_set: - iterator = iter(set(iterator)) - - return iterator - else: - return dict.keys(self) - - def items(self): - """ - Obtains the iterator for the key,val pairs of the StorageDict - Returns: - if persistent: - NamedItemsIterator(self): list of key,val pairs - if not persistent: - dict.items(self) - """ - if self.storage_id: - ik = self._hcache.iteritems(config.prefetch_size) - iterator = NamedItemsIterator(self._key_builder, - self._column_builder, - self._k_size, - ik, - self) - if self._has_embedded_set: - d = defaultdict(set) - # iteritems has the set values in different rows, this puts all the set values in the same row - if len(self._get_set_types()) == 1: - for row in iterator: - d[row.key].add(row.value[0]) - else: - for row in iterator: - d[row.key].add(tuple(row.value)) - - iterator = d.items() - - return iterator - else: - return dict.items(self) - - def values(self): - """ - Obtains the iterator for the values of the StorageDict - Returns: - if persistent: - NamedIterator(self): list of valuesStorageDict - if not persistent: - dict.values(self) - """ - if self.storage_id: - if self._has_embedded_set: - items = self.items() - return dict(items).values() - else: - ik = self._hcache.itervalues(config.prefetch_size) - return NamedIterator(ik, self._column_builder, self) - else: - return dict.values(self) - - def get(self, key, default=None): - try: - value = self.__getitem__(key) - except KeyError: - value = default - return value - - def _get_set_types(self): - if self._has_embedded_set: - set_types = [col.get("columns", []) for col in self._columns if isinstance(col, dict)] - return sum(set_types, []) - else: - return [] diff --git a/hecuba_py/hecuba/hfilter.py b/hecuba_py/hecuba/hfilter.py deleted file mode 100644 index 7d2d31a6..00000000 --- a/hecuba_py/hecuba/hfilter.py +++ /dev/null @@ -1,257 +0,0 @@ -from collections import Iterable - -import re -import inspect -from . import config -from .qbeast import QbeastIterator, QbeastMeta - -from .IStorage import IStorage -from .storageiter import NamedItemsIterator - -magical_regex = re.compile(r'(?:\d+(?:\.\d+)?|\w|"\w+"|\'\w+\')+|[^\s\w\_]') -is_numerical = re.compile(r'\d+(\.\d+)?') - - -def func_to_str(func): - func_string = inspect.getsourcelines(func)[0][0] - start, end = func_string.find("lambda"), func_string.rfind(",") - func_string = func_string[start:end] - func_vars = func_string[7:func_string.find(':')].replace(" ", "").split(',') - clean_string = func_string[func_string.find(':') + 1:].replace("\\n", '') - return func_vars, clean_string - - -def substit_var(final_list, func_vars, dictv): - list_with_values = [] - for elem in final_list: - if not isinstance(elem, str) and isinstance(elem, Iterable): - list_with_values.append(elem) - elif (elem != 'in' and not isinstance(elem, int) and not re.match(r'[^\s\w]', elem)) and not elem.isdigit(): - i = elem.find('.') - if i > 0: - elem_var = elem[:i] - if elem_var not in func_vars: - elemm = elem[i:] - get_ele = dictv.get(str(elemm)) - if get_ele is None: - list_with_values.append(elem) - else: - list_with_values.append(dictv.get(str(elem))) - else: - list_with_values.append(elem[i + 1:]) - else: - get_elem = dictv.get(str(elem), elem) - list_with_values.append(get_elem) - else: - list_with_values.append(elem) - - return list_with_values - - -def is_float(var): - return is_numerical.match(var) is not None - - -def transform_to_correct_type(final_list, dictv): - final = [] - reverse_comparison = {">=": "<=", "<=": ">=", ">": "<", "<": ">"} - for elem in final_list: - aux = [] - for i, value in enumerate(elem): - if isinstance(value, (int, float, Iterable)) and not isinstance(value, str): - aux.append(value) - elif not value.find('"') == -1: - aux.append(value.replace('"', '')) - elif not value.find("'") == -1: - aux.append(value.replace("'", "")) - elif value.isdigit() and value not in dictv.values(): - aux.append(int(value)) - elif is_float(value) and value not in dictv.values(): - aux.append(float(value)) - elif value == "True": - aux.append(True) - elif value == "False": - aux.append(False) - else: - aux.append(value) - - if (isinstance(aux[0], str) and aux[0].isdigit()) or isinstance(aux[0], int): - aux.reverse() - aux[1] = reverse_comparison[aux[1]] - - final.append(aux) - - return final - - -def parse_lambda(func): - func_vars, clean_string = func_to_str(func) - parsed_string = magical_regex.findall(clean_string) - simplified_filter = [] - - for i, elem in enumerate(parsed_string): - if i > 0: - if elem == '=' and simplified_filter[-1] == "=": - pass - elif elem == '=' and (simplified_filter[-1] == "<" or simplified_filter[-1] == ">"): - simplified_filter[-1] = simplified_filter[-1] + "=" - elif simplified_filter[-1][-1] == ".": - simplified_filter[-1] += elem - elif elem == ".": - simplified_filter[-1] = simplified_filter[-1] + elem - else: - simplified_filter.append(elem) - else: - simplified_filter.append(elem) - - # Getting variables - dictv = {} - for i, elem in enumerate(func.__code__.co_freevars): - dictv[elem] = func.__closure__[i].cell_contents - - # Combine set or tuple - for i, elem in enumerate(simplified_filter): - if elem == "[": - index = simplified_filter[i:].index(']') - c = ''.join(simplified_filter[i:index + i + 1]) - simplified_filter[i:index + i + 1] = [eval(c)] - elif elem == '(': - index = simplified_filter[i:].index(')') - c = ''.join(simplified_filter[i:index + i + 1]) - joined_tuple = eval(c) - if len(joined_tuple) > 0: - simplified_filter[i:index + i + 1] = [joined_tuple] - else: - simplified_filter[i:index + i + 1] = [] - simplified_filter[i - 1] += "()" - - final_list = [] - while 'and' in simplified_filter: - i = simplified_filter.index('and') - sublist = simplified_filter[:i] - sublist = substit_var(sublist, func_vars, dictv) - final_list.append(sublist) - simplified_filter[:i + 1] = [] - else: - sublist = substit_var(simplified_filter, func_vars, dictv) - final_list.append(sublist) - - # Replace types for correct ones - final_list = transform_to_correct_type(final_list, dictv) - return final_list - - -def hfilter(lambda_filter, iterable): - if not isinstance(iterable, IStorage): - try: - iterable = iterable._storage_father - except AttributeError: - return python_filter(lambda_filter, iterable) - - parsed_lambda = parse_lambda(lambda_filter) - - if hasattr(iterable, '_indexed_on') and iterable._indexed_on is not None: - non_index_arguments = "" - # initialize lists of the same size as indexed_on - from_p = [None] * len(iterable._indexed_on) - to_p = [None] * len(iterable._indexed_on) - precision = None - - for expression in parsed_lambda: - if expression[0] in iterable._indexed_on: - index = iterable._indexed_on.index(expression[0]) - if expression[1] == ">": - from_p[index] = expression[2] - elif expression[1] == "<": - to_p[index] = expression[2] - elif expression[1] == "in": - raise Exception("Cannot use on a QbeastIterator") - else: - non_index_arguments += "%s %s %s AND " % (expression[0], expression[1], expression[2]) - elif expression[0].find("random") > -1: - precision = expression[2] - else: - non_index_arguments += "%s %s %s AND " % (expression[0], expression[1], expression[2]) - - if precision is None: - precision = 1.0 - name = "%s.%s" % (iterable._ksp, iterable._table) - - qbeast_meta = QbeastMeta(non_index_arguments[:-5], from_p, to_p, precision) - new_iterable = QbeastIterator(primary_keys=iterable._primary_keys, columns=iterable._columns, - indexed_on=iterable._indexed_on, name=name, qbeast_meta=qbeast_meta, - tokens=iterable._tokens) - return new_iterable - - predicate = Predicate(iterable) - for expression in parsed_lambda: - if expression[1] in (">", "<", "=", ">=", "<="): - predicate = predicate.comp(col=expression[0], comp=expression[1], value=expression[2]) - elif expression[1] == "in": - predicate = predicate.inside(col=expression[0], values=expression[2]) - else: - raise Exception("Bad expression.") - - return predicate.execute() - - -class Predicate: - def __init__(self, father): - self.father = father - self.primary_keys = [col[0] if isinstance(col, tuple) else col["name"] for col in self.father._primary_keys] - self.columns = [col[0] if isinstance(col, tuple) else col["name"] for col in self.father._columns] - self.predicate = None - - def comp(self, col, value, comp): - ''' - Select all rows where col (==, >=, <=, >, <) value - ''' - if col not in self.columns + self.primary_keys: - raise Exception("Wrong column.") - - if self.predicate is not None: - self.predicate += " AND " - else: - self.predicate = "" - - if isinstance(value, str): - value = "'{}'".format(value) - - self.predicate += " {} {} {}".format(col, comp, value) - return self - - def inside(self, col, values): - ''' - Select all rows where col in values - ''' - if col not in self.primary_keys: - raise Exception("Column not in primary key.") - - if self.predicate is not None: - self.predicate += " AND " - else: - self.predicate = "" - - self.predicate += " {} IN (".format(col) - for value in values: - if isinstance(value, str): - value = "'{}'".format(value) - self.predicate += "{}, ".format(value) - self.predicate = self.predicate[:-2] + ")" - return self - - def execute(self): - ''' - Execute the CQL query - Returns an iterator over the rows - ''' - conditions = self.predicate + " ALLOW FILTERING" - - hiter = self.father._hcache.iteritems({'custom_select': conditions, 'prefetch_size': config.prefetch_size}) - iterator = NamedItemsIterator(self.father._key_builder, - self.father._column_builder, - self.father._k_size, - hiter, - self.father) - - return iterator diff --git a/hecuba_py/hecuba/hnumpy.py b/hecuba_py/hecuba/hnumpy.py deleted file mode 100644 index 330609a2..00000000 --- a/hecuba_py/hecuba/hnumpy.py +++ /dev/null @@ -1,198 +0,0 @@ -from collections import namedtuple - -import numpy as np -from . import config, log -from hfetch import HNumpyStore - -from .IStorage import IStorage -from .tools import extract_ks_tab, get_istorage_attrs - - -class StorageNumpy(IStorage, np.ndarray): - class np_meta(object): - def __init__(self, shape, dtype, block_id): - self.dims = shape - self.type = dtype - self.block_id = block_id - - _build_args = None - _prepared_store_meta = config.session.prepare('INSERT INTO hecuba.istorage' - '(storage_id, class_name, name, numpy_meta)' - 'VALUES (?,?,?,?)') - - args_names = ["storage_id", "class_name", "name", "shape", "dtype", "block_id", "built_remotely"] - args = namedtuple('StorageNumpyArgs', args_names) - - def __new__(cls, input_array=None, storage_id=None, name=None, built_remotely=False, **kwargs): - if name: - name = name + '_numpies' - elif storage_id: - metas = get_istorage_attrs(storage_id) - name = metas[0].name - if input_array is None and name and storage_id is not None: - result = cls.load_array(storage_id, name) - input_array = result[0] - obj = np.asarray(input_array).view(cls) - (obj._ksp, obj._table) = extract_ks_tab(name) - obj._hcache = result[1] - # obj.storage_id = storage_id - # obj._is_persistent = True - elif not name and storage_id is not None: - raise RuntimeError("hnumpy received storage id but not a name") - elif (input_array is not None and name and storage_id is not None) \ - or (storage_id is None and name): - obj = np.asarray(input_array).view(cls) - obj.storage_id = storage_id - obj._is_persistent = False - else: - obj = np.asarray(input_array).view(cls) - obj.storage_id = storage_id - obj._is_persistent = storage_id is not None - # Finally, we must return the newly created object: - obj._block_id = -1 - obj._built_remotely = built_remotely - obj._class_name = '%s.%s' % (cls.__module__, cls.__name__) - return obj - - def __init__(self, input_array=None, storage_id=None, name=None, **kwargs): - IStorage.__init__(self, storage_id=storage_id, name=name, **kwargs) - if input_array is not None and (name or storage_id): - self.make_persistent(name) - - # used as copy constructor - def __array_finalize__(self, obj): - if obj is None: - return - - @staticmethod - def _create_tables(name): - (ksp, table) = extract_ks_tab(name) - query_keyspace = "CREATE KEYSPACE IF NOT EXISTS %s WITH replication = %s" % (ksp, config.replication) - config.session.execute(query_keyspace) - - config.session.execute( - 'CREATE TABLE IF NOT EXISTS ' + ksp + '.' + table + '(storage_id uuid , ' - 'cluster_id int, ' - 'block_id int, ' - 'payload blob, ' - 'PRIMARY KEY((storage_id,cluster_id),block_id))') - - @staticmethod - def _create_hcache(storage_id, name): - (ksp, table) = extract_ks_tab(name) - hcache_params = (ksp, table, - {'cache_size': config.max_cache_size, - 'writer_par': config.write_callbacks_number, - 'write_buffer': config.write_buffer_size, - 'timestamped_writes': config.timestamped_writes}) - - return HNumpyStore(*hcache_params) - - @staticmethod - def _store_meta(storage_args): - """ - Saves the information of the object in the istorage table. - Args:. - storage_args (object): contains all data needed to restore the object from the workers - """ - log.debug("StorageObj: storing media %s", storage_args) - try: - config.session.execute(StorageNumpy._prepared_store_meta, - [storage_args.storage_id, storage_args.class_name, - storage_args.name, StorageNumpy.np_meta(storage_args.shape, storage_args.dtype, - storage_args.block_id)]) - - except Exception as ex: - log.warn("Error creating the StorageNumpy metadata with args: %s" % str(storage_args)) - raise ex - - @staticmethod - def load_array(storage_id, name): - hcache = StorageNumpy._create_hcache(storage_id, name) - result = hcache.get_numpy([storage_id]) - if len(result) == 1: - return [result[0], hcache] - else: - raise KeyError - - def make_persistent(self, name): - if not name.endswith("_numpies"): - name = name + '_numpies' - - super().make_persistent(name) - - self._build_args = self.args(self.storage_id, self._class_name, self._ksp + '.' + self._table, - self.shape, self.dtype.num, self._block_id, self._built_remotely) - - if not self._built_remotely: - self._create_tables(name) - - if not getattr(self, '_hcache', None): - self._hcache = self._create_hcache(self.storage_id, name) - - if len(self.shape) != 0: - self._hcache.save_numpy([self.storage_id], [self]) - StorageNumpy._store_meta(self._build_args) - - def stop_persistent(self): - super().stop_persistent() - - self.storage_id = None - - def delete_persistent(self): - """ - Deletes the Cassandra table where the persistent StorageObj stores data - """ - super().delete_persistent() - query = "DELETE FROM %s.%s WHERE storage_id = %s;" % (self._ksp, self._table, self.storage_id) - query2 = "DELETE FROM hecuba.istorage WHERE storage_id = %s;" % self.storage_id - log.debug("DELETE PERSISTENT: %s", query) - config.session.execute(query) - config.session.execute(query2) - self.storage_id = None - - def __iter__(self): - return iter(self.view(np.ndarray)) - - def __contains__(self, item): - return item in self.view(np.ndarray) - - def __array_ufunc__(self, ufunc, method, *inputs, **kwargs): - args = [] - for input_ in inputs: - if isinstance(input_, StorageNumpy): - args.append(input_.view(np.ndarray)) - else: - args.append(input_) - - outputs = kwargs.pop('out', None) - if outputs: - out_args = [] - for output in outputs: - if isinstance(output, StorageNumpy): - out_args.append(output.view(np.ndarray)) - else: - out_args.append(output) - kwargs['out'] = tuple(out_args) - else: - outputs = (None,) * ufunc.nout - - results = super(StorageNumpy, self).__array_ufunc__(ufunc, method, - *args, **kwargs) - if results is NotImplemented: - return NotImplemented - - if method == 'at': - return - - if self.storage_id and len(self.shape): - self._hcache.save_numpy([self.storage_id], [self]) - - if ufunc.nout == 1: - results = (results,) - - results = tuple((result - if output is None else output) - for result, output in zip(results, outputs)) - - return results[0] if len(results) == 1 else results diff --git a/hecuba_py/hecuba/parser.py b/hecuba_py/hecuba/parser.py deleted file mode 100644 index e8201caa..00000000 --- a/hecuba_py/hecuba/parser.py +++ /dev/null @@ -1,313 +0,0 @@ -import re -from itertools import count - -from .tools import process_path - -_conversions = {'atomicint': 'counter', - 'str': 'text', - 'bool': 'boolean', - 'decimal': 'decimal', - 'float': 'float', - 'int': 'int', - 'tuple': 'tuple', - 'list': 'list', - 'generator': 'list', - 'frozenset': 'set', - 'set': 'set', - 'dict': 'map', - 'long': 'bigint', - 'buffer': 'blob', - 'bytearray': 'blob', - 'counter': 'counter', - 'double': 'double', - 'StorageDict': 'dict', - 'ndarray': 'hecuba.hnumpy.StorageNumpy', - 'numpy.ndarray': 'hecuba.hnumpy.StorageNumpy'} - - -class Parser(object): - args_names = ["type_parser"] - split_dtypes_regex = re.compile('^(tuple|set)<(.*)>$') - - def _append_values_to_list_after_replace(self, vals): - """ - Receives a list of data types. Strips the outermost data type. - Returns: - typev: list of the outer data types, with the keyword "simple" if not found - finalvars: list of the corresponding internal data types - """ - typev = [] - finalvars = [] - for var in vals: - res = self.split_dtypes_regex.search(var) - if res: - typev.append(res.group(1)) - finalvars.append(res.group(2)) - else: - typev.append("simple") - finalvars.append(var) - return typev, finalvars - - def _get_str_primary_keys_values(self, pk): - pk = pk.replace("dict", "", 1).strip() - - # Find point to split keys from values - n_brackets = 0 - pos = 0 - for pos, c in enumerate(pk): - if c == '<': - n_brackets = n_brackets + 1 - elif c == '>': - n_brackets = n_brackets - 1 - if n_brackets == 1: - break - - keys = pk[2:pos] - values = pk[pos + 2:len(pk) - 1] - - if not keys: - raise SyntaxError("Can't detect the keys in the TypeSpec") - - # We get the variables - - varsk = re.findall(r"\w+:", keys) # var keys - varsv = re.findall(r"\w+:", values) # var values - - # Now we clean the variables - - varskc = [v.replace(':', '') for v in varsk] - varsvc = [v.replace(':', '') for v in varsv] - - # We get the valuesk - - for var in varsk: - keys = keys.replace(var, ' ') - - valsc = keys[1:].split(', ') # all valuesk separated by comma - - typevk, finalvarsk = self._append_values_to_list_after_replace(valsc) - - for var in varsv: - values = values.replace(var, ' ', 1) - - valsc1 = values[1:].split(', ') # all valuesk separated by comma - - typevv, finalvarsv = self._append_values_to_list_after_replace(valsc1) - return varskc, varsvc, finalvarsk, finalvarsv, typevk, typevv - - def _set_or_tuple(self, type, pk_col, t, t1): - string_str = "" - t = t.split(',') - converted_primary_keys = ", ".join([_conversions.get(w, w) for w in t]) - converted_primary_keys = converted_primary_keys.split(',') - converted_primary_keys = [w.replace(' ', '') for w in converted_primary_keys] - aux_list = [] # stores ((var_1, val),(var_2, val),...) - if len(converted_primary_keys) > 1: - counter = count(0) - for type_val in converted_primary_keys: - if type == "set": - aux_list.append((t1 + '_' + str(next(counter)), type_val)) - else: - aux_list.append(type_val) - # string_str = ',{"name": "%s", "type": "%s", "%s": ["%s"]}' % (t1, type, pk_col, '","'.join(aux_list)) - string_str = ',{"name": "%s", "type": "%s", "%s": %s}' % (t1, type, pk_col, aux_list) - else: - aux_list.append((t1, converted_primary_keys[0])) - string_str = ',{"name": "%s", "type": "%s", "%s": %s}' % (t1, type, pk_col, aux_list) - return string_str - - def _get_dict_str(self, varsk, cleank, typek): - concatenated_keys = "" - values = "" - string_str = "" - for t, t1, t2 in zip(cleank, varsk, typek): # first keys - if t2 == 'set': - string_str = self._set_or_tuple('set', 'columns', t, t1) - elif t2 == 'tuple': - string_str = self._set_or_tuple('tuple', 'columns', t, t1) - else: - if t not in _conversions: - route = t - cname, module = process_path(route) - try: - mod = __import__(module, globals(), locals(), [cname], 0) - except (ImportError, ValueError) as ex: - raise ImportError("Can't import class {} from module {}".format(cname, module)) - string_str = ',("%s", "%s")' % (t1, t) - else: - type = _conversions[t] - string_str = ',("%s", "%s")' % (t1, type) - concatenated_keys = concatenated_keys + string_str - concatenated_keys = concatenated_keys[1:] - return concatenated_keys - - def _parse_dict(self, line, this): - split_line = line.split() - if len(split_line) == 2: - pk = split_line[1] - table = None - else: - pk = split_line[2] - table = split_line[1] - varsk, varsv, cleank, cleanv, typek, typevv = self._get_str_primary_keys_values(pk) - pks = self._get_dict_str(varsk, cleank, typek) - values = self._get_dict_str(varsv, cleanv, typevv) - if table == None: - - final_dict = '{"primary_keys": [%s], "columns": [%s], "type": "StorageDict"}' % (pks, values) - else: - final_dict = '{"%s": {"primary_keys": [%s], "columns": [%s], "type": "StorageDict"}}' % (table, pks, values) - final_dict = eval(final_dict) - aux = '{"primary_keys": [%s], "columns": [%s], "type": "StorageDict"}' % (pks, values) - if table in this: - this[table].update(eval(aux)) - return this - return final_dict - - def _parse_set_or_tuple(self, type, line, pk_or_col, this): - split_line = line.split() - table = split_line[1] - line = re.sub('[<>, ]', ' ', split_line[2].replace(str(type), "")) - primary_keys = line.split() - converted_primary_keys = ", ".join([_conversions.get(w, w) for w in primary_keys]) - if len(primary_keys) == 1: - string_str = '{"%s":{"%s": "%s","type": "%s"}}' % (table, pk_or_col, converted_primary_keys, str(type)) - final_string = eval(string_str) - aux = '{"%s": "%s","type": "%s"}' % (pk_or_col, converted_primary_keys, str(type)) - else: - string_str = '{"%s":{"%s": "%s","type": "%s"}}' % (table, pk_or_col, converted_primary_keys, str(type)) - final_string = eval(string_str) - aux = '{"%s": {"%s"},"type": "%s"}' % (pk_or_col, converted_primary_keys, str(type)) - if table in this: - this[table].update(eval(aux)) - return this - return final_string - - def _parse_index(self, line, this): - '''Def: parses index declaration, checking for the introduced vars. - Returns: a dict structure with the parsed dict.''' - - if self.type_parser == "TypeSpec": - table = "indexed_on" - atributes = line.split(' ', 2) - atributes = atributes[1].replace(" ", '') - else: - table = line.split()[1] - atributes = line.split(' ', 2) - atributes = atributes[2].replace(" ", '') - - atributes = atributes.split(',') - converted_atributes = ", ".join([_conversions.get(w, w) for w in atributes]) - converted_atributes = converted_atributes.split(',') - converted_atributes = [w.replace(" ", "") for w in converted_atributes] - - if self.type_parser == "TypeSpec": - this[table] = converted_atributes - else: - if table in this: - this[table].update({'indexed_on': converted_atributes}) - else: - this[table] = {'indexed_on': converted_atributes} - - return this - - def _parse_file(self, line, new): - '''Def: Checks if the file declaration is correct. - Returns: the file declaration with a dict structure''' - line = line.split(" ") - output = {} - table_name = line[1] - route = line[2] - cname, module = process_path(route) - try: - mod = __import__(module, globals(), locals(), [cname], 0) - except (ImportError, ValueError) as ex: - raise ImportError("Can't import class {} from module {}".format(cname, module)) - output["type"] = str(route) - if table_name in new: - new[table_name].update(output) - else: - new[table_name] = output - return new - - def _parse_set_tuple_list(self, line, this): - if line.count('set') > 0: - return self._parse_set_or_tuple('set', line, 'primary_keys', this) - elif line.count('tuple') > 0: - return self._parse_set_or_tuple('tuple', line, 'columns', this) - elif line.count('list') > 0: - return self._parse_set_or_tuple('list', line, 'columns', this) - - def _parse_simple(self, line, this): - split_line = line.split() - table = split_line[1] - type = _conversions[split_line[2]] - simple = '{"%s":{"type":"%s"}}' % (table, type) - simple = eval(simple) - if table in this: - this[table].update(simple) - return simple - - def _input_type(self, line, this): - if line.count('<') == 1: # is tuple, set, list - aux = self._parse_set_tuple_list(line, this) - elif line.count('<') == 0 and line.count('Index_on') == 0 and line.count('.') == 0 or ( - line.count('numpy.ndarray') and line.count('dict') == 0): # is simple type - aux = self._parse_simple(line, this) - elif line.count('Index_on') == 1: - aux = self._parse_index(line, this) - elif line.count('.') > 0 and line.count('dict') == 0: - aux = self._parse_file(line, this) - else: # is dict - aux = self._parse_dict(line, this) - return aux - - def _remove_spaces_from_line(self, line): - '''Def: Remove all the spaces of the line splitted from comments - Returns: same line with no spaces.''' - line = re.sub(' +', '*', line) - if line.find('@Index_on') == -1: - line = line[line.find(self.type_parser):] - - if line.count('tuple') == 1 and line.count('dict') == 0: - pos = re.search(r'\b(tuple)\b', line) - pos = pos.start() - elif line.count('set') == 1 and line.count('dict') == 0: - pos = re.search(r'\b(set)\b', line) - pos = pos.start() - elif line.count('@Index_on') == 1: - pos = line.find('@Index_on') - line = line[pos:] - return line.replace('*', ' ') - elif line.count('dict') > 0: - pos = re.search(r'\b(dict)\b', line) - pos = pos.start() - elif line.count('list') > 0: - pos = re.search(r'\b(list)\b', line) - pos = pos.start() - else: - return line.replace('*', ' ') - - line = line[0:pos].replace('*', ' ') + line[pos:].replace("*", '') - return line - - def _parse_comments(self, comments): - '''Def: Parses the comments param to a ClassField or TypeSpec type and checks if the comments are in the correct - format. - Returns: an structure with all the parsed comments.''' - this = {} - '''Erasing first and last line''' - str_splitted = comments.split('\n', 1)[-1] - lines = str_splitted.rsplit('\n', 1)[0] - '''''' - if self.type_parser == "TypeSpec": - for line in lines.split('\n'): - this = self._input_type(self._remove_spaces_from_line(line), this) - if self.type_parser == "ClassField": - for line in lines.split('\n'): - this.update(self._input_type(self._remove_spaces_from_line(line), this)) - return this - - def __init__(self, type_parser): - '''Initializes the Parser class with the type_parser that can be @ClassField or @TypeSpec.''' - self.type_parser = type_parser diff --git a/hecuba_py/hecuba/qbeast.py b/hecuba_py/hecuba/qbeast.py deleted file mode 100644 index 80bd0738..00000000 --- a/hecuba_py/hecuba/qbeast.py +++ /dev/null @@ -1,173 +0,0 @@ -import random -import string -import uuid -from collections import namedtuple - -from hfetch import Hcache - -from . import config, log -from .IStorage import IStorage -from .storageiter import NamedItemsIterator - - -class QbeastMeta(object): - def __init__(self, mem_filter, from_point, to_point, precision): - self.precision = precision - self.from_point = from_point - self.to_point = to_point - self.mem_filter = mem_filter - - -config.cluster.register_user_type('hecuba', 'q_meta', QbeastMeta) - - -class QbeastIterator(IStorage): - """ - Object used to access data from workers. - """ - - args_names = ['primary_keys', 'columns', 'indexed_on', 'name', 'qbeast_meta', 'qbeast_random', - 'storage_id', 'tokens', 'class_name', 'built_remotely'] - _building_args = namedtuple('QbeastArgs', args_names) - _prepared_store_meta = config.session.prepare('INSERT INTO hecuba.istorage' - '(primary_keys, columns, indexed_on, name, qbeast_meta,' - ' qbeast_random, storage_id, tokens, class_name)' - 'VALUES (?,?,?,?,?,?,?,?,?)') - _prepared_set_qbeast_meta = config.session.prepare('INSERT INTO hecuba.istorage (storage_id, qbeast_meta) ' - 'VALUES (?,?)') - - @staticmethod - def _store_meta(storage_args): - log.debug("QbeastIterator: storing metas %s", '') - - try: - config.session.execute(QbeastIterator._prepared_store_meta, - [storage_args.primary_keys, - storage_args.columns, - storage_args.indexed_on, - storage_args.name, - storage_args.qbeast_meta, - storage_args.qbeast_random, - storage_args.storage_id, - storage_args.tokens, - storage_args.class_name]) - except Exception as ex: - log.error("Error creating the StorageDictIx metadata: %s %s", storage_args, ex) - raise ex - - def __init__(self, primary_keys, columns, indexed_on, name, qbeast_meta=None, qbeast_random=None, - storage_id=None, tokens=None, **kwargs): - """ - Creates a new block. - Args: - primary_keys (list(tuple)): a list of (key,type) primary keys (primary + clustering). - columns (list(tuple)): a list of (key,type) columns - indexed_on (list(str)): a list of the names of the indexed columns - name (string): keyspace.table of the Cassandra collection - qbeast_random (str): qbeast random string, when selecting in different nodes this must have the same value - storage_id (uuid): the storage id identifier - tokens (list): list of tokens - """ - super().__init__((), name=name, storage_id=storage_id, **kwargs) - - log.debug("CREATED QbeastIterator(%s,%s,%s,%s)", storage_id, tokens, ) - - self._qbeast_meta = qbeast_meta - self._primary_keys = primary_keys - self._columns = columns - self._indexed_on = indexed_on - - if qbeast_random is None: - self._qbeast_random = ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(5)) - else: - self._qbeast_random = qbeast_random - - class_name = '%s.%s' % (self.__class__.__module__, self.__class__.__name__) - - self._primary_keys = [{"type": key[1], "name": key[0]} if isinstance(key, tuple) else key - for key in self._primary_keys] - self._columns = [{"type": col[1], "name": col[0]} if isinstance(col, tuple) else col - for col in self._columns] - - key_names = [col["name"] for col in self._primary_keys] - column_names = [col["name"] for col in self._columns] - if len(key_names) > 1: - self._key_builder = namedtuple('row', key_names) - else: - self._key_builder = None - if len(column_names) > 1: - self._column_builder = namedtuple('row', column_names) - else: - self._column_builder = None - - self._k_size = len(primary_keys) - - build_keys = [(key["name"], key["type"]) for key in self._primary_keys] - build_columns = [(col["name"], col["type"]) for col in self._columns] - - self._build_args = self._building_args( - build_keys, - build_columns, - self._indexed_on, - self._ksp + "." + self._table, - self._qbeast_meta, - self._qbeast_random, - self.storage_id, - self._tokens, - class_name, - self._built_remotely) - - if name or storage_id: - self.make_persistent(name) - - def make_persistent(self, name): - # Update local QbeastIterator metadata - super().make_persistent(name) - self._build_args = self._build_args._replace(storage_id=self.storage_id, name=self._ksp + "." + self._table, - tokens=self._tokens) - - self._setup_hcache() - - QbeastIterator._store_meta(self._build_args) - - def _setup_hcache(self): - key_names = [key["name"] for key in self._primary_keys] - persistent_values = [{"name": col["name"]} for col in self._columns] - - if self._tokens is None: - raise RuntimeError("Tokens for object {} are null".format(self._get_name())) - - self._hcache_params = (self._ksp, self._table, - self.storage_id, - self._tokens, key_names, persistent_values, - {'cache_size': config.max_cache_size, - 'writer_par': config.write_callbacks_number, - 'writer_buffer': config.write_buffer_size, - 'timestamped_writes': config.timestamped_writes}) - log.debug("HCACHE params %s", self._hcache_params) - self._hcache = Hcache(*self._hcache_params) - - def _set_qbeast_meta(self, qbeast_meta): - self._qbeast_meta = qbeast_meta - self._build_args = self._build_args._replace(qbeast_meta=qbeast_meta) - config.session.execute(QbeastIterator._prepared_set_qbeast_meta, [self.storage_id, qbeast_meta]) - - def __len__(self): - return len([row for row in self.__iter__()]) - - def __iter__(self): - if hasattr(self, "_qbeast_meta") and self._qbeast_meta is not None: - conditions = "" - for index, (from_p, to_p) in enumerate(zip(self._qbeast_meta.from_point, self._qbeast_meta.to_point)): - conditions += "{0} > {1} AND {0} < {2} AND ".format(self._indexed_on[index], from_p, to_p) - - conditions = conditions[:-5] + self._qbeast_meta.mem_filter - - conditions += " AND expr(%s_idx, 'precision=%s:%s') ALLOW FILTERING" \ - % (self._table, self._qbeast_meta.precision, self._qbeast_random) - - hiter = self._hcache.iteritems({'custom_select': conditions, 'prefetch_size': config.prefetch_size}) - else: - hiter = self._hcache.iteritems(config.prefetch_size) - - return NamedItemsIterator(self._key_builder, self._column_builder, self._k_size, hiter, self) diff --git a/hecuba_py/hecuba/storageiter.py b/hecuba_py/hecuba/storageiter.py deleted file mode 100644 index ffdefcc1..00000000 --- a/hecuba_py/hecuba/storageiter.py +++ /dev/null @@ -1,49 +0,0 @@ -from collections import namedtuple - - -class NamedIterator: - # Class that allows to iterate over the keys or the values of a dict - def __init__(self, hiterator, builder, father): - self.hiterator = hiterator - self.builder = builder - self._storage_father = father - - def __iter__(self): - return self - - def __next__(self): - n = self.hiterator.get_next() - if self.builder is not None: - if self._storage_father._get_set_types() is not None: - nkeys = len(n) - len(self._storage_father._get_set_types()) - n = n[:nkeys] - return self.builder(*n) - else: - return n[0] - - -class NamedItemsIterator: - # Class that allows to iterate over the keys and the values of a dict - builder = namedtuple('row', 'key, value') - - def __init__(self, key_builder, column_builder, k_size, hiterator, father): - self.key_builder = key_builder - self.k_size = k_size - self.column_builder = column_builder - self.hiterator = hiterator - self._storage_father = father - - def __iter__(self): - return self - - def __next__(self): - n = self.hiterator.get_next() - if self.key_builder is None: - k = n[0] - else: - k = self.key_builder(*n[0:self.k_size]) - if self.column_builder is None: - v = n[self.k_size] - else: - v = self.column_builder(*n[self.k_size:]) - return self.builder(k, v) diff --git a/hecuba_py/hecuba/storageobj.py b/hecuba_py/hecuba/storageobj.py index 1eca0b28..4226208b 100644 --- a/hecuba_py/hecuba/storageobj.py +++ b/hecuba_py/hecuba/storageobj.py @@ -1,127 +1,53 @@ -from collections import namedtuple - import numpy as np -from . import config, log, Parser - -from .hnumpy import StorageNumpy -from .IStorage import IStorage - -from .tools import count_name_collision, get_istorage_attrs, build_remotely, storage_id_from_name, basic_types, \ - valid_types +from .IStorage import IStorage, AlreadyPersistentError +from .tools import storage_id_from_name, transform_to_dm +import uuid +import storage +from storage.cql_iface.config import log class StorageObj(IStorage): - args_names = ["name", "tokens", "storage_id", "class_name", "built_remotely"] - args = namedtuple('StorageObjArgs', args_names) - _prepared_store_meta = config.session.prepare('INSERT INTO hecuba.istorage' - '(storage_id, class_name, name, tokens) ' - ' VALUES (?,?,?,?)') - """ This class is where information will be stored in Hecuba. The information can be in memory, stored in a python dictionary or local variables, or saved in a DB(Cassandra), depending on if it's persistent or not. """ - @staticmethod - def _store_meta(storage_args): - """ - Saves the information of the object in the istorage table. - Args: - storage_args (object): contains all data needed to restore the object from the workers - """ - log.debug("StorageObj: storing media %s", storage_args) - try: + def __new__(cls, name='', *args, **kwargs): + if not cls._data_model_id: + cls._data_model_def = dict() + cls._data_model_def['type'] = cls + cls._data_model_def['value_id'] = {'k': uuid.UUID} + cls._data_model_def['fields'] = transform_to_dm(cls) + cls._data_model_id = storage.StorageAPI.add_data_model(cls._data_model_def) - config.session.execute(StorageObj._prepared_store_meta, - [storage_args.storage_id, - storage_args.class_name, - storage_args.name, - storage_args.tokens]) - except Exception as ex: - log.warn("Error creating the StorageDict metadata: %s, %s", str(storage_args), ex) - raise ex + toret = super(StorageObj, cls).__new__(cls) + storage_id = kwargs.get('storage_id', None) + if storage_id is None and name: + storage_id = storage_id_from_name(name) - @classmethod - def _parse_comments(cls, comments): - parser = Parser("ClassField") - return parser._parse_comments(comments) + if name or storage_id: + + toret.setID(storage_id) + toret.set_name(name) + toret._is_persistent = True + storage.StorageAPI.register_persistent_object(cls._data_model_id, toret) + return toret - def __init__(self, name='', storage_id=None, *args, **kwargs): + def __init__(self, *args, **kwargs): """ Creates a new storageobj. Args: name (string): the name of the Cassandra Keyspace + table where information can be found tokens (list of tuples): token ranges assigned to the new StorageObj storage_id (string): an unique storageobj identifier + istorage_props dict(string,string): a map with the storage id of each contained istorage object. kwargs: more optional parameters """ - # Assign private attributes - self._persistent_props = StorageObj._parse_comments(self.__doc__) - self._persistent_attrs = self._persistent_props.keys() - self._class_name = '%s.%s' % (self.__class__.__module__, self.__class__.__name__) - - super().__init__(*args, **kwargs) - - self._build_args = self.args('', [], None, self._class_name, self._built_remotely) - - if storage_id and not name: - name = get_istorage_attrs(storage_id)[0].name - - if name or storage_id: - self.make_persistent(name) - log.debug("CREATED StorageObj(%s)", self._get_name()) - - def __eq__(self, other): - return self.__class__ == other.__class__ and self.getID() == other.getID() - - def _persist_attributes(self): - """ - Persist in-memory attributes to the data store - """ - for attribute in self._persistent_props.keys(): - try: - val = super().__getattribute__(attribute) - setattr(self, attribute, val) - except AttributeError: - pass - - def _build_is_attribute(self, attribute, persistence_name, storage_id): - # Build the IStorage obj - info = {"tokens": self._tokens, "storage_id": storage_id} - info.update(self._persistent_props[attribute]) - info["built_remotely"] = self._built_remotely - info['name'] = persistence_name - return build_remotely(info) - - def _create_tables(self): - """ - Setups the python structures used to communicate with the backend. - Creates the necessary tables on the backend to store the object data. - """ - - log.info("CREATING KEYSPACE AND TABLE %s %s", self._ksp, self._table) - - query_keyspace = "CREATE KEYSPACE IF NOT EXISTS %s WITH replication = %s" % (self._ksp, config.replication) - config.session.execute(query_keyspace) - - query_simple = 'CREATE TABLE IF NOT EXISTS ' + self._ksp + '.' + self._table + \ - '( storage_id uuid PRIMARY KEY, ' - for key, entry in self._persistent_props.items(): - query_simple += str(key) + ' ' - if entry['type'] != 'dict' and entry['type'] in valid_types: - if entry['type'] == 'list' or entry['type'] == 'tuple': - query_simple += entry['type'] + '<' + entry['columns'] + '>, ' - else: - query_simple += entry['type'] + ', ' - else: - query_simple += 'uuid, ' - try: - config.session.execute(query_simple[:-2] + ' )') - except Exception as ir: - log.error("Unable to execute %s", query_simple) - raise ir + # if self._is_persistent: + # self._load_attributes() + super(StorageObj, self).__init__() def make_persistent(self, name): """ @@ -133,66 +59,58 @@ def make_persistent(self, name): Args: name (string): name with which the table in the DB will be created """ - # Update name + if self._is_persistent: + raise AlreadyPersistentError("This StorageObj is already persistent {}", name) super().make_persistent(name) - self._table = self.__class__.__name__.lower() - - # Arguments used to build objects remotely - self._build_args = self.args(self._get_name(), - self._tokens, - self.storage_id, - self._class_name, - self._built_remotely) - - # If never existed, must create the tables and register - if not self._built_remotely: - self._create_tables() + storage.StorageAPI.register_persistent_object(self.__class__._data_model_id, self) + # defined_attrs = [attr for attr in self._data_model_def.keys() if attr in list(set(dir(self)))] - # Iterate over the objects the user has requested to be persistent - # retrieve them from memory and make them persistent - self._persist_attributes() + attrs = [] + values = [] + for obj_name, obj_type in self._data_model_def["cols"].items(): + try: + pd = object.__getattribute__(self, obj_name) + except AttributeError: + # Attribute unset, no action needed + continue + attrs.append(obj_name) + if isinstance(pd, IStorage): + if not pd._is_persistent: + sd_name = name + "_" + obj_name + pd.make_persistent(sd_name) + values.append(pd.getID()) + else: + values.append(pd) - StorageObj._store_meta(self._build_args) + storage.StorageAPI.put_records(self.storage_id, attrs, values) def stop_persistent(self): """ The StorageObj stops being persistent, but keeps the information already stored in Cassandra """ log.debug("STOP PERSISTENT") - - for obj_name in self._persistent_attrs: - try: - attr = object.__getattribute__(self, obj_name) - except AttributeError: - attr = None - + for obj_name in self._data_model_def.keys(): + attr = getattr(self, obj_name, None) if isinstance(attr, IStorage): attr.stop_persistent() super().stop_persistent() - self.storage_id = None def delete_persistent(self): """ Deletes the Cassandra table where the persistent StorageObj stores data """ - log.debug("DELETE PERSISTENT: %s", self._table) - - for obj_name in self._persistent_attrs: + log.debug('DELETE PERSISTENT') + for obj_name in self._data_model_def.keys(): attr = getattr(self, obj_name, None) if isinstance(attr, IStorage): attr.delete_persistent() - query = "TRUNCATE TABLE %s.%s;" % (self._ksp, self._table) - config.session.execute(query) - - query = "DELETE FROM hecuba.istorage where storage_id={}".format(self.storage_id) - config.session.execute(query) + storage.StorageAPI.delete_persistent_object(self.storage_id) super().delete_persistent() - self.storage_id = None def __getattr__(self, attribute): """ @@ -204,69 +122,36 @@ def __getattr__(self, attribute): Returns: value: obtained value """ - if attribute.startswith('_') or attribute not in self._persistent_attrs: - return super().__getattribute__(attribute) - - if not self.storage_id: - if self._persistent_props[attribute]["type"] not in basic_types: - value = self._build_is_attribute(attribute, persistence_name='', storage_id=None) - super().__setattr__(attribute, value) - return super().__getattribute__(attribute) - - ''' - StorageObj is persistent. - If the attribute is not a built-in object, we might have it in memory. - Since python works using references any modification from another reference will affect this attribute, - which is the expected behaviour. Therefore, is safe to store in-memory the Hecuba objects. - ''' try: - return super().__getattribute__(attribute) + return object.__getattribute__(self, attribute) except AttributeError as ex: - # Not present in memory, we will need to rebuild it - pass - - query = "SELECT %s FROM %s.%s WHERE storage_id = %s;" % (attribute, self._ksp, self._table, self.storage_id) - log.debug("GETATTR: %s", query) - try: - result = config.session.execute(query) - except Exception as ex: - log.warn("GETATTR ex %s", ex) - raise ex + if attribute.startswith('_') or attribute not in self._data_model_def['fields'].keys(): + raise ex - is_istorage_attr = self._persistent_props[attribute]["type"] not in basic_types + value_info = self._data_model_def['fields'][attribute] - try: - value = result[0][0] - # if exists but is set to None, the current behaviour is raising AttributeError - if not is_istorage_attr and value is None: - raise AttributeError('value not found') - except IndexError as ex: - if not is_istorage_attr: - raise AttributeError('value not found') - value = None - except TypeError as ex: - log.warn("ERROR ON QUERY RESULT {}".format(str(result))) - raise ex - - if is_istorage_attr: - # Value is uuid or None, because it was not found - - attr_name = attribute.lower() - my_name = self._get_name() - trailing_name = my_name[my_name.rfind('.') + 1:] + if not self.storage_id: + if not issubclass(value_info, IStorage): + raise AttributeError + else: + # We build the object, because Hecuba allows accessing attributes without previous initialization + value = value_info(data_model=self._data_model_def["fields"][attribute], build_remotely=True) + object.__setattr__(self, attribute, value) + return value - count = count_name_collision(self._ksp, trailing_name, attr_name) - attr_name = self._ksp + '.' + trailing_name + '_' + attr_name - if count > 1: - attr_name += '_' + str(count - 2) + assert self._is_persistent - if value is None: - value = storage_id_from_name(attr_name) + attr = storage.StorageAPI.get_record(self.storage_id, {'k': self.storage_id}) - value = self._build_is_attribute(attribute, persistence_name=attr_name, storage_id=value) + if issubclass(value_info, IStorage): + # Build the IStorage obj + attr = value_info(name=self.get_name() + '_' + attribute, storage_id=attr, + data_model=self._data_model_def["fields"][attribute], build_remotely=True) + elif not attr: + raise AttributeError('Value not found for {}'.format(attribute)) - super().__setattr__(attribute, value) - return value + object.__setattr__(self, attribute, attr) + return attr def __setattr__(self, attribute, value): """ @@ -277,60 +162,41 @@ def __setattr__(self, attribute, value): attribute: name of the value that we want to set value: value that we want to save """ - if attribute[0] is '_' or attribute not in self._persistent_attrs: - super().__setattr__(attribute, value) + if attribute[0] is '_' or attribute not in self._data_model_def["fields"].keys(): + object.__setattr__(self, attribute, value) return # Transform numpy.ndarrays and python dicts to StorageNumpy and StorageDicts if not isinstance(value, IStorage): if isinstance(value, np.ndarray): - value = StorageNumpy(value) + pass + #value = StorageNumpy(value) elif isinstance(value, dict): - per_dict = self._persistent_props[attribute] - info = {"name": '', "tokens": self._build_args.tokens, "storage_id": None, - "built_remotely": self._built_remotely} - info.update(per_dict) - new_value = build_remotely(info) - new_value.update(value) - value = new_value + obj_class = self._data_model_defDataModelId["fields"][attribute]["type"] + value = obj_class(data_model=self._data_model_def["fields"][attribute], build_remotely=False) if self.storage_id: # Write attribute to the storage if isinstance(value, IStorage): if not value.storage_id: - attr_name = attribute.lower() - my_name = self._get_name() - trailing_name = my_name[my_name.rfind('.')+1:] - - count = count_name_collision(self._ksp, trailing_name, attr_name) - attr_name = self._ksp + '.' + trailing_name + '_' + attr_name - if count != 0: - attr_name += '_' + str(count - 1) + attr_name = self._name + '_' + attribute + attr_id = storage_id_from_name(attr_name) value.make_persistent(attr_name) - # We store the storage_id when the object belongs to an Hecuba class - values = [self.storage_id, value.storage_id] - # We store the IStorage object in memory, to avoid rebuilding when it is not necessary + storage.StorageAPI.put_records(self.storage_id, [attribute], [attr_id]) + else: + storage.StorageAPI.put_records(self.storage_id, [attribute], [value.storage_id]) else: - values = [self.storage_id, value] - - query = "INSERT INTO %s.%s (storage_id,%s)" % (self._ksp, self._table, attribute) - query += " VALUES (%s,%s)" - - log.debug("SETATTR: " + query) - config.session.execute(query, values) + storage.StorageAPI.put_record(self.storage_id, {'k': self.storage_id}, {attribute: value}) # We store all the attributes in memory - super().__setattr__(attribute, value) + object.__setattr__(self, attribute, value) - def __delattr__(self, name): + def __delattr__(self, item): """ Method that deletes a given attribute from a StorageObj Args: item: the name of the attribute to be deleted """ - super().__delattr__(name) - - if self.storage_id and name in self._persistent_attrs: - query = "UPDATE %s.%s SET %s = null WHERE storage_id = %s" % ( - self._ksp, self._table, name, self.storage_id) - config.session.execute(query) + if self.storage_id and item in self._data_model_def["cols"].keys(): + storage.StorageAPI.put_records(self.storage_id, [item], []) + object.__delattr__(self, item) diff --git a/hecuba_py/hecuba/tools.py b/hecuba_py/hecuba/tools.py index b75893a2..37d60ff2 100644 --- a/hecuba_py/hecuba/tools.py +++ b/hecuba_py/hecuba/tools.py @@ -1,11 +1,8 @@ import uuid -from . import config - -valid_types = ['counter', 'text', 'boolean', 'decimal', 'double', 'int', 'list', 'set', 'map', 'bigint', 'blob', - 'tuple', 'dict', 'float', 'numpy.ndarray'] - -basic_types = valid_types[:-1] - +import typing +from collections import OrderedDict +import hecuba +from storage.cql_iface import config def storage_id_from_name(name): return uuid.uuid3(uuid.NAMESPACE_DNS, name) @@ -184,22 +181,90 @@ def build_remotely(args): if obj_type is None: raise TypeError("Trying to build an IStorage obj without giving the type") - # Import the class defined by obj_type - cname, module = process_path(obj_type) - - ''' - if obj_type == str(StorageNumpy.__class__): - return StorageNumpy(name=args["name"], storage_id=args["storage_id"]) - ''' - try: - mod = __import__(module, globals(), locals(), [cname], 0) - except ValueError: - raise ValueError("Can't import class {} from module {}".format(cname, module)) - - imported_class = getattr(mod, cname) + imported_class = obj_type args = {k: v for k, v in args.items() if k in imported_class.args_names} args.pop('class_name', None) args["built_remotely"] = built_remotely return imported_class(**args) + + +def import_class(module_path): + """ + Method to obtain module and class_name from a module path + Args: + module_path(String): path in the format module.class_name + Returns: + tuple containing class_name and module + """ + class_name, mod = process_path(module_path) + + try: + mod = __import__(mod, globals(), locals(), [class_name], 0) + except ValueError: + raise ValueError("Can't import class {} from module {}".format(class_name, mod)) + + imported_class = getattr(mod, class_name) + return imported_class + + +def build_data_model(description): + res = {} + for k, v in description.items(): + dt = update_type(v["type"]) + try: + keys = build_data_model(v["primary_keys"]) + values = build_data_model(v["columns"]) + res[k] = {"keys": keys, "cols": values, "type": dt} + except KeyError: + res[k] = dt + return res + # {k: update_type(v['type']) for k, v in persistent_props.items()} + + +def update_type(d): + if d == 'text': + return str + res = import_class(d) + return res + + +def transform_to_dm(ob, depth=0): + """ + + :param ob: + :return: List or dict + """ + if issubclass(ob, hecuba.IStorage.IStorage) and depth>0: + return ob + elif issubclass(ob, typing.Dict): + fields = {} + + keys = transform_to_dm(ob.__args__[0], depth+1) # Keys + cols = transform_to_dm(ob.__args__[1], depth+1) # Cols + + if isinstance(keys, list): + keys = {"key{}".format(i): transform_to_dm(v, depth+1) for i, v in enumerate(keys)} + if isinstance(cols, list): + cols = {"col{}".format(i): transform_to_dm(v,depth+1) for i, v in enumerate(cols)} + + fields["value_id"] = keys + fields["cols"] = cols + return fields + + elif hasattr(ob, '__annotations__'): + annot = ob.__annotations__ + if isinstance(annot, OrderedDict): + return {k: transform_to_dm(v, depth+1) for k,v in annot.items()} + elif isinstance(annot, dict): + return {k: transform_to_dm(v, depth+1) for k,v in annot.items()} + else: + raise NotImplemented + + elif hasattr(ob, '__args__'): + if issubclass(ob, typing.Tuple): + t = [transform_to_dm(cl, depth+1) for cl in ob.__args__ if cl != ()] + return tuple(t) + return [transform_to_dm(cl, depth+1) for cl in ob.__args__ if cl != ()] + return ob diff --git a/out.txt b/out.txt new file mode 100644 index 00000000..065e8211 --- /dev/null +++ b/out.txt @@ -0,0 +1,10623 @@ +==18661== Memcheck, a memory error detector +==18661== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. +==18661== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info +==18661== Command: python3 /home/ismael/hecuba/hecuba_py/hecuba/SO_tests.py +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x56A122: ??? (in /usr/bin/python3.6) +==18661== by 0x57118E: PyDict_SetDefault (in /usr/bin/python3.6) +==18661== by 0x528059: PyUnicode_InternInPlace (in /usr/bin/python3.6) +==18661== by 0x52812F: PyUnicode_InternFromString (in /usr/bin/python3.6) +==18661== by 0x549206: ??? (in /usr/bin/python3.6) +==18661== by 0x554930: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D47A: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x637B53: ??? (in /usr/bin/python3.6) +==18661== by 0x638CD9: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x56A13A: ??? (in /usr/bin/python3.6) +==18661== by 0x57118E: PyDict_SetDefault (in /usr/bin/python3.6) +==18661== by 0x528059: PyUnicode_InternInPlace (in /usr/bin/python3.6) +==18661== by 0x52812F: PyUnicode_InternFromString (in /usr/bin/python3.6) +==18661== by 0x549206: ??? (in /usr/bin/python3.6) +==18661== by 0x554930: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D47A: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x637B53: ??? (in /usr/bin/python3.6) +==18661== by 0x638CD9: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x56A122: ??? (in /usr/bin/python3.6) +==18661== by 0x57118E: PyDict_SetDefault (in /usr/bin/python3.6) +==18661== by 0x528059: PyUnicode_InternInPlace (in /usr/bin/python3.6) +==18661== by 0x553D9A: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D47A: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x637B53: ??? (in /usr/bin/python3.6) +==18661== by 0x638CD9: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x56A13A: ??? (in /usr/bin/python3.6) +==18661== by 0x57118E: PyDict_SetDefault (in /usr/bin/python3.6) +==18661== by 0x528059: PyUnicode_InternInPlace (in /usr/bin/python3.6) +==18661== by 0x553D9A: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D47A: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x637B53: ??? (in /usr/bin/python3.6) +==18661== by 0x638CD9: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x56A118: ??? (in /usr/bin/python3.6) +==18661== by 0x56B992: ??? (in /usr/bin/python3.6) +==18661== by 0x571572: PyDict_SetItemString (in /usr/bin/python3.6) +==18661== by 0x5538B3: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D47A: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Address 0x6045020 is 304 bytes inside a block of size 2,208 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x56A634: ??? (in /usr/bin/python3.6) +==18661== by 0x57118E: PyDict_SetDefault (in /usr/bin/python3.6) +==18661== by 0x528059: PyUnicode_InternInPlace (in /usr/bin/python3.6) +==18661== by 0x553D9A: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D47A: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x57118E: PyDict_SetDefault (in /usr/bin/python3.6) +==18661== by 0x528059: PyUnicode_InternInPlace (in /usr/bin/python3.6) +==18661== by 0x52812F: PyUnicode_InternFromString (in /usr/bin/python3.6) +==18661== by 0x549206: ??? (in /usr/bin/python3.6) +==18661== by 0x554930: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D47A: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x56A118: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x5528E9: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D4C2: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Address 0x6048020 is 688 bytes inside a block of size 1,112 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x56A634: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x5528E9: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D4B0: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x5528E9: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D4B0: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x56A118: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x5528E9: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D4D4: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Address 0x6049020 is 688 bytes inside a block of size 1,112 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x56A634: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x5528E9: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D4C2: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x5528E9: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D4C2: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x56A118: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x5528E9: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D4F8: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Address 0x604a020 is 688 bytes inside a block of size 1,112 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x56A634: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x5528E9: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D4D4: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x5528E9: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D4D4: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x56A118: ??? (in /usr/bin/python3.6) +==18661== by 0x56B992: ??? (in /usr/bin/python3.6) +==18661== by 0x571572: PyDict_SetItemString (in /usr/bin/python3.6) +==18661== by 0x553DC6: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D4F8: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Address 0x604b020 is 32 bytes before a block of size 1,120 in arena "client" +==18661== +==18661== Invalid read of size 4 +==18661== at 0x56A118: ??? (in /usr/bin/python3.6) +==18661== by 0x56B992: ??? (in /usr/bin/python3.6) +==18661== by 0x571572: PyDict_SetItemString (in /usr/bin/python3.6) +==18661== by 0x553E36: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D50A: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Address 0x604c020 is 32 bytes before a block of size 576 in arena "client" +==18661== +==18661== Invalid read of size 4 +==18661== at 0x56A118: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x553E9A: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D51C: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Address 0x604d020 is 32 bytes before a block of size 576 in arena "client" +==18661== +==18661== Invalid read of size 4 +==18661== at 0x56A118: ??? (in /usr/bin/python3.6) +==18661== by 0x57118E: PyDict_SetDefault (in /usr/bin/python3.6) +==18661== by 0x528059: PyUnicode_InternInPlace (in /usr/bin/python3.6) +==18661== by 0x553D9A: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D51C: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Address 0x6045020 is 304 bytes inside a block of size 2,208 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x56A634: ??? (in /usr/bin/python3.6) +==18661== by 0x57118E: PyDict_SetDefault (in /usr/bin/python3.6) +==18661== by 0x528059: PyUnicode_InternInPlace (in /usr/bin/python3.6) +==18661== by 0x553D9A: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D47A: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x57118E: PyDict_SetDefault (in /usr/bin/python3.6) +==18661== by 0x528059: PyUnicode_InternInPlace (in /usr/bin/python3.6) +==18661== by 0x52812F: PyUnicode_InternFromString (in /usr/bin/python3.6) +==18661== by 0x549206: ??? (in /usr/bin/python3.6) +==18661== by 0x554930: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D47A: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x56A118: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x554245: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D5BE: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Address 0x6051020 is 336 bytes inside a block of size 576 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x56A634: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x554245: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D59A: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x5528E9: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D59A: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x56A118: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x5528E9: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D684: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Address 0x6055020 is 0 bytes after a block of size 576 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x56A634: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x5528E9: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D672: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x5528E9: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D672: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x56A118: ??? (in /usr/bin/python3.6) +==18661== by 0x56B992: ??? (in /usr/bin/python3.6) +==18661== by 0x571572: PyDict_SetItemString (in /usr/bin/python3.6) +==18661== by 0x553141: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D726: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Address 0x6057020 is 384 bytes inside a block of size 576 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x56A634: ??? (in /usr/bin/python3.6) +==18661== by 0x56B992: ??? (in /usr/bin/python3.6) +==18661== by 0x571572: PyDict_SetItemString (in /usr/bin/python3.6) +==18661== by 0x5538B3: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D6CC: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x5528E9: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x61D6CC: _Py_ReadyTypes (in /usr/bin/python3.6) +==18661== by 0x638D02: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x56A118: ??? (in /usr/bin/python3.6) +==18661== by 0x57118E: PyDict_SetDefault (in /usr/bin/python3.6) +==18661== by 0x528059: PyUnicode_InternInPlace (in /usr/bin/python3.6) +==18661== by 0x566A26: PyModule_Create2 (in /usr/bin/python3.6) +==18661== by 0x600288: _PyBuiltin_Init (in /usr/bin/python3.6) +==18661== by 0x638D4D: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Address 0x604d020 is 32 bytes before a block of size 576 in arena "client" +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x4FCBE77: __wcsnlen_avx2 (strlen-avx2.S:261) +==18661== by 0x4EF9EC1: wcsrtombs (wcsrtombs.c:104) +==18661== by 0x4E7FB20: wcstombs (wcstombs.c:34) +==18661== by 0x5AD6DF: ??? (in /usr/bin/python3.6) +==18661== by 0x6333FC: ??? (in /usr/bin/python3.6) +==18661== by 0x4AE069: ??? (in /usr/bin/python3.6) +==18661== by 0x63695F: Py_GetProgramFullPath (in /usr/bin/python3.6) +==18661== by 0x636C15: _PySys_Init (in /usr/bin/python3.6) +==18661== by 0x638D8C: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a stack allocation +==18661== at 0x6333E0: Py_EncodeLocale (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x4E63408: internal_utf8_loop (loop.c:298) +==18661== by 0x4E63408: __gconv_transform_internal_utf8 (skeleton.c:609) +==18661== by 0x4EF9EF4: wcsrtombs (wcsrtombs.c:110) +==18661== by 0x4E7FB20: wcstombs (wcstombs.c:34) +==18661== by 0x5AD6DF: ??? (in /usr/bin/python3.6) +==18661== by 0x6333FC: ??? (in /usr/bin/python3.6) +==18661== by 0x4AE069: ??? (in /usr/bin/python3.6) +==18661== by 0x63695F: Py_GetProgramFullPath (in /usr/bin/python3.6) +==18661== by 0x636C15: _PySys_Init (in /usr/bin/python3.6) +==18661== by 0x638D8C: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a stack allocation +==18661== at 0x6333E0: Py_EncodeLocale (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x4E63411: internal_utf8_loop (loop.c:303) +==18661== by 0x4E63411: __gconv_transform_internal_utf8 (skeleton.c:609) +==18661== by 0x4EF9EF4: wcsrtombs (wcsrtombs.c:110) +==18661== by 0x4E7FB20: wcstombs (wcstombs.c:34) +==18661== by 0x5AD6DF: ??? (in /usr/bin/python3.6) +==18661== by 0x6333FC: ??? (in /usr/bin/python3.6) +==18661== by 0x4AE069: ??? (in /usr/bin/python3.6) +==18661== by 0x63695F: Py_GetProgramFullPath (in /usr/bin/python3.6) +==18661== by 0x636C15: _PySys_Init (in /usr/bin/python3.6) +==18661== by 0x638D8C: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a stack allocation +==18661== at 0x6333E0: Py_EncodeLocale (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x4E63458: internal_utf8_loop (loop.c:298) +==18661== by 0x4E63458: __gconv_transform_internal_utf8 (skeleton.c:609) +==18661== by 0x4EF9EF4: wcsrtombs (wcsrtombs.c:110) +==18661== by 0x4E7FB20: wcstombs (wcstombs.c:34) +==18661== by 0x5AD6DF: ??? (in /usr/bin/python3.6) +==18661== by 0x6333FC: ??? (in /usr/bin/python3.6) +==18661== by 0x4AE069: ??? (in /usr/bin/python3.6) +==18661== by 0x63695F: Py_GetProgramFullPath (in /usr/bin/python3.6) +==18661== by 0x636C15: _PySys_Init (in /usr/bin/python3.6) +==18661== by 0x638D8C: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a stack allocation +==18661== at 0x6333E0: Py_EncodeLocale (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x4FCBCEC: __wcsnlen_avx2 (strlen-avx2.S:103) +==18661== by 0x4EF9EC1: wcsrtombs (wcsrtombs.c:104) +==18661== by 0x4E7FB20: wcstombs (wcstombs.c:34) +==18661== by 0x5AD6DF: ??? (in /usr/bin/python3.6) +==18661== by 0x6335BD: _Py_wreadlink (in /usr/bin/python3.6) +==18661== by 0x636394: ??? (in /usr/bin/python3.6) +==18661== by 0x63695F: Py_GetProgramFullPath (in /usr/bin/python3.6) +==18661== by 0x636C15: _PySys_Init (in /usr/bin/python3.6) +==18661== by 0x638D8C: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a stack allocation +==18661== at 0x633310: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4697: ??? (in /usr/bin/python3.6) +==18661== by 0x4F46BB: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB07F: PyMarshal_ReadObjectFromString (in /usr/bin/python3.6) +==18661== by 0x5FB0F0: PyImport_ImportFrozenModuleObject (in /usr/bin/python3.6) +==18661== by 0x5FB19D: PyImport_ImportFrozenModule (in /usr/bin/python3.6) +==18661== by 0x638B26: ??? (in /usr/bin/python3.6) +==18661== Address 0x6068020 is 0 bytes after a block of size 704 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F46BB: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB07F: PyMarshal_ReadObjectFromString (in /usr/bin/python3.6) +==18661== by 0x5FB0F0: PyImport_ImportFrozenModuleObject (in /usr/bin/python3.6) +==18661== by 0x5FB19D: PyImport_ImportFrozenModule (in /usr/bin/python3.6) +==18661== by 0x638B26: ??? (in /usr/bin/python3.6) +==18661== by 0x638E51: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4673: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4AA3: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4673: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB07F: PyMarshal_ReadObjectFromString (in /usr/bin/python3.6) +==18661== by 0x5FB0F0: PyImport_ImportFrozenModuleObject (in /usr/bin/python3.6) +==18661== by 0x5FB19D: PyImport_ImportFrozenModule (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F471F: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A8D: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB07F: PyMarshal_ReadObjectFromString (in /usr/bin/python3.6) +==18661== by 0x5FB0F0: PyImport_ImportFrozenModuleObject (in /usr/bin/python3.6) +==18661== by 0x5FB19D: PyImport_ImportFrozenModule (in /usr/bin/python3.6) +==18661== by 0x638B26: ??? (in /usr/bin/python3.6) +==18661== by 0x638E51: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== Address 0x6068020 is 0 bytes after a block of size 704 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F46BB: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB07F: PyMarshal_ReadObjectFromString (in /usr/bin/python3.6) +==18661== by 0x5FB0F0: PyImport_ImportFrozenModuleObject (in /usr/bin/python3.6) +==18661== by 0x5FB19D: PyImport_ImportFrozenModule (in /usr/bin/python3.6) +==18661== by 0x638B26: ??? (in /usr/bin/python3.6) +==18661== by 0x638E51: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4673: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4AA3: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4673: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB07F: PyMarshal_ReadObjectFromString (in /usr/bin/python3.6) +==18661== by 0x5FB0F0: PyImport_ImportFrozenModuleObject (in /usr/bin/python3.6) +==18661== by 0x5FB19D: PyImport_ImportFrozenModule (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4B3E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB07F: PyMarshal_ReadObjectFromString (in /usr/bin/python3.6) +==18661== by 0x5FB0F0: PyImport_ImportFrozenModuleObject (in /usr/bin/python3.6) +==18661== by 0x5FB19D: PyImport_ImportFrozenModule (in /usr/bin/python3.6) +==18661== by 0x638B26: ??? (in /usr/bin/python3.6) +==18661== Address 0x6068020 is 0 bytes after a block of size 704 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F46BB: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB07F: PyMarshal_ReadObjectFromString (in /usr/bin/python3.6) +==18661== by 0x5FB0F0: PyImport_ImportFrozenModuleObject (in /usr/bin/python3.6) +==18661== by 0x5FB19D: PyImport_ImportFrozenModule (in /usr/bin/python3.6) +==18661== by 0x638B26: ??? (in /usr/bin/python3.6) +==18661== by 0x638E51: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4673: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4AA3: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4673: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB07F: PyMarshal_ReadObjectFromString (in /usr/bin/python3.6) +==18661== by 0x5FB0F0: PyImport_ImportFrozenModuleObject (in /usr/bin/python3.6) +==18661== by 0x5FB19D: PyImport_ImportFrozenModule (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x56A118: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x50D084: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50B3A2: PyEval_EvalCode (in /usr/bin/python3.6) +==18661== by 0x5FAB95: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB12E: PyImport_ImportFrozenModuleObject (in /usr/bin/python3.6) +==18661== by 0x5FB19D: PyImport_ImportFrozenModule (in /usr/bin/python3.6) +==18661== by 0x638B26: ??? (in /usr/bin/python3.6) +==18661== by 0x638E51: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Address 0x6074020 is 16 bytes before a block of size 928 alloc'd +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x551C4B: PyType_GenericAlloc (in /usr/bin/python3.6) +==18661== by 0x558330: ??? (in /usr/bin/python3.6) +==18661== by 0x5516F4: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x515C74: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50B3A2: PyEval_EvalCode (in /usr/bin/python3.6) +==18661== by 0x5FAB95: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB12E: PyImport_ImportFrozenModuleObject (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5AC347: ??? (in /usr/bin/python3.6) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A8D: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB07F: PyMarshal_ReadObjectFromString (in /usr/bin/python3.6) +==18661== by 0x5FB6AB: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5757: PyObject_CallFunctionObjArgs (in /usr/bin/python3.6) +==18661== by 0x50DD07: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x5AC35F: ??? (in /usr/bin/python3.6) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A8D: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB07F: PyMarshal_ReadObjectFromString (in /usr/bin/python3.6) +==18661== by 0x5FB6AB: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5757: PyObject_CallFunctionObjArgs (in /usr/bin/python3.6) +==18661== by 0x50DD07: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F46FF: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A8D: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB07F: PyMarshal_ReadObjectFromString (in /usr/bin/python3.6) +==18661== by 0x5FB6AB: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== Address 0x607d020 is 816 bytes inside a block of size 1,184 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4B3E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB07F: PyMarshal_ReadObjectFromString (in /usr/bin/python3.6) +==18661== by 0x5FB6AB: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F46DF: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4AA3: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB07F: PyMarshal_ReadObjectFromString (in /usr/bin/python3.6) +==18661== by 0x5FB6AB: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F464F: ??? (in /usr/bin/python3.6) +==18661== by 0x4F46BB: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB07F: PyMarshal_ReadObjectFromString (in /usr/bin/python3.6) +==18661== by 0x5FB6AB: ??? (in /usr/bin/python3.6) +==18661== Address 0x607d020 is 816 bytes inside a block of size 1,184 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4B3E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB07F: PyMarshal_ReadObjectFromString (in /usr/bin/python3.6) +==18661== by 0x5FB6AB: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F46DF: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4AA3: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB07F: PyMarshal_ReadObjectFromString (in /usr/bin/python3.6) +==18661== by 0x5FB6AB: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F46BB: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4AA3: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4697: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB07F: PyMarshal_ReadObjectFromString (in /usr/bin/python3.6) +==18661== by 0x5FB6AB: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== Address 0x607d020 is 816 bytes inside a block of size 1,184 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4B3E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB07F: PyMarshal_ReadObjectFromString (in /usr/bin/python3.6) +==18661== by 0x5FB6AB: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F46DF: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4AA3: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB07F: PyMarshal_ReadObjectFromString (in /usr/bin/python3.6) +==18661== by 0x5FB6AB: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x588D38: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB094: PyMarshal_ReadObjectFromString (in /usr/bin/python3.6) +==18661== by 0x5FB6AB: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x607e020 is 528 bytes inside a block of size 1,864 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F46BB: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4AA3: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4697: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB07F: PyMarshal_ReadObjectFromString (in /usr/bin/python3.6) +==18661== by 0x5FB6AB: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F464F: ??? (in /usr/bin/python3.6) +==18661== by 0x4F46BB: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB07F: PyMarshal_ReadObjectFromString (in /usr/bin/python3.6) +==18661== by 0x5FB6AB: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x4B1BAA: ??? (in /usr/bin/python3.6) +==18661== by 0x5734DB: ??? (in /usr/bin/python3.6) +==18661== by 0x558F3D: ??? (in /usr/bin/python3.6) +==18661== by 0x5516F4: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x515C74: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x6085020 is 208 bytes inside a block of size 576 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5734DB: ??? (in /usr/bin/python3.6) +==18661== by 0x558F3D: ??? (in /usr/bin/python3.6) +==18661== by 0x5516F4: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x515C74: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x571E42: ??? (in /usr/bin/python3.6) +==18661== by 0x572080: PyDict_Copy (in /usr/bin/python3.6) +==18661== by 0x558EB8: ??? (in /usr/bin/python3.6) +==18661== by 0x5516F4: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x515C74: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x4B1BAA: ??? (in /usr/bin/python3.6) +==18661== by 0x5734DB: ??? (in /usr/bin/python3.6) +==18661== by 0x515CBE: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x6085020 is 208 bytes inside a block of size 576 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5734DB: ??? (in /usr/bin/python3.6) +==18661== by 0x558F3D: ??? (in /usr/bin/python3.6) +==18661== by 0x5516F4: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x515C74: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x571E42: ??? (in /usr/bin/python3.6) +==18661== by 0x572080: PyDict_Copy (in /usr/bin/python3.6) +==18661== by 0x558EB8: ??? (in /usr/bin/python3.6) +==18661== by 0x5516F4: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x515C74: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5908BD: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5757: PyObject_CallFunctionObjArgs (in /usr/bin/python3.6) +==18661== by 0x50DD07: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x5908D2: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5757: PyObject_CallFunctionObjArgs (in /usr/bin/python3.6) +==18661== by 0x50DD07: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x59C6D7: PyObject_GC_Del (in /usr/bin/python3.6) +==18661== by 0x591068: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5757: PyObject_CallFunctionObjArgs (in /usr/bin/python3.6) +==18661== by 0x50DD07: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x59C6EF: PyObject_GC_Del (in /usr/bin/python3.6) +==18661== by 0x591068: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5757: PyObject_CallFunctionObjArgs (in /usr/bin/python3.6) +==18661== by 0x50DD07: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x56A118: ??? (in /usr/bin/python3.6) +==18661== by 0x56B992: ??? (in /usr/bin/python3.6) +==18661== by 0x571572: PyDict_SetItemString (in /usr/bin/python3.6) +==18661== by 0x4F1889: PyModule_AddIntConstant (in /usr/bin/python3.6) +==18661== by 0x5CFCB8: PyInit_posix (in /usr/bin/python3.6) +==18661== by 0x4FB77F: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x608e020 is 2,064 bytes inside a block of size 2,208 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x56A634: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x55FCA2: _PyObject_GenericSetAttrWithDict (in /usr/bin/python3.6) +==18661== by 0x5608AA: PyObject_SetAttr (in /usr/bin/python3.6) +==18661== by 0x566A42: PyModule_Create2 (in /usr/bin/python3.6) +==18661== by 0x5CFA26: PyInit_posix (in /usr/bin/python3.6) +==18661== by 0x4FB77F: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x55FCA2: _PyObject_GenericSetAttrWithDict (in /usr/bin/python3.6) +==18661== by 0x5608AA: PyObject_SetAttr (in /usr/bin/python3.6) +==18661== by 0x566A42: PyModule_Create2 (in /usr/bin/python3.6) +==18661== by 0x5CFA26: PyInit_posix (in /usr/bin/python3.6) +==18661== by 0x4FB77F: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x56A118: ??? (in /usr/bin/python3.6) +==18661== by 0x56B992: ??? (in /usr/bin/python3.6) +==18661== by 0x571572: PyDict_SetItemString (in /usr/bin/python3.6) +==18661== by 0x4C5518: ??? (in /usr/bin/python3.6) +==18661== by 0x5D05D3: PyInit_posix (in /usr/bin/python3.6) +==18661== by 0x4FB77F: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x6094020 is 32 bytes before a block of size 576 in arena "client" +==18661== +==18661== Invalid read of size 4 +==18661== at 0x56A118: ??? (in /usr/bin/python3.6) +==18661== by 0x56B992: ??? (in /usr/bin/python3.6) +==18661== by 0x571572: PyDict_SetItemString (in /usr/bin/python3.6) +==18661== by 0x4C54E3: ??? (in /usr/bin/python3.6) +==18661== by 0x5D05D3: PyInit_posix (in /usr/bin/python3.6) +==18661== by 0x4FB77F: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x6094020 is 32 bytes before a block of size 576 in arena "client" +==18661== +==18661== Invalid read of size 4 +==18661== at 0x56A118: ??? (in /usr/bin/python3.6) +==18661== by 0x57118E: PyDict_SetDefault (in /usr/bin/python3.6) +==18661== by 0x571506: PyDict_SetItemString (in /usr/bin/python3.6) +==18661== by 0x4C54E3: ??? (in /usr/bin/python3.6) +==18661== by 0x5D05D3: PyInit_posix (in /usr/bin/python3.6) +==18661== by 0x4FB77F: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x6069020 is 432 bytes inside a block of size 1,184 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4B3E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB07F: PyMarshal_ReadObjectFromString (in /usr/bin/python3.6) +==18661== by 0x5FB0F0: PyImport_ImportFrozenModuleObject (in /usr/bin/python3.6) +==18661== by 0x5FB19D: PyImport_ImportFrozenModule (in /usr/bin/python3.6) +==18661== by 0x638B26: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F471F: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A8D: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x5FB07F: PyMarshal_ReadObjectFromString (in /usr/bin/python3.6) +==18661== by 0x5FB0F0: PyImport_ImportFrozenModuleObject (in /usr/bin/python3.6) +==18661== by 0x5FB19D: PyImport_ImportFrozenModule (in /usr/bin/python3.6) +==18661== by 0x638B26: ??? (in /usr/bin/python3.6) +==18661== by 0x638E51: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x4FCBCEC: __wcsnlen_avx2 (strlen-avx2.S:103) +==18661== by 0x4EF9EC1: wcsrtombs (wcsrtombs.c:104) +==18661== by 0x4E7FB20: wcstombs (wcstombs.c:34) +==18661== by 0x54744F: ??? (in /usr/bin/python3.6) +==18661== by 0x6332BD: _Py_stat (in /usr/bin/python3.6) +==18661== by 0x5BA510: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a stack allocation +==18661== at 0x547640: PyUnicode_EncodeFSDefault (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x4E63408: internal_utf8_loop (loop.c:298) +==18661== by 0x4E63408: __gconv_transform_internal_utf8 (skeleton.c:609) +==18661== by 0x4EF9EF4: wcsrtombs (wcsrtombs.c:110) +==18661== by 0x4E7FB20: wcstombs (wcstombs.c:34) +==18661== by 0x54744F: ??? (in /usr/bin/python3.6) +==18661== by 0x6332BD: _Py_stat (in /usr/bin/python3.6) +==18661== by 0x5BA510: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a stack allocation +==18661== at 0x547640: PyUnicode_EncodeFSDefault (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x4E63411: internal_utf8_loop (loop.c:303) +==18661== by 0x4E63411: __gconv_transform_internal_utf8 (skeleton.c:609) +==18661== by 0x4EF9EF4: wcsrtombs (wcsrtombs.c:110) +==18661== by 0x4E7FB20: wcstombs (wcstombs.c:34) +==18661== by 0x54744F: ??? (in /usr/bin/python3.6) +==18661== by 0x6332BD: _Py_stat (in /usr/bin/python3.6) +==18661== by 0x5BA510: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a stack allocation +==18661== at 0x547640: PyUnicode_EncodeFSDefault (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x4E63458: internal_utf8_loop (loop.c:298) +==18661== by 0x4E63458: __gconv_transform_internal_utf8 (skeleton.c:609) +==18661== by 0x4EF9EF4: wcsrtombs (wcsrtombs.c:110) +==18661== by 0x4E7FB20: wcstombs (wcstombs.c:34) +==18661== by 0x54744F: ??? (in /usr/bin/python3.6) +==18661== by 0x6332BD: _Py_stat (in /usr/bin/python3.6) +==18661== by 0x5BA510: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a stack allocation +==18661== at 0x547640: PyUnicode_EncodeFSDefault (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x4FCBE77: __wcsnlen_avx2 (strlen-avx2.S:261) +==18661== by 0x4EF9EC1: wcsrtombs (wcsrtombs.c:104) +==18661== by 0x4E7FB20: wcstombs (wcstombs.c:34) +==18661== by 0x54744F: ??? (in /usr/bin/python3.6) +==18661== by 0x547730: PyUnicode_FSConverter (in /usr/bin/python3.6) +==18661== by 0x4C4EC6: ??? (in /usr/bin/python3.6) +==18661== by 0x4F81E8: ??? (in /usr/bin/python3.6) +==18661== by 0x4FBC03: ??? (in /usr/bin/python3.6) +==18661== by 0x4FC794: _PyArg_ParseStack_SizeT (in /usr/bin/python3.6) +==18661== by 0x4C65C8: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a stack allocation +==18661== at 0x547380: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5D2A1A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Address 0x60b9020 is 4 bytes after a block of size 60 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x54701E: ??? (in /usr/bin/python3.6) +==18661== by 0x5D2860: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x546DF7: ??? (in /usr/bin/python3.6) +==18661== by 0x5D2860: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5ACFAE: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x55E9B6: ??? (in /usr/bin/python3.6) +==18661== by 0x561C18: ??? (in /usr/bin/python3.6) +==18661== by 0x562418: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Address 0x60bf020 is 32 bytes before a block of size 48 in arena "client" +==18661== +==18661== Invalid read of size 4 +==18661== at 0x588D38: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x60bf020 is 32 bytes before a block of size 48 in arena "client" +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5AC347: ??? (in /usr/bin/python3.6) +==18661== by 0x5925E6: _PyBytes_Resize (in /usr/bin/python3.6) +==18661== by 0x4CA893: ??? (in /usr/bin/python3.6) +==18661== by 0x4CB996: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x5AC35F: ??? (in /usr/bin/python3.6) +==18661== by 0x5925E6: _PyBytes_Resize (in /usr/bin/python3.6) +==18661== by 0x4CA893: ??? (in /usr/bin/python3.6) +==18661== by 0x4CB996: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AB17E: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Address 0x60c4020 is 3,808 bytes inside a block of size 3,964 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5925E6: _PyBytes_Resize (in /usr/bin/python3.6) +==18661== by 0x4CA893: ??? (in /usr/bin/python3.6) +==18661== by 0x4CB996: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5928BB: PyBytes_FromStringAndSize (in /usr/bin/python3.6) +==18661== by 0x4CA843: ??? (in /usr/bin/python3.6) +==18661== by 0x4CB996: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F4D57: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x60e2020 is 400 bytes inside a block of size 848 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F46DF: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A8D: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4697: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F46BB: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A8D: ??? (in /usr/bin/python3.6) +==18661== by 0x4F46DF: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4673: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4AA3: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4673: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x60e3020 is 368 bytes inside a block of size 1,184 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F464F: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A8D: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F4D57: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5908B3: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== Address 0x60e0020 is 33,680 bytes inside a block of size 33,921 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5928BB: PyBytes_FromStringAndSize (in /usr/bin/python3.6) +==18661== by 0x50C81D: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x59C6CC: PyObject_GC_Del (in /usr/bin/python3.6) +==18661== by 0x591068: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== Address 0x60e0020 is 33,680 bytes inside a block of size 33,921 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5928BB: PyBytes_FromStringAndSize (in /usr/bin/python3.6) +==18661== by 0x50C81D: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x59C6CC: PyObject_GC_Del (in /usr/bin/python3.6) +==18661== by 0x590F44: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== Address 0x60e5020 is 304 bytes inside a block of size 528 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x59107A: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x550BF0: PyTuple_New (in /usr/bin/python3.6) +==18661== by 0x4F4625: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53FF: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Address 0x6103020 is 0 bytes after a block of size 848 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x588D38: ??? (in /usr/bin/python3.6) +==18661== by 0x4FACAA: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Address 0x6108020 is 2,656 bytes inside a block of size 3,240 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x59C6CC: PyObject_GC_Del (in /usr/bin/python3.6) +==18661== by 0x54EF03: ??? (in /usr/bin/python3.6) +==18661== by 0x590F5A: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x6103020 is 0 bytes after a block of size 848 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x590E21: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== Address 0x6109020 is 3,440 bytes inside a block of size 3,696 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x588EEA: ??? (in /usr/bin/python3.6) +==18661== by 0x4FACAA: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x5925E6: _PyBytes_Resize (in /usr/bin/python3.6) +==18661== by 0x4CA893: ??? (in /usr/bin/python3.6) +==18661== by 0x4CB996: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x611f020 is 16 bytes before a block of size 576 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A8D: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A8D: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x59C6CC: PyObject_GC_Del (in /usr/bin/python3.6) +==18661== by 0x591068: ??? (in /usr/bin/python3.6) +==18661== by 0x590F5A: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x6125020 is 5,856 bytes inside a block of size 7,849 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5928BB: PyBytes_FromStringAndSize (in /usr/bin/python3.6) +==18661== by 0x50C81D: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x56A122: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x50D084: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x56A13A: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x50D084: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x59C6D7: PyObject_GC_Del (in /usr/bin/python3.6) +==18661== by 0x590F44: ??? (in /usr/bin/python3.6) +==18661== by 0x590F5A: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x59C6EF: PyObject_GC_Del (in /usr/bin/python3.6) +==18661== by 0x590F44: ??? (in /usr/bin/python3.6) +==18661== by 0x590F5A: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5AB188: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DC3E4: ??? (in /usr/bin/python3.6) +==18661== by 0x5DC6DA: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x566F19: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x567335: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6B3F: _PyObject_CallMethodId (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x5AB1A0: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DC3E4: ??? (in /usr/bin/python3.6) +==18661== by 0x5DC6DA: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x566F19: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x567335: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6B3F: _PyObject_CallMethodId (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x56A118: ??? (in /usr/bin/python3.6) +==18661== by 0x56B992: ??? (in /usr/bin/python3.6) +==18661== by 0x571572: PyDict_SetItemString (in /usr/bin/python3.6) +==18661== by 0x4F17BF: PyModule_AddIntConstant (in /usr/bin/python3.6) +==18661== by 0x4E43A6: PyInit__locale (in /usr/bin/python3.6) +==18661== by 0x4FB77F: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x612e020 is 912 bytes inside a block of size 1,001 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5928BB: PyBytes_FromStringAndSize (in /usr/bin/python3.6) +==18661== by 0x50C81D: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x56A118: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x4CBCB7: ??? (in /usr/bin/python3.6) +==18661== by 0x5D8D99: PyInit_errno (in /usr/bin/python3.6) +==18661== by 0x4FB77F: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Address 0x615f020 is 288 bytes inside a block of size 2,208 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x56A634: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x4CBCA9: ??? (in /usr/bin/python3.6) +==18661== by 0x5D8D1B: PyInit_errno (in /usr/bin/python3.6) +==18661== by 0x4FB77F: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x4CBCA9: ??? (in /usr/bin/python3.6) +==18661== by 0x5D8994: PyInit_errno (in /usr/bin/python3.6) +==18661== by 0x4FB77F: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x56A122: ??? (in /usr/bin/python3.6) +==18661== by 0x56B992: ??? (in /usr/bin/python3.6) +==18661== by 0x571572: PyDict_SetItemString (in /usr/bin/python3.6) +==18661== by 0x4F1889: PyModule_AddIntConstant (in /usr/bin/python3.6) +==18661== by 0x5E2D2B: PyInit__stat (in /usr/bin/python3.6) +==18661== by 0x4FB77F: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x509360: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A643D: _PyObject_CallMethodIdObjArgs (in /usr/bin/python3.6) +==18661== by 0x4F70FC: PyImport_ImportModuleLevelObject (in /usr/bin/python3.6) +==18661== by 0x50E47D: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x56A13A: ??? (in /usr/bin/python3.6) +==18661== by 0x56B992: ??? (in /usr/bin/python3.6) +==18661== by 0x571572: PyDict_SetItemString (in /usr/bin/python3.6) +==18661== by 0x4F1889: PyModule_AddIntConstant (in /usr/bin/python3.6) +==18661== by 0x5E2D2B: PyInit__stat (in /usr/bin/python3.6) +==18661== by 0x4FB77F: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x509360: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A643D: _PyObject_CallMethodIdObjArgs (in /usr/bin/python3.6) +==18661== by 0x4F70FC: PyImport_ImportModuleLevelObject (in /usr/bin/python3.6) +==18661== by 0x50E47D: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x56A122: ??? (in /usr/bin/python3.6) +==18661== by 0x56B992: ??? (in /usr/bin/python3.6) +==18661== by 0x571572: PyDict_SetItemString (in /usr/bin/python3.6) +==18661== by 0x4F17BF: PyModule_AddIntConstant (in /usr/bin/python3.6) +==18661== by 0x5E2F44: PyInit__stat (in /usr/bin/python3.6) +==18661== by 0x4FB77F: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x509360: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A643D: _PyObject_CallMethodIdObjArgs (in /usr/bin/python3.6) +==18661== by 0x4F70FC: PyImport_ImportModuleLevelObject (in /usr/bin/python3.6) +==18661== by 0x50E47D: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x56A13A: ??? (in /usr/bin/python3.6) +==18661== by 0x56B992: ??? (in /usr/bin/python3.6) +==18661== by 0x571572: PyDict_SetItemString (in /usr/bin/python3.6) +==18661== by 0x4F17BF: PyModule_AddIntConstant (in /usr/bin/python3.6) +==18661== by 0x5E2F44: PyInit__stat (in /usr/bin/python3.6) +==18661== by 0x4FB77F: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x509360: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A643D: _PyObject_CallMethodIdObjArgs (in /usr/bin/python3.6) +==18661== by 0x4F70FC: PyImport_ImportModuleLevelObject (in /usr/bin/python3.6) +==18661== by 0x50E47D: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x56A118: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x50FFB4: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Address 0x6168020 is 368 bytes inside a block of size 576 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x56A634: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x50D084: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x50D084: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x59C6CC: PyObject_GC_Del (in /usr/bin/python3.6) +==18661== by 0x59107A: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== Address 0x6166020 is 1,568 bytes inside a block of size 3,872 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5928BB: PyBytes_FromStringAndSize (in /usr/bin/python3.6) +==18661== by 0x50C81D: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x56A118: ??? (in /usr/bin/python3.6) +==18661== by 0x57118E: PyDict_SetDefault (in /usr/bin/python3.6) +==18661== by 0x528059: PyUnicode_InternInPlace (in /usr/bin/python3.6) +==18661== by 0x4F45A5: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4673: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4AA3: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Address 0x6095020 is 32 bytes before a block of size 73,760 in arena "client" +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x58AD4F: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Address 0x615d020 is 1,552 bytes inside a block of size 2,832 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x588EEA: ??? (in /usr/bin/python3.6) +==18661== by 0x4FACAA: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53FF: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x50D3AF: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== Address 0x61a6020 is 800 bytes inside a block of size 848 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x50D3AF: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x50D3AF: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x588D38: ??? (in /usr/bin/python3.6) +==18661== by 0x50AAB7: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Address 0x61a7020 is 208 bytes inside a block of size 1,608 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x50D3AF: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x50D3AF: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F4D57: ??? (in /usr/bin/python3.6) +==18661== by 0x4F46DF: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x61bf020 is 576 bytes inside a block of size 704 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4B3E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F46DF: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4B3E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F471F: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x59C6CC: PyObject_GC_Del (in /usr/bin/python3.6) +==18661== by 0x590F44: ??? (in /usr/bin/python3.6) +==18661== by 0x590F5A: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x6140020 is 832 bytes inside a block of size 1,608 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x588EEA: ??? (in /usr/bin/python3.6) +==18661== by 0x4FACAA: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F46FF: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F46DF: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Address 0x61e5020 is 448 bytes inside a block of size 848 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F464F: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4AA3: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F46BB: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A8D: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x56A118: ??? (in /usr/bin/python3.6) +==18661== by 0x56B992: ??? (in /usr/bin/python3.6) +==18661== by 0x50CFD7: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Address 0x6205020 is 208 bytes inside a block of size 1,112 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x56A634: ??? (in /usr/bin/python3.6) +==18661== by 0x56B992: ??? (in /usr/bin/python3.6) +==18661== by 0x50CFD7: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x56B992: ??? (in /usr/bin/python3.6) +==18661== by 0x50CFD7: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x4B1BAA: ??? (in /usr/bin/python3.6) +==18661== by 0x5734DB: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Address 0x6209020 is 8,432 bytes inside a block of size 9,248 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x56A634: ??? (in /usr/bin/python3.6) +==18661== by 0x56B992: ??? (in /usr/bin/python3.6) +==18661== by 0x50CFD7: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x56B992: ??? (in /usr/bin/python3.6) +==18661== by 0x50CFD7: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5D2A24: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x4F1B9B5: __alloc_dir (opendir.c:216) +==18661== by 0x4F1B9B5: opendir_tail (opendir.c:136) +==18661== by 0x4F1B9B5: opendir (opendir.c:190) +==18661== by 0x5D26F1: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x5D2A3C: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x4F1B9B5: __alloc_dir (opendir.c:216) +==18661== by 0x4F1B9B5: opendir_tail (opendir.c:136) +==18661== by 0x4F1B9B5: opendir (opendir.c:190) +==18661== by 0x5D26F1: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5D2A1A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Address 0x621f020 is 512 bytes inside a block of size 576 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5D2D22: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5D2DC9: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x588D38: ??? (in /usr/bin/python3.6) +==18661== by 0x5105B7: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x621f020 is 512 bytes inside a block of size 576 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5D2D22: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5D2DC9: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5AC347: ??? (in /usr/bin/python3.6) +==18661== by 0x5925E6: _PyBytes_Resize (in /usr/bin/python3.6) +==18661== by 0x5DCF63: ??? (in /usr/bin/python3.6) +==18661== by 0x566EA0: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A656D: PyObject_CallMethodObjArgs (in /usr/bin/python3.6) +==18661== by 0x5BD4F5: ??? (in /usr/bin/python3.6) +==18661== by 0x4BBEB9: ??? (in /usr/bin/python3.6) +==18661== by 0x4BC31C: ??? (in /usr/bin/python3.6) +==18661== by 0x4B5EFE: ??? (in /usr/bin/python3.6) +==18661== by 0x50C7A2: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DF10D: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x5AC35F: ??? (in /usr/bin/python3.6) +==18661== by 0x5925E6: _PyBytes_Resize (in /usr/bin/python3.6) +==18661== by 0x5DCF63: ??? (in /usr/bin/python3.6) +==18661== by 0x566EA0: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A656D: PyObject_CallMethodObjArgs (in /usr/bin/python3.6) +==18661== by 0x5BD4F5: ??? (in /usr/bin/python3.6) +==18661== by 0x4BBEB9: ??? (in /usr/bin/python3.6) +==18661== by 0x4BC31C: ??? (in /usr/bin/python3.6) +==18661== by 0x4B5EFE: ??? (in /usr/bin/python3.6) +==18661== by 0x50C7A2: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DF10D: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AB17E: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x5BD63C: ??? (in /usr/bin/python3.6) +==18661== by 0x4BBEB9: ??? (in /usr/bin/python3.6) +==18661== by 0x4BC31C: ??? (in /usr/bin/python3.6) +==18661== by 0x4B5EFE: ??? (in /usr/bin/python3.6) +==18661== by 0x50C7A2: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Address 0x6222020 is 4,352 bytes inside a block of size 8,225 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5925E6: _PyBytes_Resize (in /usr/bin/python3.6) +==18661== by 0x5DCF63: ??? (in /usr/bin/python3.6) +==18661== by 0x566EA0: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A656D: PyObject_CallMethodObjArgs (in /usr/bin/python3.6) +==18661== by 0x5BD4F5: ??? (in /usr/bin/python3.6) +==18661== by 0x4BBEB9: ??? (in /usr/bin/python3.6) +==18661== by 0x4BC31C: ??? (in /usr/bin/python3.6) +==18661== by 0x4B5EFE: ??? (in /usr/bin/python3.6) +==18661== by 0x50C7A2: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5928BB: PyBytes_FromStringAndSize (in /usr/bin/python3.6) +==18661== by 0x5DCEE7: ??? (in /usr/bin/python3.6) +==18661== by 0x566EA0: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A656D: PyObject_CallMethodObjArgs (in /usr/bin/python3.6) +==18661== by 0x5BD4F5: ??? (in /usr/bin/python3.6) +==18661== by 0x4BBEB9: ??? (in /usr/bin/python3.6) +==18661== by 0x4BC31C: ??? (in /usr/bin/python3.6) +==18661== by 0x4B5EFE: ??? (in /usr/bin/python3.6) +==18661== by 0x50C7A2: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5ACFAE: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x5DD8A4: ??? (in /usr/bin/python3.6) +==18661== by 0x566FB9: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A684D: _PyObject_CallMethodId_SizeT (in /usr/bin/python3.6) +==18661== by 0x5BC215: ??? (in /usr/bin/python3.6) +==18661== by 0x566FB9: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A656D: PyObject_CallMethodObjArgs (in /usr/bin/python3.6) +==18661== by 0x566E11: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5757: PyObject_CallFunctionObjArgs (in /usr/bin/python3.6) +==18661== Address 0x621f020 is 512 bytes inside a block of size 576 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5D2D22: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5D2DC9: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x5925E6: _PyBytes_Resize (in /usr/bin/python3.6) +==18661== by 0x5DCF63: ??? (in /usr/bin/python3.6) +==18661== by 0x566EA0: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A656D: PyObject_CallMethodObjArgs (in /usr/bin/python3.6) +==18661== by 0x5BD4F5: ??? (in /usr/bin/python3.6) +==18661== by 0x4BBEB9: ??? (in /usr/bin/python3.6) +==18661== by 0x4BC31C: ??? (in /usr/bin/python3.6) +==18661== by 0x4B5EFE: ??? (in /usr/bin/python3.6) +==18661== by 0x50C7A2: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Address 0x6230020 is 7,104 bytes inside a block of size 8,225 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5925E6: _PyBytes_Resize (in /usr/bin/python3.6) +==18661== by 0x5DCF63: ??? (in /usr/bin/python3.6) +==18661== by 0x566EA0: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A656D: PyObject_CallMethodObjArgs (in /usr/bin/python3.6) +==18661== by 0x5BD4F5: ??? (in /usr/bin/python3.6) +==18661== by 0x4BBEB9: ??? (in /usr/bin/python3.6) +==18661== by 0x4BC31C: ??? (in /usr/bin/python3.6) +==18661== by 0x4B5EFE: ??? (in /usr/bin/python3.6) +==18661== by 0x50C7A2: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5928BB: PyBytes_FromStringAndSize (in /usr/bin/python3.6) +==18661== by 0x5DCEE7: ??? (in /usr/bin/python3.6) +==18661== by 0x566EA0: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A656D: PyObject_CallMethodObjArgs (in /usr/bin/python3.6) +==18661== by 0x5BD4F5: ??? (in /usr/bin/python3.6) +==18661== by 0x4BBEB9: ??? (in /usr/bin/python3.6) +==18661== by 0x4BC31C: ??? (in /usr/bin/python3.6) +==18661== by 0x4B5EFE: ??? (in /usr/bin/python3.6) +==18661== by 0x50C7A2: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5AC347: ??? (in /usr/bin/python3.6) +==18661== by 0x62FD50: PyTokenizer_FromUTF8 (in /usr/bin/python3.6) +==18661== by 0x5AA172: PyParser_ParseStringObject (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x62FC0A: PyTokenizer_FromUTF8 (in /usr/bin/python3.6) +==18661== by 0x5AA172: PyParser_ParseStringObject (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x5AC35F: ??? (in /usr/bin/python3.6) +==18661== by 0x62FD50: PyTokenizer_FromUTF8 (in /usr/bin/python3.6) +==18661== by 0x5AA172: PyParser_ParseStringObject (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x62FC0A: PyTokenizer_FromUTF8 (in /usr/bin/python3.6) +==18661== by 0x5AA172: PyParser_ParseStringObject (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x4B1BB3: ??? (in /usr/bin/python3.6) +==18661== by 0x59E440: PyGrammar_AddAccelerators (in /usr/bin/python3.6) +==18661== by 0x5A98CE: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x62FC0A: PyTokenizer_FromUTF8 (in /usr/bin/python3.6) +==18661== by 0x5AA172: PyParser_ParseStringObject (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x4B1BCB: ??? (in /usr/bin/python3.6) +==18661== by 0x59E440: PyGrammar_AddAccelerators (in /usr/bin/python3.6) +==18661== by 0x5A98CE: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x62FC0A: PyTokenizer_FromUTF8 (in /usr/bin/python3.6) +==18661== by 0x5AA172: PyParser_ParseStringObject (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x4B1BAA: ??? (in /usr/bin/python3.6) +==18661== by 0x59E440: PyGrammar_AddAccelerators (in /usr/bin/python3.6) +==18661== by 0x5A98CE: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Address 0x6239020 is 320 bytes inside a block of size 704 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x59E440: PyGrammar_AddAccelerators (in /usr/bin/python3.6) +==18661== by 0x5A98CE: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x59DF12: PyGrammar_AddAccelerators (in /usr/bin/python3.6) +==18661== by 0x5A98CE: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== +==18661== More than 100 errors detected. Subsequent errors +==18661== will still be recorded, but in less detail than before. +==18661== Invalid read of size 4 +==18661== at 0x5ACFAE: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x5A9523: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Address 0x6291020 is 560 bytes inside a block of size 704 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x59E440: PyGrammar_AddAccelerators (in /usr/bin/python3.6) +==18661== by 0x5A98CE: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x59DF12: PyGrammar_AddAccelerators (in /usr/bin/python3.6) +==18661== by 0x5A98CE: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5ACFB8: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x59FBAD: PyTokenizer_Free (in /usr/bin/python3.6) +==18661== by 0x5A9543: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x62FC0A: PyTokenizer_FromUTF8 (in /usr/bin/python3.6) +==18661== by 0x5AA172: PyParser_ParseStringObject (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x5ACFD0: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x59FBAD: PyTokenizer_Free (in /usr/bin/python3.6) +==18661== by 0x5A9543: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x62FC0A: PyTokenizer_FromUTF8 (in /usr/bin/python3.6) +==18661== by 0x5AA172: PyParser_ParseStringObject (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5ACFB8: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x5A9543: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x4EF8A5: PyArena_New (in /usr/bin/python3.6) +==18661== by 0x635259: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x5ACFD0: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x5A9543: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x4EF8A5: PyArena_New (in /usr/bin/python3.6) +==18661== by 0x635259: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x59D93C: ??? (in /usr/bin/python3.6) +==18661== by 0x59D9C2: ??? (in /usr/bin/python3.6) +==18661== by 0x59DA0B: ??? (in /usr/bin/python3.6) +==18661== by 0x59D9C2: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2246: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x629a020 is 35,216 bytes inside a block of size 36,032 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A9523: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5A90D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x4FDE30: ??? (in /usr/bin/python3.6) +==18661== by 0x5029FF: ??? (in /usr/bin/python3.6) +==18661== by 0x5031C8: ??? (in /usr/bin/python3.6) +==18661== by 0x505FE7: ??? (in /usr/bin/python3.6) +==18661== by 0x5075EA: PyAST_CompileObject (in /usr/bin/python3.6) +==18661== by 0x635298: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Address 0x629a020 is 35,216 bytes inside a block of size 36,032 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A9523: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5A90D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5ACFB8: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x4EFEA9: PyCode_Optimize (in /usr/bin/python3.6) +==18661== by 0x4FFC2E: ??? (in /usr/bin/python3.6) +==18661== by 0x5075FF: PyAST_CompileObject (in /usr/bin/python3.6) +==18661== by 0x635298: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x4EFA5E: PyCode_Optimize (in /usr/bin/python3.6) +==18661== by 0x4FFC2E: ??? (in /usr/bin/python3.6) +==18661== by 0x5075FF: PyAST_CompileObject (in /usr/bin/python3.6) +==18661== by 0x635298: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x5ACFD0: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x4EFEA9: PyCode_Optimize (in /usr/bin/python3.6) +==18661== by 0x4FFC2E: ??? (in /usr/bin/python3.6) +==18661== by 0x5075FF: PyAST_CompileObject (in /usr/bin/python3.6) +==18661== by 0x635298: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x4EFA5E: PyCode_Optimize (in /usr/bin/python3.6) +==18661== by 0x4FFC2E: ??? (in /usr/bin/python3.6) +==18661== by 0x5075FF: PyAST_CompileObject (in /usr/bin/python3.6) +==18661== by 0x635298: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AB17E: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x506289: ??? (in /usr/bin/python3.6) +==18661== by 0x4FD175: ??? (in /usr/bin/python3.6) +==18661== by 0x50760A: PyAST_CompileObject (in /usr/bin/python3.6) +==18661== by 0x635298: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Address 0x629a020 is 35,216 bytes inside a block of size 36,032 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A9523: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5A90D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x59C6CC: PyObject_GC_Del (in /usr/bin/python3.6) +==18661== by 0x5A3BDE: ??? (in /usr/bin/python3.6) +==18661== by 0x5A4BD4: ??? (in /usr/bin/python3.6) +==18661== by 0x550BF0: PyTuple_New (in /usr/bin/python3.6) +==18661== by 0x4F4625: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== Address 0x62a4020 is 304 bytes inside a block of size 1,384 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x588EEA: ??? (in /usr/bin/python3.6) +==18661== by 0x4FACAA: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53FF: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x5479AC: ??? (in /usr/bin/python3.6) +==18661== by 0x53E68A: PyUnicode_DecodeUTF8Stateful (in /usr/bin/python3.6) +==18661== by 0x4F4EC2: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4673: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Address 0x6307020 is 1,392 bytes inside a block of size 4,768 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x52E2BD: _PyUnicodeWriter_PrepareInternal (in /usr/bin/python3.6) +==18661== by 0x52F35E: ??? (in /usr/bin/python3.6) +==18661== by 0x53E601: PyUnicode_DecodeUTF8Stateful (in /usr/bin/python3.6) +==18661== by 0x4F4EC2: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4673: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x544B0E: PyUnicode_New (in /usr/bin/python3.6) +==18661== by 0x53E1C7: PyUnicode_DecodeUTF8Stateful (in /usr/bin/python3.6) +==18661== by 0x4F4EC2: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4673: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x4B1BAA: ??? (in /usr/bin/python3.6) +==18661== by 0x5687E8: ??? (in /usr/bin/python3.6) +==18661== by 0x5A3BCD: ??? (in /usr/bin/python3.6) +==18661== by 0x551DD7: PyType_GenericAlloc (in /usr/bin/python3.6) +==18661== by 0x553D56: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x5D439B: PyInit_itertools (in /usr/bin/python3.6) +==18661== by 0x4FB77F: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Address 0x62f5020 is 704 bytes inside a block of size 1,008 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A3BDE: ??? (in /usr/bin/python3.6) +==18661== by 0x551DD7: PyType_GenericAlloc (in /usr/bin/python3.6) +==18661== by 0x553D56: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x5D439B: PyInit_itertools (in /usr/bin/python3.6) +==18661== by 0x4FB77F: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x551C4B: PyType_GenericAlloc (in /usr/bin/python3.6) +==18661== by 0x558330: ??? (in /usr/bin/python3.6) +==18661== by 0x5516F4: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x515C74: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5908B3: ??? (in /usr/bin/python3.6) +==18661== by 0x590F5A: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== Address 0x62e2020 is 1,104 bytes inside a block of size 1,608 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4B3E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F471F: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4AA3: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5ACFB8: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x5A9523: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5A90D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x5ACFD0: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x5A9523: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5A90D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x518164: ??? (in /usr/bin/python3.6) +==18661== by 0x51CA29: ??? (in /usr/bin/python3.6) +==18661== by 0x51E927: ??? (in /usr/bin/python3.6) +==18661== by 0x51CD70: ??? (in /usr/bin/python3.6) +==18661== by 0x519705: ??? (in /usr/bin/python3.6) +==18661== by 0x51AE72: ??? (in /usr/bin/python3.6) +==18661== by 0x5192FF: ??? (in /usr/bin/python3.6) +==18661== by 0x51AE72: ??? (in /usr/bin/python3.6) +==18661== by 0x601B5B: ??? (in /usr/bin/python3.6) +==18661== by 0x51B4EF: PyAST_FromNodeObject (in /usr/bin/python3.6) +==18661== by 0x5B223B: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== Address 0x6347020 is 80 bytes inside a block of size 576 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x5171B6: ??? (in /usr/bin/python3.6) +==18661== by 0x51CCC3: ??? (in /usr/bin/python3.6) +==18661== by 0x51D50F: ??? (in /usr/bin/python3.6) +==18661== by 0x51E927: ??? (in /usr/bin/python3.6) +==18661== by 0x51CD70: ??? (in /usr/bin/python3.6) +==18661== by 0x519BE0: ??? (in /usr/bin/python3.6) +==18661== by 0x51AE72: ??? (in /usr/bin/python3.6) +==18661== by 0x519817: ??? (in /usr/bin/python3.6) +==18661== by 0x51AE72: ??? (in /usr/bin/python3.6) +==18661== by 0x5192FF: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x5171B6: ??? (in /usr/bin/python3.6) +==18661== by 0x51CCC3: ??? (in /usr/bin/python3.6) +==18661== by 0x519648: ??? (in /usr/bin/python3.6) +==18661== by 0x51AE72: ??? (in /usr/bin/python3.6) +==18661== by 0x5192FF: ??? (in /usr/bin/python3.6) +==18661== by 0x51AE72: ??? (in /usr/bin/python3.6) +==18661== by 0x601B5B: ??? (in /usr/bin/python3.6) +==18661== by 0x51B4EF: PyAST_FromNodeObject (in /usr/bin/python3.6) +==18661== by 0x5B223B: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x4B1BB3: ??? (in /usr/bin/python3.6) +==18661== by 0x5734DB: ??? (in /usr/bin/python3.6) +==18661== by 0x5B0EB1: ??? (in /usr/bin/python3.6) +==18661== by 0x5B10D5: ??? (in /usr/bin/python3.6) +==18661== by 0x5B1D72: PySymtable_BuildObject (in /usr/bin/python3.6) +==18661== by 0x507589: PyAST_CompileObject (in /usr/bin/python3.6) +==18661== by 0x635298: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x4ED273: PyArena_Malloc (in /usr/bin/python3.6) +==18661== by 0x519B57: ??? (in /usr/bin/python3.6) +==18661== by 0x51AE72: ??? (in /usr/bin/python3.6) +==18661== by 0x601B5B: ??? (in /usr/bin/python3.6) +==18661== by 0x51B4EF: PyAST_FromNodeObject (in /usr/bin/python3.6) +==18661== by 0x5B223B: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x4B1BCB: ??? (in /usr/bin/python3.6) +==18661== by 0x5734DB: ??? (in /usr/bin/python3.6) +==18661== by 0x5B0EB1: ??? (in /usr/bin/python3.6) +==18661== by 0x5B10D5: ??? (in /usr/bin/python3.6) +==18661== by 0x5B1D72: PySymtable_BuildObject (in /usr/bin/python3.6) +==18661== by 0x507589: PyAST_CompileObject (in /usr/bin/python3.6) +==18661== by 0x635298: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x4ED273: PyArena_Malloc (in /usr/bin/python3.6) +==18661== by 0x519B57: ??? (in /usr/bin/python3.6) +==18661== by 0x51AE72: ??? (in /usr/bin/python3.6) +==18661== by 0x601B5B: ??? (in /usr/bin/python3.6) +==18661== by 0x51B4EF: PyAST_FromNodeObject (in /usr/bin/python3.6) +==18661== by 0x5B223B: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5ACFAE: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x4EFEA9: PyCode_Optimize (in /usr/bin/python3.6) +==18661== by 0x4FFC2E: ??? (in /usr/bin/python3.6) +==18661== by 0x50556C: ??? (in /usr/bin/python3.6) +==18661== by 0x505FE7: ??? (in /usr/bin/python3.6) +==18661== by 0x5038D3: ??? (in /usr/bin/python3.6) +==18661== by 0x50600A: ??? (in /usr/bin/python3.6) +==18661== by 0x5075EA: PyAST_CompileObject (in /usr/bin/python3.6) +==18661== by 0x635298: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x634a020 is 48 bytes inside a block of size 576 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5734DB: ??? (in /usr/bin/python3.6) +==18661== by 0x5B0EB1: ??? (in /usr/bin/python3.6) +==18661== by 0x5B10D5: ??? (in /usr/bin/python3.6) +==18661== by 0x5B1D72: PySymtable_BuildObject (in /usr/bin/python3.6) +==18661== by 0x507589: PyAST_CompileObject (in /usr/bin/python3.6) +==18661== by 0x635298: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x5B08D7: ??? (in /usr/bin/python3.6) +==18661== by 0x5B10D5: ??? (in /usr/bin/python3.6) +==18661== by 0x5B1D72: PySymtable_BuildObject (in /usr/bin/python3.6) +==18661== by 0x507589: PyAST_CompileObject (in /usr/bin/python3.6) +==18661== by 0x635298: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AB17E: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x506227: ??? (in /usr/bin/python3.6) +==18661== by 0x4FD175: ??? (in /usr/bin/python3.6) +==18661== by 0x50760A: PyAST_CompileObject (in /usr/bin/python3.6) +==18661== by 0x635298: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x634a020 is 48 bytes inside a block of size 576 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5734DB: ??? (in /usr/bin/python3.6) +==18661== by 0x5B0EB1: ??? (in /usr/bin/python3.6) +==18661== by 0x5B10D5: ??? (in /usr/bin/python3.6) +==18661== by 0x5B1D72: PySymtable_BuildObject (in /usr/bin/python3.6) +==18661== by 0x507589: PyAST_CompileObject (in /usr/bin/python3.6) +==18661== by 0x635298: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x5B08D7: ??? (in /usr/bin/python3.6) +==18661== by 0x5B10D5: ??? (in /usr/bin/python3.6) +==18661== by 0x5B1D72: PySymtable_BuildObject (in /usr/bin/python3.6) +==18661== by 0x507589: PyAST_CompileObject (in /usr/bin/python3.6) +==18661== by 0x635298: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5ACFAE: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x4ECA27: PyArena_Free (in /usr/bin/python3.6) +==18661== by 0x6352F8: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== Address 0x633a020 is 960 bytes inside a block of size 2,026 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x547884: ??? (in /usr/bin/python3.6) +==18661== by 0x52C2E7: _PyUnicodeWriter_Finish (in /usr/bin/python3.6) +==18661== by 0x52AFD4: ??? (in /usr/bin/python3.6) +==18661== by 0x52BBE5: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x547884: ??? (in /usr/bin/python3.6) +==18661== by 0x52E1F7: _PyUnicodeWriter_PrepareInternal (in /usr/bin/python3.6) +==18661== by 0x52B3C0: ??? (in /usr/bin/python3.6) +==18661== by 0x52BBE5: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5ACFAE: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x4ECA38: PyArena_Free (in /usr/bin/python3.6) +==18661== by 0x6352F8: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== Address 0x6347020 is 80 bytes inside a block of size 576 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x5171B6: ??? (in /usr/bin/python3.6) +==18661== by 0x51CCC3: ??? (in /usr/bin/python3.6) +==18661== by 0x51D50F: ??? (in /usr/bin/python3.6) +==18661== by 0x51E927: ??? (in /usr/bin/python3.6) +==18661== by 0x51CD70: ??? (in /usr/bin/python3.6) +==18661== by 0x519BE0: ??? (in /usr/bin/python3.6) +==18661== by 0x51AE72: ??? (in /usr/bin/python3.6) +==18661== by 0x519817: ??? (in /usr/bin/python3.6) +==18661== by 0x51AE72: ??? (in /usr/bin/python3.6) +==18661== by 0x5192FF: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x5171B6: ??? (in /usr/bin/python3.6) +==18661== by 0x51CCC3: ??? (in /usr/bin/python3.6) +==18661== by 0x519648: ??? (in /usr/bin/python3.6) +==18661== by 0x51AE72: ??? (in /usr/bin/python3.6) +==18661== by 0x5192FF: ??? (in /usr/bin/python3.6) +==18661== by 0x51AE72: ??? (in /usr/bin/python3.6) +==18661== by 0x601B5B: ??? (in /usr/bin/python3.6) +==18661== by 0x51B4EF: PyAST_FromNodeObject (in /usr/bin/python3.6) +==18661== by 0x5B223B: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x588D38: ??? (in /usr/bin/python3.6) +==18661== by 0x4ECA84: PyArena_Free (in /usr/bin/python3.6) +==18661== by 0x6352F8: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== Address 0x6347020 is 80 bytes inside a block of size 576 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x5171B6: ??? (in /usr/bin/python3.6) +==18661== by 0x51CCC3: ??? (in /usr/bin/python3.6) +==18661== by 0x51D50F: ??? (in /usr/bin/python3.6) +==18661== by 0x51E927: ??? (in /usr/bin/python3.6) +==18661== by 0x51CD70: ??? (in /usr/bin/python3.6) +==18661== by 0x519BE0: ??? (in /usr/bin/python3.6) +==18661== by 0x51AE72: ??? (in /usr/bin/python3.6) +==18661== by 0x519817: ??? (in /usr/bin/python3.6) +==18661== by 0x51AE72: ??? (in /usr/bin/python3.6) +==18661== by 0x5192FF: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x5171B6: ??? (in /usr/bin/python3.6) +==18661== by 0x51CCC3: ??? (in /usr/bin/python3.6) +==18661== by 0x519648: ??? (in /usr/bin/python3.6) +==18661== by 0x51AE72: ??? (in /usr/bin/python3.6) +==18661== by 0x5192FF: ??? (in /usr/bin/python3.6) +==18661== by 0x51AE72: ??? (in /usr/bin/python3.6) +==18661== by 0x601B5B: ??? (in /usr/bin/python3.6) +==18661== by 0x51B4EF: PyAST_FromNodeObject (in /usr/bin/python3.6) +==18661== by 0x5B223B: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5442C8: ??? (in /usr/bin/python3.6) +==18661== by 0x57341F: ??? (in /usr/bin/python3.6) +==18661== by 0x50A416: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Address 0x6235020 is 6,480 bytes inside a block of size 8,225 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5925E6: _PyBytes_Resize (in /usr/bin/python3.6) +==18661== by 0x5DCF63: ??? (in /usr/bin/python3.6) +==18661== by 0x566EA0: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A656D: PyObject_CallMethodObjArgs (in /usr/bin/python3.6) +==18661== by 0x5BD4F5: ??? (in /usr/bin/python3.6) +==18661== by 0x4BBEB9: ??? (in /usr/bin/python3.6) +==18661== by 0x4BC31C: ??? (in /usr/bin/python3.6) +==18661== by 0x4B5EFE: ??? (in /usr/bin/python3.6) +==18661== by 0x50C7A2: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5928BB: PyBytes_FromStringAndSize (in /usr/bin/python3.6) +==18661== by 0x5DCEE7: ??? (in /usr/bin/python3.6) +==18661== by 0x566EA0: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A656D: PyObject_CallMethodObjArgs (in /usr/bin/python3.6) +==18661== by 0x5BD4F5: ??? (in /usr/bin/python3.6) +==18661== by 0x4BBEB9: ??? (in /usr/bin/python3.6) +==18661== by 0x4BC31C: ??? (in /usr/bin/python3.6) +==18661== by 0x4B5EFE: ??? (in /usr/bin/python3.6) +==18661== by 0x50C7A2: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5442C8: ??? (in /usr/bin/python3.6) +==18661== by 0x56B905: ??? (in /usr/bin/python3.6) +==18661== by 0x58A75A: PyFrame_FastToLocalsWithError (in /usr/bin/python3.6) +==18661== by 0x5FF999: PyEval_GetLocals (in /usr/bin/python3.6) +==18661== by 0x51695F: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Address 0x63a9020 is 608 bytes inside a block of size 1,753 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5BD63C: ??? (in /usr/bin/python3.6) +==18661== by 0x4BBEB9: ??? (in /usr/bin/python3.6) +==18661== by 0x4BC31C: ??? (in /usr/bin/python3.6) +==18661== by 0x4B5EFE: ??? (in /usr/bin/python3.6) +==18661== by 0x50C7A2: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5925E6: _PyBytes_Resize (in /usr/bin/python3.6) +==18661== by 0x5DCF63: ??? (in /usr/bin/python3.6) +==18661== by 0x566EA0: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A656D: PyObject_CallMethodObjArgs (in /usr/bin/python3.6) +==18661== by 0x5BD4F5: ??? (in /usr/bin/python3.6) +==18661== by 0x4BBEB9: ??? (in /usr/bin/python3.6) +==18661== by 0x4BC31C: ??? (in /usr/bin/python3.6) +==18661== by 0x4B5EFE: ??? (in /usr/bin/python3.6) +==18661== by 0x50C7A2: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x4B8785: PyParser_AddToken (in /usr/bin/python3.6) +==18661== by 0x5A91E2: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5A90D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x4B879A: PyParser_AddToken (in /usr/bin/python3.6) +==18661== by 0x5A91E2: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5A90D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5442C8: ??? (in /usr/bin/python3.6) +==18661== by 0x4BC080: ??? (in /usr/bin/python3.6) +==18661== by 0x4BC31C: ??? (in /usr/bin/python3.6) +==18661== by 0x4B5EFE: ??? (in /usr/bin/python3.6) +==18661== by 0x50C7A2: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x63a9020 is 608 bytes inside a block of size 1,753 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5BD63C: ??? (in /usr/bin/python3.6) +==18661== by 0x4BBEB9: ??? (in /usr/bin/python3.6) +==18661== by 0x4BC31C: ??? (in /usr/bin/python3.6) +==18661== by 0x4B5EFE: ??? (in /usr/bin/python3.6) +==18661== by 0x50C7A2: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5925E6: _PyBytes_Resize (in /usr/bin/python3.6) +==18661== by 0x5DCF63: ??? (in /usr/bin/python3.6) +==18661== by 0x566EA0: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A656D: PyObject_CallMethodObjArgs (in /usr/bin/python3.6) +==18661== by 0x5BD4F5: ??? (in /usr/bin/python3.6) +==18661== by 0x4BBEB9: ??? (in /usr/bin/python3.6) +==18661== by 0x4BC31C: ??? (in /usr/bin/python3.6) +==18661== by 0x4B5EFE: ??? (in /usr/bin/python3.6) +==18661== by 0x50C7A2: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5443E6: ??? (in /usr/bin/python3.6) +==18661== by 0x52E2BD: _PyUnicodeWriter_PrepareInternal (in /usr/bin/python3.6) +==18661== by 0x52F35E: ??? (in /usr/bin/python3.6) +==18661== by 0x53E601: PyUnicode_DecodeUTF8Stateful (in /usr/bin/python3.6) +==18661== by 0x4F4EC2: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Address 0x642f020 is 544 bytes inside a block of size 1,184 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F4D57: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F4D57: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5ACFB8: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x59FBC3: PyTokenizer_Free (in /usr/bin/python3.6) +==18661== by 0x5A9543: ??? (in /usr/bin/python3.6) +==18661== by 0x634FDC: PyParser_ASTFromFileObject (in /usr/bin/python3.6) +==18661== by 0x635102: PyRun_FileExFlags (in /usr/bin/python3.6) +==18661== by 0x6388EE: PyRun_SimpleFileExFlags (in /usr/bin/python3.6) +==18661== by 0x639490: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x4EF8A5: PyArena_New (in /usr/bin/python3.6) +==18661== by 0x6350D7: PyRun_FileExFlags (in /usr/bin/python3.6) +==18661== by 0x6388EE: PyRun_SimpleFileExFlags (in /usr/bin/python3.6) +==18661== by 0x639490: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x5ACFD0: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x59FBC3: PyTokenizer_Free (in /usr/bin/python3.6) +==18661== by 0x5A9543: ??? (in /usr/bin/python3.6) +==18661== by 0x634FDC: PyParser_ASTFromFileObject (in /usr/bin/python3.6) +==18661== by 0x635102: PyRun_FileExFlags (in /usr/bin/python3.6) +==18661== by 0x6388EE: PyRun_SimpleFileExFlags (in /usr/bin/python3.6) +==18661== by 0x639490: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x4EF8A5: PyArena_New (in /usr/bin/python3.6) +==18661== by 0x6350D7: PyRun_FileExFlags (in /usr/bin/python3.6) +==18661== by 0x6388EE: PyRun_SimpleFileExFlags (in /usr/bin/python3.6) +==18661== by 0x639490: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AB17E: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x50624A: ??? (in /usr/bin/python3.6) +==18661== by 0x4FD175: ??? (in /usr/bin/python3.6) +==18661== by 0x50760A: PyAST_CompileObject (in /usr/bin/python3.6) +==18661== by 0x635067: ??? (in /usr/bin/python3.6) +==18661== by 0x635136: PyRun_FileExFlags (in /usr/bin/python3.6) +==18661== by 0x6388EE: PyRun_SimpleFileExFlags (in /usr/bin/python3.6) +==18661== by 0x639490: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Address 0x6ea2020 is 1,568 bytes inside a block of size 2,048 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x4EFEA9: PyCode_Optimize (in /usr/bin/python3.6) +==18661== by 0x4FFC2E: ??? (in /usr/bin/python3.6) +==18661== by 0x503931: ??? (in /usr/bin/python3.6) +==18661== by 0x50602D: ??? (in /usr/bin/python3.6) +==18661== by 0x5075EA: PyAST_CompileObject (in /usr/bin/python3.6) +==18661== by 0x635067: ??? (in /usr/bin/python3.6) +==18661== by 0x635136: PyRun_FileExFlags (in /usr/bin/python3.6) +==18661== by 0x6388EE: PyRun_SimpleFileExFlags (in /usr/bin/python3.6) +==18661== by 0x639490: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x4EFA5E: PyCode_Optimize (in /usr/bin/python3.6) +==18661== by 0x4FFC2E: ??? (in /usr/bin/python3.6) +==18661== by 0x503931: ??? (in /usr/bin/python3.6) +==18661== by 0x50602D: ??? (in /usr/bin/python3.6) +==18661== by 0x5075EA: PyAST_CompileObject (in /usr/bin/python3.6) +==18661== by 0x635067: ??? (in /usr/bin/python3.6) +==18661== by 0x635136: PyRun_FileExFlags (in /usr/bin/python3.6) +==18661== by 0x6388EE: PyRun_SimpleFileExFlags (in /usr/bin/python3.6) +==18661== by 0x639490: Py_Main (in /usr/bin/python3.6) +==18661== by 0x4B0F5F: main (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x56A118: ??? (in /usr/bin/python3.6) +==18661== by 0x571E42: ??? (in /usr/bin/python3.6) +==18661== by 0x572405: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x6f39020 is 176 bytes inside a block of size 576 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53FF: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F464F: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A8D: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x588D38: ??? (in /usr/bin/python3.6) +==18661== by 0x5132CE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Address 0x6f42020 is 80 bytes inside a block of size 576 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5734DB: ??? (in /usr/bin/python3.6) +==18661== by 0x515CBE: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x50D084: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x515C35: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5AC347: ??? (in /usr/bin/python3.6) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x50A487: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x5AC35F: ??? (in /usr/bin/python3.6) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x50A487: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5AC347: ??? (in /usr/bin/python3.6) +==18661== by 0x579324: ??? (in /usr/bin/python3.6) +==18661== by 0x50A8EB: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x5AC35F: ??? (in /usr/bin/python3.6) +==18661== by 0x579324: ??? (in /usr/bin/python3.6) +==18661== by 0x50A8EB: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x588D43: ??? (in /usr/bin/python3.6) +==18661== by 0x508536: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x588D5B: ??? (in /usr/bin/python3.6) +==18661== by 0x508536: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5AC347: ??? (in /usr/bin/python3.6) +==18661== by 0x4B8CC1: PyParser_AddToken (in /usr/bin/python3.6) +==18661== by 0x5A91E2: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5A90D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x5AC35F: ??? (in /usr/bin/python3.6) +==18661== by 0x4B8CC1: PyParser_AddToken (in /usr/bin/python3.6) +==18661== by 0x5A91E2: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5A90D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AB17E: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x506203: ??? (in /usr/bin/python3.6) +==18661== by 0x4FD175: ??? (in /usr/bin/python3.6) +==18661== by 0x50393C: ??? (in /usr/bin/python3.6) +==18661== by 0x50600A: ??? (in /usr/bin/python3.6) +==18661== by 0x5075EA: PyAST_CompileObject (in /usr/bin/python3.6) +==18661== by 0x635298: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Address 0x6f71020 is 384 bytes inside a block of size 2,048 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x4EFEA9: PyCode_Optimize (in /usr/bin/python3.6) +==18661== by 0x4FFC2E: ??? (in /usr/bin/python3.6) +==18661== by 0x50556C: ??? (in /usr/bin/python3.6) +==18661== by 0x50608E: ??? (in /usr/bin/python3.6) +==18661== by 0x5038D3: ??? (in /usr/bin/python3.6) +==18661== by 0x50600A: ??? (in /usr/bin/python3.6) +==18661== by 0x5075EA: PyAST_CompileObject (in /usr/bin/python3.6) +==18661== by 0x635298: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x4EFA5E: PyCode_Optimize (in /usr/bin/python3.6) +==18661== by 0x4FFC2E: ??? (in /usr/bin/python3.6) +==18661== by 0x50556C: ??? (in /usr/bin/python3.6) +==18661== by 0x50608E: ??? (in /usr/bin/python3.6) +==18661== by 0x5038D3: ??? (in /usr/bin/python3.6) +==18661== by 0x50600A: ??? (in /usr/bin/python3.6) +==18661== by 0x5075EA: PyAST_CompileObject (in /usr/bin/python3.6) +==18661== by 0x635298: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5AB188: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x506227: ??? (in /usr/bin/python3.6) +==18661== by 0x4FD175: ??? (in /usr/bin/python3.6) +==18661== by 0x50760A: PyAST_CompileObject (in /usr/bin/python3.6) +==18661== by 0x635298: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x51DB17: ??? (in /usr/bin/python3.6) +==18661== by 0x51EA04: ??? (in /usr/bin/python3.6) +==18661== by 0x51CD70: ??? (in /usr/bin/python3.6) +==18661== by 0x519B39: ??? (in /usr/bin/python3.6) +==18661== by 0x51AE72: ??? (in /usr/bin/python3.6) +==18661== by 0x601B5B: ??? (in /usr/bin/python3.6) +==18661== by 0x51B4EF: PyAST_FromNodeObject (in /usr/bin/python3.6) +==18661== by 0x5B223B: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x5AB1A0: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x506227: ??? (in /usr/bin/python3.6) +==18661== by 0x4FD175: ??? (in /usr/bin/python3.6) +==18661== by 0x50760A: PyAST_CompileObject (in /usr/bin/python3.6) +==18661== by 0x635298: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x51DB17: ??? (in /usr/bin/python3.6) +==18661== by 0x51EA04: ??? (in /usr/bin/python3.6) +==18661== by 0x51CD70: ??? (in /usr/bin/python3.6) +==18661== by 0x519B39: ??? (in /usr/bin/python3.6) +==18661== by 0x51AE72: ??? (in /usr/bin/python3.6) +==18661== by 0x601B5B: ??? (in /usr/bin/python3.6) +==18661== by 0x51B4EF: PyAST_FromNodeObject (in /usr/bin/python3.6) +==18661== by 0x5B223B: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x4B1BAA: ??? (in /usr/bin/python3.6) +==18661== by 0x55E48B: ??? (in /usr/bin/python3.6) +==18661== by 0x51236F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Address 0x6f74020 is 192 bytes inside a block of size 576 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5734DB: ??? (in /usr/bin/python3.6) +==18661== by 0x515CBE: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x6352CE: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x50D084: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x515C35: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x6352CE: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5442C8: ??? (in /usr/bin/python3.6) +==18661== by 0x510D5A: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Address 0x6f75020 is 384 bytes inside a block of size 2,048 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x55E48B: ??? (in /usr/bin/python3.6) +==18661== by 0x51236F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x55E83D: ??? (in /usr/bin/python3.6) +==18661== by 0x56186C: ??? (in /usr/bin/python3.6) +==18661== by 0x50A8EB: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x547884: ??? (in /usr/bin/python3.6) +==18661== by 0x549170: ??? (in /usr/bin/python3.6) +==18661== by 0x537CD2: PyUnicode_Append (in /usr/bin/python3.6) +==18661== by 0x507837: ??? (in /usr/bin/python3.6) +==18661== by 0x510B0C: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== Address 0x6f75020 is 384 bytes inside a block of size 2,048 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x55E48B: ??? (in /usr/bin/python3.6) +==18661== by 0x51236F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x55E83D: ??? (in /usr/bin/python3.6) +==18661== by 0x56186C: ??? (in /usr/bin/python3.6) +==18661== by 0x50A8EB: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5ACFAE: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x59FBAD: PyTokenizer_Free (in /usr/bin/python3.6) +==18661== by 0x5A9543: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x6f87020 is 576 bytes inside a block of size 1,733 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x62FD50: PyTokenizer_FromUTF8 (in /usr/bin/python3.6) +==18661== by 0x5AA172: PyParser_ParseStringObject (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x62FCE5: PyTokenizer_FromUTF8 (in /usr/bin/python3.6) +==18661== by 0x5AA172: PyParser_ParseStringObject (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5AC347: ??? (in /usr/bin/python3.6) +==18661== by 0x518164: ??? (in /usr/bin/python3.6) +==18661== by 0x51929B: ??? (in /usr/bin/python3.6) +==18661== by 0x51AE72: ??? (in /usr/bin/python3.6) +==18661== by 0x601B5B: ??? (in /usr/bin/python3.6) +==18661== by 0x51B4EF: PyAST_FromNodeObject (in /usr/bin/python3.6) +==18661== by 0x5B223B: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x4B937E: PyParser_AddToken (in /usr/bin/python3.6) +==18661== by 0x5A91E2: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x5AC35F: ??? (in /usr/bin/python3.6) +==18661== by 0x518164: ??? (in /usr/bin/python3.6) +==18661== by 0x51929B: ??? (in /usr/bin/python3.6) +==18661== by 0x51AE72: ??? (in /usr/bin/python3.6) +==18661== by 0x601B5B: ??? (in /usr/bin/python3.6) +==18661== by 0x51B4EF: PyAST_FromNodeObject (in /usr/bin/python3.6) +==18661== by 0x5B223B: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x4B937E: PyParser_AddToken (in /usr/bin/python3.6) +==18661== by 0x5A91E2: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AB17E: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x5116E8: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x7126020 is 640 bytes inside a block of size 2,895 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5928BB: PyBytes_FromStringAndSize (in /usr/bin/python3.6) +==18661== by 0x50C81D: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x4B1BAA: ??? (in /usr/bin/python3.6) +==18661== by 0x59A92A: ??? (in /usr/bin/python3.6) +==18661== by 0x5105B7: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Address 0x7136020 is 61,984 bytes inside a block of size 65,313 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5116E8: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ACC1A: PyObject_Malloc (in /usr/bin/python3.6) +==18661== by 0x629EC6: ??? (in /usr/bin/python3.6) +==18661== by 0x50D6FD: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x588D38: ??? (in /usr/bin/python3.6) +==18661== by 0x5120CD: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x7157020 is 496 bytes inside a block of size 513 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x592387: PyByteArray_Resize (in /usr/bin/python3.6) +==18661== by 0x62A92A: ??? (in /usr/bin/python3.6) +==18661== by 0x50D4F2: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x592387: PyByteArray_Resize (in /usr/bin/python3.6) +==18661== by 0x62A92A: ??? (in /usr/bin/python3.6) +==18661== by 0x50D4F2: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x588D38: ??? (in /usr/bin/python3.6) +==18661== by 0x508536: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Address 0x7157020 is 496 bytes inside a block of size 513 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x592387: PyByteArray_Resize (in /usr/bin/python3.6) +==18661== by 0x62A92A: ??? (in /usr/bin/python3.6) +==18661== by 0x50D4F2: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x592387: PyByteArray_Resize (in /usr/bin/python3.6) +==18661== by 0x62A92A: ??? (in /usr/bin/python3.6) +==18661== by 0x50D4F2: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x579324: ??? (in /usr/bin/python3.6) +==18661== by 0x50A8EB: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Address 0x7158020 is 16 bytes after a block of size 848 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x588EEA: ??? (in /usr/bin/python3.6) +==18661== by 0x508536: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x579114: ??? (in /usr/bin/python3.6) +==18661== by 0x583FA8: ??? (in /usr/bin/python3.6) +==18661== by 0x5844B3: ??? (in /usr/bin/python3.6) +==18661== by 0x50CFD7: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x588D43: ??? (in /usr/bin/python3.6) +==18661== by 0x5132CE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x58AD4F: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x588D5B: ??? (in /usr/bin/python3.6) +==18661== by 0x5132CE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x58AD4F: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x588D38: ??? (in /usr/bin/python3.6) +==18661== by 0x5761DD: ??? (in /usr/bin/python3.6) +==18661== by 0x50C7A2: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Address 0x788d020 is 16 bytes before a block of size 928 alloc'd +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x551C4B: PyType_GenericAlloc (in /usr/bin/python3.6) +==18661== by 0x558330: ??? (in /usr/bin/python3.6) +==18661== by 0x5516F4: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x515C74: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x4D94C6: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== Address 0x78d4020 is 496 bytes inside a block of size 1,114 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x4D9830: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x4D41D4: ??? (in /usr/bin/python3.6) +==18661== by 0x4D6EA3: ??? (in /usr/bin/python3.6) +==18661== by 0x4D912E: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x4D957A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== Address 0x78d4020 is 496 bytes inside a block of size 1,114 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x4D9830: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x4D41D4: ??? (in /usr/bin/python3.6) +==18661== by 0x4D6EA3: ??? (in /usr/bin/python3.6) +==18661== by 0x4D912E: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x4D94CF: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x4D9801: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x4D94E8: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x4D9801: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x4D9585: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x4D9801: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x4D959D: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x4D9801: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5AC347: ??? (in /usr/bin/python3.6) +==18661== by 0x547884: ??? (in /usr/bin/python3.6) +==18661== by 0x52C2E7: _PyUnicodeWriter_Finish (in /usr/bin/python3.6) +==18661== by 0x52AFD4: ??? (in /usr/bin/python3.6) +==18661== by 0x52BBE5: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18662== Warning: invalid file descriptor 1024 in syscall close() +==18662== Warning: invalid file descriptor 1025 in syscall close() +==18662== Warning: invalid file descriptor 1026 in syscall close() +==18662== Warning: invalid file descriptor 1027 in syscall close() +==18662== Use --log-fd= to select an alternative log fd. +==18662== Warning: invalid file descriptor 1028 in syscall close() +==18662== Warning: invalid file descriptor 1029 in syscall close() +==18661== Invalid read of size 4 +==18661== at 0x5AB17E: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x508536: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== Address 0x7bf6020 is 46,576 bytes inside a block of size 50,033 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5925E6: _PyBytes_Resize (in /usr/bin/python3.6) +==18661== by 0x4C4E0A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5928BB: PyBytes_FromStringAndSize (in /usr/bin/python3.6) +==18661== by 0x4C4DD2: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5ACFAE: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x5E8FCD: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Address 0x7c55020 is 8 bytes after a block of size 520 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x50A487: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AB17E: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x4D3FC6: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x94f2020 is 32 bytes before a block of size 87,264 in arena "client" +==18661== +==18661== Invalid read of size 4 +==18661== at 0x59D93C: ??? (in /usr/bin/python3.6) +==18661== by 0x59D9E4: ??? (in /usr/bin/python3.6) +==18661== by 0x59DA0B: ??? (in /usr/bin/python3.6) +==18661== by 0x59D9C2: ??? (in /usr/bin/python3.6) +==18661== by 0x59D9C2: ??? (in /usr/bin/python3.6) +==18661== by 0x59DA0B: ??? (in /usr/bin/python3.6) +==18661== by 0x59D9C2: ??? (in /usr/bin/python3.6) +==18661== by 0x59D9C2: ??? (in /usr/bin/python3.6) +==18661== by 0x59D9C2: ??? (in /usr/bin/python3.6) +==18661== by 0x59DA0B: ??? (in /usr/bin/python3.6) +==18661== by 0x59D9C2: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2246: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== Address 0x95bc020 is 33,408 bytes inside a block of size 36,032 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A9523: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5A90D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5442C8: ??? (in /usr/bin/python3.6) +==18661== by 0x5686BA: PyDict_Clear (in /usr/bin/python3.6) +==18661== by 0x54FFA1: ??? (in /usr/bin/python3.6) +==18661== by 0x5A3BCD: ??? (in /usr/bin/python3.6) +==18661== by 0x5A7242: _PyObject_GC_New (in /usr/bin/python3.6) +==18661== by 0x56C369: PyDict_New (in /usr/bin/python3.6) +==18661== by 0x553C7F: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0xADDB18E: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x56667A: PyModule_ExecDef (in /usr/bin/python3.6) +==18661== by 0x4FB883: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x967a020 is 624 bytes inside a block of size 848 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4673: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A8D: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4AA3: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5908B3: ??? (in /usr/bin/python3.6) +==18661== by 0x589947: ??? (in /usr/bin/python3.6) +==18661== by 0x576744: ??? (in /usr/bin/python3.6) +==18661== by 0x5686BA: PyDict_Clear (in /usr/bin/python3.6) +==18661== by 0x54FFA1: ??? (in /usr/bin/python3.6) +==18661== by 0x5A3BCD: ??? (in /usr/bin/python3.6) +==18661== by 0x5A7242: _PyObject_GC_New (in /usr/bin/python3.6) +==18661== by 0x56C369: PyDict_New (in /usr/bin/python3.6) +==18661== by 0x553C7F: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0xADDB18E: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x56667A: PyModule_ExecDef (in /usr/bin/python3.6) +==18661== by 0x4FB883: ??? (in /usr/bin/python3.6) +==18661== Address 0x967a020 is 624 bytes inside a block of size 848 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4673: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A8D: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4AA3: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x4B1BAA: ??? (in /usr/bin/python3.6) +==18661== by 0x54FFA1: ??? (in /usr/bin/python3.6) +==18661== by 0x5A3BCD: ??? (in /usr/bin/python3.6) +==18661== by 0x5A7242: _PyObject_GC_New (in /usr/bin/python3.6) +==18661== by 0x56C369: PyDict_New (in /usr/bin/python3.6) +==18661== by 0x553C7F: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0xADDB18E: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x56667A: PyModule_ExecDef (in /usr/bin/python3.6) +==18661== by 0x4FB883: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Address 0x967f020 is 304 bytes inside a block of size 1,112 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5734DB: ??? (in /usr/bin/python3.6) +==18661== by 0x515CBE: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x50D084: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x515C35: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5442C8: ??? (in /usr/bin/python3.6) +==18661== by 0x5899B6: ??? (in /usr/bin/python3.6) +==18661== by 0x5686BA: PyDict_Clear (in /usr/bin/python3.6) +==18661== by 0x54FFA1: ??? (in /usr/bin/python3.6) +==18661== by 0x5A3C2C: ??? (in /usr/bin/python3.6) +==18661== by 0x5A7242: _PyObject_GC_New (in /usr/bin/python3.6) +==18661== by 0x56C369: PyDict_New (in /usr/bin/python3.6) +==18661== by 0x553C7F: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0xADDB18E: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x56667A: PyModule_ExecDef (in /usr/bin/python3.6) +==18661== by 0x4FB883: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== Address 0x967e020 is 1,888 bytes inside a block of size 2,472 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x588EEA: ??? (in /usr/bin/python3.6) +==18661== by 0x4FACAA: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4B3E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x59C6CC: PyObject_GC_Del (in /usr/bin/python3.6) +==18661== by 0x54EECA: ??? (in /usr/bin/python3.6) +==18661== by 0x55037D: ??? (in /usr/bin/python3.6) +==18661== by 0x5A3C3F: ??? (in /usr/bin/python3.6) +==18661== by 0x5A7242: _PyObject_GC_New (in /usr/bin/python3.6) +==18661== by 0x56C369: PyDict_New (in /usr/bin/python3.6) +==18661== by 0x553C7F: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0xADDB18E: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x56667A: PyModule_ExecDef (in /usr/bin/python3.6) +==18661== by 0x4FB883: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x9680020 is 880 bytes inside a block of size 1,112 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5734DB: ??? (in /usr/bin/python3.6) +==18661== by 0x558F3D: ??? (in /usr/bin/python3.6) +==18661== by 0x5516F4: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x515C74: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x571E42: ??? (in /usr/bin/python3.6) +==18661== by 0x572080: PyDict_Copy (in /usr/bin/python3.6) +==18661== by 0x558EB8: ??? (in /usr/bin/python3.6) +==18661== by 0x5516F4: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x515C74: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x59C6CC: PyObject_GC_Del (in /usr/bin/python3.6) +==18661== by 0x5A3C3F: ??? (in /usr/bin/python3.6) +==18661== by 0x5A7242: _PyObject_GC_New (in /usr/bin/python3.6) +==18661== by 0x56C369: PyDict_New (in /usr/bin/python3.6) +==18661== by 0x553C7F: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0xADDB18E: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x56667A: PyModule_ExecDef (in /usr/bin/python3.6) +==18661== by 0x4FB883: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Address 0x9686020 is 1,920 bytes inside a block of size 2,208 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x54FFA1: ??? (in /usr/bin/python3.6) +==18661== by 0x5A3C2C: ??? (in /usr/bin/python3.6) +==18661== by 0x5A7242: _PyObject_GC_New (in /usr/bin/python3.6) +==18661== by 0x56C369: PyDict_New (in /usr/bin/python3.6) +==18661== by 0x553C7F: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0xADDB18E: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x56667A: PyModule_ExecDef (in /usr/bin/python3.6) +==18661== by 0x4FB883: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x571E42: ??? (in /usr/bin/python3.6) +==18661== by 0x572080: PyDict_Copy (in /usr/bin/python3.6) +==18661== by 0x5582AC: ??? (in /usr/bin/python3.6) +==18661== by 0x5516F4: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x515C74: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x59C6CC: PyObject_GC_Del (in /usr/bin/python3.6) +==18661== by 0x54F4B3: ??? (in /usr/bin/python3.6) +==18661== by 0x54F3AF: ??? (in /usr/bin/python3.6) +==18661== by 0x5686BA: PyDict_Clear (in /usr/bin/python3.6) +==18661== by 0x54FFA1: ??? (in /usr/bin/python3.6) +==18661== by 0x5A3C82: ??? (in /usr/bin/python3.6) +==18661== by 0x5A7242: _PyObject_GC_New (in /usr/bin/python3.6) +==18661== by 0x56C369: PyDict_New (in /usr/bin/python3.6) +==18661== by 0x553C7F: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0xADDB18E: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x56667A: PyModule_ExecDef (in /usr/bin/python3.6) +==18661== by 0x4FB883: ??? (in /usr/bin/python3.6) +==18661== Address 0x967f020 is 304 bytes inside a block of size 1,112 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5734DB: ??? (in /usr/bin/python3.6) +==18661== by 0x515CBE: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x50D084: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x515C35: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x59C6CC: PyObject_GC_Del (in /usr/bin/python3.6) +==18661== by 0x5A3C94: ??? (in /usr/bin/python3.6) +==18661== by 0x5A7242: _PyObject_GC_New (in /usr/bin/python3.6) +==18661== by 0x56C369: PyDict_New (in /usr/bin/python3.6) +==18661== by 0x553C7F: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0xADDB18E: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x56667A: PyModule_ExecDef (in /usr/bin/python3.6) +==18661== by 0x4FB883: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Address 0x9687020 is 32 bytes inside a block of size 608 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x590F44: ??? (in /usr/bin/python3.6) +==18661== by 0x589947: ??? (in /usr/bin/python3.6) +==18661== by 0x576744: ??? (in /usr/bin/python3.6) +==18661== by 0x5686BA: PyDict_Clear (in /usr/bin/python3.6) +==18661== by 0x54FFA1: ??? (in /usr/bin/python3.6) +==18661== by 0x5A3C2C: ??? (in /usr/bin/python3.6) +==18661== by 0x5A7242: _PyObject_GC_New (in /usr/bin/python3.6) +==18661== by 0x56C369: PyDict_New (in /usr/bin/python3.6) +==18661== by 0x553C7F: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0xADDB18E: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x56667A: PyModule_ExecDef (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x549F21: ??? (in /usr/bin/python3.6) +==18661== by 0x5516F4: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x588D43: ??? (in /usr/bin/python3.6) +==18661== by 0x4FACAA: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x544B0E: PyUnicode_New (in /usr/bin/python3.6) +==18661== by 0x54603C: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4581: ??? (in /usr/bin/python3.6) +==18661== by 0x4F464F: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x588D38: ??? (in /usr/bin/python3.6) +==18661== by 0x51129B: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Address 0x98c7020 is 16 bytes after a block of size 1,328 in arena "client" +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5442C8: ??? (in /usr/bin/python3.6) +==18661== by 0x50AAB7: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Address 0x2002d020 is 784 bytes inside a block of size 855 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x50AAB7: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x544B0E: PyUnicode_New (in /usr/bin/python3.6) +==18661== by 0x535CA1: PyUnicode_Substring (in /usr/bin/python3.6) +==18661== by 0x5369D2: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5442C8: ??? (in /usr/bin/python3.6) +==18661== by 0x54EECA: ??? (in /usr/bin/python3.6) +==18661== by 0x50AAB7: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x20032020 is 32 bytes before a block of size 1,168 in arena "client" +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x588D43: ??? (in /usr/bin/python3.6) +==18661== by 0x536F09: ??? (in /usr/bin/python3.6) +==18661== by 0x50A8EB: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x579114: ??? (in /usr/bin/python3.6) +==18661== by 0x588894: ??? (in /usr/bin/python3.6) +==18661== by 0x5A75DA: PySequence_List (in /usr/bin/python3.6) +==18661== by 0x536F27: ??? (in /usr/bin/python3.6) +==18661== by 0x50A8EB: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x588D5B: ??? (in /usr/bin/python3.6) +==18661== by 0x536F09: ??? (in /usr/bin/python3.6) +==18661== by 0x50A8EB: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x579114: ??? (in /usr/bin/python3.6) +==18661== by 0x588894: ??? (in /usr/bin/python3.6) +==18661== by 0x5A75DA: PySequence_List (in /usr/bin/python3.6) +==18661== by 0x536F27: ??? (in /usr/bin/python3.6) +==18661== by 0x50A8EB: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x588D38: ??? (in /usr/bin/python3.6) +==18661== by 0x536F09: ??? (in /usr/bin/python3.6) +==18661== by 0x50A8EB: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x20041020 is 0 bytes inside a block of size 1 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x588EEA: ??? (in /usr/bin/python3.6) +==18661== by 0x536F09: ??? (in /usr/bin/python3.6) +==18661== by 0x50A8EB: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x579114: ??? (in /usr/bin/python3.6) +==18661== by 0x588894: ??? (in /usr/bin/python3.6) +==18661== by 0x5A75DA: PySequence_List (in /usr/bin/python3.6) +==18661== by 0x536F27: ??? (in /usr/bin/python3.6) +==18661== by 0x50A8EB: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5442C8: ??? (in /usr/bin/python3.6) +==18661== by 0x590F5A: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== Address 0x20016020 is 608 bytes inside a block of size 2,472 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4B3E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x588924: ??? (in /usr/bin/python3.6) +==18661== by 0x588AD8: ??? (in /usr/bin/python3.6) +==18661== by 0x50D4F2: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x20044020 is 0 bytes after a block of size 576 alloc'd +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x50D084: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x4D94C6: ??? (in /usr/bin/python3.6) +==18661== by 0x566F19: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A6BC3: _PyObject_CallMethodId (in /usr/bin/python3.6) +==18661== by 0x610DA6: ??? (in /usr/bin/python3.6) +==18661== by 0x612039: ??? (in /usr/bin/python3.6) +==18661== by 0x61235D: ??? (in /usr/bin/python3.6) +==18661== by 0x61243A: ??? (in /usr/bin/python3.6) +==18661== by 0x6124A1: PyErr_WarnEx (in /usr/bin/python3.6) +==18661== by 0x2138954D: __Pyx_ImportType.constprop.87 (mtrand.c:43193) +==18661== by 0x2138BCC6: __Pyx_modinit_type_init_code (mtrand.c:39418) +==18661== by 0x2138BCC6: __pyx_pymod_exec_mtrand (mtrand.c:39681) +==18661== by 0x56667A: PyModule_ExecDef (in /usr/bin/python3.6) +==18661== Address 0x21004020 is 304 bytes inside a block of size 1,114 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x4D9830: ??? (in /usr/bin/python3.6) +==18661== by 0x566F19: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A6BC3: _PyObject_CallMethodId (in /usr/bin/python3.6) +==18661== by 0x610DA6: ??? (in /usr/bin/python3.6) +==18661== by 0x612016: ??? (in /usr/bin/python3.6) +==18661== by 0x61235D: ??? (in /usr/bin/python3.6) +==18661== by 0x61243A: ??? (in /usr/bin/python3.6) +==18661== by 0x6124A1: PyErr_WarnEx (in /usr/bin/python3.6) +==18661== by 0x2138954D: __Pyx_ImportType.constprop.87 (mtrand.c:43193) +==18661== by 0x2138BCC6: __Pyx_modinit_type_init_code (mtrand.c:39418) +==18661== by 0x2138BCC6: __pyx_pymod_exec_mtrand (mtrand.c:39681) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x4D41D4: ??? (in /usr/bin/python3.6) +==18661== by 0x4D6EA3: ??? (in /usr/bin/python3.6) +==18661== by 0x4D912E: ??? (in /usr/bin/python3.6) +==18661== by 0x566F19: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A6BC3: _PyObject_CallMethodId (in /usr/bin/python3.6) +==18661== by 0x610DA6: ??? (in /usr/bin/python3.6) +==18661== by 0x612016: ??? (in /usr/bin/python3.6) +==18661== by 0x61235D: ??? (in /usr/bin/python3.6) +==18661== by 0x61243A: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x4D957A: ??? (in /usr/bin/python3.6) +==18661== by 0x566F19: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A6BC3: _PyObject_CallMethodId (in /usr/bin/python3.6) +==18661== by 0x610DA6: ??? (in /usr/bin/python3.6) +==18661== by 0x612039: ??? (in /usr/bin/python3.6) +==18661== by 0x61235D: ??? (in /usr/bin/python3.6) +==18661== by 0x61243A: ??? (in /usr/bin/python3.6) +==18661== by 0x6124A1: PyErr_WarnEx (in /usr/bin/python3.6) +==18661== by 0x2138954D: __Pyx_ImportType.constprop.87 (mtrand.c:43193) +==18661== by 0x2138BCC6: __Pyx_modinit_type_init_code (mtrand.c:39418) +==18661== by 0x2138BCC6: __pyx_pymod_exec_mtrand (mtrand.c:39681) +==18661== by 0x56667A: PyModule_ExecDef (in /usr/bin/python3.6) +==18661== Address 0x21004020 is 304 bytes inside a block of size 1,114 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x4D9830: ??? (in /usr/bin/python3.6) +==18661== by 0x566F19: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A6BC3: _PyObject_CallMethodId (in /usr/bin/python3.6) +==18661== by 0x610DA6: ??? (in /usr/bin/python3.6) +==18661== by 0x612016: ??? (in /usr/bin/python3.6) +==18661== by 0x61235D: ??? (in /usr/bin/python3.6) +==18661== by 0x61243A: ??? (in /usr/bin/python3.6) +==18661== by 0x6124A1: PyErr_WarnEx (in /usr/bin/python3.6) +==18661== by 0x2138954D: __Pyx_ImportType.constprop.87 (mtrand.c:43193) +==18661== by 0x2138BCC6: __Pyx_modinit_type_init_code (mtrand.c:39418) +==18661== by 0x2138BCC6: __pyx_pymod_exec_mtrand (mtrand.c:39681) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x4D41D4: ??? (in /usr/bin/python3.6) +==18661== by 0x4D6EA3: ??? (in /usr/bin/python3.6) +==18661== by 0x4D912E: ??? (in /usr/bin/python3.6) +==18661== by 0x566F19: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A6BC3: _PyObject_CallMethodId (in /usr/bin/python3.6) +==18661== by 0x610DA6: ??? (in /usr/bin/python3.6) +==18661== by 0x612016: ??? (in /usr/bin/python3.6) +==18661== by 0x61235D: ??? (in /usr/bin/python3.6) +==18661== by 0x61243A: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5442C8: ??? (in /usr/bin/python3.6) +==18661== by 0x547DFC: PyUnicode_FromFormatV (in /usr/bin/python3.6) +==18661== by 0x5490E8: PyUnicode_FromFormat (in /usr/bin/python3.6) +==18661== by 0xC0C5868: ufunc_get_doc (ufunc_object.c:5862) +==18661== by 0x4B2778: ??? (in /usr/bin/python3.6) +==18661== by 0x55DCFC: PyObject_GetAttr (in /usr/bin/python3.6) +==18661== by 0x50C46C: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== Address 0x60e2020 is 400 bytes inside an unallocated block of size 848 in arena "client" +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5442C8: ??? (in /usr/bin/python3.6) +==18661== by 0xC0C589A: PyUnicode_ConcatAndDel (npy_3kcompat.h:155) +==18661== by 0xC0C589A: ufunc_get_doc (ufunc_object.c:5862) +==18661== by 0x4B2778: ??? (in /usr/bin/python3.6) +==18661== by 0x55DCFC: PyObject_GetAttr (in /usr/bin/python3.6) +==18661== by 0x50C46C: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== Address 0x60c5020 is 7,904 bytes inside an unallocated block of size 8,000 in arena "client" +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5442D1: ??? (in /usr/bin/python3.6) +==18661== by 0xC0C589A: PyUnicode_ConcatAndDel (npy_3kcompat.h:155) +==18661== by 0xC0C589A: ufunc_get_doc (ufunc_object.c:5862) +==18661== by 0x4B2778: ??? (in /usr/bin/python3.6) +==18661== by 0x55DCFC: PyObject_GetAttr (in /usr/bin/python3.6) +==18661== by 0x50C46C: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DC3E4: ??? (in /usr/bin/python3.6) +==18661== by 0x5DC6DA: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x566F19: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x567335: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6B3F: _PyObject_CallMethodId (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x5442E9: ??? (in /usr/bin/python3.6) +==18661== by 0xC0C589A: PyUnicode_ConcatAndDel (npy_3kcompat.h:155) +==18661== by 0xC0C589A: ufunc_get_doc (ufunc_object.c:5862) +==18661== by 0x4B2778: ??? (in /usr/bin/python3.6) +==18661== by 0x55DCFC: PyObject_GetAttr (in /usr/bin/python3.6) +==18661== by 0x50C46C: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DC3E4: ??? (in /usr/bin/python3.6) +==18661== by 0x5DC6DA: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x566F19: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x567335: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6B3F: _PyObject_CallMethodId (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5442C8: ??? (in /usr/bin/python3.6) +==18661== by 0x573540: ??? (in /usr/bin/python3.6) +==18661== by 0x54F1A1: ??? (in /usr/bin/python3.6) +==18661== by 0x56EB95: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x50D084: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Address 0x6112020 is 720 bytes inside a block of size 1,744 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0xC0C589A: PyUnicode_ConcatAndDel (npy_3kcompat.h:155) +==18661== by 0xC0C589A: ufunc_get_doc (ufunc_object.c:5862) +==18661== by 0x4B2778: ??? (in /usr/bin/python3.6) +==18661== by 0x55DCFC: PyObject_GetAttr (in /usr/bin/python3.6) +==18661== by 0x50C46C: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x547884: ??? (in /usr/bin/python3.6) +==18661== by 0x52E1F7: _PyUnicodeWriter_PrepareInternal (in /usr/bin/python3.6) +==18661== by 0x52E63F: _PyUnicodeWriter_WriteStr (in /usr/bin/python3.6) +==18661== by 0x547DE9: PyUnicode_FromFormatV (in /usr/bin/python3.6) +==18661== by 0x5490E8: PyUnicode_FromFormat (in /usr/bin/python3.6) +==18661== by 0xC0C5868: ufunc_get_doc (ufunc_object.c:5862) +==18661== by 0x4B2778: ??? (in /usr/bin/python3.6) +==18661== by 0x55DCFC: PyObject_GetAttr (in /usr/bin/python3.6) +==18661== by 0x50C46C: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5442D1: ??? (in /usr/bin/python3.6) +==18661== by 0x547DFC: PyUnicode_FromFormatV (in /usr/bin/python3.6) +==18661== by 0x5490E8: PyUnicode_FromFormat (in /usr/bin/python3.6) +==18661== by 0xC0C5868: ufunc_get_doc (ufunc_object.c:5862) +==18661== by 0x4B2778: ??? (in /usr/bin/python3.6) +==18661== by 0x55DCFC: PyObject_GetAttr (in /usr/bin/python3.6) +==18661== by 0x50C46C: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DC3E4: ??? (in /usr/bin/python3.6) +==18661== by 0x5DC6DA: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x566F19: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x567335: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6B3F: _PyObject_CallMethodId (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x5442E9: ??? (in /usr/bin/python3.6) +==18661== by 0x547DFC: PyUnicode_FromFormatV (in /usr/bin/python3.6) +==18661== by 0x5490E8: PyUnicode_FromFormat (in /usr/bin/python3.6) +==18661== by 0xC0C5868: ufunc_get_doc (ufunc_object.c:5862) +==18661== by 0x4B2778: ??? (in /usr/bin/python3.6) +==18661== by 0x55DCFC: PyObject_GetAttr (in /usr/bin/python3.6) +==18661== by 0x50C46C: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DC3E4: ??? (in /usr/bin/python3.6) +==18661== by 0x5DC6DA: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x566F19: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x567335: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6B3F: _PyObject_CallMethodId (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5ACFAE: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x4D4C4B: ??? (in /usr/bin/python3.6) +==18661== by 0x4DAC41: ??? (in /usr/bin/python3.6) +==18661== by 0x5E4679: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== Address 0x6157020 is 880 bytes inside a block of size 1,592 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x591068: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x550BF0: PyTuple_New (in /usr/bin/python3.6) +==18661== by 0x4F4625: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5ACFAE: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x4D4C64: ??? (in /usr/bin/python3.6) +==18661== by 0x4DAC41: ??? (in /usr/bin/python3.6) +==18661== by 0x5E4679: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== Address 0x60e2020 is 400 bytes inside an unallocated block of size 848 in arena "client" +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5ACFAE: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x5E78AE: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Address 0x6109020 is 1,760 bytes inside a block of size 1,910 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x547DFC: PyUnicode_FromFormatV (in /usr/bin/python3.6) +==18661== by 0x5490E8: PyUnicode_FromFormat (in /usr/bin/python3.6) +==18661== by 0xC0C5868: ufunc_get_doc (ufunc_object.c:5862) +==18661== by 0x4B2778: ??? (in /usr/bin/python3.6) +==18661== by 0x55DCFC: PyObject_GetAttr (in /usr/bin/python3.6) +==18661== by 0x50C46C: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x544B0E: PyUnicode_New (in /usr/bin/python3.6) +==18661== by 0x53E1C7: PyUnicode_DecodeUTF8Stateful (in /usr/bin/python3.6) +==18661== by 0x547DB9: PyUnicode_FromFormatV (in /usr/bin/python3.6) +==18661== by 0x5490E8: PyUnicode_FromFormat (in /usr/bin/python3.6) +==18661== by 0xC0C5868: ufunc_get_doc (ufunc_object.c:5862) +==18661== by 0x4B2778: ??? (in /usr/bin/python3.6) +==18661== by 0x55DCFC: PyObject_GetAttr (in /usr/bin/python3.6) +==18661== by 0x50C46C: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5ACFAE: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x4DA69C: ??? (in /usr/bin/python3.6) +==18661== by 0x5E4679: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x6149020 is 560 bytes inside a block of size 1,114 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5E78AE: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x4D41D4: ??? (in /usr/bin/python3.6) +==18661== by 0x4D6EA3: ??? (in /usr/bin/python3.6) +==18661== by 0x5E798B: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5442C8: ??? (in /usr/bin/python3.6) +==18661== by 0x588E0B: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Address 0x616d020 is 2,032 bytes inside a block of size 2,168 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x588EEA: ??? (in /usr/bin/python3.6) +==18661== by 0x5132CE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31B25: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC1BA: ??? (in /usr/bin/python3.6) +==18661== by 0x5832D3: PyList_New (in /usr/bin/python3.6) +==18661== by 0x56E48B: PyDict_Keys (in /usr/bin/python3.6) +==18661== by 0x50FF30: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5ACFAE: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x5A9543: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x58952A: ??? (in /usr/bin/python3.6) +==18661== by 0xA36FAE8: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA35AD2D: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x56667A: PyModule_ExecDef (in /usr/bin/python3.6) +==18661== Address 0x6238020 is 848 bytes inside a block of size 1,008 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A9543: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x62FC0A: PyTokenizer_FromUTF8 (in /usr/bin/python3.6) +==18661== by 0x5AA172: PyParser_ParseStringObject (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x588D38: ??? (in /usr/bin/python3.6) +==18661== by 0x61DFC1: PyObject_Dir (in /usr/bin/python3.6) +==18661== by 0xA3A57EC: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA36FEC9: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA366C2B: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x56667A: PyModule_ExecDef (in /usr/bin/python3.6) +==18661== by 0x4FB883: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Address 0x61e4020 is 16 bytes after a block of size 1,360 in arena "client" +==18661== +==18661== Invalid read of size 4 +==18661== at 0x588D38: ??? (in /usr/bin/python3.6) +==18661== by 0xA3A5AA6: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA36FEC9: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA366C2B: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x56667A: PyModule_ExecDef (in /usr/bin/python3.6) +==18661== by 0x4FB883: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x622e020 is 480 bytes inside a block of size 1,160 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x588EEA: ??? (in /usr/bin/python3.6) +==18661== by 0x61DFC1: PyObject_Dir (in /usr/bin/python3.6) +==18661== by 0xA3A57EC: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA36FEC9: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA366C2B: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x56667A: PyModule_ExecDef (in /usr/bin/python3.6) +==18661== by 0x4FB883: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31B25: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC1BA: ??? (in /usr/bin/python3.6) +==18661== by 0x5832D3: PyList_New (in /usr/bin/python3.6) +==18661== by 0x56E48B: PyDict_Keys (in /usr/bin/python3.6) +==18661== by 0x61F747: ??? (in /usr/bin/python3.6) +==18661== by 0x566FB9: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5757: PyObject_CallFunctionObjArgs (in /usr/bin/python3.6) +==18661== by 0x61DF89: PyObject_Dir (in /usr/bin/python3.6) +==18661== by 0xA3A57EC: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA36FEC9: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA366C2B: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x588D38: ??? (in /usr/bin/python3.6) +==18661== by 0xAE66EF1: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xAE6B921: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x594F4B: ??? (in /usr/bin/python3.6) +==18661== by 0x54A2C4: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== Address 0x6049020 is 1,328 bytes inside a block of size 1,384 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x59C6D7: PyObject_GC_Del (in /usr/bin/python3.6) +==18661== by 0x5A3BDE: ??? (in /usr/bin/python3.6) +==18661== by 0x5A4BD4: ??? (in /usr/bin/python3.6) +==18661== by 0x5AAB50: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x515C35: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5442C8: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Address 0x6ec1020 is 416 bytes inside a block of size 848 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F46BB: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4AA3: ??? (in /usr/bin/python3.6) +==18661== by 0x4F471F: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x592387: PyByteArray_Resize (in /usr/bin/python3.6) +==18661== by 0x62A92A: ??? (in /usr/bin/python3.6) +==18661== by 0x50D4F2: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Address 0x6f59020 is 128 bytes inside a block of size 576 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x56A634: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x50D084: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x515C35: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x56ECE2: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x50D084: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x515C35: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x588D38: ??? (in /usr/bin/python3.6) +==18661== by 0x54EECA: ??? (in /usr/bin/python3.6) +==18661== by 0x588E0B: ??? (in /usr/bin/python3.6) +==18661== by 0x5761DD: ??? (in /usr/bin/python3.6) +==18661== by 0x50C7A2: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x70a9020 is 384 bytes inside a block of size 664 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x590F44: ??? (in /usr/bin/python3.6) +==18661== by 0x590F5A: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x50A487: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x588D43: ??? (in /usr/bin/python3.6) +==18661== by 0x5761DD: ??? (in /usr/bin/python3.6) +==18661== by 0x59CFFD: PyIter_Next (in /usr/bin/python3.6) +==18661== by 0x571F64: ??? (in /usr/bin/python3.6) +==18661== by 0x61B0F5: ??? (in /usr/bin/python3.6) +==18661== by 0x61B187: ??? (in /usr/bin/python3.6) +==18661== by 0x61B220: ??? (in /usr/bin/python3.6) +==18661== by 0x566FB9: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5757: PyObject_CallFunctionObjArgs (in /usr/bin/python3.6) +==18661== by 0x61DF89: PyObject_Dir (in /usr/bin/python3.6) +==18661== by 0x600AF9: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A643D: _PyObject_CallMethodIdObjArgs (in /usr/bin/python3.6) +==18661== by 0x4F70FC: PyImport_ImportModuleLevelObject (in /usr/bin/python3.6) +==18661== by 0x50E47D: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x588D5B: ??? (in /usr/bin/python3.6) +==18661== by 0x5761DD: ??? (in /usr/bin/python3.6) +==18661== by 0x59CFFD: PyIter_Next (in /usr/bin/python3.6) +==18661== by 0x571F64: ??? (in /usr/bin/python3.6) +==18661== by 0x61B0F5: ??? (in /usr/bin/python3.6) +==18661== by 0x61B187: ??? (in /usr/bin/python3.6) +==18661== by 0x61B220: ??? (in /usr/bin/python3.6) +==18661== by 0x566FB9: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5757: PyObject_CallFunctionObjArgs (in /usr/bin/python3.6) +==18661== by 0x61DF89: PyObject_Dir (in /usr/bin/python3.6) +==18661== by 0x600AF9: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A643D: _PyObject_CallMethodIdObjArgs (in /usr/bin/python3.6) +==18661== by 0x4F70FC: PyImport_ImportModuleLevelObject (in /usr/bin/python3.6) +==18661== by 0x50E47D: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x4D9301: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== Address 0x71ff020 is 976 bytes inside a block of size 1,114 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x4D9830: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x4D41D4: ??? (in /usr/bin/python3.6) +==18661== by 0x4D6EA3: ??? (in /usr/bin/python3.6) +==18661== by 0x4D912E: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== +WARNING:root:You are using TEST_DEBUG=True, a Cassandra cluster must be already running. Keep in mind that the results of the test might be altered by data already existing. +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5AAF13: ??? (in /usr/bin/python3.6) +==18661== by 0x560464: _PyObject_GenericSetAttrWithDict (in /usr/bin/python3.6) +==18661== by 0x5608AA: PyObject_SetAttr (in /usr/bin/python3.6) +==18661== by 0x50CA30: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DC3E4: ??? (in /usr/bin/python3.6) +==18661== by 0x5DC6DA: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5AC347: ??? (in /usr/bin/python3.6) +==18661== by 0x584044: ??? (in /usr/bin/python3.6) +==18661== by 0x586582: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x584044: ??? (in /usr/bin/python3.6) +==18661== by 0x586582: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Address 0x724a020 is 16 bytes after a block of size 928 alloc'd +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x551C4B: PyType_GenericAlloc (in /usr/bin/python3.6) +==18661== by 0x558330: ??? (in /usr/bin/python3.6) +==18661== by 0x5516F4: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6DF9: PyObject_CallFunction (in /usr/bin/python3.6) +==18661== by 0x5FB7A2: PyErr_NewException (in /usr/bin/python3.6) +==18661== by 0x5DE000: PyInit_binascii (in /usr/bin/python3.6) +==18661== by 0x4FB77F: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x586524: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Address 0x724a020 is 16 bytes after a block of size 928 alloc'd +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x551C4B: PyType_GenericAlloc (in /usr/bin/python3.6) +==18661== by 0x558330: ??? (in /usr/bin/python3.6) +==18661== by 0x5516F4: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6DF9: PyObject_CallFunction (in /usr/bin/python3.6) +==18661== by 0x5FB7A2: PyErr_NewException (in /usr/bin/python3.6) +==18661== by 0x5DE000: PyInit_binascii (in /usr/bin/python3.6) +==18661== by 0x4FB77F: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5AC347: ??? (in /usr/bin/python3.6) +==18661== by 0x586524: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579324: ??? (in /usr/bin/python3.6) +==18661== by 0x50A8EB: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x5AC35F: ??? (in /usr/bin/python3.6) +==18661== by 0x586524: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579324: ??? (in /usr/bin/python3.6) +==18661== by 0x50A8EB: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5ACFAE: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x599912: ??? (in /usr/bin/python3.6) +==18661== by 0x4BB636: ??? (in /usr/bin/python3.6) +==18661== by 0x4BB754: ??? (in /usr/bin/python3.6) +==18661== by 0x50AB80: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x7871020 is 2,032 bytes inside a block of size 2,560 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x54F1C5: ??? (in /usr/bin/python3.6) +==18661== by 0x57351F: ??? (in /usr/bin/python3.6) +==18661== by 0x54F1A1: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x551C4B: PyType_GenericAlloc (in /usr/bin/python3.6) +==18661== by 0x5E98A0: ??? (in /usr/bin/python3.6) +==18661== by 0x5516F4: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x58952A: ??? (in /usr/bin/python3.6) +==18661== by 0x4B63F0: ??? (in /usr/bin/python3.6) +==18661== by 0x55DCFC: PyObject_GetAttr (in /usr/bin/python3.6) +==18661== by 0x50C46C: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x588D38: ??? (in /usr/bin/python3.6) +==18661== by 0x4BB64D: ??? (in /usr/bin/python3.6) +==18661== by 0x4BB754: ??? (in /usr/bin/python3.6) +==18661== by 0x50AB80: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Address 0x79b5020 is 16 bytes inside a block of size 1,114 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x4D9830: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x4D41D4: ??? (in /usr/bin/python3.6) +==18661== by 0x4D6EA3: ??? (in /usr/bin/python3.6) +==18661== by 0x4D912E: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x588D38: ??? (in /usr/bin/python3.6) +==18661== by 0x56B905: ??? (in /usr/bin/python3.6) +==18661== by 0x55F9F0: _PyObject_GenericSetAttrWithDict (in /usr/bin/python3.6) +==18661== by 0x5608AA: PyObject_SetAttr (in /usr/bin/python3.6) +==18661== by 0x50CA30: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5896FB: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x50D8F4: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x78c0020 is 208 bytes inside a block of size 552 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x50A487: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x50A487: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x588D38: ??? (in /usr/bin/python3.6) +==18661== by 0x573626: ??? (in /usr/bin/python3.6) +==18661== by 0x54F1A1: ??? (in /usr/bin/python3.6) +==18661== by 0x508536: ??? (in /usr/bin/python3.6) +==18661== by 0x5896FB: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x50D8F4: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Address 0x7954020 is 4,224 bytes inside a block of size 4,293 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5925E6: _PyBytes_Resize (in /usr/bin/python3.6) +==18661== by 0x4CA893: ??? (in /usr/bin/python3.6) +==18661== by 0x4CB996: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5928BB: PyBytes_FromStringAndSize (in /usr/bin/python3.6) +==18661== by 0x4CA843: ??? (in /usr/bin/python3.6) +==18661== by 0x4CB996: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x588D38: ??? (in /usr/bin/python3.6) +==18661== by 0x5735B6: ??? (in /usr/bin/python3.6) +==18661== by 0x54F1A1: ??? (in /usr/bin/python3.6) +==18661== by 0x508536: ??? (in /usr/bin/python3.6) +==18661== by 0x5896FB: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x50D8F4: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Address 0x78c0020 is 208 bytes inside a block of size 552 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x50A487: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x50A487: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x4B1BAA: ??? (in /usr/bin/python3.6) +==18661== by 0x5735D7: ??? (in /usr/bin/python3.6) +==18661== by 0x54F1A1: ??? (in /usr/bin/python3.6) +==18661== by 0x508536: ??? (in /usr/bin/python3.6) +==18661== by 0x5896FB: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x50D8F4: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Address 0x7888020 is 304 bytes inside a block of size 1,112 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x560464: _PyObject_GenericSetAttrWithDict (in /usr/bin/python3.6) +==18661== by 0x5608AA: PyObject_SetAttr (in /usr/bin/python3.6) +==18661== by 0x50CA30: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x56B992: ??? (in /usr/bin/python3.6) +==18661== by 0x560019: _PyObject_GenericSetAttrWithDict (in /usr/bin/python3.6) +==18661== by 0x5608AA: PyObject_SetAttr (in /usr/bin/python3.6) +==18661== by 0x50CA30: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5ACFB8: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x5DD8A4: ??? (in /usr/bin/python3.6) +==18661== by 0x566FB9: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A684D: _PyObject_CallMethodId_SizeT (in /usr/bin/python3.6) +==18661== by 0x5BC215: ??? (in /usr/bin/python3.6) +==18661== by 0x566FB9: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A656D: PyObject_CallMethodObjArgs (in /usr/bin/python3.6) +==18661== by 0x566E11: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5757: PyObject_CallFunctionObjArgs (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x5ACFD0: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x5DD8A4: ??? (in /usr/bin/python3.6) +==18661== by 0x566FB9: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A684D: _PyObject_CallMethodId_SizeT (in /usr/bin/python3.6) +==18661== by 0x5BC215: ??? (in /usr/bin/python3.6) +==18661== by 0x566FB9: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A656D: PyObject_CallMethodObjArgs (in /usr/bin/python3.6) +==18661== by 0x566E11: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5757: PyObject_CallFunctionObjArgs (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5ACFB8: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x5E65FB: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DF10D: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5ACFAE: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x5E65FB: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== Address 0x79b8020 is 880 bytes inside a block of size 1,114 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5E65FB: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x4D41D4: ??? (in /usr/bin/python3.6) +==18661== by 0x4D6EA3: ??? (in /usr/bin/python3.6) +==18661== by 0x5E6823: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AAF0A: ??? (in /usr/bin/python3.6) +==18661== by 0x560464: _PyObject_GenericSetAttrWithDict (in /usr/bin/python3.6) +==18661== by 0x5608AA: PyObject_SetAttr (in /usr/bin/python3.6) +==18661== by 0x50CA30: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x79bb020 is 8,432 bytes inside an unallocated block of size 10,832 in arena "client" +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x4B1BB3: ??? (in /usr/bin/python3.6) +==18661== by 0x5735D7: ??? (in /usr/bin/python3.6) +==18661== by 0x54F1A1: ??? (in /usr/bin/python3.6) +==18661== by 0x508536: ??? (in /usr/bin/python3.6) +==18661== by 0x5896FB: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x50D8F4: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DC3E4: ??? (in /usr/bin/python3.6) +==18661== by 0x5DC6DA: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AB17E: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x5105B7: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Address 0x79c8020 is 608 bytes inside a block of size 1,114 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x4D9830: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x4D41D4: ??? (in /usr/bin/python3.6) +==18661== by 0x4D6EA3: ??? (in /usr/bin/python3.6) +==18661== by 0x4D912E: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5AB188: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x508536: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DF10D: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5442D1: ??? (in /usr/bin/python3.6) +==18661== by 0x508536: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DF10D: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5ACFAE: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x5E8FF2: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Address 0x7a5b020 is 8 bytes after a block of size 104 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x547084: ??? (in /usr/bin/python3.6) +==18661== by 0x4FB95F: PyErr_SetFromErrnoWithFilenameObjects (in /usr/bin/python3.6) +==18661== by 0x4C6842: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AB904: ??? (in /usr/bin/python3.6) +==18661== by 0x54704C: ??? (in /usr/bin/python3.6) +==18661== by 0x4FB95F: PyErr_SetFromErrnoWithFilenameObjects (in /usr/bin/python3.6) +==18661== by 0x4C6842: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5442C8: ??? (in /usr/bin/python3.6) +==18661== by 0x5BD695: ??? (in /usr/bin/python3.6) +==18661== by 0x5BD84F: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x7af4020 is 3,168 bytes inside a block of size 4,096 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5DD8A4: ??? (in /usr/bin/python3.6) +==18661== by 0x566FB9: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A656D: PyObject_CallMethodObjArgs (in /usr/bin/python3.6) +==18661== by 0x566E11: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5757: PyObject_CallFunctionObjArgs (in /usr/bin/python3.6) +==18661== by 0x50DC02: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DF10D: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AB17E: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x54EECA: ??? (in /usr/bin/python3.6) +==18661== by 0x5BD62B: ??? (in /usr/bin/python3.6) +==18661== by 0x5BD84F: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Address 0x7b04020 is 192 bytes inside an unallocated block of size 848 in arena "client" +==18661== +==18661== Invalid read of size 4 +==18661== at 0x588D38: ??? (in /usr/bin/python3.6) +==18661== by 0x573540: ??? (in /usr/bin/python3.6) +==18661== by 0x54F1A1: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Address 0x7a8f020 is 1,552 bytes inside a block of size 4,096 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5DD8A4: ??? (in /usr/bin/python3.6) +==18661== by 0x566FB9: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A656D: PyObject_CallMethodObjArgs (in /usr/bin/python3.6) +==18661== by 0x566E11: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5757: PyObject_CallFunctionObjArgs (in /usr/bin/python3.6) +==18661== by 0x50DC02: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DF10D: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AB17E: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x5BD907: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Address 0x7934020 is 1,344 bytes inside a block of size 1,384 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4F45C7: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4673: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AB17E: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x4BB698: ??? (in /usr/bin/python3.6) +==18661== by 0x4BB754: ??? (in /usr/bin/python3.6) +==18661== by 0x50AB80: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Address 0x79a5020 is 16 bytes after a block of size 16 in arena "client" +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5AB188: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x5BD63C: ??? (in /usr/bin/python3.6) +==18661== by 0x4BBEB9: ??? (in /usr/bin/python3.6) +==18661== by 0x4BC31C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C7A2: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DC3E4: ??? (in /usr/bin/python3.6) +==18661== by 0x5DC6DA: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5ACFB8: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x5E8FF2: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DF10D: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5ACFAE: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x5E8A48: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Address 0x9507020 is 128 bytes inside a block of size 704 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x588EEA: ??? (in /usr/bin/python3.6) +==18661== by 0x4BB64D: ??? (in /usr/bin/python3.6) +==18661== by 0x4BB754: ??? (in /usr/bin/python3.6) +==18661== by 0x566FB9: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A684D: _PyObject_CallMethodId_SizeT (in /usr/bin/python3.6) +==18661== by 0x5BC1F0: ??? (in /usr/bin/python3.6) +==18661== by 0x566FB9: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A656D: PyObject_CallMethodObjArgs (in /usr/bin/python3.6) +==18661== by 0x566E11: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x4BBA57: ??? (in /usr/bin/python3.6) +==18661== by 0x50A8EB: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x5AB1A0: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x5BD63C: ??? (in /usr/bin/python3.6) +==18661== by 0x4BBEB9: ??? (in /usr/bin/python3.6) +==18661== by 0x4BC31C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C7A2: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DC3E4: ??? (in /usr/bin/python3.6) +==18661== by 0x5DC6DA: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5ACFAE: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x5E8A6D: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Address 0x96f8020 is 16 bytes after a block of size 576 alloc'd +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x571E42: ??? (in /usr/bin/python3.6) +==18661== by 0x572080: PyDict_Copy (in /usr/bin/python3.6) +==18661== by 0x5582AC: ??? (in /usr/bin/python3.6) +==18661== by 0x5516F4: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0xADCB888: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xADF09BF: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x56667A: PyModule_ExecDef (in /usr/bin/python3.6) +==18661== by 0x4FB883: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5442C8: ??? (in /usr/bin/python3.6) +==18661== by 0x508536: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Address 0x97db020 is 3,792 bytes inside a block of size 4,138 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5BD907: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5925E6: _PyBytes_Resize (in /usr/bin/python3.6) +==18661== by 0x4CA893: ??? (in /usr/bin/python3.6) +==18661== by 0x566FB9: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A656D: PyObject_CallMethodObjArgs (in /usr/bin/python3.6) +==18661== by 0x4CE2E1: ??? (in /usr/bin/python3.6) +==18661== by 0x566E11: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A684D: _PyObject_CallMethodId_SizeT (in /usr/bin/python3.6) +==18661== by 0x5BD8C7: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x5ACFD0: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x5E8FF2: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x4D4FF1: ??? (in /usr/bin/python3.6) +==18661== by 0x5E882B: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5ACFB8: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x599912: ??? (in /usr/bin/python3.6) +==18661== by 0x4BB636: ??? (in /usr/bin/python3.6) +==18661== by 0x4BB754: ??? (in /usr/bin/python3.6) +==18661== by 0x566FB9: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A684D: _PyObject_CallMethodId_SizeT (in /usr/bin/python3.6) +==18661== by 0x5BC1F0: ??? (in /usr/bin/python3.6) +==18661== by 0x566FB9: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A656D: PyObject_CallMethodObjArgs (in /usr/bin/python3.6) +==18661== by 0x566E11: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DC3E4: ??? (in /usr/bin/python3.6) +==18661== by 0x5DC6DA: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5442D1: ??? (in /usr/bin/python3.6) +==18661== by 0x4BC080: ??? (in /usr/bin/python3.6) +==18661== by 0x4BC31C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C7A2: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DC3E4: ??? (in /usr/bin/python3.6) +==18661== by 0x5DC6DA: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5AB188: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x5105B7: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DC3E4: ??? (in /usr/bin/python3.6) +==18661== by 0x5DC6DA: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x5AB1A0: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x508536: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5442D1: ??? (in /usr/bin/python3.6) +==18661== by 0x5BD695: ??? (in /usr/bin/python3.6) +==18661== by 0x5BD84F: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DF10D: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5442D1: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x544B0E: PyUnicode_New (in /usr/bin/python3.6) +==18661== by 0x535CA1: PyUnicode_Substring (in /usr/bin/python3.6) +==18661== by 0x5B9B6F: ??? (in /usr/bin/python3.6) +==18661== by 0x5BD78E: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x588D43: ??? (in /usr/bin/python3.6) +==18661== by 0x5105B7: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DC3E4: ??? (in /usr/bin/python3.6) +==18661== by 0x5DC6DA: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x5ACFD0: PyMem_Free (in /usr/bin/python3.6) +==18661== by 0x599912: ??? (in /usr/bin/python3.6) +==18661== by 0x4BB636: ??? (in /usr/bin/python3.6) +==18661== by 0x4BB754: ??? (in /usr/bin/python3.6) +==18661== by 0x50AB80: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DC3E4: ??? (in /usr/bin/python3.6) +==18661== by 0x5DC6DA: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x588D43: ??? (in /usr/bin/python3.6) +==18661== by 0x573540: ??? (in /usr/bin/python3.6) +==18661== by 0x54F1A1: ??? (in /usr/bin/python3.6) +==18661== by 0x509E94: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5896FB: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x50D8F4: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DC3E4: ??? (in /usr/bin/python3.6) +==18661== by 0x5DC6DA: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== +==18749== Warning: invalid file descriptor 1024 in syscall close() +==18749== Warning: invalid file descriptor 1025 in syscall close() +==18749== Warning: invalid file descriptor 1026 in syscall close() +==18749== Warning: invalid file descriptor 1027 in syscall close() +==18749== Use --log-fd= to select an alternative log fd. +==18749== Warning: invalid file descriptor 1028 in syscall close() +==18749== Warning: invalid file descriptor 1029 in syscall close() +WARNING:root:TEST_DEBUG: ignoring exception +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x4D9585: ??? (in /usr/bin/python3.6) +==18661== by 0x566F19: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A6BC3: _PyObject_CallMethodId (in /usr/bin/python3.6) +==18661== by 0x610DA6: ??? (in /usr/bin/python3.6) +==18661== by 0x612039: ??? (in /usr/bin/python3.6) +==18661== by 0x61235D: ??? (in /usr/bin/python3.6) +==18661== by 0x6126A4: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x4D9801: ??? (in /usr/bin/python3.6) +==18661== by 0x566F19: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A6BC3: _PyObject_CallMethodId (in /usr/bin/python3.6) +==18661== by 0x610DA6: ??? (in /usr/bin/python3.6) +==18661== by 0x612039: ??? (in /usr/bin/python3.6) +==18661== by 0x61235D: ??? (in /usr/bin/python3.6) +==18661== by 0x6126A4: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x579114: ??? (in /usr/bin/python3.6) +==18661== by 0x5889BE: ??? (in /usr/bin/python3.6) +==18661== by 0x566EA0: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A6883: _PyObject_CallMethodId_SizeT (in /usr/bin/python3.6) +==18661== by 0x5D792C: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Address 0x20b05020 is 544 bytes inside a block of size 768 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579114: ??? (in /usr/bin/python3.6) +==18661== by 0x5889BE: ??? (in /usr/bin/python3.6) +==18661== by 0x566EA0: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A6883: _PyObject_CallMethodId_SizeT (in /usr/bin/python3.6) +==18661== by 0x5D792C: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579114: ??? (in /usr/bin/python3.6) +==18661== by 0x5889BE: ??? (in /usr/bin/python3.6) +==18661== by 0x566EA0: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A6883: _PyObject_CallMethodId_SizeT (in /usr/bin/python3.6) +==18661== by 0x5D792C: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== Thread 3: +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5AAF13: ??? (in /usr/bin/python3.6) +==18661== by 0x56071C: _PyObject_GenericSetAttrWithDict (in /usr/bin/python3.6) +==18661== by 0x5608AA: PyObject_SetAttr (in /usr/bin/python3.6) +==18661== by 0x50F53E: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A6E33: PyObject_CallFunction (in /usr/bin/python3.6) +==18661== by 0x22549B75: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/io/libevwrapper.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x22755152: ev_invoke_pending (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/.libs/libev-aea52ade.so.4.0.0) +==18661== by 0x22755C23: ev_run (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/.libs/libev-aea52ade.so.4.0.0) +==18661== by 0x2254A00B: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/io/libevwrapper.cpython-36m-x86_64-linux-gnu.so) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x4ED032: ??? (in /usr/bin/python3.6) +==18661== by 0x5516F4: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== +/home/ismael/.local/lib/python3.6/site-packages/Hecuba-0.1.3-py3.6-linux-x86_64.egg/storage/cql_iface/__init__.py:189: UserWarning: Defining a MAX_CACHE_SIZE smaller than WRITE_BUFFER_SIZE can result in reading outdated results from the persistent storage + warnings.warn(message) +WARNING:cassandra.cluster:Downgrading core protocol version from 66 to 65 for 127.0.0.1:9042. To avoid this, it is best practice to explicitly set Cluster(protocol_version) to the version supported by your cluster. http://datastax.github.io/python-driver/api/cassandra/cluster.html#cassandra.cluster.Cluster.protocol_version +WARNING:cassandra.cluster:Downgrading core protocol version from 65 to 4 for 127.0.0.1:9042. To avoid this, it is best practice to explicitly set Cluster(protocol_version) to the version supported by your cluster. http://datastax.github.io/python-driver/api/cassandra/cluster.html#cassandra.cluster.Cluster.protocol_version +==18661== Invalid read of size 4 +==18661== at 0x588D38: ??? (in /usr/bin/python3.6) +==18661== by 0xB5595D0: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB598753: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB599BBD: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB12B036: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/row_parser.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA393F04: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA39C5F4: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA3DE581: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B73238: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B783AE: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B36F2B: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B52E66: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== Address 0x20b2f020 is 3,392 bytes inside a block of size 4,129 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5925E6: _PyBytes_Resize (in /usr/bin/python3.6) +==18661== by 0x5C0901: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6DF9: PyObject_CallFunction (in /usr/bin/python3.6) +==18661== by 0x22549E6C: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/io/libevwrapper.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x22755152: ev_invoke_pending (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/.libs/libev-aea52ade.so.4.0.0) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5928BB: PyBytes_FromStringAndSize (in /usr/bin/python3.6) +==18661== by 0x5C08C5: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6DF9: PyObject_CallFunction (in /usr/bin/python3.6) +==18661== by 0x22549E6C: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/io/libevwrapper.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x22755152: ev_invoke_pending (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/.libs/libev-aea52ade.so.4.0.0) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x588D43: ??? (in /usr/bin/python3.6) +==18661== by 0xB5595D0: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB598753: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB599BBD: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB12B036: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/row_parser.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA393F04: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA39C5F4: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA3DE581: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B73238: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B783AE: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B36F2B: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B52E66: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x637B53: ??? (in /usr/bin/python3.6) +==18661== by 0x5E1A6E: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x588D5B: ??? (in /usr/bin/python3.6) +==18661== by 0xB5595D0: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB598753: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB599BBD: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB12B036: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/row_parser.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA393F04: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA39C5F4: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA3DE581: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B73238: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B783AE: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B36F2B: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B52E66: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x637B53: ??? (in /usr/bin/python3.6) +==18661== by 0x5E1A6E: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x588D38: ??? (in /usr/bin/python3.6) +==18661== by 0xB5897A9: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xBC338B1: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/obj_parser.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xBC28372: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/obj_parser.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB12B4E3: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/row_parser.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA393F04: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA39C5F4: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA3DE581: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B73238: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B783AE: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B36F2B: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B52E66: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== Address 0x20b45020 is 672 bytes inside a block of size 1,864 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0xB5687F5: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB5896A4: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xBC338B1: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/obj_parser.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xBC28372: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/obj_parser.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB12B4E3: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/row_parser.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA393F04: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA39C5F4: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA3DE581: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B73238: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B783AE: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0xB5687F5: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB5896A4: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xBC338B1: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/obj_parser.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xBC28372: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/obj_parser.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB12B4E3: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/row_parser.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA393F04: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA39C5F4: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA3DE581: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B73238: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B783AE: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AB17E: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0xB33B2D6: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/bytesio.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB12B836: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/row_parser.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA393F04: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA39C5F4: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xA3DE581: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/protocol.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B73238: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B783AE: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B36F2B: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B52E66: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== Address 0x20b41020 is 400 bytes inside a block of size 712 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x588EEA: ??? (in /usr/bin/python3.6) +==18661== by 0x61DFC1: PyObject_Dir (in /usr/bin/python3.6) +==18661== by 0xB5594D5: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB598753: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB599BBD: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB5B5564: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB5B5DDC: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x4B4EC5: ??? (in /usr/bin/python3.6) +==18661== by 0xB5570F8: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB54F704: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB59A7B6: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== Block was alloc'd at +==18661== at 0x4C31B25: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC1BA: ??? (in /usr/bin/python3.6) +==18661== by 0x5832D3: PyList_New (in /usr/bin/python3.6) +==18661== by 0x56E48B: PyDict_Keys (in /usr/bin/python3.6) +==18661== by 0x61F747: ??? (in /usr/bin/python3.6) +==18661== by 0x566FB9: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5757: PyObject_CallFunctionObjArgs (in /usr/bin/python3.6) +==18661== by 0x61DF89: PyObject_Dir (in /usr/bin/python3.6) +==18661== by 0xB5594D5: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB598753: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB599BBD: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AB17E: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x4CC767: ??? (in /usr/bin/python3.6) +==18661== by 0x56EB95: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x55FCA2: _PyObject_GenericSetAttrWithDict (in /usr/bin/python3.6) +==18661== by 0x9B4E045: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B27128: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B09440: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B536C5: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Address 0x1ffc0020 is 1,792 bytes inside a block of size 4,129 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5925E6: _PyBytes_Resize (in /usr/bin/python3.6) +==18661== by 0x5C0901: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6DF9: PyObject_CallFunction (in /usr/bin/python3.6) +==18661== by 0x22549E6C: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/io/libevwrapper.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x22755152: ev_invoke_pending (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/.libs/libev-aea52ade.so.4.0.0) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5928BB: PyBytes_FromStringAndSize (in /usr/bin/python3.6) +==18661== by 0x5C08C5: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6DF9: PyObject_CallFunction (in /usr/bin/python3.6) +==18661== by 0x22549E6C: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/io/libevwrapper.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x22755152: ev_invoke_pending (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/.libs/libev-aea52ade.so.4.0.0) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AB17E: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x9B526CF: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6DF9: PyObject_CallFunction (in /usr/bin/python3.6) +==18661== by 0x22549E6C: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/io/libevwrapper.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x22755152: ev_invoke_pending (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/.libs/libev-aea52ade.so.4.0.0) +==18661== Address 0x212cf020 is 5,856 bytes inside a block of size 6,611 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5925E6: _PyBytes_Resize (in /usr/bin/python3.6) +==18661== by 0x4CC2F5: ??? (in /usr/bin/python3.6) +==18661== by 0x9B556E3: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B36F2B: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B27128: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B09440: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B53D08: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5925E6: _PyBytes_Resize (in /usr/bin/python3.6) +==18661== by 0x4CC408: ??? (in /usr/bin/python3.6) +==18661== by 0x4CC56A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A8EB: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6DF9: PyObject_CallFunction (in /usr/bin/python3.6) +==18661== by 0x22549E6C: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/io/libevwrapper.cpython-36m-x86_64-linux-gnu.so) +==18661== +==18661== Thread 1: +==18661== Invalid read of size 4 +==18661== at 0x588D38: ??? (in /usr/bin/python3.6) +==18661== by 0x21A433FE: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/metadata.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x7537752: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x75406D4: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x594F4B: ??? (in /usr/bin/python3.6) +==18661== by 0x75727C6: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x75773F1: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x7486E8A: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x74DD773: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x7467BF8: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x742D221: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x74D4352: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== Address 0x20b4f020 is 1,328 bytes inside a block of size 1,608 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x21A434BC: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/metadata.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x7537752: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x75406D4: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x594F4B: ??? (in /usr/bin/python3.6) +==18661== by 0x75727C6: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x75773F1: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x7486E8A: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x74DD773: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x7467BF8: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x742D221: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0x21A434BC: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/metadata.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x7537752: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x75406D4: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x594F4B: ??? (in /usr/bin/python3.6) +==18661== by 0x75727C6: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x75773F1: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x7486E8A: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x74DD773: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x7467BF8: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x742D221: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== +==18661== Thread 3: +==18661== Invalid read of size 4 +==18661== at 0x5AB17E: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x9B53359: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6DF9: PyObject_CallFunction (in /usr/bin/python3.6) +==18661== by 0x22549E6C: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/io/libevwrapper.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x22755152: ev_invoke_pending (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/.libs/libev-aea52ade.so.4.0.0) +==18661== Address 0x20b53020 is 2,480 bytes inside a block of size 2,694 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5925E6: _PyBytes_Resize (in /usr/bin/python3.6) +==18661== by 0x4CC2F5: ??? (in /usr/bin/python3.6) +==18661== by 0x9B556E3: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B36F2B: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B27128: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B09440: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B53D08: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5928BB: PyBytes_FromStringAndSize (in /usr/bin/python3.6) +==18661== by 0x4CC39E: ??? (in /usr/bin/python3.6) +==18661== by 0x4CC56A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A8EB: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6DF9: PyObject_CallFunction (in /usr/bin/python3.6) +==18661== by 0x22549E6C: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/io/libevwrapper.cpython-36m-x86_64-linux-gnu.so) +==18661== +==18661== Thread 1: +==18661== Invalid read of size 4 +==18661== at 0x588D38: ??? (in /usr/bin/python3.6) +==18661== by 0x57351F: ??? (in /usr/bin/python3.6) +==18661== by 0x54F1A1: ??? (in /usr/bin/python3.6) +==18661== by 0x54EECA: ??? (in /usr/bin/python3.6) +==18661== by 0x588E0B: ??? (in /usr/bin/python3.6) +==18661== by 0x573626: ??? (in /usr/bin/python3.6) +==18661== by 0x54F1A1: ??? (in /usr/bin/python3.6) +==18661== by 0x588E0B: ??? (in /usr/bin/python3.6) +==18661== by 0x7572B7C: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x75773F1: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x7486E8A: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x74DD773: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== Address 0x20b48020 is 1,664 bytes inside a block of size 1,864 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0xAE8050D: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xAE21ACA: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xAE2CDC0: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xAE21ACA: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xAE329AF: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x594F4B: ??? (in /usr/bin/python3.6) +==18661== by 0x54A2C4: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0xB5570F8: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB54F704: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== Block was alloc'd at +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x579494: PyList_Append (in /usr/bin/python3.6) +==18661== by 0xAE8050D: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xAE21ACA: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xAE2CDC0: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xAE21ACA: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xAE329AF: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x594F4B: ??? (in /usr/bin/python3.6) +==18661== by 0x54A2C4: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0xB5570F8: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB54F704: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5AAF13: ??? (in /usr/bin/python3.6) +==18661== by 0x5735EA: ??? (in /usr/bin/python3.6) +==18661== by 0x54CC80: ??? (in /usr/bin/python3.6) +==18661== by 0x5A3BCD: ??? (in /usr/bin/python3.6) +==18661== by 0x551DD7: PyType_GenericAlloc (in /usr/bin/python3.6) +==18661== by 0x562430: ??? (in /usr/bin/python3.6) +==18661== by 0x5B077D: ??? (in /usr/bin/python3.6) +==18661== by 0x5B10D5: ??? (in /usr/bin/python3.6) +==18661== by 0x5B10D5: ??? (in /usr/bin/python3.6) +==18661== by 0x5B1D72: PySymtable_BuildObject (in /usr/bin/python3.6) +==18661== by 0x507589: PyAST_CompileObject (in /usr/bin/python3.6) +==18661== by 0x635298: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5F7D0E: ??? (in /usr/bin/python3.6) +==18661== by 0x5F4F45: ??? (in /usr/bin/python3.6) +==18661== by 0x4E5636: ??? (in /usr/bin/python3.6) +==18661== by 0x508536: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +WARNING:cassandra.cluster:Downgrading core protocol version from 66 to 65 for 127.0.0.1:9042. To avoid this, it is best practice to explicitly set Cluster(protocol_version) to the version supported by your cluster. http://datastax.github.io/python-driver/api/cassandra/cluster.html#cassandra.cluster.Cluster.protocol_version +WARNING:cassandra.cluster:Downgrading core protocol version from 65 to 4 for 127.0.0.1:9042. To avoid this, it is best practice to explicitly set Cluster(protocol_version) to the version supported by your cluster. http://datastax.github.io/python-driver/api/cassandra/cluster.html#cassandra.cluster.Cluster.protocol_version +==18661== Thread 3: +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x5AB188: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x4CC767: ??? (in /usr/bin/python3.6) +==18661== by 0x56EB95: PyDict_SetItem (in /usr/bin/python3.6) +==18661== by 0x55FCA2: _PyObject_GenericSetAttrWithDict (in /usr/bin/python3.6) +==18661== by 0x9B4E045: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B27128: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B09440: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B536C5: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x5AB1A0: PyObject_Free (in /usr/bin/python3.6) +==18661== by 0x5105B7: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6DF9: PyObject_CallFunction (in /usr/bin/python3.6) +==18661== by 0x22549E6C: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/io/libevwrapper.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x22755152: ev_invoke_pending (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/.libs/libev-aea52ade.so.4.0.0) +==18661== by 0x22756044: ev_run (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/.libs/libev-aea52ade.so.4.0.0) +==18661== by 0x2254A00B: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/io/libevwrapper.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x50AB80: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== Conditional jump or move depends on uninitialised value(s) +==18661== at 0x588D43: ??? (in /usr/bin/python3.6) +==18661== by 0x61DFC1: PyObject_Dir (in /usr/bin/python3.6) +==18661== by 0xB5594D5: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB598753: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB599BBD: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB5B5564: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB5B5DDC: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x4B4EC5: ??? (in /usr/bin/python3.6) +==18661== by 0xB5570F8: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB54F704: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB59A7B6: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DC3E4: ??? (in /usr/bin/python3.6) +==18661== by 0x5DC6DA: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x566F19: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x567335: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6B3F: _PyObject_CallMethodId (in /usr/bin/python3.6) +==18661== +==18661== Use of uninitialised value of size 8 +==18661== at 0x588D5B: ??? (in /usr/bin/python3.6) +==18661== by 0x61DFC1: PyObject_Dir (in /usr/bin/python3.6) +==18661== by 0xB5594D5: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB598753: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB599BBD: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB5B5564: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB5B5DDC: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x4B4EC5: ??? (in /usr/bin/python3.6) +==18661== by 0xB5570F8: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB54F704: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xB59A7B6: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/deserializers.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AD37A: PyMem_Malloc (in /usr/bin/python3.6) +==18661== by 0x5DC3E4: ??? (in /usr/bin/python3.6) +==18661== by 0x5DC6DA: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6CBC: _PyObject_CallFunction_SizeT (in /usr/bin/python3.6) +==18661== by 0x5EF6B1: ??? (in /usr/bin/python3.6) +==18661== by 0x566F19: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x567335: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6B3F: _PyObject_CallMethodId (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x59C6CC: PyObject_GC_Del (in /usr/bin/python3.6) +==18661== by 0x54F1C5: ??? (in /usr/bin/python3.6) +==18661== by 0x5A3C94: ??? (in /usr/bin/python3.6) +==18661== by 0x5A7242: _PyObject_GC_New (in /usr/bin/python3.6) +==18661== by 0x56C369: PyDict_New (in /usr/bin/python3.6) +==18661== by 0x508A79: ??? (in /usr/bin/python3.6) +==18661== by 0x50B288: PyEval_EvalCodeEx (in /usr/bin/python3.6) +==18661== by 0xAE18D13: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xAE93658: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xADFD9A8: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xADCBC61: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0xAE278A3: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/util.cpython-36m-x86_64-linux-gnu.so) +==18661== Address 0x20b2f020 is 3,392 bytes inside a block of size 4,129 free'd +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5925E6: _PyBytes_Resize (in /usr/bin/python3.6) +==18661== by 0x5C0901: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6DF9: PyObject_CallFunction (in /usr/bin/python3.6) +==18661== by 0x22549E6C: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/io/libevwrapper.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x22755152: ev_invoke_pending (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/.libs/libev-aea52ade.so.4.0.0) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5928BB: PyBytes_FromStringAndSize (in /usr/bin/python3.6) +==18661== by 0x5C08C5: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6DF9: PyObject_CallFunction (in /usr/bin/python3.6) +==18661== by 0x22549E6C: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/io/libevwrapper.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x22755152: ev_invoke_pending (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/.libs/libev-aea52ade.so.4.0.0) +==18661== +==18661== Thread 1: +==18661== Use of uninitialised value of size 8 +==18661== at 0x588D5B: ??? (in /usr/bin/python3.6) +==18661== by 0x4FACAA: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Uninitialised value was created by a heap allocation +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5757: PyObject_CallFunctionObjArgs (in /usr/bin/python3.6) +==18661== by 0x50DD07: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x588D38: ??? (in /usr/bin/python3.6) +==18661== by 0x50B774: ??? (in /usr/bin/python3.6) +==18661== by 0x588863: ??? (in /usr/bin/python3.6) +==18661== by 0x588A9D: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Address 0x6ead020 is 1,344 bytes inside an unallocated block of size 1,568 in arena "client" +==18661== +==18661== Thread 3: +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x62FD50: PyTokenizer_FromUTF8 (in /usr/bin/python3.6) +==18661== by 0x5AA172: PyParser_ParseStringObject (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50B288: PyEval_EvalCodeEx (in /usr/bin/python3.6) +==18661== by 0x21F53963: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/query.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x21F5B100: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/query.cpython-36m-x86_64-linux-gnu.so) +==18661== Address 0x6387020 is 544 bytes inside a block of size 1,114 free'd +==18661== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x4D9830: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== Block was alloc'd at +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x4D41D4: ??? (in /usr/bin/python3.6) +==18661== by 0x4D6EA3: ??? (in /usr/bin/python3.6) +==18661== by 0x4D912E: ??? (in /usr/bin/python3.6) +==18661== by 0x50A979: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== +==18661== Invalid read of size 4 +==18661== at 0x5AC33E: ??? (in /usr/bin/python3.6) +==18661== by 0x4B8CC1: PyParser_AddToken (in /usr/bin/python3.6) +==18661== by 0x5A91E2: ??? (in /usr/bin/python3.6) +==18661== by 0x5B2212: PyParser_ASTFromStringObject (in /usr/bin/python3.6) +==18661== by 0x635279: PyRun_StringFlags (in /usr/bin/python3.6) +==18661== by 0x5167DC: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50B288: PyEval_EvalCodeEx (in /usr/bin/python3.6) +==18661== by 0x21F53963: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/query.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x21F5B100: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/query.cpython-36m-x86_64-linux-gnu.so) +==18661== Address 0x6f1c020 is 16 bytes after a block of size 576 alloc'd +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5ABF54: ??? (in /usr/bin/python3.6) +==18661== by 0x56A353: ??? (in /usr/bin/python3.6) +==18661== by 0x56B992: ??? (in /usr/bin/python3.6) +==18661== by 0x571572: PyDict_SetItemString (in /usr/bin/python3.6) +==18661== by 0x5538B3: PyType_Ready (in /usr/bin/python3.6) +==18661== by 0x55866E: ??? (in /usr/bin/python3.6) +==18661== by 0x5516F4: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x515C74: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== Thread 1: +==18661== Jump to the invalid address stated on the next line +==18661== at 0x0: ??? +==18661== by 0x5F27BC: ??? (in /usr/bin/python3.6) +==18661== by 0xE78785C: TimeParser::c_to_py(void const*) const (UnitParser.cpp:337) +==18661== by 0xE778434: PythonParser::make_pylist(std::vector >&) const (PythonParser.cpp:94) +==18661== by 0xE77BA27: get_row(HCache*, _object*) (HCache.cpp:164) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== Address 0x0 is not stack'd, malloc'd or (recently) free'd +==18661== +==18661== +==18661== Process terminating with default action of signal 11 (SIGSEGV) +==18661== Bad permissions for mapped region at address 0x0 +==18661== at 0x0: ??? +==18661== by 0x5F27BC: ??? (in /usr/bin/python3.6) +==18661== by 0xE78785C: TimeParser::c_to_py(void const*) const (UnitParser.cpp:337) +==18661== by 0xE778434: PythonParser::make_pylist(std::vector >&) const (PythonParser.cpp:94) +==18661== by 0xE77BA27: get_row(HCache*, _object*) (HCache.cpp:164) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== +==18661== HEAP SUMMARY: +==18661== in use at exit: 11,784,116 bytes in 27,190 blocks +==18661== total heap usage: 77,867 allocs, 50,677 frees, 57,702,741 bytes allocated +==18661== +==18661== 6 bytes in 1 blocks are definitely lost in loss record 12 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0xE77C502: put_row(HCache*, _object*) (HCache.cpp:78) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x557877: ??? (in /usr/bin/python3.6) +==18661== by 0x541CAF: ??? (in /usr/bin/python3.6) +==18661== +==18661== 16 bytes in 1 blocks are definitely lost in loss record 151 of 2,328 +==18661== at 0x4C3017F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0xE780359: allocate (new_allocator.h:111) +==18661== by 0xE780359: allocate (alloc_traits.h:436) +==18661== by 0xE780359: _M_allocate (stl_vector.h:172) +==18661== by 0xE780359: _M_create_storage (stl_vector.h:187) +==18661== by 0xE780359: _Vector_base (stl_vector.h:138) +==18661== by 0xE780359: vector (stl_vector.h:284) +==18661== by 0xE780359: hcache_init(HCache*, _object*, _object*) (HCache.cpp:280) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x50D8F4: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== 336 bytes in 1 blocks are possibly lost in loss record 965 of 2,328 +==18661== at 0x4C31B25: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x40134A6: allocate_dtv (dl-tls.c:286) +==18661== by 0x40134A6: _dl_allocate_tls (dl-tls.c:530) +==18661== by 0x5235227: allocate_stack (allocatestack.c:627) +==18661== by 0x5235227: pthread_create@@GLIBC_2.2.5 (pthread_create.c:644) +==18661== by 0x13A78CC0: uv_thread_create (in /usr/lib/x86_64-linux-gnu/libuv.so.1.0.0) +==18661== by 0xEF3DA5F: cass::LoopThread::run() (in /home/ismael/.local/lib/python3.6/site-packages/Hecuba-0.1.3-py3.6-linux-x86_64.egg/libcassandra.so.2) +==18661== by 0xEF38E8B: cass::Session::connect_async(cass::Config const&, std::__cxx11::basic_string, std::allocator > const&, cass::SharedRefPtr const&) (in /home/ismael/.local/lib/python3.6/site-packages/Hecuba-0.1.3-py3.6-linux-x86_64.egg/libcassandra.so.2) +==18661== by 0xEF37171: cass_session_connect_keyspace_n (in /home/ismael/.local/lib/python3.6/site-packages/Hecuba-0.1.3-py3.6-linux-x86_64.egg/libcassandra.so.2) +==18661== by 0xEF370C1: cass_session_connect_keyspace (in /home/ismael/.local/lib/python3.6/site-packages/Hecuba-0.1.3-py3.6-linux-x86_64.egg/libcassandra.so.2) +==18661== by 0xEF37088: cass_session_connect (in /home/ismael/.local/lib/python3.6/site-packages/Hecuba-0.1.3-py3.6-linux-x86_64.egg/libcassandra.so.2) +==18661== by 0xE9ADB96: StorageInterface::StorageInterface(int, std::__cxx11::basic_string, std::allocator >) (in /home/ismael/.local/lib/python3.6/site-packages/Hecuba-0.1.3-py3.6-linux-x86_64.egg/libhfetch.so) +==18661== by 0xE77A193: construct, std::allocator >&> (new_allocator.h:136) +==18661== by 0xE77A193: construct, std::allocator >&> (alloc_traits.h:475) +==18661== by 0xE77A193: _Sp_counted_ptr_inplace, std::allocator >&> (shared_ptr_base.h:526) +==18661== by 0xE77A193: __shared_count, int&, std::__cxx11::basic_string, std::allocator >&> (shared_ptr_base.h:637) +==18661== by 0xE77A193: __shared_ptr, int&, std::__cxx11::basic_string, std::allocator >&> (shared_ptr_base.h:1295) +==18661== by 0xE77A193: shared_ptr, int&, std::__cxx11::basic_string, std::allocator >&> (shared_ptr.h:344) +==18661== by 0xE77A193: allocate_shared, int&, std::__cxx11::basic_string, std::allocator >&> (shared_ptr.h:691) +==18661== by 0xE77A193: make_shared, std::allocator >&> (shared_ptr.h:707) +==18661== by 0xE77A193: connectCassandra(_object*, _object*) (HCache.cpp:31) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== +==18661== 336 bytes in 1 blocks are possibly lost in loss record 966 of 2,328 +==18661== at 0x4C31B25: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x40134A6: allocate_dtv (dl-tls.c:286) +==18661== by 0x40134A6: _dl_allocate_tls (dl-tls.c:530) +==18661== by 0x5235227: allocate_stack (allocatestack.c:627) +==18661== by 0x5235227: pthread_create@@GLIBC_2.2.5 (pthread_create.c:644) +==18661== by 0x631EEC: PyThread_start_new_thread (in /usr/bin/python3.6) +==18661== by 0x5E1AAD: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x747B9F4: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x74D8CF1: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x594F4B: ??? (in /usr/bin/python3.6) +==18661== by 0x54A2C4: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== +==18661== 336 bytes in 1 blocks are possibly lost in loss record 967 of 2,328 +==18661== at 0x4C31B25: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x40134A6: allocate_dtv (dl-tls.c:286) +==18661== by 0x40134A6: _dl_allocate_tls (dl-tls.c:530) +==18661== by 0x5235227: allocate_stack (allocatestack.c:627) +==18661== by 0x5235227: pthread_create@@GLIBC_2.2.5 (pthread_create.c:644) +==18661== by 0x631EEC: PyThread_start_new_thread (in /usr/bin/python3.6) +==18661== by 0x5E1AAD: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x9B32774: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B4D541: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x594F4B: ??? (in /usr/bin/python3.6) +==18661== by 0x54A2C4: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== +==18661== 336 bytes in 1 blocks are possibly lost in loss record 968 of 2,328 +==18661== at 0x4C31B25: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x40134A6: allocate_dtv (dl-tls.c:286) +==18661== by 0x40134A6: _dl_allocate_tls (dl-tls.c:530) +==18661== by 0x5235227: allocate_stack (allocatestack.c:627) +==18661== by 0x5235227: pthread_create@@GLIBC_2.2.5 (pthread_create.c:644) +==18661== by 0x631EEC: PyThread_start_new_thread (in /usr/bin/python3.6) +==18661== by 0x5E1AAD: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== 520 bytes in 1 blocks are possibly lost in loss record 1,007 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x550BF0: PyTuple_New (in /usr/bin/python3.6) +==18661== by 0x4F4625: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A8D: ??? (in /usr/bin/python3.6) +==18661== by 0x4F471F: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== +==18661== 520 bytes in 1 blocks are possibly lost in loss record 1,008 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== +==18661== 520 bytes in 1 blocks are possibly lost in loss record 1,009 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0xBECD461: PyArray_NewFromDescr_int (ctors.c:1134) +==18661== by 0xBEC5667: PyArray_View (convert.c:620) +==18661== by 0xBF5C942: array_view (methods.c:286) +==18661== by 0x566FEB: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== +==18661== 520 bytes in 1 blocks are possibly lost in loss record 1,010 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== +==18661== 520 bytes in 1 blocks are possibly lost in loss record 1,011 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== 520 bytes in 1 blocks are possibly lost in loss record 1,012 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== +==18661== 520 bytes in 1 blocks are possibly lost in loss record 1,013 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x509360: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x557877: ??? (in /usr/bin/python3.6) +==18661== by 0x50C81D: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== +==18661== 520 bytes in 1 blocks are possibly lost in loss record 1,014 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x9B3272A: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B35CE5: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B7F0A7: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B50B7D: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x9B36F2B: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== 520 bytes in 1 blocks are possibly lost in loss record 1,015 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== +==18661== 520 bytes in 1 blocks are possibly lost in loss record 1,016 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x50D8F4: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== 528 bytes in 1 blocks are possibly lost in loss record 1,033 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x515C35: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== 528 bytes in 1 blocks are possibly lost in loss record 1,034 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x509360: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A643D: _PyObject_CallMethodIdObjArgs (in /usr/bin/python3.6) +==18661== by 0x4F70FC: PyImport_ImportModuleLevelObject (in /usr/bin/python3.6) +==18661== by 0x514753: ??? (in /usr/bin/python3.6) +==18661== by 0x5673A2: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== +==18661== 528 bytes in 1 blocks are possibly lost in loss record 1,035 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== +==18661== 528 bytes in 1 blocks are possibly lost in loss record 1,036 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x58AD4F: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== 528 bytes in 1 blocks are possibly lost in loss record 1,037 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x58AD4F: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x557877: ??? (in /usr/bin/python3.6) +==18661== by 0x50C81D: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== +==18661== 528 bytes in 1 blocks are possibly lost in loss record 1,038 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x557877: ??? (in /usr/bin/python3.6) +==18661== by 0x50C81D: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5895E0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== +==18661== 528 bytes in 1 blocks are possibly lost in loss record 1,039 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x9B57A5F: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x594F4B: ??? (in /usr/bin/python3.6) +==18661== by 0x747C58D: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x594F4B: ??? (in /usr/bin/python3.6) +==18661== +==18661== 536 bytes in 1 blocks are possibly lost in loss record 1,045 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x549F21: ??? (in /usr/bin/python3.6) +==18661== by 0x5516F4: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== 536 bytes in 1 blocks are possibly lost in loss record 1,046 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x549F21: ??? (in /usr/bin/python3.6) +==18661== by 0x5516F4: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x515C74: ??? (in /usr/bin/python3.6) +==18661== +==18661== 536 bytes in 1 blocks are possibly lost in loss record 1,047 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x5895E0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5F0671: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x50D8F4: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== +==18661== 536 bytes in 1 blocks are possibly lost in loss record 1,048 of 2,328 +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x58AD4F: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5757: PyObject_CallFunctionObjArgs (in /usr/bin/python3.6) +==18661== by 0x611DBF: ??? (in /usr/bin/python3.6) +==18661== by 0x61235D: ??? (in /usr/bin/python3.6) +==18661== +==18661== 536 bytes in 1 blocks are possibly lost in loss record 1,049 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50B288: PyEval_EvalCodeEx (in /usr/bin/python3.6) +==18661== by 0x747B813: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x7486F95: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x74BE417: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x7572F88: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x75773F1: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x7486E8A: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x74DD773: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== +==18661== 536 bytes in 1 blocks are possibly lost in loss record 1,050 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x7473B28: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x7486E8A: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== +==18661== 536 bytes in 1 blocks are possibly lost in loss record 1,051 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== +==18661== 544 bytes in 1 blocks are possibly lost in loss record 1,058 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x509360: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0xBECD461: PyArray_NewFromDescr_int (ctors.c:1134) +==18661== by 0xBEC5667: PyArray_View (convert.c:620) +==18661== by 0xBF5C942: array_view (methods.c:286) +==18661== by 0x566FEB: _PyCFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5470: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x4B291C: ??? (in /usr/bin/python3.6) +==18661== +==18661== 544 bytes in 1 blocks are possibly lost in loss record 1,059 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x549F21: ??? (in /usr/bin/python3.6) +==18661== by 0x5516F4: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== +==18661== 544 bytes in 1 blocks are possibly lost in loss record 1,060 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x58AD4F: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x549F21: ??? (in /usr/bin/python3.6) +==18661== +==18661== 552 bytes in 1 blocks are possibly lost in loss record 1,070 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x58952A: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x50D8F4: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== 552 bytes in 1 blocks are possibly lost in loss record 1,071 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5F0ADB: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== +==18661== 552 bytes in 1 blocks are possibly lost in loss record 1,072 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x7473B28: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x7486E8A: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x74C794C: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x594F4B: ??? (in /usr/bin/python3.6) +==18661== by 0x75AC164: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x594F4B: ??? (in /usr/bin/python3.6) +==18661== +==18661== 560 bytes in 1 blocks are possibly lost in loss record 1,079 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5F0ADB: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== +==18661== 560 bytes in 1 blocks are possibly lost in loss record 1,080 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x50A487: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== 560 bytes in 1 blocks are possibly lost in loss record 1,081 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x58966C: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x50D8F4: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== 560 bytes in 1 blocks are possibly lost in loss record 1,082 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== 568 bytes in 1 blocks are possibly lost in loss record 1,087 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5757: PyObject_CallFunctionObjArgs (in /usr/bin/python3.6) +==18661== by 0x50DC02: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== 568 bytes in 1 blocks are possibly lost in loss record 1,088 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A643D: _PyObject_CallMethodIdObjArgs (in /usr/bin/python3.6) +==18661== by 0x4F70FC: PyImport_ImportModuleLevelObject (in /usr/bin/python3.6) +==18661== by 0x514753: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== 568 bytes in 1 blocks are possibly lost in loss record 1,089 of 2,328 +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x50A487: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A643D: _PyObject_CallMethodIdObjArgs (in /usr/bin/python3.6) +==18661== by 0x4F70FC: PyImport_ImportModuleLevelObject (in /usr/bin/python3.6) +==18661== by 0x50E47D: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== +==18661== 568 bytes in 1 blocks are possibly lost in loss record 1,090 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x9B57A5F: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/connection.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x594F4B: ??? (in /usr/bin/python3.6) +==18661== +==18661== 576 bytes in 1 blocks are possibly lost in loss record 1,276 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x509360: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5757: PyObject_CallFunctionObjArgs (in /usr/bin/python3.6) +==18661== by 0x50DC02: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== +==18661== 584 bytes in 1 blocks are possibly lost in loss record 1,281 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x50A487: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== +==18661== 592 bytes in 1 blocks are possibly lost in loss record 1,286 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x50D8F4: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== 592 bytes in 1 blocks are possibly lost in loss record 1,287 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x747B9AA: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x74D8CF1: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x594F4B: ??? (in /usr/bin/python3.6) +==18661== by 0x54A2C4: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x7467BF8: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x742D221: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x74830AA: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x754BAA4: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== +==18661== 600 bytes in 1 blocks are possibly lost in loss record 1,291 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x58952A: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x630D8B: PyObject_CallMethod (in /usr/bin/python3.6) +==18661== by 0x638BDD: ??? (in /usr/bin/python3.6) +==18661== by 0x638E51: _Py_InitializeEx_Private (in /usr/bin/python3.6) +==18661== by 0x63916E: Py_Main (in /usr/bin/python3.6) +==18661== +==18661== 600 bytes in 1 blocks are possibly lost in loss record 1,292 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x58952A: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x630D8B: PyObject_CallMethod (in /usr/bin/python3.6) +==18661== +==18661== 600 bytes in 1 blocks are possibly lost in loss record 1,293 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x5896FB: ??? (in /usr/bin/python3.6) +==18661== by 0x75AC623: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x594F4B: ??? (in /usr/bin/python3.6) +==18661== by 0x54A2C4: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x74DFFA5: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x7486E8A: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x7581B26: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so) +==18661== +==18661== 608 bytes in 1 blocks are possibly lost in loss record 1,306 of 2,328 +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x50A487: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== 608 bytes in 1 blocks are possibly lost in loss record 1,307 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x58AD4F: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A643D: _PyObject_CallMethodIdObjArgs (in /usr/bin/python3.6) +==18661== by 0x4F704B: PyImport_ImportModuleLevelObject (in /usr/bin/python3.6) +==18661== by 0x50E47D: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== +==18661== 624 bytes in 1 blocks are possibly lost in loss record 1,315 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== 624 bytes in 1 blocks are possibly lost in loss record 1,316 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== +==18661== 632 bytes in 1 blocks are possibly lost in loss record 1,318 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== 632 bytes in 1 blocks are possibly lost in loss record 1,319 of 2,328 +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x58AD4F: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x5896FB: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x50D8F4: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== 640 bytes in 1 blocks are possibly lost in loss record 1,324 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== +==18661== 648 bytes in 1 blocks are possibly lost in loss record 1,329 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x61A5E0: ??? (in /usr/bin/python3.6) +==18661== +==18661== 656 bytes in 1 blocks are possibly lost in loss record 1,332 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54AC00: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== +==18661== 656 bytes in 1 blocks are possibly lost in loss record 1,333 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== +==18661== 656 bytes in 1 blocks are possibly lost in loss record 1,334 of 2,328 +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x58AD4F: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== +==18661== 672 bytes in 1 blocks are possibly lost in loss record 1,343 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x549F21: ??? (in /usr/bin/python3.6) +==18661== by 0x5516F4: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== +==18661== 672 bytes in 1 blocks are possibly lost in loss record 1,344 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== +==18661== 672 bytes in 1 blocks are possibly lost in loss record 1,345 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x5896FB: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x50D8F4: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== 672 bytes in 2 blocks are possibly lost in loss record 1,346 of 2,328 +==18661== at 0x4C31B25: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x40134A6: allocate_dtv (dl-tls.c:286) +==18661== by 0x40134A6: _dl_allocate_tls (dl-tls.c:530) +==18661== by 0x5235227: allocate_stack (allocatestack.c:627) +==18661== by 0x5235227: pthread_create@@GLIBC_2.2.5 (pthread_create.c:644) +==18661== by 0x13A78CC0: uv_thread_create (in /usr/lib/x86_64-linux-gnu/libuv.so.1.0.0) +==18661== by 0xEF3DA5F: cass::LoopThread::run() (in /home/ismael/.local/lib/python3.6/site-packages/Hecuba-0.1.3-py3.6-linux-x86_64.egg/libcassandra.so.2) +==18661== by 0xEF396B4: cass::Session::on_run() (in /home/ismael/.local/lib/python3.6/site-packages/Hecuba-0.1.3-py3.6-linux-x86_64.egg/libcassandra.so.2) +==18661== by 0xEF3DB07: cass::LoopThread::on_run_internal(void*) (in /home/ismael/.local/lib/python3.6/site-packages/Hecuba-0.1.3-py3.6-linux-x86_64.egg/libcassandra.so.2) +==18661== by 0x52346DA: start_thread (pthread_create.c:463) +==18661== by 0x4F5D88E: clone (clone.S:95) +==18661== +==18661== 696 bytes in 1 blocks are possibly lost in loss record 1,352 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x550BF0: PyTuple_New (in /usr/bin/python3.6) +==18661== by 0x4F4625: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4AA3: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== +==18661== 704 bytes in 1 blocks are possibly lost in loss record 1,355 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== +==18661== 712 bytes in 1 blocks are possibly lost in loss record 1,356 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54AC00: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== +==18661== 712 bytes in 1 blocks are possibly lost in loss record 1,357 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x13838CCB: tbb::internal::padded_allocate(unsigned long, unsigned long) (cache_aligned_allocator.cpp:204) +==18661== by 0x13838DB3: tbb::internal::NFS_Allocate(unsigned long, unsigned long, void*) (cache_aligned_allocator.cpp:190) +==18661== by 0x13831CF5: allocate (cache_aligned_allocator.h:82) +==18661== by 0x13831CF5: tbb::internal::concurrent_queue_base_v3::concurrent_queue_base_v3(unsigned long) (concurrent_queue.cpp:345) +==18661== by 0xE9C3FB3: Writer::Writer(TableMetadata const*, CassSession_*, std::map, std::allocator >, std::__cxx11::basic_string, std::allocator >, std::less, std::allocator > >, std::allocator, std::allocator > const, std::__cxx11::basic_string, std::allocator > > > >&) (in /home/ismael/.local/lib/python3.6/site-packages/Hecuba-0.1.3-py3.6-linux-x86_64.egg/libhfetch.so) +==18661== by 0xE9A4EE9: CacheTable::CacheTable(TableMetadata const*, CassSession_*, std::map, std::allocator >, std::__cxx11::basic_string, std::allocator >, std::less, std::allocator > >, std::allocator, std::allocator > const, std::__cxx11::basic_string, std::allocator > > > >&) (in /home/ismael/.local/lib/python3.6/site-packages/Hecuba-0.1.3-py3.6-linux-x86_64.egg/libhfetch.so) +==18661== by 0xE9ADFFB: StorageInterface::make_cache(char const*, char const*, std::vector, std::allocator >, std::__cxx11::basic_string, std::allocator >, std::less, std::allocator > >, std::allocator, std::allocator > const, std::__cxx11::basic_string, std::allocator > > > >, std::allocator, std::allocator >, std::__cxx11::basic_string, std::allocator >, std::less, std::allocator > >, std::allocator, std::allocator > const, std::__cxx11::basic_string, std::allocator > > > > > >&, std::vector, std::allocator >, std::__cxx11::basic_string, std::allocator >, std::less, std::allocator > >, std::allocator, std::allocator > const, std::__cxx11::basic_string, std::allocator > > > >, std::allocator, std::allocator >, std::__cxx11::basic_string, std::allocator >, std::less, std::allocator > >, std::allocator, std::allocator > const, std::__cxx11::basic_string, std::allocator > > > > > >&, std::map, std::allocator >, std::__cxx11::basic_string, std::allocator >, std::less, std::allocator > >, std::allocator, std::allocator > const, std::__cxx11::basic_string, std::allocator > > > >&) (in /home/ismael/.local/lib/python3.6/site-packages/Hecuba-0.1.3-py3.6-linux-x86_64.egg/libhfetch.so) +==18661== by 0xE780ED5: hcache_init(HCache*, _object*, _object*) (HCache.cpp:325) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x50D8F4: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== 800 bytes in 1 blocks are possibly lost in loss record 1,370 of 2,328 +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x58AD4F: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x509360: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x219A6AB8: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/metadata.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x2198C5DB: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/metadata.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x56667A: PyModule_ExecDef (in /usr/bin/python3.6) +==18661== by 0x4FB883: ??? (in /usr/bin/python3.6) +==18661== by 0x567374: PyCFunction_Call (in /usr/bin/python3.6) +==18661== +==18661== 808 bytes in 1 blocks are possibly lost in loss record 1,371 of 2,328 +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x50A487: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== 856 bytes in 1 blocks are possibly lost in loss record 1,382 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x58AD4F: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== 1,016 bytes in 1 blocks are possibly lost in loss record 1,761 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== +==18661== 1,040 bytes in 2 blocks are possibly lost in loss record 1,774 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x58AD4F: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== 1,056 bytes in 2 blocks are possibly lost in loss record 1,781 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x50881A: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== +==18661== 1,066 bytes in 1 blocks are possibly lost in loss record 1,782 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x544B0E: PyUnicode_New (in /usr/bin/python3.6) +==18661== by 0x54603C: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4581: ??? (in /usr/bin/python3.6) +==18661== by 0x4F471F: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== 1,080 bytes in 2 blocks are possibly lost in loss record 1,784 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== +==18661== 1,080 bytes in 2 blocks are possibly lost in loss record 1,785 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x50D8F4: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== +==18661== 1,120 bytes in 2 blocks are possibly lost in loss record 1,878 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5757: PyObject_CallFunctionObjArgs (in /usr/bin/python3.6) +==18661== by 0x50DD07: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== +==18661== 1,136 bytes in 2 blocks are possibly lost in loss record 1,881 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x50A487: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A643D: _PyObject_CallMethodIdObjArgs (in /usr/bin/python3.6) +==18661== by 0x4F70FC: PyImport_ImportModuleLevelObject (in /usr/bin/python3.6) +==18661== by 0x514753: ??? (in /usr/bin/python3.6) +==18661== by 0x5673A2: PyCFunction_Call (in /usr/bin/python3.6) +==18661== +==18661== 1,160 bytes in 2 blocks are possibly lost in loss record 1,892 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== 1,160 bytes in 2 blocks are possibly lost in loss record 1,893 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x50A487: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== +==18661== 1,168 bytes in 2 blocks are possibly lost in loss record 1,894 of 2,328 +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x58AD4F: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== 1,184 bytes in 2 blocks are possibly lost in loss record 1,897 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x550BF0: PyTuple_New (in /usr/bin/python3.6) +==18661== by 0x4F4625: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A8D: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== +==18661== 1,192 bytes in 2 blocks are possibly lost in loss record 1,898 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x550BF0: PyTuple_New (in /usr/bin/python3.6) +==18661== by 0x4F4625: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A8D: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== 1,216 bytes in 2 blocks are possibly lost in loss record 1,901 of 2,328 +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x58AD4F: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A643D: _PyObject_CallMethodIdObjArgs (in /usr/bin/python3.6) +==18661== by 0x4F704B: PyImport_ImportModuleLevelObject (in /usr/bin/python3.6) +==18661== by 0x50E47D: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== +==18661== 1,224 bytes in 2 blocks are possibly lost in loss record 1,902 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== +==18661== 1,240 bytes in 2 blocks are possibly lost in loss record 1,904 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== 1,280 bytes in 4 blocks are possibly lost in loss record 1,913 of 2,328 +==18661== at 0x4C31B25: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x40134A6: allocate_dtv (dl-tls.c:286) +==18661== by 0x40134A6: _dl_allocate_tls (dl-tls.c:530) +==18661== by 0x5235227: allocate_stack (allocatestack.c:627) +==18661== by 0x5235227: pthread_create@@GLIBC_2.2.5 (pthread_create.c:644) +==18661== by 0xC7197E7: blas_thread_init (in /home/ismael/.local/lib/python3.6/site-packages/numpy/.libs/libopenblasp-r0-2ecf47d5.3.7.dev.so) +==18661== by 0xC4EE084: gotoblas_init (in /home/ismael/.local/lib/python3.6/site-packages/numpy/.libs/libopenblasp-r0-2ecf47d5.3.7.dev.so) +==18661== by 0x4010732: call_init (dl-init.c:72) +==18661== by 0x4010732: _dl_init (dl-init.c:119) +==18661== by 0x40151FE: dl_open_worker (dl-open.c:522) +==18661== by 0x4FA32DE: _dl_catch_exception (dl-error-skeleton.c:196) +==18661== by 0x40147C9: _dl_open (dl-open.c:605) +==18661== by 0x544CF95: dlopen_doit (dlopen.c:66) +==18661== by 0x4FA32DE: _dl_catch_exception (dl-error-skeleton.c:196) +==18661== by 0x4FA336E: _dl_catch_error (dl-error-skeleton.c:215) +==18661== +==18661== 1,344 bytes in 2 blocks are possibly lost in loss record 1,923 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x5A6DF9: PyObject_CallFunction (in /usr/bin/python3.6) +==18661== by 0x22549E6C: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/io/libevwrapper.cpython-36m-x86_64-linux-gnu.so) +==18661== by 0x22755152: ev_invoke_pending (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/.libs/libev-aea52ade.so.4.0.0) +==18661== by 0x22756044: ev_run (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/.libs/libev-aea52ade.so.4.0.0) +==18661== by 0x2254A00B: ??? (in /home/ismael/.local/lib/python3.6/site-packages/cassandra/io/libevwrapper.cpython-36m-x86_64-linux-gnu.so) +==18661== +==18661== 1,408 bytes in 2 blocks are possibly lost in loss record 1,928 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x5A04CD: PyObject_Call (in /usr/bin/python3.6) +==18661== by 0x50D8F4: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== +==18661== 1,584 bytes in 3 blocks are possibly lost in loss record 1,950 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x58AD4F: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x509360: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A643D: _PyObject_CallMethodIdObjArgs (in /usr/bin/python3.6) +==18661== by 0x4F70FC: PyImport_ImportModuleLevelObject (in /usr/bin/python3.6) +==18661== by 0x50E47D: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== +==18661== 1,632 bytes in 1 blocks are possibly lost in loss record 1,951 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x58AD4F: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x509360: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== 1,632 bytes in 1 blocks are possibly lost in loss record 1,952 of 2,328 +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x58AD4F: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x509360: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== +==18661== 1,752 bytes in 3 blocks are possibly lost in loss record 1,966 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== 1,816 bytes in 2 blocks are possibly lost in loss record 1,970 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x58952A: ??? (in /usr/bin/python3.6) +==18661== +==18661== 2,216 bytes in 4 blocks are possibly lost in loss record 2,050 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== 2,280 bytes in 4 blocks are possibly lost in loss record 2,056 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== 2,288 bytes in 4 blocks are possibly lost in loss record 2,057 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x58AD4F: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== 2,304 bytes in 4 blocks are possibly lost in loss record 2,062 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== 2,392 bytes in 4 blocks are possibly lost in loss record 2,064 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x549F21: ??? (in /usr/bin/python3.6) +==18661== by 0x5516F4: ??? (in /usr/bin/python3.6) +==18661== by 0x5A508B: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x515C74: ??? (in /usr/bin/python3.6) +==18661== by 0x50ABC4: ??? (in /usr/bin/python3.6) +==18661== by 0x50D31F: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== 2,400 bytes in 4 blocks are possibly lost in loss record 2,065 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x509646: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5951C0: ??? (in /usr/bin/python3.6) +==18661== by 0x54A11E: ??? (in /usr/bin/python3.6) +==18661== by 0x551760: ??? (in /usr/bin/python3.6) +==18661== by 0x5AA69B: _PyObject_FastCallKeywords (in /usr/bin/python3.6) +==18661== by 0x50AB52: ??? (in /usr/bin/python3.6) +==18661== +==18661== 2,744 bytes in 5 blocks are possibly lost in loss record 2,078 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== 2,848 bytes in 5 blocks are possibly lost in loss record 2,081 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== 3,064 bytes in 5 blocks are possibly lost in loss record 2,085 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== 3,336 bytes in 6 blocks are possibly lost in loss record 2,092 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== 3,376 bytes in 6 blocks are possibly lost in loss record 2,098 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== 3,408 bytes in 6 blocks are possibly lost in loss record 2,099 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x50A487: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A643D: _PyObject_CallMethodIdObjArgs (in /usr/bin/python3.6) +==18661== by 0x4F70FC: PyImport_ImportModuleLevelObject (in /usr/bin/python3.6) +==18661== by 0x50E47D: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== 3,472 bytes in 6 blocks are possibly lost in loss record 2,100 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== 3,976 bytes in 7 blocks are possibly lost in loss record 2,109 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A643D: _PyObject_CallMethodIdObjArgs (in /usr/bin/python3.6) +==18661== by 0x4F70FC: PyImport_ImportModuleLevelObject (in /usr/bin/python3.6) +==18661== by 0x514753: ??? (in /usr/bin/python3.6) +==18661== by 0x5673A2: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== 4,752 bytes in 9 blocks are possibly lost in loss record 2,154 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x509360: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A643D: _PyObject_CallMethodIdObjArgs (in /usr/bin/python3.6) +==18661== by 0x4F70FC: PyImport_ImportModuleLevelObject (in /usr/bin/python3.6) +==18661== by 0x50E47D: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== by 0x5115AE: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== 5,232 bytes in 9 blocks are possibly lost in loss record 2,169 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== 5,280 bytes in 10 blocks are possibly lost in loss record 2,170 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== 5,352 bytes in 9 blocks are possibly lost in loss record 2,173 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== 5,472 bytes in 9 blocks are possibly lost in loss record 2,174 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x5095D1: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A643D: _PyObject_CallMethodIdObjArgs (in /usr/bin/python3.6) +==18661== by 0x4F704B: PyImport_ImportModuleLevelObject (in /usr/bin/python3.6) +==18661== by 0x50E47D: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== +==18661== 5,552 bytes in 10 blocks are possibly lost in loss record 2,177 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5AC5E3: ??? (in /usr/bin/python3.6) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x50A487: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== +==18661== 5,680 bytes in 10 blocks are possibly lost in loss record 2,182 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x50A3B2: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5093E4: _PyFunction_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A5400: _PyObject_FastCallDict (in /usr/bin/python3.6) +==18661== by 0x5A643D: _PyObject_CallMethodIdObjArgs (in /usr/bin/python3.6) +==18661== by 0x4F70FC: PyImport_ImportModuleLevelObject (in /usr/bin/python3.6) +==18661== by 0x50E47D: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== +==18661== 5,920 bytes in 10 blocks are possibly lost in loss record 2,184 of 2,328 +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x58AD4F: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== +==18661== 6,392 bytes in 10 blocks are possibly lost in loss record 2,187 of 2,328 +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x50A487: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== +==18661== 6,776 bytes in 7 blocks are possibly lost in loss record 2,191 of 2,328 +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x58AD4F: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== +==18661== 10,488 bytes in 16 blocks are possibly lost in loss record 2,242 of 2,328 +==18661== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x59FC97: _PyObject_GC_Resize (in /usr/bin/python3.6) +==18661== by 0x50A487: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== 13,296 bytes in 15 blocks are possibly lost in loss record 2,252 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x5A4A4A: ??? (in /usr/bin/python3.6) +==18661== by 0x58ACF2: PyFrame_New (in /usr/bin/python3.6) +==18661== by 0x508051: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x50A01F: ??? (in /usr/bin/python3.6) +==18661== +==18661== 44,692 bytes in 23 blocks are possibly lost in loss record 2,293 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x544B0E: PyUnicode_New (in /usr/bin/python3.6) +==18661== by 0x54603C: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4581: ??? (in /usr/bin/python3.6) +==18661== by 0x4F464F: ??? (in /usr/bin/python3.6) +==18661== by 0x4F4A77: ??? (in /usr/bin/python3.6) +==18661== by 0x4F475E: ??? (in /usr/bin/python3.6) +==18661== by 0x4F53E9: ??? (in /usr/bin/python3.6) +==18661== by 0x4FAC86: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== +==18661== 128,793 bytes in 65 blocks are possibly lost in loss record 2,310 of 2,328 +==18661== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) +==18661== by 0x544B0E: PyUnicode_New (in /usr/bin/python3.6) +==18661== by 0x535CA1: PyUnicode_Substring (in /usr/bin/python3.6) +==18661== by 0x5369D2: ??? (in /usr/bin/python3.6) +==18661== by 0x50A84E: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x509CE7: ??? (in /usr/bin/python3.6) +==18661== by 0x50AA1C: ??? (in /usr/bin/python3.6) +==18661== by 0x50C548: _PyEval_EvalFrameDefault (in /usr/bin/python3.6) +==18661== by 0x5081D4: ??? (in /usr/bin/python3.6) +==18661== by 0x516718: ??? (in /usr/bin/python3.6) +==18661== by 0x5673DD: PyCFunction_Call (in /usr/bin/python3.6) +==18661== +==18661== LEAK SUMMARY: +==18661== definitely lost: 22 bytes in 2 blocks +==18661== indirectly lost: 0 bytes in 0 blocks +==18661== possibly lost: 365,263 bytes in 402 blocks +==18661== still reachable: 11,418,831 bytes in 26,786 blocks +==18661== of which reachable via heuristic: +==18661== newarray : 524,456 bytes in 3 blocks +==18661== suppressed: 0 bytes in 0 blocks +==18661== Reachable blocks (those to which a pointer was found) are not shown. +==18661== To see them, rerun with: --leak-check=full --show-leak-kinds=all +==18661== +==18661== For counts of detected and suppressed errors, rerun with: -v +==18661== ERROR SUMMARY: 25480 errors from 405 contexts (suppressed: 0 from 0) diff --git a/storage/cql_iface/config.py b/storage/cql_iface/config.py index 2eb59728..08a08e43 100644 --- a/storage/cql_iface/config.py +++ b/storage/cql_iface/config.py @@ -20,7 +20,7 @@ # FrozenSet: 'set', decimal.Decimal: 'decimal', datetime.date: 'date', - datetime.datetime: 'datetime', + datetime.datetime: 'timestamp', datetime.time: 'time', numpy.int8: 'tinyint', numpy.int16: 'smallint', diff --git a/storage/cql_iface/cql_comm.py b/storage/cql_iface/cql_comm.py index 64e0c1be..03f82919 100644 --- a/storage/cql_iface/cql_comm.py +++ b/storage/cql_iface/cql_comm.py @@ -48,12 +48,16 @@ def parse_definition_to_cass_format(fields_dict): all_values = "" for k, v in fields_dict.items(): try: - all_values = all_values + "%s %s," % (k, _hecuba2cassandra_typemap[v]) + all_values = all_values + f'{k} {_hecuba2cassandra_typemap[v]}, ' except KeyError: - if v.__origin__ in _hecuba2cassandra_typemap: + try: + check = v.__origin__ + except AttributeError: + check = v + # check if types exist val = str(v) - all_values = all_values + str(k) + f" tuple<{val[val.find('[') + 1:val.rfind(']')]}>," - return all_values[:-1] + all_values = all_values + f'{k} tuple<{", ".join(a.__name__ for a in v)}>, ' + return all_values @staticmethod def create_table(name: str, definition: dict) -> None: @@ -71,11 +75,11 @@ def create_table(name: str, definition: dict) -> None: all_keys = CqlCOMM.parse_definition_to_cass_format(primary_keys) if columns: all_cols = CqlCOMM.parse_definition_to_cass_format(columns) - total_cols = all_keys + ',' + all_cols + total_cols = f'{all_keys} {all_cols}' else: total_cols = all_keys - query_table = "CREATE TABLE IF NOT EXISTS %s.%s (%s, PRIMARY KEY (%s));" \ + query_table = "CREATE TABLE IF NOT EXISTS %s.%s (%s PRIMARY KEY (%s));" \ % (ksp, table, total_cols, diff --git a/storage/cql_iface/cql_iface.py b/storage/cql_iface/cql_iface.py index 096d0a41..a8ea9e99 100644 --- a/storage/cql_iface/cql_iface.py +++ b/storage/cql_iface/cql_iface.py @@ -2,7 +2,7 @@ from typing import List, Generator from uuid import UUID -from storage.cql_iface.tests.mockIStorage import IStorage +from hecuba.IStorage import IStorage from .config import _hecuba2cassandra_typemap from .cql_comm import CqlCOMM from .queries import istorage_read_entry, istorage_prepared_st @@ -73,7 +73,7 @@ def add_data_model(self, definition: dict) -> int: def register_persistent_object(self, datamodel_id: int, pyobject: IStorage) -> UUID: if not isinstance(pyobject, IStorage): raise RuntimeError("Class does not inherit IStorage") - elif not pyobject.is_persistent(): + elif not pyobject._is_persistent: raise ValueError("Class needs to be a persistent object, it needs id and name") elif datamodel_id is None: raise ValueError("datamodel_id cannot be None") @@ -116,34 +116,34 @@ def put_record(self, object_id: UUID, key_list: dict, value_list: dict) -> None: raise TypeError("key_list and value_list must be OrderedDict") data_model = self.data_models_cache[self.object_to_data_model[object_id]] - for v in value_list: - try: - if not isinstance(value_list[v], data_model["fields"][v]) and value_list[v] is not None: - raise TypeError("The value types don't match the data model specification") - except TypeError: - try: - if not isinstance(value_list[v], data_model["fields"][v].__origin__): - raise TypeError("The value types don't match the data model specification") - except AttributeError: - raise TypeError("The value types don't match the data model specification") - - for k in key_list: - try: - if not isinstance(key_list[k], data_model["value_id"][k]): - raise TypeError("The key types don't match the data model specification") - except TypeError: - try: - if not isinstance(key_list[k], data_model["value_id"][k].__origin__): - raise TypeError("The value types don't match the data model specification") - except AttributeError: - raise TypeError("The value types don't match the data model specification") + # for v in value_list: + # try: + # if not isinstance(value_list[v], data_model["fields"][v]) and value_list[v] is not None: + # raise TypeError("The value types don't match the data model specification") + # except TypeError: + # try: + # if not isinstance(value_list[v], data_model["fields"][v].__origin__): + # raise TypeError("The value types don't match the data model specification") + # except AttributeError: + # raise TypeError("The value types don't match the data model specification") + # + # for k in key_list: + # try: + # if not isinstance(key_list[k], data_model["value_id"][k]): + # raise TypeError("The key types don't match the data model specification") + # except TypeError: + # try: + # if not isinstance(key_list[k], data_model["value_id"][k].__origin__): + # raise TypeError("The value types don't match the data model specification") + # except AttributeError: + # raise TypeError("The value types don't match the data model specification") values_dict = CQLIface.fill_empty_keys_with_None(value_list, data_model["fields"]) - try: - self.hcache_by_id[object_id].put_row(list(key_list.values()), list(values_dict.values()), + #try: + self.hcache_by_id[object_id].put_row(list(key_list.values()), list(values_dict.values()), list(value_list.keys())) - except Exception: - raise Exception("key_list or value_list have some parameter that does not correspond with the data model") + #except Exception: + # raise Exception("key_list or value_list have some parameter that does not correspond with the data model") def get_record(self, object_id: UUID, key_list: dict) -> List[object]: if not isinstance(object_id, UUID): diff --git a/storage/cql_iface/tests/api_tests.py b/storage/cql_iface/tests/api_tests.py index 00ac2694..46cd269e 100644 --- a/storage/cql_iface/tests/api_tests.py +++ b/storage/cql_iface/tests/api_tests.py @@ -7,7 +7,7 @@ from storage.cql_iface.cql_comm import config from storage.cql_iface.cql_iface import CQLIface -from storage.cql_iface.tests.mockIStorage import IStorage +from hecuba.IStorage import IStorage from storage.cql_iface.tests.mockStorageObj import StorageObj from storage.cql_iface.tests.mockhdict import StorageDict from storage.cql_iface.tests.mockhnumpy import StorageNumpy @@ -766,7 +766,7 @@ def test_get_record_tuple_so(self): obj = TestClass(name=given_name) myid = obj.getID() data_model = {"type": StorageObj, "value_id": {"k": uuid.UUID}, - "fields": {"a": int, "b": Tuple[int, int], "c": int}} + "fields": {"a": int, "b": Tuple[int], "c": int}} given_name = 'storage_test.dict' storage = CQLIface() data_model_id = storage.add_data_model(data_model) @@ -774,8 +774,8 @@ def test_get_record_tuple_so(self): keys = NamedTuple('keys', [('k', uuid.UUID)]) keys = keys(myid)._asdict() - fields = NamedTuple('fields', [('a', int), ('b', Tuple[int, int]), ('c', int)]) - fields = fields(4, (6, 6), 4)._asdict() + fields = NamedTuple('fields', [('a', int), ('b', Tuple[int]), ('c', int)]) + fields = fields(4, (6,), 4)._asdict() storage.put_record(myid, keys, fields) keys = NamedTuple('keys', [('k', uuid.UUID)]) @@ -901,7 +901,7 @@ def test_put_record_StorageDict_split_and_get_data_locality_except_wrong_UUID(se parts.append(partition) self.assertTrue(storage.get_data_locality(myid)) - def test_put_record_StorageDict_split_and_get_data_locality_except_wrong_UUID(self): + def test_put_record_StorageDict_split_and_get_data_locality_except_wrong_UUID_2(self): with self.assertRaises(TypeError): given_name = 'storage_test.complex_obj' config.session.execute("DROP TABLE IF EXISTS {}".format(given_name)) From 9631942d17660bdd206e9b8c9e08d7146900339c Mon Sep 17 00:00:00 2001 From: Ismael Date: Fri, 14 Feb 2020 11:43:35 +0100 Subject: [PATCH 81/81] validating python / c++ --- hecuba_core/src/TableMetadata.cpp | 14 +- hecuba_core/src/TupleRowFactory.cpp | 75 +- hecuba_core/src/py_interface/UnitParser.cpp | 151 +- hecuba_core/src/py_interface/UnitParser.h | 35 +- hecuba_py/tests/__init__.py | 2 +- hecuba_py/tests/withcassandra/__init__.py | 0 .../tests/withcassandra/embeddedset_tests.py | 607 -------- .../tests/withcassandra/hfetch_flush_tests.py | 90 -- hecuba_py/tests/withcassandra/hfetch_tests.py | 32 - .../tests/withcassandra/hfilter_tests.py | 194 --- .../withcassandra/istorage_split_locality.py | 146 -- .../tests/withcassandra/istorage_tests.py | 113 -- .../tests/withcassandra/storage_api_tests.py | 49 - .../withcassandra/storagedict_split_tests.py | 354 ----- .../tests/withcassandra/storagedict_tests.py | 1126 --------------- .../tests/withcassandra/storagenumpy_tests.py | 130 -- .../withcassandra/storageobj_split_tests.py | 171 --- .../tests/withcassandra/storageobj_tests.py | 1281 ----------------- .../tests/withcassandra/test2storageobj.py | 9 - .../tests/withcassandra/tutorial_tests.py | 157 -- 20 files changed, 247 insertions(+), 4489 deletions(-) delete mode 100644 hecuba_py/tests/withcassandra/__init__.py delete mode 100644 hecuba_py/tests/withcassandra/embeddedset_tests.py delete mode 100644 hecuba_py/tests/withcassandra/hfetch_flush_tests.py delete mode 100644 hecuba_py/tests/withcassandra/hfetch_tests.py delete mode 100644 hecuba_py/tests/withcassandra/hfilter_tests.py delete mode 100644 hecuba_py/tests/withcassandra/istorage_split_locality.py delete mode 100644 hecuba_py/tests/withcassandra/istorage_tests.py delete mode 100644 hecuba_py/tests/withcassandra/storage_api_tests.py delete mode 100644 hecuba_py/tests/withcassandra/storagedict_split_tests.py delete mode 100644 hecuba_py/tests/withcassandra/storagedict_tests.py delete mode 100644 hecuba_py/tests/withcassandra/storagenumpy_tests.py delete mode 100644 hecuba_py/tests/withcassandra/storageobj_split_tests.py delete mode 100644 hecuba_py/tests/withcassandra/storageobj_tests.py delete mode 100644 hecuba_py/tests/withcassandra/test2storageobj.py delete mode 100644 hecuba_py/tests/withcassandra/tutorial_tests.py diff --git a/hecuba_core/src/TableMetadata.cpp b/hecuba_core/src/TableMetadata.cpp index 7508bc5a..44e2d210 100644 --- a/hecuba_core/src/TableMetadata.cpp +++ b/hecuba_core/src/TableMetadata.cpp @@ -40,9 +40,7 @@ uint16_t TableMetadata::compute_size_of(const ColumnMeta &CM) const { return sizeof(int32_t); } case CASS_VALUE_TYPE_TIMESTAMP: { - //TODO - std::cerr << "Timestamp data type supported yet" << std::endl; - break; + return sizeof(int64_t); } case CASS_VALUE_TYPE_UUID: { return sizeof(uint64_t *); @@ -58,16 +56,10 @@ uint16_t TableMetadata::compute_size_of(const ColumnMeta &CM) const { break; } case CASS_VALUE_TYPE_DATE: { - std::cerr << "Date data type supported yet" << std::endl; - - //TODO - break; + return sizeof(int64_t); } case CASS_VALUE_TYPE_TIME: { - std::cerr << "Time data type supported yet" << std::endl; - //TODO - - break; + return sizeof(int64_t); } case CASS_VALUE_TYPE_SMALL_INT: { return sizeof(int16_t); diff --git a/hecuba_core/src/TupleRowFactory.cpp b/hecuba_core/src/TupleRowFactory.cpp index 195fb43d..7734c3a4 100644 --- a/hecuba_core/src/TupleRowFactory.cpp +++ b/hecuba_core/src/TupleRowFactory.cpp @@ -206,12 +206,32 @@ int TupleRowFactory::cass_to_c(const CassValue *lhs, void *data, int16_t col) co cass_iterator_free(tuple_iterator); return 0; } + case CASS_VALUE_TYPE_DATE: { + cass_uint32_t year_month_day; + CassError rc = cass_value_get_uint32(lhs, &year_month_day); + CHECK_CASS("TupleRowFactory: Cassandra to C parse uint32 unsuccessful, column:" + std::to_string(col)); + if (rc == CASS_ERROR_LIB_NULL_VALUE) return -1; + int64_t time = (int64_t) cass_date_time_to_epoch(year_month_day, 0); + memcpy(data, &time, sizeof(int64_t *)); + return 0; + } + case CASS_VALUE_TYPE_TIME: { + CassError rc = cass_value_get_int64(lhs, reinterpret_cast(data)); + CHECK_CASS("TupleRowFactory: Cassandra to C parse int64 unsuccessful, column:" + std::to_string(col)); + if (rc == CASS_ERROR_LIB_NULL_VALUE) return -1; + return 0; + } + case CASS_VALUE_TYPE_TIMESTAMP: { + cass_int64_t time_of_day; + CassError rc = cass_value_get_int64(lhs, &time_of_day); + CHECK_CASS("TupleRowFactory: Cassandra to C parse int64 unsuccessful, column:" + std::to_string(col)); + if (rc == CASS_ERROR_LIB_NULL_VALUE) return -1; + memcpy(data, &time_of_day, sizeof(int64_t *)); + return 0; + } case CASS_VALUE_TYPE_DECIMAL: - case CASS_VALUE_TYPE_TIMESTAMP: case CASS_VALUE_TYPE_TIMEUUID: case CASS_VALUE_TYPE_INET: - case CASS_VALUE_TYPE_DATE: - case CASS_VALUE_TYPE_TIME: case CASS_VALUE_TYPE_LIST: case CASS_VALUE_TYPE_MAP: case CASS_VALUE_TYPE_SET: @@ -326,12 +346,29 @@ TupleRowFactory::bind(CassTuple *tuple, const TupleRow *row) const { CHECK_CASS("TupleRowFactory: Cassandra unsuccessful binding a new Tuple to the existing tuple"); break; } + case CASS_VALUE_TYPE_DATE: { + const time_t time = *((time_t *) element_i); + uint32_t year_month_day = cass_date_from_epoch(time); + CassError rc = cass_tuple_set_uint32(tuple, (size_t) bind_pos, year_month_day); + CHECK_CASS("TupleRowFactory: Cassandra unsuccessful binding int64 to the tuple"); + break; + } + case CASS_VALUE_TYPE_TIME: { + int64_t time = *((int64_t *) element_i); + CassError rc = cass_tuple_set_int64(tuple, (size_t) bind_pos, time); + CHECK_CASS("TupleRowFactory: Cassandra unsuccessful binding int64 to the tuple"); + break; + } + case CASS_VALUE_TYPE_TIMESTAMP: { + cass_int64_t time = *((int64_t *) element_i); + CassError rc = cass_tuple_set_int64(tuple, (size_t) bind_pos, time); + CHECK_CASS("TupleRowFactory: Cassandra unsuccessful binding int64 to the tuple"); + break; + + } case CASS_VALUE_TYPE_DECIMAL: - case CASS_VALUE_TYPE_TIMESTAMP: case CASS_VALUE_TYPE_TIMEUUID: case CASS_VALUE_TYPE_INET: - case CASS_VALUE_TYPE_DATE: - case CASS_VALUE_TYPE_TIME: case CASS_VALUE_TYPE_LIST: case CASS_VALUE_TYPE_MAP: case CASS_VALUE_TYPE_SET: @@ -466,7 +503,6 @@ TupleRowFactory::bind(CassStatement *statement, const TupleRow *row, u_int16_t o CassError rc = cass_statement_bind_int8(statement, bind_pos, *data); CHECK_CASS("TupleRowFactory: Cassandra binding query unsuccessful [tiny int as int8], column:" + metadata->at(i).info.begin()->second); - break; } case CASS_VALUE_TYPE_TUPLE: { @@ -480,12 +516,31 @@ TupleRowFactory::bind(CassStatement *statement, const TupleRow *row, u_int16_t o cass_tuple_free(tuple); break; } + case CASS_VALUE_TYPE_DATE: { + const time_t time = *((time_t *) element_i); + cass_uint32_t year_month_day = cass_date_from_epoch(time); + CassError rc = cass_statement_bind_uint32(statement, bind_pos, year_month_day); + CHECK_CASS("TupleRowFactory: Cassandra binding query unsuccessful [date as int64], column:" + + metadata->at(i).info.begin()->second); + break; + } + case CASS_VALUE_TYPE_TIME: { + int64_t time = *((int64_t *) element_i); + CassError rc = cass_statement_bind_int64(statement, bind_pos, time); + CHECK_CASS("TupleRowFactory: Cassandra binding query unsuccessful [time as int64], column:" + + metadata->at(i).info.begin()->second); + break; + } + case CASS_VALUE_TYPE_TIMESTAMP: { + cass_int64_t time = *((int64_t *) element_i); + CassError rc = cass_statement_bind_int64(statement, bind_pos, time); + CHECK_CASS("TupleRowFactory: Cassandra binding query unsuccessful [timestamp as int64], column:" + + metadata->at(i).info.begin()->second); + break; + } case CASS_VALUE_TYPE_DECIMAL: - case CASS_VALUE_TYPE_TIMESTAMP: case CASS_VALUE_TYPE_TIMEUUID: case CASS_VALUE_TYPE_INET: - case CASS_VALUE_TYPE_DATE: - case CASS_VALUE_TYPE_TIME: case CASS_VALUE_TYPE_LIST: case CASS_VALUE_TYPE_MAP: case CASS_VALUE_TYPE_SET: diff --git a/hecuba_core/src/py_interface/UnitParser.cpp b/hecuba_core/src/py_interface/UnitParser.cpp index e72dfed3..944dff63 100644 --- a/hecuba_core/src/py_interface/UnitParser.cpp +++ b/hecuba_core/src/py_interface/UnitParser.cpp @@ -210,6 +210,133 @@ PyObject *TextParser::c_to_py(const void *payload) const { return PyUnicode_FromString(d); } +/***Timestamp parser ***/ + +TimestampParser::TimestampParser(const ColumnMeta &CM) : UnitParser(CM) { + if (CM.size != sizeof(int64_t *)) + throw ModuleException("Bad size allocated for a timestamp"); + if (!PyDateTimeAPI) PyDateTime_IMPORT; +} + +int16_t TimestampParser::py_to_c(PyObject *obj, void *payload) const { + if (obj == Py_None) return -1; + if (PyDateTime_CheckExact(obj)) { + time_t time_now; + time(&time_now); + struct tm timeinfo = {0}; //express datetime to the current timezone (tzset) + timeinfo.tm_sec = PyDateTime_DATE_GET_SECOND(obj); + timeinfo.tm_min = PyDateTime_DATE_GET_MINUTE(obj); + timeinfo.tm_hour = PyDateTime_DATE_GET_HOUR(obj); + timeinfo.tm_year = PyDateTime_GET_YEAR(obj) - 1900; + timeinfo.tm_mon = PyDateTime_GET_MONTH(obj) - 1; + timeinfo.tm_mday = PyDateTime_GET_DAY(obj); + time_t time = mktime(&timeinfo); + if(time == -1) throw ModuleException("Calendar time cannot be represented"); + auto diff = std::chrono::system_clock::from_time_t(time).time_since_epoch(); + std::time_t time_epoch = 0; + time_t timezone = -1 * std::mktime(std::gmtime(&time_epoch)); + int64_t ms = std::chrono::duration_cast(diff).count() + (timezone * 1000); + memcpy(payload, &ms, sizeof(int64_t *)); + return 0; + } + else { //if pyobject is a double it has already the exact date so is no use to call tzset + if (!PyFloat_Check(obj) && !PyLong_Check(obj)) error_parsing("PyDouble", obj); + double t; + if (!PyArg_Parse(obj, Py_DOUBLE, &t)) error_parsing("PyDouble as Double", obj); + time_t time = std::chrono::system_clock::to_time_t(std::chrono::system_clock::time_point(std::chrono::duration_cast(std::chrono::duration(t)))); + auto diff = std::chrono::system_clock::from_time_t(time).time_since_epoch(); + std::time_t time_epoch = 0; + time_t timezone = -1 * std::mktime(std::gmtime(&time_epoch)); + int64_t ms = std::chrono::duration_cast(diff).count() + (timezone * 1000); + memcpy(payload, &ms, sizeof(int64_t *)); + return 0; + } + error_parsing("PyDateTime_DateType", obj); + return -2; +} + +PyObject *TimestampParser::c_to_py(const void *payload) const { + if (!payload) throw ModuleException("Error parsing from C to Py, expected ptr to int, found NULL"); + time_t time = *(reinterpret_cast(payload)) /1000; //we convert from ms to sec (UNIX time) + struct tm * timeinfo = gmtime(&time); //gmt+0 + PyObject *timestamp_py = PyDateTime_FromDateAndTime(timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, 0); + return timestamp_py; +} + +/***Date parser ***/ + +DateParser::DateParser(const ColumnMeta &CM) : UnitParser(CM) { + if (CM.size != sizeof(int64_t *)) + throw ModuleException("Bad size allocated for a date"); + if (!PyDateTimeAPI) PyDateTime_IMPORT; +} + +int16_t DateParser::py_to_c(PyObject *obj, void *payload) const { + if (obj == Py_None) return -1; + if (PyDate_CheckExact(obj)) { + struct tm timeinfo = {0}; //express datetime to the current timezone (tzset) + timeinfo.tm_year = PyDateTime_GET_YEAR(obj) - 1900; + timeinfo.tm_mon = PyDateTime_GET_MONTH(obj) - 1; + timeinfo.tm_mday = PyDateTime_GET_DAY(obj); + std::time_t time_epoch = 0; + time_t time = mktime(&timeinfo); + if(time == -1) throw ModuleException("Calendar time cannot be represented"); + time_t timezone = -1 * std::mktime(std::gmtime(&time_epoch)); + time += timezone; + memcpy(payload, &time, sizeof(uint32_t *)); + return 0; + } + error_parsing("PyDateTime_DateType", obj); + return -2; +} + +PyObject *DateParser::c_to_py(const void *payload) const { + if (!payload) throw ModuleException("Error parsing from C to Py, expected ptr to int, found NULL"); + const time_t *time = reinterpret_cast(payload); + std::tm *now = std::gmtime(time); + PyObject *date_py = PyDate_FromDate(now->tm_year + 1900, now->tm_mon + 1, now->tm_mday); + return date_py; +} + +/***Time parser ***/ + + + +TimeParser::TimeParser(const ColumnMeta &CM) : UnitParser(CM) { + if (CM.size != sizeof(int64_t *)) + throw ModuleException("Bad size allocated for a time"); + if (!PyDateTimeAPI) PyDateTime_IMPORT; +} + +int16_t TimeParser::py_to_c(PyObject *obj, void *payload) const { + if (obj == Py_None) return -1; + if (PyTime_CheckExact(obj)) { + int64_t date = static_cast(PyDateTime_TIME_GET_HOUR(obj)) * 3600000000000 + //time in nanoseconds + static_cast(PyDateTime_TIME_GET_MINUTE(obj)) * 60000000000 + + static_cast(PyDateTime_TIME_GET_SECOND(obj)) * 1000000000 + + PyDateTime_TIME_GET_MICROSECOND(obj) * 1000; + memcpy(payload, &date, sizeof(int64_t *)); + return 0; + } + error_parsing("PyDateTime_DateType", obj); + return -2; +} + +PyObject *TimeParser::c_to_py(const void *payload) const { + if (!payload) throw ModuleException("Error parsing from C to Py, expected ptr to int, found NULL"); + int64_t msec = *(reinterpret_cast(payload)) / 1000; //from nanoseconds to microseconds + int64_t hour = 0, min = 0, sec = 0; + hour = msec / 3600000000; + msec = msec - 3600000000 * hour; + //60000000 microseconds in a minute + min = msec / 60000000; + msec = msec - 60000000 * min; + //1000000 microseconds in a second + sec = msec / 1000000; + msec = msec - 1000000 * sec; + PyObject *time_py = PyTime_FromTime(hour, min, sec, msec); + return time_py; +} /***Bytes parser ***/ @@ -390,7 +517,8 @@ int16_t TupleParser::py_to_c(PyObject *obj, void *payload) const { break; } case CASS_VALUE_TYPE_TIMESTAMP: { - //TODO + TimestampParser dp = TimestampParser(col_meta.pointer->at(i)); + dp.py_to_c(tuple_elem, destiny); break; } case CASS_VALUE_TYPE_UUID: { @@ -407,11 +535,13 @@ int16_t TupleParser::py_to_c(PyObject *obj, void *payload) const { break; } case CASS_VALUE_TYPE_DATE: { - + DateParser dp = DateParser(col_meta.pointer->at(i)); + dp.py_to_c(tuple_elem, destiny); break; } case CASS_VALUE_TYPE_TIME: { - //TODO + TimeParser dp = TimeParser(col_meta.pointer->at(i)); + dp.py_to_c(tuple_elem, destiny); break; } case CASS_VALUE_TYPE_SMALL_INT: { @@ -523,7 +653,10 @@ PyObject *TupleParser::c_to_py(const void *payload) const { break; } case CASS_VALUE_TYPE_TIMESTAMP: { - //TODO + TimestampParser uip = TimestampParser((col_meta.pointer->at(i))); + int64_t *p = (int64_t *) inner_data->get_element(i); + PyObject *po = uip.c_to_py(p); + PyTuple_SET_ITEM(tuple, i, po); break; } case CASS_VALUE_TYPE_UUID: { @@ -542,11 +675,17 @@ PyObject *TupleParser::c_to_py(const void *payload) const { break; } case CASS_VALUE_TYPE_DATE: { - + DateParser uip = DateParser((col_meta.pointer->at(i))); + int64_t *p = (int64_t *) inner_data->get_element(i); + PyObject *po = uip.c_to_py(p); + PyTuple_SET_ITEM(tuple, i, po); break; } case CASS_VALUE_TYPE_TIME: { - //TODO + TimeParser uip = TimeParser((col_meta.pointer->at(i))); + int64_t *p = (int64_t *) inner_data->get_element(i); + PyObject *po = uip.c_to_py(p); + PyTuple_SET_ITEM(tuple, i, po); break; } case CASS_VALUE_TYPE_SMALL_INT: { diff --git a/hecuba_core/src/py_interface/UnitParser.h b/hecuba_core/src/py_interface/UnitParser.h index 96ac0024..d61ab07a 100644 --- a/hecuba_core/src/py_interface/UnitParser.h +++ b/hecuba_core/src/py_interface/UnitParser.h @@ -12,7 +12,10 @@ #include #include #include - +#include +#include +#include +#include #include "../TupleRow.h" #include "../ModuleException.h" @@ -170,7 +173,6 @@ class UuidParser : public UnitParser { }; class TupleParser : public UnitParser { - public: TupleParser(const ColumnMeta &CM); @@ -179,10 +181,39 @@ class TupleParser : public UnitParser { virtual PyObject *c_to_py(const void *payload) const; + private: ColumnMeta col_meta; }; +class DateParser : public UnitParser { +public: + DateParser(const ColumnMeta &CM); + + virtual int16_t py_to_c(PyObject *obj, void *payload) const; + + virtual PyObject *c_to_py(const void *payload) const; +}; + +class TimeParser : public UnitParser { +public: + TimeParser(const ColumnMeta &CM); + + virtual int16_t py_to_c(PyObject *obj, void *payload) const; + + virtual PyObject *c_to_py(const void *payload) const; +}; + +class TimestampParser : public UnitParser { +public: + TimestampParser(const ColumnMeta &CM); + + virtual int16_t py_to_c(PyObject *obj, void *payload) const; + + virtual PyObject *c_to_py(const void *payload) const; + + int64_t time_from_timezone(struct tm *timeinfo) const; +}; #endif //HFETCH_UNITPARSER_H diff --git a/hecuba_py/tests/__init__.py b/hecuba_py/tests/__init__.py index cd07c5db..52262ea4 100644 --- a/hecuba_py/tests/__init__.py +++ b/hecuba_py/tests/__init__.py @@ -13,7 +13,7 @@ class TestConfig: test_config = TestConfig() test_config.n_nodes = int(os.environ.get('TEST_CASSANDRA_N_NODES', '2')) -TEST_DEBUG = strtobool(os.environ.get("TEST_DEBUG", "True").lower()) +TEST_DEBUG = strtobool(os.environ.get("TEST_DEBUG", "False").lower()) if TEST_DEBUG: logging.warning(("You are using TEST_DEBUG=True, a Cassandra cluster must be already running. " "Keep in mind that the results of the test might be altered by data already existing.")) diff --git a/hecuba_py/tests/withcassandra/__init__.py b/hecuba_py/tests/withcassandra/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/hecuba_py/tests/withcassandra/embeddedset_tests.py b/hecuba_py/tests/withcassandra/embeddedset_tests.py deleted file mode 100644 index c2ceb46a..00000000 --- a/hecuba_py/tests/withcassandra/embeddedset_tests.py +++ /dev/null @@ -1,607 +0,0 @@ -import time -import unittest - -from hecuba import StorageDict -from hecuba import config -from hecuba.IStorage \ - import build_remotely - - -class DictSet(StorageDict): - ''' - @TypeSpec dict<, s1:set> - ''' - - -class DictSet2(StorageDict): - ''' - @TypeSpec dict<, s1:set> - ''' - - -class DictSet3(StorageDict): - ''' - @TypeSpec dict<, s1:set> - ''' - - -class DictSet4(StorageDict): - ''' - @TypeSpec dict<, s1:set> - ''' - - -class EmbeddedSetTest(unittest.TestCase): - def testAddRemove(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset") - d = DictSet2("pruebas0.dictset") - d["1", 1] = {"1"} - d["2", 2] = {"1", "2", "3"} - - self.assertTrue("1" in d["1", 1]) - for i in range(1, 4): - self.assertTrue(str(i) in d["2", 2]) - - d["2", 2].remove("2") - self.assertEqual(False, d["2", 2].__contains__("2")) - - d["2", 2].add("2") - self.assertTrue("2" in d["2", 2]) - self.assertEqual(1, len(d["1", 1])) - self.assertEqual(3, len(d["2", 2])) - - def testDoNotCollide(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset") - d = DictSet2("pruebas0.dictset") - d["1", 1] = {"1"} - d["2", 2] = {"1", "2", "3"} - - self.assertTrue("1" in d["1", 1]) - for i in range(1, 4): - self.assertTrue(str(i) in d["2", 2]) - - del d - d2 = DictSet2("pruebas0.dictset") - self.assertTrue("1" in d2["1", 1]) - for i in range(1, 4): - self.assertTrue(str(i) in d2["2", 2]) - - def testDoNotCollideEmptySet(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset") - d = DictSet2("pruebas0.dictset") - d["1", 1] = {"1", "2", "3"} - d["2", 2] = {"4", "5", "6"} - - del d - d2 = DictSet2("pruebas0.dictset") - - d2["1", 1].add("4") - d2["2", 2].add("7") - self.assertTrue("4" in d2["1", 1]) - self.assertTrue("7" in d2["2", 2]) - - d2["1", 1] = {"1"} - d2["2", 2] = {"1", "2", "3"} - self.assertTrue("1" in d2["1", 1]) - for i in range(1, 4): - self.assertTrue(str(i) in d2["2", 2]) - - self.assertEqual(len(d2["1", 1]), 1) - self.assertEqual(len(d2["2", 2]), 3) - - def testAddRemove2(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset") - d = DictSet4("pruebas0.dictset") - d["10"] = {1} - d["20"] = {1, 2, 3} - - self.assertTrue(1 in d["10"]) - for i in range(1, 4): - self.assertTrue(i in d["20"]) - - d["20"].remove(2) - self.assertEqual(False, d["20"].__contains__("2")) - - d["20"].add(2) - self.assertTrue(2 in d["20"]) - self.assertEqual(1, len(d["10"])) - self.assertEqual(3, len(d["20"])) - - def testAddRemoveInt(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset") - d = DictSet3("pruebas0.dictset") - d["1", 1] = {1} - d["2", 2] = {1, 2, 3} - - self.assertTrue(1 in d["1", 1]) - for i in range(1, 4): - self.assertTrue(i in d["2", 2]) - - d["2", 2].remove(2) - - self.assertEqual(False, d["2", 2].__contains__(2)) - - d["2", 2].add(2) - self.assertTrue(2 in d["2", 2]) - self.assertEqual(1, len(d["1", 1])) - self.assertEqual(3, len(d["2", 2])) - - def testIter(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset") - d = DictSet2("pruebas0.dictset") - - d["2", 2] = set() - for i in range(0, 10): - d["2", 2].add(str(i)) - time.sleep(1) - l = [] - for value in d["2", 2]: - l.append(value) - for i in range(0, 10): - self.assertTrue(str(i) in l) - - self.assertEqual(len(l), len(d["2", 2])) - - def testAddRemoveTuple(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset") - d = DictSet("pruebas0.dictset") - d["1", 1] = {(1, 1)} - d["2", 2] = {(1, 1), (2, 2), (3, 3)} - - self.assertTrue((1, 1) in d["1", 1]) - for i in range(1, 4): - self.assertTrue((i, i) in d["2", 2]) - - d["2", 2].remove((2, 2)) - self.assertEqual(False, d["2", 2].__contains__((2, 2))) - - d["2", 2].add((2, 2)) - self.assertTrue((2, 2) in d["2", 2]) - self.assertEqual(1, len(d["1", 1])) - self.assertEqual(3, len(d["2", 2])) - - def testIterTuple(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset") - d = DictSet("pruebas0.dictset") - - d["2", 2] = set() - for i in range(0, 10): - d["2", 2].add((i, i)) - time.sleep(1) - l = [] - for value in d["2", 2]: - l.append(value) - for i in range(0, 10): - self.assertTrue((i, i) in l) - - self.assertEqual(len(l), len(d["2", 2])) - - def testUnion(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset1") - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset2") - d1 = DictSet2("pruebas0.dictset1") - d2 = DictSet2("pruebas0.dictset2") - - d1["0", 0] = set() - d2["1", 1] = set() - for i in range(0, 10): - d1["0", 0].add(str(i)) - for i in range(10, 20): - d2["1", 1].add(str(i)) - - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset3") - d3 = DictSet2("pruebas0.dictset3") - d3["2", 2] = d1["0", 0].union(d2["1", 1]) - time.sleep(3) - for i in range(0, 20): - self.assertTrue(str(i) in d3["2", 2]) - self.assertEqual(20, len(d3["2", 2])) - - def testIntersection(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset1") - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset2") - d1 = DictSet2("pruebas0.dictset1") - d2 = DictSet2("pruebas0.dictset2") - - d1["0", 0] = set() - d2["1", 1] = set() - for i in range(0, 10): - d1["0", 0].add(str(i)) - if i < 5: - d2["1", 1].add(str(i)) - - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset3") - d3 = DictSet2("pruebas0.dictset3") - d3["2", 2] = d1["0", 0].intersection(d2["1", 1]) - for i in range(0, 5): - self.assertTrue(str(i) in d3["2", 2]) - self.assertEqual(5, len(d3["2", 2])) - - def testDifference(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset1") - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset2") - d1 = DictSet2("pruebas0.dictset1") - d2 = DictSet2("pruebas0.dictset2") - - d1["0", 0] = set() - d2["1", 1] = set() - for i in range(0, 10): - d1["0", 0].add(str(i)) - if i < 5: - d2["1", 1].add(str(i)) - - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset3") - d3 = DictSet2("pruebas0.dictset3") - d3["2", 2] = d1["0", 0].difference(d2["1", 1]) - for i in range(5, 10): - self.assertTrue(str(i) in d3["2", 2]) - self.assertEqual(5, len(d3["2", 2])) - - def testUnionWithTuples(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset1") - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset2") - d1 = DictSet("pruebas0.dictset1") - d2 = DictSet("pruebas0.dictset2") - - d1["0", 0] = set() - d2["1", 1] = set() - for i in range(0, 10): - d1["0", 0].add((i, i)) - for i in range(10, 20): - d2["1", 1].add((i, i)) - - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset3") - d3 = DictSet("pruebas0.dictset3") - d3["2", 2] = d1["0", 0].union(d2["1", 1]) - time.sleep(3) - for i in range(0, 20): - self.assertTrue((i, i) in d3["2", 2]) - self.assertEqual(20, len(d3["2", 2])) - - def testIntersectionWithTuples(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset1") - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset2") - d1 = DictSet("pruebas0.dictset1") - d2 = DictSet("pruebas0.dictset2") - - d1["0", 0] = set() - d2["1", 1] = set() - for i in range(0, 10): - d1["0", 0].add((i, i)) - if i < 5: - d2["1", 1].add((i, i)) - - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset3") - d3 = DictSet("pruebas0.dictset3") - d3["2", 2] = d1["0", 0].intersection(d2["1", 1]) - for i in range(0, 5): - self.assertTrue((i, i) in d3["2", 2]) - self.assertEqual(5, len(d3["2", 2])) - - def testDifferenceWithTuples(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset1") - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset2") - d1 = DictSet("pruebas0.dictset1") - d2 = DictSet("pruebas0.dictset2") - - d1["0", 0] = set() - d2["1", 1] = set() - for i in range(0, 10): - d1["0", 0].add((i, i)) - if i < 5: - d2["1", 1].add((i, i)) - - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset3") - d3 = DictSet("pruebas0.dictset3") - d3["2", 2] = d1["0", 0].difference(d2["1", 1]) - for i in range(5, 10): - self.assertTrue((i, i) in d3["2", 2]) - self.assertEqual(5, len(d3["2", 2])) - - def testUnionWithSet(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset1") - d1 = DictSet2("pruebas0.dictset1") - - d1["0", 0] = set() - s1 = set() - for i in range(0, 10): - d1["0", 0].add(str(i)) - s1.add(str(i + 10)) - - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset3") - d3 = DictSet2("pruebas0.dictset3") - d3["2", 2] = d1["0", 0].union(s1) - time.sleep(3) - for i in range(0, 20): - self.assertTrue(str(i) in d3["2", 2]) - self.assertEqual(20, len(d3["2", 2])) - - def testIntersectionWithSet(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset1") - d1 = DictSet2("pruebas0.dictset1") - - d1["0", 0] = set() - s1 = set() - for i in range(0, 10): - d1["0", 0].add(str(i)) - if i < 5: - s1.add(str(i)) - - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset3") - d3 = DictSet2("pruebas0.dictset3") - d3["2", 2] = d1["0", 0].intersection(s1) - for i in range(0, 5): - self.assertTrue(str(i) in d3["2", 2]) - self.assertEqual(5, len(d3["2", 2])) - - def testDifferenceWithSet(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset1") - d1 = DictSet2("pruebas0.dictset1") - - d1["0", 0] = set() - s1 = set() - for i in range(0, 10): - d1["0", 0].add(str(i)) - if i < 5: - s1.add(str(i)) - - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset3") - d3 = DictSet2("pruebas0.dictset3") - d3["2", 2] = d1["0", 0].difference(s1) - for i in range(5, 10): - self.assertTrue(str(i) in d3["2", 2]) - self.assertEqual(5, len(d3["2", 2])) - - def testIterKeys(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset1") - d1 = DictSet3("pruebas0.dictset1") - - d1["0", 0] = {1, 2, 3, 4} - d1["0", 1] = {1, 2, 3, 4} - d1["1", 0] = {1, 2, 3, 4} - d1["1", 1] = {1, 2, 3, 4} - time.sleep(1) - l = list() - for keys in d1.keys(): - l.append(keys) - - self.assertTrue(("0", 0) in l) - self.assertTrue(("0", 1) in l) - self.assertTrue(("1", 0) in l) - self.assertTrue(("1", 1) in l) - self.assertEqual(4, len(l)) - - def testItems(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset1") - d1 = DictSet3("pruebas0.dictset1") - - d1["0", 0] = {1, 2, 3, 4} - d1["0", 1] = {1, 2, 3, 4} - d1["1", 0] = {1, 2, 3, 4} - d1["1", 1] = {1, 2, 3, 4} - time.sleep(1) - d = dict() - for keys, value in d1.items(): - d[keys] = value - self.assertTrue(("0", 0) in d) - self.assertTrue(("0", 1) in d) - self.assertTrue(("1", 0) in d) - self.assertTrue(("1", 1) in d) - self.assertEqual(4, len(d)) - self.assertEqual({1, 2, 3, 4}, d["0", 0]) - self.assertEqual({1, 2, 3, 4}, d["0", 1]) - self.assertEqual({1, 2, 3, 4}, d["1", 0]) - self.assertEqual({1, 2, 3, 4}, d["1", 1]) - - def testIterValues(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset1") - d1 = DictSet3("pruebas0.dictset1") - - d1["0", 0] = {1, 2, 3, 4} - d1["0", 1] = {5, 6, 7, 8} - d1["1", 0] = {8, 7, 6, 5} - d1["1", 1] = {4, 3, 2, 1} - time.sleep(1) - l = list() - for value in d1.values(): - l.append(value) - - self.assertEqual(4, len(l)) - self.assertTrue({1, 2, 3, 4} in l) - self.assertTrue({5, 6, 7, 8} in l) - self.assertTrue({8, 7, 6, 5} in l) - self.assertTrue({4, 3, 2, 1} in l) - - def testItemsWithTuples(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset1") - d1 = DictSet("pruebas0.dictset1") - - d1["key0", 15] = {(0, 1), (2, 3), (4, 5)} - d1["key1", 30] = {(10, 11), (12, 13), (14, 15)} - time.sleep(1) - d = dict() - for keys, value in d1.items(): - d[keys] = value - self.assertTrue(("key0", 15) in d) - self.assertTrue(("key1", 30) in d) - self.assertEqual(2, len(d)) - self.assertEqual({(0, 1), (2, 3), (4, 5)}, d["key0", 15]) - self.assertEqual({(10, 11), (12, 13), (14, 15)}, d["key1", 30]) - - def testUpdate(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset1") - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset2") - d1 = DictSet2("pruebas0.dictset1") - d2 = DictSet2("pruebas0.dictset2") - - d1["0", 0] = set() - d2["1", 1] = set() - for i in range(0, 10): - d1["0", 0].add(str(i)) - for i in range(5, 20): - d2["1", 1].add(str(i)) - - time.sleep(2) - d1["0", 0].update(d2["1", 1]) - time.sleep(3) - for i in range(0, 20): - self.assertTrue(str(i) in d1["0", 0]) - self.assertEqual(20, len(d1["0", 0])) - - def testIsSubset(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset1") - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset2") - d1 = DictSet2("pruebas0.dictset1") - d2 = DictSet2("pruebas0.dictset2") - - d1["0", 0] = set() - d2["1", 1] = set() - for i in range(0, 10): - d1["0", 0].add(str(i)) - d2["1", 1].add(str(i)) - for i in range(10, 20): - d2["1", 1].add(str(i)) - - b = d1["0", 0].issubset(d2["1", 1]) - self.assertTrue(b) - - b = d2["1", 1].issubset(d1["0", 0]) - self.assertFalse(b) - - def testIsSuperset(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset1") - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset2") - d1 = DictSet2("pruebas0.dictset1") - d2 = DictSet2("pruebas0.dictset2") - - d1["0", 0] = set() - d2["1", 1] = set() - for i in range(0, 10): - d1["0", 0].add(str(i)) - d2["1", 1].add(str(i)) - for i in range(10, 20): - d2["1", 1].add(str(i)) - - time.sleep(2) - b = d2["1", 1].issuperset(d1["0", 0]) - self.assertTrue(b) - - b = d1["0", 0].issuperset(d2["1", 1]) - self.assertFalse(b) - - def testIsSubsetWithSet(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset1") - d1 = DictSet2("pruebas0.dictset1") - - d1["0", 0] = set() - s = set() - for i in range(0, 10): - d1["0", 0].add(str(i)) - s.add(str(i)) - for i in range(10, 20): - s.add(str(i)) - - b = d1["0", 0].issubset(s) - self.assertTrue(b) - - b = s.issubset(d1["0", 0]) - self.assertFalse(b) - - def testIsSupersetWithSet(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset1") - d1 = DictSet2("pruebas0.dictset1") - - d1["0", 0] = set() - s = set() - for i in range(0, 10): - d1["0", 0].add(str(i)) - s.add(str(i)) - for i in range(10, 20): - s.add(str(i)) - - b = s.issuperset(d1["0", 0]) - self.assertTrue(b) - - b = d1["0", 0].issuperset(s) - self.assertFalse(b) - - def testRemoveKeyError(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset1") - d1 = DictSet2("pruebas0.dictset1") - - d1["0", 0] = {"0", "1", "2"} - d1["0", 0].remove("0") - self.assertRaises(Exception, d1["0", 0].remove, "3") - self.assertTrue("1" in d1["0", 0]) - self.assertTrue("2" in d1["0", 0]) - self.assertEqual(False, d1["0", 0].__contains__("0")) - - def testDiscard(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset1") - d1 = DictSet2("pruebas0.dictset1") - - d1["0", 0] = {"0", "1", "2"} - d1["0", 0].discard("0") - d1["0", 0].discard("3") - self.assertTrue("1" in d1["0", 0]) - self.assertTrue("2" in d1["0", 0]) - self.assertEqual(False, d1["0", 0].__contains__("0")) - - def testClear(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset1") - d1 = DictSet3("pruebas0.dictset1") - - d1["0", 0] = {1, 2} - time.sleep(1) - self.assertEqual(2, len(d1["0", 0])) - d1["0", 0].clear() - self.assertEqual(0, len(d1["0", 0])) - - def testSplit(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset1") - d = DictSet3("pruebas0.dictset1") - for i in range(0, 10): - for j in range(0, 3): - d[str(i), j] = {0, 1, 2, 3, 4, 5} - - d2 = dict() - for partition in d.split(): - for ((key0, key1), val) in partition.items(): - d2[key0, key1] = val - - for i in range(0, 10): - for j in range(0, 3): - self.assertEqual(d2[str(i), j], {0, 1, 2, 3, 4, 5}) - - def testBuildRemotely(self): - config.session.execute("DROP TABLE IF EXISTS pruebas0.dictset1") - d = DictSet("pruebas0.dictset1") - for i in range(0, 10): - d[str(i), i] = {(0, 0), (1, 1), (2, 2)} - - self.assertEqual('dictset1', d._table) - self.assertEqual('pruebas0', d._ksp) - - res = config.session.execute( - 'SELECT storage_id, primary_keys, columns, class_name, name, tokens, istorage_props,indexed_on ' + - 'FROM hecuba.istorage WHERE storage_id = %s', [d.storage_id])[0] - - self.assertEqual(res.storage_id, d.storage_id) - self.assertEqual(res.class_name, DictSet.__module__ + "." + DictSet.__name__) - self.assertEqual(res.name, 'pruebas0.dictset1') - - rebuild = build_remotely(res._asdict()) - self.assertEqual(rebuild._built_remotely, True) - self.assertEqual('dictset1', rebuild._table) - self.assertEqual('pruebas0', rebuild._ksp) - self.assertEqual(res.storage_id, rebuild.storage_id) - - self.assertEqual(d._is_persistent, rebuild._is_persistent) - - for i in range(0, 10): - # rebuild[str(i), i] does not return data, we must iterate over it - self.assertEqual({i for i in rebuild[str(i), i]}, {(0, 0), (1, 1), (2, 2)}) - - -if __name__ == '__main__': - unittest.main() diff --git a/hecuba_py/tests/withcassandra/hfetch_flush_tests.py b/hecuba_py/tests/withcassandra/hfetch_flush_tests.py deleted file mode 100644 index 0631c200..00000000 --- a/hecuba_py/tests/withcassandra/hfetch_flush_tests.py +++ /dev/null @@ -1,90 +0,0 @@ -import unittest - -from hecuba import config -from hecuba.hdict import StorageDict - - -class StorageDictTest(unittest.TestCase): - @staticmethod - def setUpClass(): - config.session.execute( - "CREATE KEYSPACE IF NOT EXISTS ksp WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};") - - def test_flush_items_100(self): - config.session.execute("DROP TABLE IF EXISTS ksp.tb1") - config.session.execute("CREATE TABLE ksp.tb1(pk1 int, val1 text,PRIMARY KEY(pk1))") - pd = StorageDict('ksp.tb1', [('pk1', 'int')], [('val1', 'text')]) - num_inserts = 100 - for i in range(num_inserts): - pd[i] = 'ciao' + str(i) - del pd # To force hfetch to flush data - import gc - gc.collect() - count, = config.session.execute("SELECT count(*) FROM ksp.tb1")[0] - - self.assertEqual(count, num_inserts) - - def test_flush_items_10K(self): - config.session.execute("DROP TABLE IF EXISTS ksp.tb1") - config.session.execute("CREATE TABLE ksp.tb1(pk1 int, val1 text,PRIMARY KEY(pk1))") - pd = StorageDict('ksp.tb1', [('pk1', 'int')], [('val1', 'text')]) - num_inserts = 10000 - for i in range(num_inserts): - pd[i] = 'ciao' + str(i) - del pd # To force hfetch to flush data - import gc - gc.collect() - count, = config.session.execute("SELECT count(*) FROM ksp.tb1 LIMIT " + str(num_inserts + 1))[0] - self.assertEqual(count, num_inserts) - - ''' - def test_flush_items_1M(self): - config.session.execute("DROP KEYSPACE IF EXISTS ksp") - config.session.execute("CREATE KEYSPACE ksp WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};") - config.session.execute("CREATE TABLE ksp.tb1(pk1 int, val1 text,PRIMARY KEY(pk1))") - pd = StorageDict('ksp.tb1', [('pk1', 'int')], [('val1', 'text')]) - num_inserts = 1000000 - for i in range(num_inserts): - pd[i] = 'ciao' + str(i) - del pd # To force hfetch to flush data - count, = config.session.execute("SELECT count(*) FROM ksp.tb1")[0] - - self.assertEqual(count, num_inserts) - ''' - - def test_write_and_then_read(self): - config.session.execute("DROP TABLE IF EXISTS ksp.tb1") - config.session.execute("CREATE TABLE ksp.tb1(pk1 int, val1 text,PRIMARY KEY(pk1))") - pd = StorageDict('ksp.tb1', [('pk1', 'int')], [('val1', 'text')]) - for i in range(100): - pd[i] = 'ciao' + str(i) - del pd # To force hfetch to flush data - import gc - gc.collect() - count, = config.session.execute("SELECT count(*) FROM ksp.tb1")[0] - - self.assertEqual(count, 100) - pd = StorageDict('ksp.tb1', [('pk1', 'int')], [('val1', 'text')]) - for i in range(100): - self.assertEqual(pd[i], u'ciao' + str(i)) - - def test_write_and_then_read_named_tuple(self): - config.session.execute("DROP TABLE IF EXISTS ksp.tb1") - config.session.execute("CREATE TABLE ksp.tb1(pk1 int, name text,age int,PRIMARY KEY(pk1))") - pd = StorageDict('ksp.tb1', [('pk1', 'int')], [('name', 'text'), ('age', 'int')]) - for i in range(100): - pd[i] = ['ciao' + str(i), i] - del pd # To force hfetch to flush data - import gc - gc.collect() - count, = config.session.execute("SELECT count(*) FROM ksp.tb1")[0] - - self.assertEqual(count, 100) - pd = StorageDict('ksp.tb1', [('pk1', 'int')], [('name', 'text'), ('age', 'int')]) - for i in range(100): - name, age = pd[i] - self.assertEqual(name, u'ciao' + str(i)) - self.assertEqual(age, i) - - self.assertEqual(pd[i].name, u'ciao' + str(i)) - self.assertEqual(pd[i].age, i) diff --git a/hecuba_py/tests/withcassandra/hfetch_tests.py b/hecuba_py/tests/withcassandra/hfetch_tests.py deleted file mode 100644 index fd7bf4f1..00000000 --- a/hecuba_py/tests/withcassandra/hfetch_tests.py +++ /dev/null @@ -1,32 +0,0 @@ -import unittest - -from hecuba import config, StorageDict - - -class ConcurrentDict(StorageDict): - ''' - @TypeSpec <,value:int> - ''' - - -class HfetchTests(unittest.TestCase): - def test_timestamped_writes(self): - previous_cfg = config.timestamped_writes - config.timestamped_writes = "True" - - my_dict = ConcurrentDict("concurrent_dict") - last_value = 1000 - for value in range(last_value): - my_dict[0] = value - - del my_dict - import gc - gc.collect() - - my_dict = ConcurrentDict("concurrent_dict") - - retrieved = my_dict[0] - - config.timestamped_writes = previous_cfg - - self.assertEqual(retrieved, last_value - 1) diff --git a/hecuba_py/tests/withcassandra/hfilter_tests.py b/hecuba_py/tests/withcassandra/hfilter_tests.py deleted file mode 100644 index cd77c105..00000000 --- a/hecuba_py/tests/withcassandra/hfilter_tests.py +++ /dev/null @@ -1,194 +0,0 @@ -import time -import unittest -from hecuba import StorageDict, config - - -class SimpleDict(StorageDict): - ''' - @TypeSpec dict<, val0:int> - ''' - - -class ComplexDict(StorageDict): - ''' - @TypeSpec dict<, val0:str, val1:int, val2:float, val3:bool> - ''' - - -class LambdaParserTest(unittest.TestCase): - - def test_simple_filter(self): - config.session.execute("DROP TABLE IF EXISTS hfilter_tests.simpledict") - simple_dict = SimpleDict("hfilter_tests.simpledict") - res = filter(lambda x: x.key0 == 5, simple_dict.items()) - res = [i for i in res] - self.assertEqual(0, len(res)) - - def test_greater(self): - config.session.execute("DROP TABLE IF EXISTS hfilter_tests.simpledict") - simple_dict = SimpleDict("hfilter_tests.simpledict") - for i in range(0, 10): - simple_dict[i] = i - time.sleep(1) - - res = filter(lambda x: x.key0 > 5, simple_dict.items()) - res = [i for i in res] - self.assertEqual(4, len(res)) - self.assertTrue((6, 6) in res) - self.assertTrue((7, 7) in res) - self.assertTrue((8, 8) in res) - self.assertTrue((9, 9) in res) - - def test_column_not_exist(self): - config.session.execute("DROP TABLE IF EXISTS hfilter_tests.simpledict") - simple_dict = SimpleDict("hfilter_tests.simpledict") - - def filter_nonexisting_key(): - return filter(lambda x: x.key1 == 5, simple_dict.items()) - - self.assertRaises(Exception, filter_nonexisting_key) - - def test_not_persistent_object(self): - config.session.execute("DROP TABLE IF EXISTS hfilter_tests.simpledict") - simple_dict = SimpleDict() - for i in range(0, 10): - simple_dict[i] = i - - res = filter(lambda x: x[0] > 5, simple_dict.items()) - res = [i for i in res] - self.assertEqual(4, len(res)) - self.assertTrue((6, 6) in res) - self.assertTrue((7, 7) in res) - self.assertTrue((8, 8) in res) - self.assertTrue((9, 9) in res) - - def test_filter_equal(self): - config.session.execute("DROP TABLE IF EXISTS hfilter_tests.simpledict") - simple_dict = SimpleDict("hfilter_tests.simpledict") - for i in range(0, 10): - simple_dict[i] = i - time.sleep(1) - - res = filter(lambda x: x.key0 == 5, simple_dict.items()) - res = [i for i in res] - self.assertEqual(1, len(res)) - self.assertEqual((5, 5), res[0]) - - def test_filter_inside(self): - config.session.execute("DROP TABLE IF EXISTS hfilter_tests.simpledict") - simple_dict = SimpleDict("hfilter_tests.simpledict") - for i in range(0, 10): - simple_dict[i] = i - time.sleep(1) - - res = filter(lambda x: x.key0 in [1, 3], simple_dict.items()) - res = [i for i in res] - self.assertEqual(2, len(res)) - self.assertTrue((1, 1) in res) - self.assertTrue((3, 3) in res) - - def test_different_columns(self): - config.session.execute("DROP TABLE IF EXISTS hfilter_tests.simpledict") - simple_dict = SimpleDict("hfilter_tests.simpledict") - for i in range(0, 10): - simple_dict[i] = i - time.sleep(1) - - res = filter(lambda x: x.key0 in [1, 2, 3, 5, 6, 9] and x.val0 >= 0 and x.val0 <= 5, simple_dict.items()) - res = [i for i in res] - self.assertEqual(4, len(res)) - self.assertTrue((1, 1) in res) - self.assertTrue((2, 2) in res) - self.assertTrue((3, 3) in res) - self.assertTrue((5, 5) in res) - - def test_complex_filter(self): - config.session.execute("DROP TABLE IF EXISTS hfilter_tests.complexdict") - complex_dict = ComplexDict("hfilter_tests.complexdict") - for i in range(0, 20): - complex_dict[str(i), i] = [str(i), i, float(i), True] - time.sleep(2) - - res = filter(lambda x: x.key0 in ["1", "2", "3", "4", "5"] and x.val1 >= 1 and x.val1 <= 5 and x.val2 >= 1.0 and x.val2 <= 4.0 and x.val3 == True, complex_dict.items()) - res = [tuple(i) for i in res] - self.assertEqual(4, len(res)) - self.assertTrue((("1", 1), ("1", 1, 1.0, True)) in res) - self.assertTrue((("2", 2), ("2", 2, 2.0, True)) in res) - self.assertTrue((("3", 3), ("3", 3, 3.0, True)) in res) - self.assertTrue((("4", 4), ("4", 4, 4.0, True)) in res) - - def test_bad_type(self): - config.session.execute("DROP TABLE IF EXISTS hfilter_tests.simpledict") - simple_dict = SimpleDict("hfilter_tests.simpledict") - for i in range(0, 10): - simple_dict[i] = i - time.sleep(1) - - def execute_bad_type(): - res = filter(lambda x: x.key0 == "1", simple_dict.items()) - - self.assertRaises(Exception, execute_bad_type) - - def test_several_operators(self): - config.session.execute("DROP TABLE IF EXISTS hfilter_tests.simpledict") - simple_dict = SimpleDict("hfilter_tests.simpledict") - for i in range(0, 10): - simple_dict[i] = i - time.sleep(1) - - res = filter(lambda x: x.key0 < 5 and x.key0 >= 3, simple_dict.items()) - res = [i for i in res] - self.assertEqual(2, len(res)) - self.assertTrue((3, 3) in res) - self.assertTrue((4, 4) in res) - - def test_reversed_operations(self): - config.session.execute("DROP TABLE IF EXISTS hfilter_tests.simpledict") - simple_dict = SimpleDict("hfilter_tests.simpledict") - for i in range(0, 10): - simple_dict[i] = i - time.sleep(1) - - res = filter(lambda x: 5 > x.key0 and 3 <= x.key0, simple_dict.items()) - res = [i for i in res] - self.assertEqual(2, len(res)) - self.assertTrue((3, 3) in res) - self.assertTrue((4, 4) in res) - - def test_non_hecuba_filter(self): - l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] - res = list(filter(lambda x: x >= 5, l)) - self.assertEqual(res, [5, 6, 7, 8, 9]) - - def test_split_filter(self): - config.session.execute("DROP TABLE IF EXISTS hfilter_tests.simpledict") - simple_dict = SimpleDict("hfilter_tests.simpledict") - what_should_be = dict() - for i in range(0, 10): - what_should_be[i] = i - simple_dict[i] = i - time.sleep(1) - - filtered = [] - normal_filtered = list(python_filter(lambda x: x[0] > 3, simple_dict.items())) - - i = 0 - for partition in simple_dict.split(): - # aggregation of filtering on each partition should be equal to a filter on the whole object - res = filter(lambda x: x.key0 > 3, partition.items()) - for row in res: - filtered.append(row) - - for k, v in partition.items(): - # self.assertTrue((tuple(row.key), list(row.value)) in f2) - self.assertEqual(what_should_be[k], v) - i += 1 - - self.assertEqual(len(what_should_be), i) - self.assertEqual(len(filtered), len(normal_filtered)) - for row in filtered: - self.assertTrue(row in normal_filtered) - - -if __name__ == "__main__": - unittest.main() diff --git a/hecuba_py/tests/withcassandra/istorage_split_locality.py b/hecuba_py/tests/withcassandra/istorage_split_locality.py deleted file mode 100644 index c85d4a35..00000000 --- a/hecuba_py/tests/withcassandra/istorage_split_locality.py +++ /dev/null @@ -1,146 +0,0 @@ -import unittest - -from collections import defaultdict - -from hecuba import config -from hecuba.tools import tokens_partitions, discrete_token_ranges - -from .. import test_config - - -@unittest.skip("Disabled until token partition gets fixed") -class IStorageSplitLocalityTest(unittest.TestCase): - @classmethod - def setUpClass(cls): - config.session.execute("CREATE KEYSPACE IF NOT EXISTS test_ksp WITH replication = " - "{'class': 'SimpleStrategy', 'replication_factor': 1};") - - config.session.execute("CREATE TABLE IF NOT EXISTS test_ksp.tab(k int PRIMARY KEY,v int)") - - def test_enough_token(self): - original_cfg = config.__dict__ - config.__dict__.update(splits_per_node=10, token_range_size=None, target_token_range_size=64 * 1024 * 1024) - all_tokens = discrete_token_ranges(list(map(lambda a: a.value, config.cluster.metadata.token_map.ring))) - tkns_p = list(tokens_partitions("test_ksp", "tab", all_tokens)) - self.check_all(tkns_p, 10, 20) - config.__dict__ = original_cfg - - def test_too_little_tokens(self): - original_cfg = config.__dict__ - config.__dict__.update(splits_per_node=1000, token_range_size=None, target_token_range_size=64 * 1024) - all_tokens = discrete_token_ranges(list(map(lambda a: a.value, config.cluster.metadata.token_map.ring))) - tkns_p = list(tokens_partitions("test_ksp", "tab", all_tokens)) - self.check_all(tkns_p, 1000, 1000) - config.__dict__ = original_cfg - - def test_splitting_tokens(self): - original_cfg = config.__dict__ - config.__dict__.update(splits_per_node=1, - token_range_size=int((2 ** 64) / 1000), - target_token_range_size=None) - all_tokens = discrete_token_ranges(list(map(lambda a: a.value, config.cluster.metadata.token_map.ring))) - tkns_p = list(tokens_partitions("test_ksp", "tab", all_tokens)) - self.check_all(tkns_p, 1, 1000) - config.__dict__ = original_cfg - - def test_using_size_estimates(self): - for i in range(100000): - config.session.execute("INSERT INTO test_ksp.tab(k,v) values(%s,%s)", [i, i]) - original_cfg = config.__dict__ - config.__dict__.update(splits_per_node=1, - token_range_size=None, - target_token_range_size=64) - test_config.ccm_cluster.flush() - test_config.ccm_cluster.compact() - all_tokens = discrete_token_ranges(list(map(lambda a: a.value, config.cluster.metadata.token_map.ring))) - tkns_p = list(tokens_partitions("test_ksp", "tab", all_tokens)) - config.__dict__ = original_cfg - # self.check_all(tkns_p, 1, 1000) - - def check_all(self, tkns_p, split_per_node, expected_total_tkns): - self.assertGreaterEqual(len(tkns_p), len(test_config.ccm_cluster.nodes) * split_per_node) - self.assertGreaterEqual(sum(map(len, tkns_p)), expected_total_tkns) - self.check_full_range([i for split_tokens in tkns_p for i in split_tokens]) - - hosts = [self.checkToken(worker_partition) for worker_partition in tkns_p] - self.assertEqual(len(set(hosts)), len(test_config.ccm_cluster.nodes)) - self.ensure_balance(tkns_p) - - def check_full_range(self, list_of_ranges): - list_of_ranges.sort() - start = list(map(lambda a: a[0], list_of_ranges)) - counts = list(filter(lambda size: size[1] > 1, map(lambda number: (number, start.count(number)), start))) - self.assertEqual(0, len(counts), "duplicated starts") - end = list(map(lambda a: a[0], list_of_ranges)) - counts = list(filter(lambda size: size[1] > 1, map(lambda number: (number, end.count(number)), end))) - self.assertEqual(0, len(counts), "duplicated ends") - - first, last = list_of_ranges[0] - self.assertEqual(-(2 ** 63), first, "first token should always be -2^63") - for s, e in list_of_ranges[1:]: - self.assertEqual(last, s, "broken range %d -> %d" % (last, s)) - last = e - self.assertEqual((2 ** 63) - 1, last, "last token should always be (2^63)-1") - - def ensure_balance(self, tokens_per_split): - from cassandra.metadata import Token - tm = config.cluster.metadata.token_map - node_loads = defaultdict(int) - for split in tokens_per_split: - for f, t in split: - host = tm.get_replicas("test_ksp", Token(f))[0] - node_loads[host] += t - f - - print(node_loads) - node_loads = node_loads.values() - avg_delta = sum(node_loads) // len(node_loads) - max_delta = max(node_loads) - min_delta = min(node_loads) - self.assertLessEqual(max_delta, avg_delta * 2) - self.assertGreaterEqual(min_delta, avg_delta / 2) - - def checkToken(self, tokens): - # type : (List[Long]) -> Host - from cassandra.metadata import Token - tm = config.cluster.metadata.token_map - hosts = set(map(lambda token: tm.get_replicas("test_ksp", token)[0], - map(lambda a: Token(a[0]), tokens))) - self.assertEqual(len(hosts), 1, "A token range is local in 2 nodes") - return list(hosts)[0] - - -class IStorageSplitLocalityTestVnodes(IStorageSplitLocalityTest): - @classmethod - def setUpClass(cls): - from hfetch import disconnectCassandra - disconnectCassandra() - from .. import set_ccm_cluster - test_config.ccm_cluster.clear() - set_ccm_cluster() - from .. import TEST_DEBUG - try: - test_config.ccm_cluster.populate(3, use_vnodes=True).start() - except Exception as ex: - if not TEST_DEBUG: - raise ex - - import hfetch - import hecuba - import importlib - importlib.reload(hfetch) - import importlib - importlib.reload(hecuba) - super(IStorageSplitLocalityTest, cls).setUpClass() - - @classmethod - def tearDownClass(cls): - from hfetch import disconnectCassandra - disconnectCassandra() - - test_config.ccm_cluster.clear() - from .. import set_up_default_cassandra - set_up_default_cassandra() - - -if __name__ == '__main__': - unittest.main() diff --git a/hecuba_py/tests/withcassandra/istorage_tests.py b/hecuba_py/tests/withcassandra/istorage_tests.py deleted file mode 100644 index b85c3c89..00000000 --- a/hecuba_py/tests/withcassandra/istorage_tests.py +++ /dev/null @@ -1,113 +0,0 @@ -import unittest - -from hecuba import config, StorageDict -from hecuba.IStorage import IStorage - - -class PersistentDict(StorageDict): - ''' - @TypeSpec dict<, value:double> - ''' - - -class IStorageTests(unittest.TestCase): - def stop_persistent_method_test(self): - from hecuba.tools import storage_id_from_name - config.session.execute( - "DROP TABLE IF EXISTS test.istorage_pers;") - config.session.execute( - "DELETE FROM hecuba.istorage WHERE storage_id = {}".format(storage_id_from_name("test.istorage_pers"))) - - key = 123 - value = 456 - name = 'test.istorage_pers' - - base_dict = PersistentDict() - - def check_stop_pers(): - assert (isinstance(base_dict, IStorage)) - base_dict.stop_persistent() - - self.assertRaises(RuntimeError, check_stop_pers) - # PyCOMPSs requires uuid of type str - - base_dict.make_persistent(name) - - base_dict[key] = value - - base_dict.stop_persistent() - - self.assertIsNone(base_dict.storage_id) - self.assertIsNone(base_dict.storage_id) - - self.assertRaises(RuntimeError, check_stop_pers) - - base_dict.make_persistent(name) - - self.assertEqual(base_dict[key], value) - - base_dict.stop_persistent() - - self.assertRaises(RuntimeError, check_stop_pers) - - external_dict = PersistentDict(name) - self.assertEqual(external_dict[key], value) - - def delete_persistent_method_test(self): - from hecuba.tools import storage_id_from_name - config.session.execute( - "DROP TABLE IF EXISTS test.istorage_pers;") - config.session.execute( - "DELETE FROM hecuba.istorage WHERE storage_id = {}".format(storage_id_from_name("test.istorage_pers"))) - - key = 123 - value = 456 - name = 'test.istorage_pers' - - base_dict = PersistentDict() - - def check_stop_pers(): - assert (isinstance(base_dict, IStorage)) - base_dict.stop_persistent() - - def check_del_pers(): - assert (isinstance(base_dict, IStorage)) - base_dict.delete_persistent() - - self.assertRaises(RuntimeError, check_del_pers) - # PyCOMPSs requires uuid of type str - - base_dict.make_persistent(name) - - base_dict[key] = value - - base_dict.delete_persistent() - - self.assertIsNone(base_dict.storage_id) - self.assertIsNone(base_dict.storage_id) - - self.assertRaises(RuntimeError, check_del_pers) - self.assertRaises(RuntimeError, check_stop_pers) - - base_dict.make_persistent(name) - - def get_key(): - res = base_dict[key] - - self.assertRaises(KeyError, get_key) - - base_dict.delete_persistent() - - self.assertRaises(RuntimeError, check_del_pers) - self.assertRaises(RuntimeError, check_stop_pers) - - external_dict = PersistentDict(name) - - def get_key_ext(): - res = external_dict[key] - - self.assertRaises(KeyError, get_key_ext) - - -if __name__ == '__main__': - unittest.main() diff --git a/hecuba_py/tests/withcassandra/storage_api_tests.py b/hecuba_py/tests/withcassandra/storage_api_tests.py deleted file mode 100644 index 9e8bd375..00000000 --- a/hecuba_py/tests/withcassandra/storage_api_tests.py +++ /dev/null @@ -1,49 +0,0 @@ -import unittest - -from storage.api import getByID -from ..app.words import Words -from hecuba import config, StorageDict - - -class ApiTestSDict(StorageDict): - ''' - @TypeSpec dict<, value:double> - ''' - - -class StorageApi_Tests(unittest.TestCase): - def class_type_test(self): - base_dict = ApiTestSDict('test.api_sdict') - # PyCOMPSs requires uuid of type str - storage_id = str(base_dict.storage_id) - del base_dict - - rebuild_dict = getByID(storage_id) - self.assertTrue(isinstance(rebuild_dict, ApiTestSDict)) - - def object_id_is_str_test(self): - memory_obj = ApiTestSDict() - - self.assertTrue(hasattr(memory_obj, 'getID')) - self.assertIsInstance(memory_obj.getID(), str, "PyCOMPSs specs states that getID should return a string") - - pers_dict = ApiTestSDict('test.api_id_str') - self.assertTrue(hasattr(pers_dict, 'getID')) - self.assertIsInstance(pers_dict.getID(), str, "PyCOMPSs specs states that getID should return a string") - - def test_getByID_block(self): - # ki = KeyIter('testspace', 'tt', 'app.words.Words', 'fake-id', ['position']) - from hecuba import config - config.session.execute("DROP TABLE IF EXISTS my_app.so") - config.session.execute("DROP TABLE IF EXISTS my_app.so_0") - config.session.execute("DROP TABLE IF EXISTS my_app.so_1") - SO = Words('so') - b = next(SO.split()) - new_block = getByID(b.storage_id) - self.assertEqual(b.storage_id, new_block.storage_id) - self.assertEqual(b, new_block) - - def test_getByID_storage_obj(self): - b = Words('testspace.tt') - new_block = getByID(b.storage_id) - self.assertEqual(b, new_block) diff --git a/hecuba_py/tests/withcassandra/storagedict_split_tests.py b/hecuba_py/tests/withcassandra/storagedict_split_tests.py deleted file mode 100644 index e2bdfa5f..00000000 --- a/hecuba_py/tests/withcassandra/storagedict_split_tests.py +++ /dev/null @@ -1,354 +0,0 @@ -import unittest - -from hecuba import config -from hecuba.hdict import StorageDict -from hecuba.storageobj import StorageObj - - -class SObj_Basic(StorageObj): - ''' - @ClassField attr1 int - @ClassField attr2 double - @ClassField attr3 str - ''' - - -class SDict_SimpleTypeSpec(StorageDict): - ''' - @TypeSpec dict<, info:str> - ''' - - -class SDict_ComplexTypeSpec(StorageDict): - ''' - @TypeSpec dict<, state:tests.withcassandra.storagedict_split_tests.SObj_Basic> - ''' - - -class SObj_SimpleClassField(StorageObj): - ''' - @ClassField attr1 int - @ClassField mydict dict<, value:double> - @ClassField attr3 double - ''' - - -class SObj_ComplexClassField(StorageObj): - ''' - @ClassField attr1 int - @ClassField mydict dict<, val:tests.withcassandra.storagedict_split_tests.SObj_Basic> - @ClassField attr3 double - ''' - - -class StorageDictSplitTestbase(unittest.TestCase): - @classmethod - def setUpClass(cls): - config.session.execute("DROP KEYSPACE IF EXISTS my_app", timeout=60) - config.session.execute( - "CREATE KEYSPACE IF NOT EXISTS my_app WITH " - "replication = {'class': 'SimpleStrategy', 'replication_factor': 1};", - timeout=60) - - def test_simple_iterkeys_split(self): - config.session.execute( - "CREATE TABLE IF NOT EXISTS my_app.tab30(position int, value text, PRIMARY KEY(position))") - tablename = "tab30" - pd = StorageDict(tablename, - [('position', 'int')], - [('value', 'text')]) - num_inserts = 10000 - what_should_be = set() - for i in range(num_inserts): - pd[i] = 'ciao' + str(i) - what_should_be.add(i) - del pd - import gc - gc.collect() - count, = config.session.execute('SELECT count(*) FROM my_app.tab30')[0] - self.assertEqual(count, num_inserts) - - pd = StorageDict(tablename, - [('position', 'int')], - [('value', 'text')]) - - count = 0 - res = set() - for partition in pd.split(): - for val in partition.keys(): - res.add(val) - count += 1 - self.assertEqual(count, num_inserts) - self.assertEqual(what_should_be, res) - - def test_remote_build_iterkeys_split(self): - config.session.execute( - "CREATE TABLE IF NOT EXISTS my_app.tab_b0(position int, value text, PRIMARY KEY(position))") - tablename = "tab_b0" - pd = StorageDict(tablename, - [('position', 'int')], - [('value', 'text')]) - num_inserts = 10000 - what_should_be = set() - for i in range(num_inserts): - pd[i] = 'ciao' + str(i) - what_should_be.add(i) - del pd - import gc - gc.collect() - count, = config.session.execute('SELECT count(*) FROM my_app.tab_b0')[0] - self.assertEqual(count, num_inserts) - - pd = StorageDict(tablename, - [('position', 'int')], - [('value', 'text')]) - - count = 0 - res = set() - for partition in pd.split(): - id = partition.storage_id - from storage.api import getByID - rebuild = getByID(id) - for val in rebuild.keys(): - res.add(val) - count += 1 - self.assertEqual(count, num_inserts) - self.assertEqual(what_should_be, res) - - def test_composed_iteritems(self): - config.session.execute( - "CREATE TABLE IF NOT EXISTS my_app.tab_b1(pid int,time int, value text,x float,y float,z float, PRIMARY KEY(pid,time))") - tablename = "tab_b1" - pd = StorageDict(tablename, - [('pid', 'int'), ('time', 'int')], - [('value', 'text'), ('x', 'double'), ('y', 'double'), ('z', 'double')]) - num_inserts = 10000 - what_should_be = {} - for i in range(num_inserts): - pd[i, i + 100] = ['ciao' + str(i), i * 0.1, i * 0.2, i * 0.3] - what_should_be[i, i + 100] = ('ciao' + str(i), i * 0.1, i * 0.2, i * 0.3) - - del pd - import gc - gc.collect() - count, = config.session.execute('SELECT count(*) FROM my_app.tab_b1')[0] - self.assertEqual(count, num_inserts) - pd = StorageDict(tablename, - [('pid', 'int'), ('time', 'int')], - [('value', 'text'), ('x', 'float'), ('y', 'float'), ('z', 'float')]) - count = 0 - res = {} - for partition in pd.split(): - for key, val in partition.items(): - res[key] = val - count += 1 - self.assertEqual(count, num_inserts) - delta = 0.0001 - for i in range(num_inserts): - a = what_should_be[i, i + 100] - b = res[i, i + 100] - self.assertEqual(a[0], b.value) - self.assertAlmostEquals(a[1], b.x, delta=delta) - self.assertAlmostEquals(a[2], b.y, delta=delta) - self.assertAlmostEquals(a[3], b.z, delta=delta) - - def computeItems(self, SDict): - counter = 0 - for item in SDict.keys(): - counter = counter + 1 - # self.assertEqual(counter, expected) - return counter - - def test_split_type_spec_basic(self): - nitems = 1000 - mybook = SDict_SimpleTypeSpec("test_records") - for id in range(0, nitems): - mybook[id] = 'someRandomText' + str(id) - - del mybook - import gc - gc.collect() - # verify all data has been written - myotherbook = SDict_SimpleTypeSpec("test_records") - self.assertEqual(nitems, self.computeItems(myotherbook)) - # we don't want anything in memory - del myotherbook - - myfinalbook = SDict_SimpleTypeSpec("test_records") - # split the dict and assert all the dicts generated contain the expected data - acc = 0 - nsplits = 0 - for b in myfinalbook.split(): # this split fails - acc = acc + self.computeItems(b) - nsplits = nsplits + 1 - - self.assertEqual(acc, nitems) - - def test_split_type_spec_complex(self): - config.session.execute("DROP TABLE IF EXISTS my_app.SObj_ComplexClassField") - nitems = 10 - mybook = SDict_ComplexTypeSpec("experimentx") - for id in range(0, nitems): - mybook[id] = SObj_Basic() - mybook[id].attr1 = id - mybook[id].attr2 = id / nitems - mybook[id].attr3 = "basicobj" + str(id) - - del mybook - - # verify all data has been written - myotherbook = SDict_ComplexTypeSpec("experimentx") - self.assertEqual(nitems, self.computeItems(myotherbook)) - # we don't want anything in memory - del myotherbook - - myfinalbook = SDict_ComplexTypeSpec("experimentx") - # split the dict and assert all the dicts generated contain the expected data - acc = 0 - nsplits = 0 - for b in myfinalbook.split(): # this split fails - acc = acc + self.computeItems(b) - nsplits = nsplits + 1 - - self.assertEqual(acc, nitems) - - def test_split_class_field_simple(self): - config.session.execute("DROP TABLE IF EXISTS my_app.SObj_SimpleClassField") - nitems = 80 - mybook = SObj_SimpleClassField("so_split_dict_simple") - mybook.attr1 = nitems - mybook.attr3 = nitems / 100 - for id in range(0, nitems): - key_text = 'so_split_dict_simple' + str(id) - mybook.mydict[key_text] = id / nitems - - del mybook - - # verify all data has been written - myotherbook = SObj_SimpleClassField("so_split_dict_simple") - self.assertEqual(nitems, self.computeItems(myotherbook.mydict)) - # we don't want anything in memory - del myotherbook - - myfinalbook = SObj_SimpleClassField("so_split_dict_simple") - # split the dict and assert all the dicts generated contain the expected data - acc = 0 - nsplits = 0 - for b in myfinalbook.mydict.split(): # this split fails - acc = acc + self.computeItems(b) - nsplits = nsplits + 1 - - self.assertEqual(acc, nitems) - - def test_split_class_field_complex(self): - nitems = 50 - mybook = SObj_ComplexClassField("so_split_dict_complex") - mybook.attr1 = nitems - mybook.attr3 = nitems / 100 - for id in range(0, nitems): - key_text = 'so_split_dict_simple' + str(id) - so = SObj_Basic() - so.attr1 = id - so.attr2 = id / nitems - so.attr3 = 'someInnerRandomText' + str(id) - mybook.mydict[key_text] = so - - del mybook - - # verify all data has been written - myotherbook = SObj_ComplexClassField("so_split_dict_complex") - self.assertEqual(nitems, self.computeItems(myotherbook.mydict)) - # we don't want anything in memory - del myotherbook - - myfinalbook = SObj_ComplexClassField("so_split_dict_complex") - # split the dict and assert all the dicts generated contain the expected data - acc = 0 - nsplits = 0 - for b in myfinalbook.mydict.split(): # this split fails - acc = acc + self.computeItems(b) - nsplits = nsplits + 1 - - self.assertEqual(acc, nitems) - - ''' - def test_remote_build_composed_iteritems(self): - config.session.execute( - "CREATE TABLE IF NOT EXISTS my_app.tab_b2(pid int,time int, value text,x float,y float,z float, PRIMARY KEY(pid,time))") - tablename = "tab_b2" - pd = StorageDict(tablename, - [('pid', 'int'), ('time', 'int')], - [('value', 'text'), ('x', 'float'), ('y', 'float'), ('z', 'float')]) - - what_should_be = {} - for i in range(10000): - pd[i, i + 100] = ('ciao' + str(i), i * 0.1, i * 0.2, i * 0.3) - what_should_be[i, i + 100] = ('ciao' + str(i), i * 0.1, i * 0.2, i * 0.3) - - del pd - - count, = config.session.execute('SELECT count(*) FROM my_app.tab_b2')[0] - self.assertEqual(count, 10000) - pd = StorageDict(tablename, - [('pid', 'int'), ('time', 'int')], - [('value', 'text'), ('x', 'float'), ('y', 'float'), ('z', 'float')]) - count = 0 - res = {} - for partition in pd.split(): - id = partition.storage_id - from storage.api import getByID - rebuild = getByID(id) - for key, val in rebuild.items(): - res[key] = val - count += 1 - self.assertEqual(count, 10000) - delta = 0.0001 - for i in range(10000): - a = what_should_be[i, i + 100] - b = res[i, i + 100] - self.assertEqual(a[0], b.value) - self.assertAlmostEquals(a[1], b.x, delta=delta) - self.assertAlmostEquals(a[2], b.y, delta=delta) - self.assertAlmostEquals(a[3], b.z, delta=delta) - ''' - - -class StorageDictSlitTestVnodes(StorageDictSplitTestbase): - @classmethod - def setUpClass(cls): - from hfetch import disconnectCassandra - disconnectCassandra() - from .. import test_config, set_ccm_cluster - test_config.ccm_cluster.clear() - set_ccm_cluster() - from .. import TEST_DEBUG - try: - test_config.ccm_cluster.populate(3, use_vnodes=True).start() - except Exception as ex: - if not TEST_DEBUG: - raise ex - - import hfetch - import hecuba - import importlib - importlib.reload(hfetch) - import importlib - importlib.reload(hecuba) - config.session.execute("DROP KEYSPACE IF EXISTS my_app") - config.session.execute( - "CREATE KEYSPACE IF NOT EXISTS my_app WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};") - super(StorageDictSplitTestbase, cls).setUpClass() - - @classmethod - def tearDownClass(cls): - from .. import test_config - from hfetch import disconnectCassandra - disconnectCassandra() - - test_config.ccm_cluster.clear() - from .. import set_up_default_cassandra - set_up_default_cassandra() - - -if __name__ == '__main__': - unittest.main() diff --git a/hecuba_py/tests/withcassandra/storagedict_tests.py b/hecuba_py/tests/withcassandra/storagedict_tests.py deleted file mode 100644 index 4a40a183..00000000 --- a/hecuba_py/tests/withcassandra/storagedict_tests.py +++ /dev/null @@ -1,1126 +0,0 @@ -import unittest - -from hecuba import config, StorageObj, StorageDict -from hecuba.IStorage import build_remotely -from ..app.words import Words -import uuid -import time - - -class MyStorageDict(StorageDict): - ''' - @TypeSpec dict<, val:int> - ''' - pass - - -class MyStorageDict2(StorageDict): - ''' - @TypeSpec dict<, val:int> - ''' - pass - - -class MyStorageDict3(StorageDict): - ''' - @TypeSpec dict<, val:int> - ''' - - -class MyStorageObjC(StorageObj): - ''' - @ClassField mona dict<, b:int> - ''' - - -class MyStorageDictA(StorageDict): - ''' - @TypeSpec dict<, b:int> - ''' - - -class mydict(StorageDict): - ''' - @TypeSpec dict<, val0:tests.withcassandra.storagedict_tests.myobj2> - ''' - - -class myobj2(StorageObj): - ''' - @ClassField attr1 int - @ClassField attr2 str - ''' - - -class DictWithTuples(StorageDict): - ''' - @TypeSpec dict<, val:tuple> - ''' - - -class DictWithTuples2(StorageDict): - ''' - @TypeSpec dict<, key1:int>, val:str> - ''' - - -class DictWithTuples3(StorageDict): - ''' - @TypeSpec dict<, val0:int, val1:tuple, val2:str, val3:tuple> - ''' - - -class MultiTuples(StorageDict): - ''' - @TypeSpec dict<, m_cloudfract:tuple, m_humidity:tuple, m_icewater:tuple, m_liquidwate:tuple, m_ozone:tuple, m_pot_vorticit:tuple, m_rain:tuple, m_snow:tuple> - ''' - - -class Test2StorageObj(StorageObj): - ''' - @ClassField name str - @ClassField age int - ''' - pass - - -class TestDictOfStorageObj(StorageDict): - ''' - @TypeSpec dict<, val:tests.withcassandra.storageobj_tests.Test2StorageObj> - ''' - - -class StorageDictTest(unittest.TestCase): - def test_init_empty(self): - config.session.execute("DROP TABLE IF EXISTS my_app.tab1") - tablename = "ksp.tab1" - tokens = [(1, 2), (2, 3), (3, 4)] - nopars = StorageDict(tablename, - [('position', 'int')], - [('value', 'int')], - tokens=tokens) - self.assertEqual("tab1", nopars._table) - self.assertEqual("ksp", nopars._ksp) - - res = config.session.execute( - 'SELECT storage_id, primary_keys, columns, class_name, name, tokens, istorage_props,indexed_on ' + - 'FROM hecuba.istorage WHERE storage_id = %s', [nopars.storage_id])[0] - - self.assertEqual(uuid.uuid3(uuid.NAMESPACE_DNS, tablename), nopars.storage_id) - self.assertEqual(nopars.__class__.__module__, 'hecuba.hdict') - self.assertEqual(nopars.__class__.__name__, 'StorageDict') - - rebuild = build_remotely(res._asdict()) - self.assertEqual(rebuild._built_remotely, True) - self.assertEqual('tab1', rebuild._table) - self.assertEqual("ksp", rebuild._ksp) - self.assertEqual(uuid.uuid3(uuid.NAMESPACE_DNS, tablename), rebuild.storage_id) - - self.assertEqual(nopars.storage_id, rebuild.storage_id) - - def test_init_empty_def_keyspace(self): - config.session.execute("DROP TABLE IF EXISTS my_app.tab1") - tablename = "tab1" - tokens = [(1, 2), (2, 3), (3, 4)] - nopars = StorageDict(tablename, - [('position', 'int')], - [('value', 'int')], - tokens=tokens) - self.assertEqual("tab1", nopars._table) - self.assertEqual(config.execution_name, nopars._ksp) - - res = config.session.execute( - 'SELECT storage_id, primary_keys, columns, class_name, name, tokens, istorage_props,indexed_on ' + - 'FROM hecuba.istorage WHERE storage_id = %s', [nopars.storage_id])[0] - - self.assertEqual(uuid.uuid3(uuid.NAMESPACE_DNS, config.execution_name + '.' + tablename), nopars.storage_id) - self.assertEqual(nopars.__class__.__module__, 'hecuba.hdict') - self.assertEqual(nopars.__class__.__name__, 'StorageDict') - - rebuild = build_remotely(res._asdict()) - self.assertEqual(rebuild._built_remotely, True) - self.assertEqual('tab1', rebuild._table) - self.assertEqual(config.execution_name, rebuild._ksp) - self.assertEqual(uuid.uuid3(uuid.NAMESPACE_DNS, config.execution_name + '.' + tablename), rebuild.storage_id) - - self.assertEqual(nopars.storage_id, rebuild.storage_id) - - def test_simple_insertions(self): - config.session.execute("DROP TABLE IF EXISTS my_app.tab10") - tablename = "tab10" - tokens = [(1, 2), (2, 3), (3, 4)] - pd = StorageDict(tablename, - [('position', 'int')], - [('value', 'text')], - tokens=tokens) - - for i in range(100): - pd[i] = 'ciao' + str(i) - del pd - import gc - gc.collect() - count, = config.session.execute('SELECT count(*) FROM my_app.tab10')[0] - self.assertEqual(count, 100) - - def test_dict_print(self): - tablename = "tab10" - config.session.execute("DROP TABLE IF EXISTS my_app." + tablename) - pd = StorageDict(tablename, - [('position', 'int')], - [('value', 'text')]) - - self.assertEquals(pd.__repr__(), "") - - pd[0] = 'a' - self.assertEquals(pd.__repr__(), "{0: 'a'}") - - pd[1] = 'b' - self.assertEquals(pd.__repr__(), "{1: 'b', 0: 'a'}") - - for i in range(1100): - pd[i] = str(i) - self.assertEquals(pd.__repr__().count(':'), 1000) - - def test_get_strs(self): - tablename = "tab10" - config.session.execute("DROP TABLE IF EXISTS my_app." + tablename) - pd = StorageDict(tablename, - [('position', 'int')], - [('value', 'text')]) - pd[0] = 'str1' - self.assertEquals(pd[0], 'str1') - ''' - config.session.execute("DROP TABLE IF EXISTS my_app." + tablename) - pd = StorageDict(tablename, - [('position', 'int')], - [('value', 'list')]) - pd[0] = ['str1', 'str2'] - self.assertEquals(pd[0], ['str1', 'str2']) - - config.session.execute("DROP TABLE IF EXISTS my_app." + tablename) - pd = StorageDict(tablename, - [('position', 'int')], - [('value', 'tuple')]) - pd[0] = 'str1', 'str2' - self.assertEquals(pd[0], 'str1', 'str2') - ''' - - def test_make_persistent(self): - config.session.execute("DROP TABLE IF EXISTS my_app.t_make") - config.session.execute("DROP TABLE IF EXISTS my_app.t_make_words") - nopars = Words() - self.assertIsNone(nopars.storage_id) - nopars.ciao = 1 - nopars.ciao2 = "1" - nopars.ciao3 = [1, 2, 3] - nopars.ciao4 = (1, 2, 3) - for i in range(10): - nopars.words[i] = 'ciao' + str(i) - - count, = config.session.execute( - "SELECT count(*) FROM system_schema.tables WHERE keyspace_name = 'my_app' and table_name = 'Words_words'")[ - 0] - self.assertEqual(0, count) - - nopars.make_persistent("t_make") - - del nopars - import gc - gc.collect() - count, = config.session.execute('SELECT count(*) FROM my_app.t_make_words')[0] - self.assertEqual(10, count) - - def test_none_value(self): - config.session.execute("DROP TABLE IF EXISTS my_app.Words") - config.session.execute("DROP TABLE IF EXISTS my_app.Words_words") - mydict = MyStorageDict('somename') - mydict[0] = None - self.assertEqual(mydict[0], None) - config.session.execute("DROP TABLE IF EXISTS my_app.Words") - config.session.execute("DROP TABLE IF EXISTS my_app.Words_words") - - def test_none_keys(self): - config.session.execute("DROP TABLE IF EXISTS my_app.somename") - mydict = MyStorageDict('somename') - - def set_none_key(): - mydict[None] = 1 - - self.assertRaises(TypeError, set_none_key) - config.session.execute("DROP TABLE IF EXISTS my_app.somename") - - def test_paranoid_setitem_nonpersistent(self): - config.session.execute("DROP TABLE IF EXISTS my_app.mydict") - pd = StorageDict("mydict", - [('position', 'int')], - [('value', 'text')]) - pd[0] = 'bla' - self.assertEquals(pd[0], 'bla') - - def set_wrong_val_1(): - pd[0] = 1 - - self.assertRaises(TypeError, set_wrong_val_1) - - def set_wrong_val_2(): - pd['bla'] = 'bla' - - self.assertRaises(TypeError, set_wrong_val_2) - - def test_paranoid_setitem_multiple_nonpersistent(self): - config.session.execute("DROP TABLE IF EXISTS my_app.mydict") - pd = StorageDict("mydict", - [('position1', 'int'), ('position2', 'text')], - [('value1', 'text'), ('value2', 'int')]) - pd[0, 'pos1'] = ['bla', 1] - self.assertEquals(pd[0, 'pos1'], ('bla', 1)) - - def set_wrong_val_1(): - pd[0, 'pos1'] = [1, 'bla'] - - self.assertRaises(TypeError, set_wrong_val_1) - - def set_wrong_val_2(): - pd['pos1', 0] = ['bla', 1] - - self.assertRaises(TypeError, set_wrong_val_2) - - def test_paranoid_setitem_persistent(self): - config.session.execute("DROP TABLE IF EXISTS my_app.tab_a1") - pd = StorageDict("tab_a1", - [('position', 'int')], - [('value', 'text')]) - pd[0] = 'bla' - result = config.session.execute('SELECT value FROM my_app.tab_a1 WHERE position = 0') - for row in result: - self.assertEquals(row.value, 'bla') - - def set_wrong_val_test(): - pd[0] = 1 - - self.assertRaises(TypeError, set_wrong_val_test) - - def test_paranoid_setitem_multiple_persistent(self): - config.session.execute("DROP TABLE IF EXISTS my_app.tab_a2") - pd = StorageDict("tab_a2", - [('position1', 'int'), ('position2', 'text')], - [('value1', 'text'), ('value2', 'int')]) - pd[0, 'pos1'] = ['bla', 1] - for result in pd.values(): - self.assertEquals(result.value1, 'bla') - self.assertEquals(result.value2, 1) - - def set_wrong_val(): - pd[0, 'pos1'] = ['bla', 'bla1'] - - self.assertRaises(TypeError, set_wrong_val) - - def set_wrong_key(): - pd['bla', 'pos1'] = ['bla', 1] - - self.assertRaises(TypeError, set_wrong_key) - - def test_paranoid_setitemdouble_persistent(self): - config.session.execute("DROP TABLE IF EXISTS my_app.tab_a3") - pd = StorageDict("tab_a3", - [('position', 'int')], - [('value', 'double')]) - pd[0] = 2.0 - result = config.session.execute('SELECT value FROM my_app.tab_a3 WHERE position = 0') - for row in result: - self.assertEquals(row.value, 2.0) - - def set_wrong_val_test(): - pd[0] = 1 - - set_wrong_val_test() - - def test_paranoid_setitemdouble_multiple_persistent(self): - config.session.execute("DROP TABLE IF EXISTS my_app.tab_a4") - pd = StorageDict("tab_a4", - [('position1', 'int'), ('position2', 'text')], - [('value1', 'text'), ('value2', 'double')]) - pd[0, 'pos1'] = ['bla', 1.0] - time.sleep(2) - self.assertEquals(pd[0, 'pos1'], ('bla', 1.0)) - - def test_empty_persistent(self): - config.session.execute("DROP TABLE IF EXISTS my_app.wordsso") - config.session.execute("DROP TABLE IF EXISTS my_app.wordsso_words") - so = Words() - so.make_persistent("wordsso") - so.ciao = "an attribute" - so.another = 123 - config.batch_size = 1 - config.cache_activated = False - for i in range(10): - so.words[i] = str.join(',', map(lambda a: "ciao", range(i))) - - del so - import gc - gc.collect() - count, = config.session.execute('SELECT count(*) FROM my_app.wordsso_words')[0] - self.assertEqual(10, count) - - so = Words("wordsso") - so.delete_persistent() - - def delete_already_deleted(): - so.words.delete_persistent() - - self.assertRaises(RuntimeError, delete_already_deleted) - - count, = config.session.execute('SELECT count(*) FROM my_app.wordsso_words')[0] - self.assertEqual(0, count) - - def test_simple_items_test(self): - config.session.execute("DROP TABLE IF EXISTS my_app.tab_a1") - - pd = StorageDict("tab_a1", - [('position', 'int')], - [('value', 'text')]) - - what_should_be = {} - for i in range(100): - pd[i] = 'ciao' + str(i) - what_should_be[i] = 'ciao' + str(i) - del pd - import gc - gc.collect() - count, = config.session.execute('SELECT count(*) FROM my_app.tab_a1')[0] - self.assertEqual(count, 100) - pd = StorageDict("tab_a1", - [('position', 'int')], - [('value', 'text')]) - count = 0 - res = {} - for key, val in pd.items(): - res[key] = val - count += 1 - self.assertEqual(count, 100) - self.assertEqual(what_should_be, res) - - def test_simple_values_test(self): - config.session.execute("DROP TABLE IF EXISTS my_app.tab_a2") - tablename = "tab_a2" - pd = StorageDict(tablename, - [('position', 'int')], - [('value', 'text')]) - - what_should_be = set() - for i in range(100): - pd[i] = 'ciao' + str(i) - what_should_be.add('ciao' + str(i)) - del pd - import gc - gc.collect() - count, = config.session.execute('SELECT count(*) FROM my_app.tab_a2')[0] - - self.assertEqual(count, 100) - - pd = StorageDict(tablename, - [('position', 'int')], - [('value', 'text')]) - count = 0 - res = set() - for val in pd.values(): - res.add(val) - count += 1 - self.assertEqual(count, 100) - self.assertEqual(what_should_be, res) - - def test_simple_keys_test(self): - config.session.execute("DROP TABLE IF EXISTS my_app.tab_a3") - tablename = "tab_a3" - pd = StorageDict(tablename, - [('position', 'int')], - [('value', 'text')]) - - what_should_be = set() - for i in range(100): - pd[i] = 'ciao' + str(i) - what_should_be.add(i) - del pd - import gc - gc.collect() - count, = config.session.execute('SELECT count(*) FROM my_app.tab_a3')[0] - self.assertEqual(count, 100) - pd = StorageDict(tablename, - [('position', 'int')], - [('value', 'text')]) - count = 0 - res = set() - for val in pd.keys(): - res.add(val) - count += 1 - self.assertEqual(count, 100) - self.assertEqual(what_should_be, res) - - def test_simple_contains(self): - config.session.execute("DROP TABLE IF EXISTS my_app.tab_a4") - tablename = "tab_a4" - pd = StorageDict(tablename, - [('position', 'int')], - [('value', 'text')]) - - for i in range(100): - pd[i] = 'ciao' + str(i) - del pd - import gc - gc.collect() - count, = config.session.execute('SELECT count(*) FROM my_app.tab_a4')[0] - self.assertEqual(count, 100) - - pd = StorageDict(tablename, - [('position', 'int')], - [('value', 'text')]) - for i in range(100): - self.assertTrue(i in pd) - - def test_deleteitem_nonpersistent(self): - pd = StorageDict(None, - [('position', 'int')], - [('value', 'text')]) - pd[0] = 'to_delete' - del pd[0] - - def del_val(): - val = pd[0] - - self.assertRaises(KeyError, del_val) - - pd = StorageDict(None, - [('position', 'text')], - [('value', 'int')]) - pd['pos0'] = 0 - del pd['pos0'] - - def del_val(): - val = pd['pos0'] - - self.assertRaises(KeyError, del_val) - - def test_deleteitem_persistent(self): - tablename = "tab_a5" - config.session.execute("DROP TABLE IF EXISTS my_app." + tablename) - pd = StorageDict(tablename, - [('position', 'int')], - [('value', 'text')]) - pd[0] = 'to_delete' - del pd[0] - - def del_val(): - val = pd[0] - - self.assertRaises(KeyError, del_val) - - tablename = "tab_a6" - config.session.execute("DROP TABLE IF EXISTS my_app." + tablename) - pd = StorageDict(tablename, - [('position', 'text')], - [('value', 'int')]) - pd['pos1'] = 0 - del pd['pos1'] - - def del_val(): - val = pd['pos1'] - - self.assertRaises(KeyError, del_val) - - def test_composed_items_test(self): - config.session.execute("DROP TABLE IF EXISTS my_app.tab12") - tablename = "tab12" - pd = StorageDict(tablename, - primary_keys=[('pid', 'int'), ('time', 'int')], - columns=[('value', 'text'), ('x', 'double'), ('y', 'double'), ('z', 'double')]) - - what_should_be = {} - for i in range(100): - pd[i, i + 100] = ['ciao' + str(i), i * 0.1, i * 0.2, i * 0.3] - what_should_be[i, i + 100] = ['ciao' + str(i), i * 0.1, i * 0.2, i * 0.3] - - del pd - import gc - gc.collect() - count, = config.session.execute('SELECT count(*) FROM my_app.tab12')[0] - self.assertEqual(count, 100) - pd = StorageDict(tablename, - [('pid', 'int'), ('time', 'int')], - [('value', 'text'), ('x', 'double'), ('y', 'double'), ('z', 'double')]) - count = 0 - res = {} - for key, val in pd.items(): - res[key] = val - count += 1 - self.assertEqual(count, 100) - delta = 0.000001 - for i in range(100): - a = what_should_be[i, i + 100] - b = res[i, i + 100] - self.assertEqual(a[0], b.value) - self.assertAlmostEquals(a[1], b.x, delta=delta) - self.assertAlmostEquals(a[2], b.y, delta=delta) - self.assertAlmostEquals(a[3], b.z, delta=delta) - - def test_composed_key_return_list_items_test(self): - config.session.execute("DROP TABLE IF EXISTS my_app.tab13") - tablename = "tab13" - pd = StorageDict(tablename, - primary_keys=[('pid', 'int'), ('time', 'double')], - columns=[('value', 'text'), ('x', 'double'), ('y', 'double'), ('z', 'double')]) - - what_should_be = {} - for i in range(100): - pd[i, i + 100.0] = ['ciao' + str(i), i * 0.1, i * 0.2, i * 0.3] - what_should_be[i, i + 100.0] = ['ciao' + str(i), i * 0.1, i * 0.2, i * 0.3] - - del pd - import gc - gc.collect() - count, = config.session.execute('SELECT count(*) FROM my_app.tab13')[0] - self.assertEqual(count, 100) - pd = StorageDict(tablename, - [('pid', 'int')], - [('time', 'double'), ('value', 'text'), ('x', 'double'), ('y', 'double'), ('z', 'double')]) - count = 0 - res = {} - for key, val in pd.items(): - self.assertTrue(isinstance(key, int)) - self.assertTrue(isinstance(val[0], float)) - res[key] = val - count += 1 - self.assertEqual(count, 100) - # casting to avoid 1.0000001 float python problem - data = set([(key, int(val.time), val.value, int(val.x), int(val.y), int(val.z)) for key, val in pd.items()]) - data2 = set([(key[0], int(key[1]), val[0], int(val[1]), int(val[2]), int(val[3])) for key, val in - what_should_be.items()]) - self.assertEqual(data, data2) - - def test_storagedict_newinterface_localmemory(self): - config.session.execute("DROP TABLE IF EXISTS my_app.my_dict") - - my_dict = MyStorageDict() - my_dict[0] = 1 - error = False - try: - result = config.session.execute('SELECT * FROM my_app.my_dict')[0] - except Exception as e: - error = True - self.assertEquals(True, error) - - def test_storagedict_newinterface_memorytopersistent(self): - config.session.execute("DROP TABLE IF EXISTS my_app.my_dict") - - my_dict = MyStorageDict() - my_dict[0] = 1 - error = False - try: - result = config.session.execute('SELECT * FROM my_app.my_dict')[0] - except Exception as e: - error = True - self.assertEquals(True, error) - - my_dict.make_persistent('my_dict') - - del my_dict - import gc - gc.collect() - count, = config.session.execute('SELECT count(*) FROM my_app.my_dict')[0] - self.assertEquals(1, count) - - def test_storagedict_newinterface_persistent(self): - config.session.execute("DROP TABLE IF EXISTS my_app.my_dict") - - my_dict = MyStorageDict() - my_dict[0] = 1 - my_dict.make_persistent('my_dict') - time.sleep(1) - count, = config.session.execute('SELECT count(*) FROM my_app.my_dict')[0] - self.assertEquals(1, count) - - my_dict[1] = 2 - time.sleep(1) - count, = config.session.execute('SELECT count(*) FROM my_app.my_dict')[0] - self.assertEquals(2, count) - - my_dict2 = MyStorageDict('my_dict') - self.assertEquals(1, my_dict2[0]) - self.assertEquals(2, my_dict2[1]) - - def test_update(self): - config.session.execute("DROP TABLE IF EXISTS my_app.tab_a4") - config.session.execute("DROP TABLE IF EXISTS my_app.tab_a5") - tablename = "tab_a4" - pd = StorageDict(tablename, - [('position', 'int')], - [('value', 'text')]) - pd[0] = 'prev_a' - pd[1] = 'prev_b' - self.assertEquals(pd[0], 'prev_a') - self.assertEquals(pd[1], 'prev_b') - pd.update({0: 'a', 1: 'b'}) - time.sleep(1) - self.assertEquals(pd[0], 'a') - self.assertEquals(pd[1], 'b') - pd.update({2: 'c', 3: 'd'}) - time.sleep(1) - self.assertEquals(pd[0], 'a') - self.assertEquals(pd[1], 'b') - self.assertEquals(pd[2], 'c') - self.assertEquals(pd[3], 'd') - tablename = "tab_a5" - pd2 = StorageDict(tablename, - [('position', 'int')], - [('value', 'text')]) - pd2[0] = 'final_a' - pd2[4] = 'final_4' - pd.update(pd2) - time.sleep(1) - self.assertEquals(pd[0], 'final_a') - self.assertEquals(pd[4], 'final_4') - - def test_update_kwargs(self): - config.session.execute("DROP TABLE IF EXISTS my_app.tab_a6") - tablename = "tab_a6" - pd = StorageDict(tablename, - [('position', 'text')], - [('value', 'text')]) - pd['val1'] = 'old_a' - pd['val2'] = 'old_b' - time.sleep(2) - self.assertEquals(pd['val1'], 'old_a') - self.assertEquals(pd['val2'], 'old_b') - pd.update(val1='new_a', val2='new_b') - time.sleep(2) - self.assertEquals(pd['val1'], 'new_a') - self.assertEquals(pd['val2'], 'new_b') - - def test_get_persistent(self): - table_name = 'tab_a7' - config.session.execute("DROP TABLE IF EXISTS my_app." + table_name) - my_text = MyStorageDict3('my_app.' + table_name) - self.assertEquals(0, my_text.get('word', 0)) - my_text['word'] = my_text.get('word', 0) + 1 - time.sleep(2) - self.assertEquals(1, my_text.get('word', 0)) - - def test_get_notpersistent(self): - my_text = MyStorageDict3() - self.assertEquals(0, my_text.get('word', 0)) - my_text['word'] = my_text.get('word', 0) + 1 - time.sleep(2) - self.assertEquals(1, my_text.get('word', 0)) - - def test_keys(self): - config.session.execute("DROP TABLE IF EXISTS my_app.test_keys") - my_dict = MyStorageDict2('test_keys') - # int,text - int - nitems = 100 - # write nitems to the dict - for id in range(0, nitems): - text_id = 'someText' - # force some clash on second keys - if id % 2 == 0: - text_id = 'someText' + str(id) - my_dict[(id, text_id)] = id - - del my_dict # force sync - my_dict = MyStorageDict2('test_keys') - total_items = list(my_dict.items()) - - self.assertEqual(len(total_items), nitems) - - # del my_dict - - my_second_dict = MyStorageDict2() - - for id in range(nitems, 2 * nitems): - text_id = 'someText' - # force some clash on second keys - if id % 2 == 0: - text_id = 'someText' + str(id) - my_second_dict[(id, text_id)] = id - - my_second_dict.make_persistent('test_keys') - del my_second_dict # force sync - my_second_dict = MyStorageDict2() - my_second_dict.make_persistent('test_keys') - - total_items = list(my_second_dict.items()) - self.assertEqual(len(total_items), 2 * nitems) - del my_dict - del my_second_dict - - my_third_dict = MyStorageDict2('test_keys') - total_items = list(my_third_dict.items()) - self.assertEqual(len(total_items), 2 * nitems) - - del my_third_dict - config.session.execute("DROP TABLE IF EXISTS my_app.test_keys") - - def test_values(self): - config.session.execute("DROP TABLE IF EXISTS my_app.test_values") - my_dict = MyStorageDict2('test_values') - # int,text - int - nitems = 100 - # write nitems to the dict - for id in range(0, nitems): - text_id = 'someText' - # force some clash on second keys - if id % 2 == 0: - text_id = 'someText' + str(id) - my_dict[(id, text_id)] = id - - del my_dict # force sync - my_dict = MyStorageDict2('test_values') - total_items = my_dict.items() - - self.assertEqual(len(list(total_items)), nitems) - - # del my_dict - - my_second_dict = MyStorageDict2() - - for id in range(nitems, 2 * nitems): - text_id = 'someText' - # force some clash on second keys - if id % 2 == 0: - text_id = 'someText' + str(id) - my_second_dict[(id, text_id)] = id - - my_second_dict.make_persistent('test_values') - del my_second_dict # force sync - my_second_dict = MyStorageDict2() - my_second_dict.make_persistent('test_values') - - total_items = list(my_second_dict.items()) - self.assertEqual(len(total_items), 2 * nitems) - del my_dict - del my_second_dict - - my_third_dict = MyStorageDict2('test_values') - total_items = list(my_third_dict.items()) - self.assertEqual(len(total_items), 2 * nitems) - - del my_third_dict - config.session.execute("DROP TABLE IF EXISTS my_app.test_values") - - def test_items(self): - config.session.execute("DROP TABLE IF EXISTS my_app.test_items") - my_dict = MyStorageDict2('test_items') - # int,text - int - nitems = 100 - # write nitems to the dict - for id in range(0, nitems): - text_id = 'someText' - # force some clash on second keys - if id % 2 == 0: - text_id = 'someText' + str(id) - my_dict[(id, text_id)] = id - - del my_dict # force sync - my_dict = MyStorageDict2('test_items') - total_items = list(my_dict.items()) - - self.assertEqual(len(total_items), nitems) - - # del my_dict - - my_second_dict = MyStorageDict2() - - for id in range(nitems, 2 * nitems): - text_id = 'someText' - # force some clash on second keys - if id % 2 == 0: - text_id = 'someText' + str(id) - my_second_dict[(id, text_id)] = id - - my_second_dict.make_persistent('test_items') - del my_second_dict # force sync - my_second_dict = MyStorageDict2() - my_second_dict.make_persistent('test_items') - - total_items = list(my_second_dict.items()) - self.assertEqual(len(total_items), 2 * nitems) - del my_dict - del my_second_dict - - my_third_dict = MyStorageDict2('test_items') - total_items = list(my_third_dict.items()) - self.assertEqual(len(total_items), 2 * nitems) - - del my_third_dict - config.session.execute("DROP TABLE IF EXISTS my_app.test_items") - - def test_iterator_sync(self): - ''' - check that the prefetch returns the exact same number of elements as inserted - ''' - config.session.execute("DROP TABLE IF EXISTS my_app.test_iterator_sync") - my_dict = MyStorageDict2('test_iterator_sync') - # int,text - int - nitems = 5000 - # write nitems to the dict - for id in range(0, nitems): - text_id = 'someText' - # force some clash on second keys - if id % 2 == 0: - text_id = 'someText' + str(id) - my_dict[(id, text_id)] = id - - total_items = list(my_dict.items()) - - self.assertEqual(len(total_items), nitems) - del my_dict - config.session.execute("DROP TABLE IF EXISTS my_app.test_iterator_sync") - - def test_assign_and_replace(self): - config.session.execute("DROP TABLE IF EXISTS my_app.MyStorageObjC") - config.session.execute("DROP TABLE IF EXISTS my_app.MyStorageObjC_mona") - config.session.execute("DROP TABLE IF EXISTS my_app.MyStorageObjC_mona_0") - config.session.execute("DROP TABLE IF EXISTS my_app.MyStorageObjC_mona_1") - config.session.execute("DROP TABLE IF EXISTS my_app.second_name") - - first_storagedict = MyStorageDictA() - my_storageobj = MyStorageObjC("first_name") - self.assertIsNotNone(my_storageobj.mona.storage_id) - self.assertTrue(isinstance(my_storageobj.mona.storage_id, uuid.UUID)) - - # Creates the 'my_app.mystorageobjc_mona' table - my_storageobj.mona['uno'] = 123 - - # empty dict no persistent assigned to persistent object - # creates the 'my_app.mystorageobjc_mona_0' table - my_storageobj.mona = first_storagedict - - self.assertIsNotNone(my_storageobj.mona.storage_id) - self.assertTrue(isinstance(my_storageobj.mona.storage_id, uuid.UUID)) - nitems = list(my_storageobj.mona.items()) - self.assertEqual(len(nitems), 0) - # it was assigned to a persistent storage obj, it should be persistent - self.assertIsNotNone(first_storagedict.storage_id) - self.assertTrue(isinstance(first_storagedict.storage_id, uuid.UUID)) - # create another non persistent dict - my_storagedict = MyStorageDictA() - my_storagedict['due'] = 12341321 - # store the second non persistent dict into the StorageObj attribute - my_storageobj.mona = my_storagedict - # contents should not be merged, the contents should be the same as in the last storage_dict - elements = list(my_storageobj.mona.items()) - self.assertEqual(len(elements), 1) - my_storagedict = MyStorageDictA('second_name') - last_key = 'some_key' - last_value = 123 - - my_storagedict[last_key] = last_value - # my_storageobj.mona - my_storageobj.mona = my_storagedict - self.assertTrue(last_key in my_storageobj.mona) - - last_items = list(my_storageobj.mona.items()) - self.assertEqual(len(last_items), 1) - self.assertEqual(my_storagedict[last_key], last_value) - - config.session.execute("DROP TABLE IF EXISTS my_app.MyStorageObjC") - config.session.execute("DROP TABLE IF EXISTS my_app.MyStorageObjC_mona") - config.session.execute("DROP TABLE IF EXISTS my_app.MyStorageObjC_mona_0") - config.session.execute("DROP TABLE IF EXISTS my_app.MyStorageObjC_mona_1") - config.session.execute("DROP TABLE IF EXISTS my_app.second_name") - - def test_make_persistent_with_persistent_obj(self): - o2 = myobj2("obj") - o2.attr1 = 1 - o2.attr2 = "2" - - d = mydict() - d[0] = o2 - try: - d.make_persistent("dict") - except Exception as ex: - self.fail("Raised exception unexpectedly.\n" + str(ex)) - - def test_int_tuples(self): - config.session.execute("DROP TABLE IF EXISTS my_app.dictwithtuples") - d = DictWithTuples("my_app.dictwithtuples") - - what_should_be = dict() - for i in range(0, 10): - what_should_be[i] = (i, i + 10) - d[i] = (i, i + 10) - - time.sleep(1) - for i in range(0, 10): - self.assertEqual(d[i], (i, i + 10)) - - self.assertEqual(len(list(d.keys())), 10) - - res = dict() - count = 0 - for key, item in d.items(): - res[key] = item - count += 1 - - self.assertEqual(count, len(what_should_be)) - self.assertEqual(what_should_be, res) - - def test_values_tuples(self): - # @TypeSpec dict<, val0:int, val1:tuple, val2:str, val3:tuple> - config.session.execute("DROP TABLE IF EXISTS my_app.dictwithtuples3") - d = DictWithTuples3("my_app.dictwithtuples3") - - what_should_be = set() - for i in range(0, 20): - what_should_be.add((i, (5500000000000000, i + 10), "hola", ("adios", (i + 20.5)))) - d[i] = [i, (5500000000000000, i + 10), "hola", ("adios", (i + 20.5))] - - time.sleep(1) - res = set() - count = 0 - for item in d.values(): - res.add(tuple(item)) - count += 1 - - self.assertEqual(count, len(what_should_be)) - self.assertEqual(what_should_be, res) - self.assertEqual(what_should_be, res) - - def test_tuples_in_key(self): - config.session.execute("DROP TABLE IF EXISTS my_app.dictwithtuples2") - d = DictWithTuples2("my_app.dictwithtuples2") - - for i in range(0, 10): - d[(i, i), i + 1] = str(i) - - time.sleep(1) - for i in range(0, 10): - self.assertEqual(d[(i, i), i + 1], str(i)) - - self.assertEqual(len(list(d.keys())), 10) - - def test_keys_tuples(self): - config.session.execute("DROP TABLE IF EXISTS my_app.dictwithtuples2") - d = DictWithTuples2("my_app.dictwithtuples2") - - what_should_be = set() - for i in range(0, 10): - what_should_be.add(((i, i), i + 1)) - d[(i, i), i + 1] = str(i) - - time.sleep(1) - - res = set() - count = 0 - for key in d.keys(): - res.add(tuple(key)) - count += 1 - - self.assertEqual(count, len(what_should_be)) - self.assertEqual(what_should_be, res) - - def test_multiple_tuples(self): - config.session.execute("DROP TABLE IF EXISTS my_app.dictmultipletuples") - d = DictWithTuples3("my_app.dictmultipletuples") - - what_should_be = dict() - for i in range(0, 10): - what_should_be[i] = [i, (5500000000000000, i + 10), "hola", ("adios", (i + 20.5))] - d[i] = [i, (5500000000000000, i + 10), "hola", ("adios", (i + 20.5))] - - time.sleep(2) - for i in range(0, 10): - self.assertEqual(list(d[i]), [i, (5500000000000000, i + 10), "hola", ("adios", (i + 20.5))]) - self.assertEqual(len(list(d.keys())), 10) - - res = dict() - count = 0 - for key, item in d.items(): - res[key] = list(item) - count += 1 - - self.assertEqual(count, len(what_should_be)) - self.assertEqual(what_should_be, res) - - def test_int_tuples_null_values(self): - config.session.execute("DROP TABLE IF EXISTS my_app.dictwithtuples") - d = DictWithTuples("my_app.dictwithtuples") - - for i in range(0, 10): - if i % 2 == 0: - d[i] = (None, i + 10) - else: - d[i] = (i, i + 10) - - d = DictWithTuples("my_app.dictwithtuples") - for i in range(0, 10): - if i % 2 == 0: - self.assertEqual(d[i], (None, i + 10)) - else: - self.assertEqual(d[i], (i, i + 10)) - - def test_multi_tuples(self): - config.session.execute("DROP TABLE IF EXISTS my_app.multituples") - d = MultiTuples("my_app.multituples") - what_should_be = dict() - - for i in range(0, 10): - d[(i, i, i, i)] = [(i, i, i, i), (i, i, i, i), (i, i, i, i), (i, i, i, i), (i, i, i, i), (i, i, i, i), - (i, i, i, i), (i, i, i, i)] - what_should_be[(i, i, i, i)] = [(i, i, i, i), (i, i, i, i), (i, i, i, i), (i, i, i, i), (i, i, i, i), - (i, i, i, i), - (i, i, i, i), (i, i, i, i)] - for i in range(0, 10): - self.assertEqual(list(d[(i, i, i, i)]), - [(float(i), float(i), float(i), i), (float(i), float(i), float(i), i), - (float(i), float(i), float(i), i), (float(i), float(i), float(i), i), - (float(i), float(i), float(i), i), (float(i), float(i), float(i), i), - (float(i), float(i), float(i), i), (float(i), float(i), float(i), i)]) - - def test_multiple_tuples_NULL(self): - config.session.execute("DROP TABLE IF EXISTS my_app.dictmultipletuples") - d = DictWithTuples3("my_app.dictmultipletuples") - - what_should_be = dict() - for i in range(0, 10): - if i % 2 == 0: - what_should_be[i] = [i, (5500000000000000, i + 10), "hola", ("adios", (i + 20.5))] - d[i] = [i, (5500000000000000, i + 10), "hola", ("adios", (i + 20.5))] - else: - what_should_be[i] = [i, (5500000000000000, None), "hola", (None, (i + 20.5))] - d[i] = [i, (5500000000000000, None), "hola", (None, (i + 20.5))] - - d = DictWithTuples3("my_app.dictmultipletuples") - for i in range(0, 10): - if i % 2 == 0: - self.assertEqual(list(d[i]), [i, (5500000000000000, i + 10), "hola", ("adios", (i + 20.5))]) - else: - self.assertEqual(list(d[i]), [i, (5500000000000000, None), "hola", (None, (i + 20.5))]) - - self.assertEqual(len(list(d.keys())), 10) - - res = dict() - count = 0 - for key, item in d.items(): - res[key] = list(item) - count += 1 - - self.assertEqual(count, len(what_should_be)) - self.assertEqual(what_should_be, res) - - def test_storagedict_objs_same_table(self): - config.session.execute("DROP TABLE IF EXISTS my_app.my_dict") - config.session.execute("DROP TABLE IF EXISTS my_app.Test2StorageObj") - d = TestDictOfStorageObj("my_app.my_dict") - for i in range(0, 10): - o = Test2StorageObj() - o.name = "adri" + str(i) - o.age = i - d[i] = o - - n = len(d) - for i in range(0, n): - self.assertEqual(d[i]._ksp, "my_app") - self.assertEqual(d[i]._table, "Test2StorageObj") - - -if __name__ == '__main__': - unittest.main() diff --git a/hecuba_py/tests/withcassandra/storagenumpy_tests.py b/hecuba_py/tests/withcassandra/storagenumpy_tests.py deleted file mode 100644 index 76f325c9..00000000 --- a/hecuba_py/tests/withcassandra/storagenumpy_tests.py +++ /dev/null @@ -1,130 +0,0 @@ -import unittest - -from hecuba import config, StorageNumpy -import uuid -import numpy as np - - -class StorageNumpyTest(unittest.TestCase): - table = 'numpy_test' - ksp = 'my_app' - - def test_init_empty(self): - tablename = None - - base_array = np.arange(4096).reshape((64, 64)) - storage_id = None - - basic_init = StorageNumpy(base_array) - self.assertTrue(np.array_equal(basic_init, base_array)) - - complete_init = StorageNumpy(base_array, storage_id, tablename) - self.assertTrue(np.array_equal(complete_init, base_array)) - - def test_types(self): - base_array = np.arange(256) - storage_id = None - tablename = None - - for typecode in np.typecodes['Integer']: - typed_array = StorageNumpy(base_array.astype(typecode), storage_id, tablename) - self.assertTrue(np.array_equal(typed_array, base_array.astype(typecode))) - - for typecode in np.typecodes['UnsignedInteger']: - typed_array = StorageNumpy(base_array.astype(typecode), storage_id, tablename) - self.assertTrue(np.array_equal(typed_array, base_array.astype(typecode))) - - def test_types_persistence(self): - base_array = np.arange(256) - tablename = self.ksp + '.' + self.table - - for typecode in np.typecodes['Integer']: - if typecode == 'p': - # TODO For now skip arrays made of pointers - pass - storage_id = uuid.uuid3(uuid.NAMESPACE_DNS, tablename + typecode) - typed_array = StorageNumpy(base_array.astype(typecode), storage_id, tablename) - self.assertTrue(np.array_equal(typed_array, base_array.astype(typecode))) - import gc - del typed_array - gc.collect() - typed_array = StorageNumpy(None, storage_id, tablename) - self.assertTrue(np.array_equal(typed_array, base_array.astype(typecode))) - - for typecode in np.typecodes['UnsignedInteger']: - if typecode == 'P': - # TODO For now skip arrays made of pointers - pass - storage_id = uuid.uuid3(uuid.NAMESPACE_DNS, tablename + typecode) - typed_array = StorageNumpy(base_array.astype(typecode), storage_id, tablename) - self.assertTrue(np.array_equal(typed_array, base_array.astype(typecode))) - typed_array = None - typed_array = StorageNumpy(None, storage_id, tablename) - self.assertTrue(np.array_equal(typed_array, base_array.astype(typecode))) - - def test_explicit_construct(self): - # From an explicit constructor - e.g. InfoArray(): - # obj is None - # (we're in the middle of the InfoArray.__new__ - # constructor, and self.info will be set when we return to - # InfoArray.__new__) - - basic_init = StorageNumpy() - - def test_view_cast(self): - # From view casting - e.g arr.view(InfoArray): - # obj is arr - # (type(obj) can be InfoArray) - - base_array = np.arange(4096).reshape((64, 64)) - view_cast = base_array.view(StorageNumpy) - - def test_new_from_template(self): - # From new-from-template - e.g infoarr[:3] - # type(obj) is InfoArray - base_array = np.arange(4096).reshape((64, 64)) - basic_init = StorageNumpy(base_array) - new_from_template = basic_init[:32] - - def test_explicit_construct(self): - # From an explicit constructor - e.g. InfoArray(): - # obj is None - # (we're in the middle of the InfoArray.__new__ - # constructor, and self.info will be set when we return to - # InfoArray.__new__) - - basic_init = StorageNumpy() - - def test_view_cast(self): - # From view casting - e.g arr.view(InfoArray): - # obj is arr - # (type(obj) can be InfoArray) - - base_array = np.arange(4096).reshape((64, 64)) - view_cast = base_array.view(StorageNumpy) - - def test_new_from_template(self): - # From new-from-template - e.g infoarr[:3] - # type(obj) is InfoArray - base_array = np.arange(4096).reshape((64, 64)) - basic_init = StorageNumpy(base_array) - new_from_template = basic_init[:32] - - def test_read_all(self): - nelem = 2 ** 21 - elem_dim = 2 ** 7 - - storage_id = uuid.uuid3(uuid.NAMESPACE_DNS, "first_test") - base_array = np.arange(nelem).reshape((elem_dim, elem_dim, elem_dim)) - casted = StorageNumpy(input_array=base_array, name="testing_arrays.first_test", storage_id=storage_id) - import gc - del casted - gc.collect() - test_numpy = np.arange(nelem).reshape((elem_dim, elem_dim, elem_dim)) - casted = StorageNumpy(name="testing_arrays.first_test", storage_id=storage_id) - chunk = casted[slice(None, None, None)] - self.assertTrue(np.allclose(chunk.view(np.ndarray), test_numpy)) - - -if __name__ == '__main__': - unittest.main() diff --git a/hecuba_py/tests/withcassandra/storageobj_split_tests.py b/hecuba_py/tests/withcassandra/storageobj_split_tests.py deleted file mode 100644 index 5df6b2bb..00000000 --- a/hecuba_py/tests/withcassandra/storageobj_split_tests.py +++ /dev/null @@ -1,171 +0,0 @@ -import unittest -import gc - -from hecuba import config -from hecuba.storageobj import StorageObj - - -class TestSimple(StorageObj): - ''' - @ClassField words dict<,value:str> - ''' - pass - - -N_CASS_NODES = 2 - - -class StorageObjSplitTest(unittest.TestCase): - def test_simple_keys_split_test(self): - tablename = "tab30" - config.session.execute("DROP TABLE IF EXISTS my_app.{}".format(tablename)) - config.session.execute("DROP TABLE IF EXISTS my_app.{}_words".format(tablename)) - sto = TestSimple(tablename) - pd = sto.words - num_inserts = 1000 - what_should_be = set() - for i in range(num_inserts): - pd[i] = 'ciao' + str(i) - what_should_be.add(i) - del pd, sto - - gc.collect() - count, = config.session.execute('SELECT count(*) FROM my_app.{}_words'.format(tablename))[0] - self.assertEqual(count, num_inserts) - - sto = TestSimple(tablename) - pd = sto.words - - count = 0 - res = set() - splits = 0 - for partition in pd.split(): - splits += 1 - for val in partition.keys(): - res.add(val) - count += 1 - pd.delete_persistent() - del pd - self.assertTrue(splits >= config.splits_per_node * N_CASS_NODES) - self.assertEqual(count, num_inserts) - self.assertEqual(what_should_be, res) - - def test_build_remotely_keys_split_test(self): - tablename = 'tab30' - config.session.execute('DROP TABLE IF EXISTS my_app.{}'.format(tablename)) - config.session.execute('DROP TABLE IF EXISTS my_app.{}_words'.format(tablename)) - sto = TestSimple(tablename) - pd = sto.words - num_inserts = 1000 - - what_should_be = set() - for i in range(num_inserts): - pd[i] = 'ciao' + str(i) - what_should_be.add(i) - del pd, sto - - gc.collect() - count, = config.session.execute('SELECT count(*) FROM my_app.{}_words'.format(tablename))[0] - self.assertEqual(count, num_inserts) - - sto = TestSimple(tablename) - pd = sto.words - - count = 0 - res = set() - splits = 0 - for partition in pd.split(): - id = partition.storage_id - from storage.api import getByID - rebuild = getByID(id) - splits += 1 - for val in rebuild.keys(): - res.add(val) - count += 1 - pd.delete_persistent() - del pd - self.assertTrue(splits >= config.splits_per_node * N_CASS_NODES) - self.assertEqual(count, num_inserts) - self.assertEqual(what_should_be, res) - - def test_simple_keys_split_fromSO_test(self): - tablename = "tab31" - config.session.execute('DROP TABLE IF EXISTS my_app.{}'.format(tablename)) - config.session.execute('DROP TABLE IF EXISTS my_app.{}_words'.format(tablename)) - sto = TestSimple(tablename) - pd = sto.words - num_inserts = 1000 - what_should_be = set() - for i in range(num_inserts): - pd[i] = 'ciao' + str(i) - what_should_be.add(i) - del pd, sto - - gc.collect() - count, = config.session.execute('SELECT count(*) FROM my_app.{}_words'.format(tablename))[0] - self.assertEqual(count, num_inserts) - - sto = TestSimple(tablename) - count = 0 - res = set() - splits = 0 - for partition in sto.split(): - splits += 1 - for val in partition.words.keys(): - res.add(val) - count += 1 - sto.delete_persistent() - del sto - self.assertTrue(splits >= config.splits_per_node * N_CASS_NODES) - self.assertEqual(count, num_inserts) - self.assertEqual(what_should_be, res) - - def test_build_remotely_keys_split_fromSO_test(self): - tablename = "tab32" - config.session.execute('DROP TABLE IF EXISTS my_app.{}'.format(tablename)) - config.session.execute('DROP TABLE IF EXISTS my_app.{}_words'.format(tablename)) - sto = TestSimple(tablename) - pd = sto.words - num_inserts = 1000 - what_should_be = set() - for i in range(num_inserts): - pd[i] = 'ciao' + str(i) - what_should_be.add(i) - del pd, sto - - gc.collect() - count, = config.session.execute('SELECT count(*) FROM my_app.{}_words'.format(tablename))[0] - self.assertEqual(count, num_inserts) - - sto = TestSimple(tablename) - count = 0 - res = set() - splits = 0 - for partition in sto.split(): - splits += 1 - id = partition.storage_id - from storage.api import getByID - rebuild = getByID(id) - for val in rebuild.words.keys(): - res.add(val) - count += 1 - sto.delete_persistent() - del sto - self.assertTrue(splits >= config.splits_per_node * N_CASS_NODES) - self.assertEqual(count, num_inserts) - self.assertEqual(what_should_be, res) - - def test_split_with_different_storage_ids(self): - tablename = "tab33" - config.session.execute('DROP TABLE IF EXISTS my_app.{}'.format(tablename)) - config.session.execute('DROP TABLE IF EXISTS my_app.{}_words'.format(tablename)) - sto = TestSimple(tablename) - pd = sto.words - - ids = len(set(map(lambda x: x.storage_id, pd.split()))) - self.assertTrue(ids >= config.splits_per_node * N_CASS_NODES) - sto.delete_persistent() - - -if __name__ == '__main__': - unittest.main() diff --git a/hecuba_py/tests/withcassandra/storageobj_tests.py b/hecuba_py/tests/withcassandra/storageobj_tests.py deleted file mode 100644 index a59af19d..00000000 --- a/hecuba_py/tests/withcassandra/storageobj_tests.py +++ /dev/null @@ -1,1281 +0,0 @@ -import time -import unittest -import uuid - -import cassandra -import numpy as np -from hecuba import config -from hecuba.tools import discrete_token_ranges -from hecuba.storageobj import StorageObj -from storage.api import getByID -from hecuba.IStorage import build_remotely - -from ..app.words import Words - - -class Test2StorageObj(StorageObj): - ''' - @ClassField name str - @ClassField age int - ''' - pass - - -class Result(StorageObj): - ''' - @ClassField instances dict<, numinstances:int> - ''' - pass - - -class TestStorageObj(StorageObj): - ''' - @ClassField test dict<, text:str> - ''' - pass - - -class TestStorageIndexedArgsObj(StorageObj): - ''' - @ClassField test dict<, x:float, y:float, z:float> - @Index_on test x,y,z - ''' - pass - - -class Test2StorageObjFloat(StorageObj): - ''' - @ClassField name str - @ClassField age float - ''' - pass - - -class Test3StorageObj(StorageObj): - ''' - @ClassField myso tests.withcassandra.storageobj_tests.Test2StorageObj - @ClassField myso2 tests.withcassandra.storageobj_tests.TestStorageObj - @ClassField myint int - @ClassField mystr str - ''' - pass - - -class Test4StorageObj(StorageObj): - ''' - @ClassField myotherso tests.withcassandra.storageobj_tests.Test2StorageObj - ''' - pass - - -class Test4bStorageObj(StorageObj): - ''' - @ClassField myotherso tests.withcassandra.test2storageobj.Test2StorageObj - ''' - pass - - -class Test5StorageObj(StorageObj): - ''' - @ClassField test2 dict<, myso:tests.withcassandra.storageobj_tests.Test2StorageObj> - ''' - pass - - -class Test6StorageObj(StorageObj): - ''' - @ClassField test3 dict<, val0:str, val1:str> - ''' - pass - - -class Test7StorageObj(StorageObj): - ''' - @ClassField test2 dict<, val0:tests.withcassandra.storageobj_tests.Test2StorageObj> - ''' - pass - - -class TestStorageObjNumpy(StorageObj): - ''' - @ClassField mynumpy numpy.ndarray - ''' - pass - - -class TestStorageObjNumpyDict(StorageObj): - ''' - @ClassField mynumpydict dict<, val:numpy.ndarray> - ''' - pass - - -class TestAttributes(StorageObj): - ''' - @ClassField key int - ''' - - value = None - - def do_nothing_at_all(self): - pass - - def setvalue(self, v): - self.value = v - - def getvalue(self): - return self.value - - -class mixObj(StorageObj): - ''' - @ClassField floatfield float - @ClassField intField int - @ClassField strField str - @ClassField intlistField list - @ClassField floatlistField list - @ClassField strlistField list - @ClassField dictField dict<, val0:str> - @ClassField inttupleField tuple - ''' - - -class StorageObjTest(unittest.TestCase): - def test_build_remotely(self): - config.session.execute("DROP TABLE IF EXISTS " + config.execution_name + ".TestStorageObj") - obj = TestStorageObj(config.execution_name + ".tt1") - r = {"built_remotely": False, "storage_id": uuid.uuid3(uuid.NAMESPACE_DNS, config.execution_name + '.tt1'), - "ksp": config.execution_name, - "class_name": str(TestStorageObj.__module__) + "." + TestStorageObj.__name__, "name": 'tt1', - "columns": [('val1', 'str')], "entry_point": 'localhost', "primary_keys": [('pk1', 'int')], - "istorage_props": {}, - "tokens": discrete_token_ranges([token.value for token in config.cluster.metadata.token_map.ring])} - - nopars = build_remotely(r) - self.assertEqual('TestStorageObj'.lower(), nopars._table) - self.assertEqual(config.execution_name, nopars._ksp) - self.assertEqual(uuid.uuid3(uuid.NAMESPACE_DNS, config.execution_name + '.tt1'), nopars.storage_id) - name, tkns = \ - config.session.execute("SELECT name, tokens FROM hecuba.istorage WHERE storage_id = %s", - [nopars.storage_id])[ - 0] - - self.assertEqual(name, config.execution_name + '.tt1') - self.assertEqual(tkns, r['tokens']) - - def test_init_create_pdict(self): - config.session.execute("DROP TABLE IF EXISTS my_app.TestStorageObj") - config.session.execute("DROP TABLE IF EXISTS my_app.TestStorageObj_instances") - config.session.execute("DROP TABLE IF EXISTS " + config.execution_name + '.TestStorageObj') - - r = {"built_remotely": False, "storage_id": uuid.uuid3(uuid.NAMESPACE_DNS, config.execution_name + '.tt1'), - "ksp": config.execution_name, - "class_name": str(TestStorageObj.__module__) + "." + TestStorageObj.__name__, "name": 'tt1', - "columns": [('val1', 'str')], "entry_point": 'localhost', "primary_keys": [('pk1', 'int')], - "istorage_props": {}, - "tokens": discrete_token_ranges([token.value for token in config.cluster.metadata.token_map.ring])} - - nopars = build_remotely(r) - self.assertEqual(nopars._built_remotely, False) - self.assertEqual('TestStorageObj'.lower(), nopars._table) - self.assertEqual(config.execution_name, nopars._ksp) - self.assertEqual(uuid.uuid3(uuid.NAMESPACE_DNS, config.execution_name + '.tt1'), nopars.storage_id) - name, tkns = \ - config.session.execute("SELECT name,tokens FROM hecuba.istorage WHERE storage_id = %s", - [nopars.storage_id])[0] - self.assertEqual(name, config.execution_name + '.' + r['name']) - self.assertEqual(tkns, r['tokens']) - - tkns = discrete_token_ranges( - [8508619251581300691, 8514581128764531689, 8577968535836399533, 8596162846302799189, - 8603491526474728284, 8628291680139169981, 8687301163739303017, 9111581078517061776]) - config.session.execute("DROP TABLE IF EXISTS " + config.execution_name + '.tt2') - nopars = Result(name='tt2', - tokens=tkns) - self.assertEqual('Result'.lower(), nopars._table) - self.assertEqual(config.execution_name, nopars._ksp) - self.assertEqual(uuid.uuid3(uuid.NAMESPACE_DNS, config.execution_name + '.tt2'), nopars.storage_id) - self.assertEqual(True, nopars._is_persistent) - self.assertTrue(hasattr(nopars, 'instances')) - name, read_tkns = config.session.execute("SELECT name,tokens FROM hecuba.istorage WHERE storage_id = %s", - [nopars.storage_id])[0] - - self.assertEqual(name, config.execution_name + '.tt2') - self.assertEqual(tkns, read_tkns) - - def test_mixed_class(self): - config.session.execute("DROP TABLE IF EXISTS hecuba_test.mixObj") - myObj = mixObj() - - myObj.make_persistent("hecuba_test.bla") - - myObj.floatfield = 5.0 - myObj.intField = 5 - myObj.strField = "6" - myObj.intlistField = [7, 8, 9] - myObj.floatlistField = [10.0, 11.0, 12.0] - myObj.strlistField = ["13.0", "14.0", "15.0"] - myObj.inttupleField = (1, 2) - - floatfield, intField, strField, intlistField, floatlistField, strlistField, inttupleField = \ - config.session.execute("SELECT floatField, " - "intField, " - "strField, " - "intlistField, " - "floatlistField, " - "strlistField, " - "inttupleField " - "FROM hecuba_test.mixObj WHERE storage_id =" + str(myObj.storage_id))[0] - - self.assertEquals(floatfield, myObj.floatfield) - self.assertEquals(intField, myObj.intField) - self.assertEquals(strField, myObj.strField) - self.assertEquals(intlistField, myObj.intlistField) - self.assertEquals(floatlistField, myObj.floatlistField) - self.assertEquals(strlistField, myObj.strlistField) - self.assertEquals(inttupleField, myObj.inttupleField) - - def test_init_empty(self): - config.session.execute("DROP TABLE IF EXISTS ksp1.TestStorageObj") - nopars = TestStorageObj('ksp1.ttta') - self.assertEqual('TestStorageObj'.lower(), nopars._table) - self.assertEqual('ksp1', nopars._ksp) - - res = config.session.execute( - 'SELECT storage_id, class_name, name, tokens, istorage_props FROM hecuba.istorage WHERE storage_id = %s', - [nopars.storage_id])[0] - - storage_id, storageobj_classname, name, tokens, istorage_props = res - self.assertEqual(storage_id, nopars.storage_id) - self.assertEqual(storageobj_classname, TestStorageObj.__module__ + "." + TestStorageObj.__name__) - self.assertEqual(name, 'ksp1.ttta') - - rebuild = build_remotely(res._asdict()) - self.assertEqual(rebuild._built_remotely, True) - self.assertEqual('TestStorageObj'.lower(), rebuild._table) - self.assertEqual('ksp1'.lower(), rebuild._ksp) - self.assertEqual(storage_id, rebuild.storage_id) - - self.assertEqual(nopars._is_persistent, rebuild._is_persistent) - # self.assertEqual(vars(nopars), vars(rebuild)) - - def test_make_persistent(self): - config.session.execute("DROP TABLE IF EXISTS hecuba_test.nonames") - config.session.execute("DROP TABLE IF EXISTS hecuba_test.words") - config.session.execute("DROP TABLE IF EXISTS hecuba_test.words_words") - config.session.execute("DROP TABLE IF EXISTS hecuba_test.nonames_test3") - nopars = Words() - self.assertFalse(nopars._is_persistent) - nopars.ciao = 1 - nopars.ciao2 = "1" - nopars.ciao3 = [1, 2, 3] - nopars.ciao4 = (1, 2, 3) - for i in range(10): - nopars.words[i] = 'ciao' + str(i) - - count, = config.session.execute( - "SELECT count(*) FROM system_schema.tables WHERE keyspace_name = 'hecuba_test' and table_name = 'words'")[0] - self.assertEqual(0, count) - - nopars.make_persistent("hecuba_test.wordsso") - del nopars - - count, = config.session.execute('SELECT count(*) FROM hecuba_test.wordsso_words')[0] - self.assertEqual(10, count) - - nopars2 = Test6StorageObj("hecuba_test.nonames") - nopars2.test3[0] = ['1', '2'] - time.sleep(2) - result = config.session.execute("SELECT val0, val1 FROM hecuba_test.nonames_test3 WHERE key0 = 0") - - rval0 = None - rval1 = None - for row in result: - rval0 = row.val0 - rval1 = row.val1 - - self.assertEqual('1', rval0) - self.assertEqual('2', rval1) - - def test_empty_persistent(self): - config.session.execute("DROP TABLE IF EXISTS my_app.Words_words") - config.session.execute("DROP TABLE IF EXISTS my_app.Words") - so = Words() - so.make_persistent("my_app.wordsso") - so.ciao = "an attribute" - so.another = 123 - config.batch_size = 1 - config.cache_activated = False - for i in range(10): - so.words[i] = str.join(',', map(lambda a: "ciao", range(i))) - - del so - import gc - gc.collect() - - count, = config.session.execute('SELECT count(*) FROM my_app.wordsso_words')[0] - self.assertEqual(10, count) - so = Words() - so.make_persistent("my_app.wordsso") - so.delete_persistent() - - count, = config.session.execute('SELECT count(*) FROM my_app.wordsso_words')[0] - self.assertEqual(0, count) - - def test_simple_stores_after_make_persistent(self): - config.session.execute("DROP TABLE IF EXISTS my_app.Test2StorageObj") - so = Test2StorageObj() - so.name = 'caio' - so.age = 1000 - so.make_persistent("t2") - count, = config.session.execute("SELECT COUNT(*) FROM my_app.Test2StorageObj")[0] - self.assertEqual(count, 1) - self.assertEqual(so.name, 'caio') - self.assertEqual(so.age, 1000) - - def test_simple_attributes(self): - config.session.execute("DROP TABLE IF EXISTS my_app.Test2StorageObj") - so = Test2StorageObj() - so.make_persistent("t2") - so.name = 'caio' - so.age = 1000 - count, = config.session.execute("SELECT COUNT(*) FROM my_app.Test2StorageObj")[0] - self.assertEqual(count, 1) - self.assertEqual(so.name, 'caio') - self.assertEqual(so.age, 1000) - - def test_modify_simple_attributes(self): - config.session.execute("DROP TABLE IF EXISTS my_app.Test2StorageObj") - so = Test2StorageObj() - so.make_persistent("t2") - so.name = 'caio' - so.age = 1000 - count, = config.session.execute("SELECT COUNT(*) FROM my_app.Test2StorageObj")[0] - self.assertEqual(count, 1) - self.assertEqual(so.name, 'caio') - self.assertEqual(so.age, 1000) - so.name = 'addio' - so.age = 2000 - self.assertEqual(so.name, 'addio') - self.assertEqual(so.age, 2000) - - def test_delattr_nonpersistent(self): - so = Test2StorageObj() - so.name = 'caio' - del so.name - - def del_attr(): - my_val = so.name - - self.assertRaises(AttributeError, del_attr) - - def test_delattr_persistent(self): - config.session.execute("DROP TABLE IF EXISTS my_app.Test2StorageObj") - so = Test2StorageObj("t3") - so.name = 'caio' - del so.name - - def del_attr1(): - my_val = so.name - - self.assertRaises(AttributeError, del_attr1) - - def del_attr2(): - my_val = so.random_val - - self.assertRaises(AttributeError, del_attr1) - - def test_delattr_persistent_nested(self): - config.session.execute("DROP TABLE IF EXISTS my_app.Test3StorageObj") - so = Test3StorageObj("t4") - nestedSo = Test2StorageObj() - nestedSo.name = 'caio' - so.myint = 123 - so.myso = nestedSo - # Make sure the inner object has been made persistent - self.assertTrue(nestedSo._is_persistent) - # Delete the attribute - del so.myint - - def del_attr1(): - my_val = so.myint - - # Accessing deleted attr of type StorageOb should raise AttrErr - self.assertRaises(AttributeError, del_attr1) - - # We assign again, nestedSo still existed (no one called delete on it) - so.myso = nestedSo - - # Delete a nested attribute of the shared StorageObj - del so.myso.name - - # Make sure that the nested attribute deleted has been successfully deleted from both objects - def del_attr2(): - my_val = nestedSo.name - - def del_attr3(): - my_val = so.myso.name - - self.assertRaises(AttributeError, del_attr2) - self.assertRaises(AttributeError, del_attr3) - - def test_modify_simple_before_mkp_attributes(self): - config.session.execute("DROP TABLE IF EXISTS my_app.Test2StorageObj") - so = Test2StorageObj() - so.name = 'caio' - so.age = 1000 - so.make_persistent("t2") - count, = config.session.execute("SELECT COUNT(*) FROM my_app.Test2StorageObj")[0] - self.assertEqual(count, 1) - self.assertEqual(so.name, 'caio') - self.assertEqual(so.age, 1000) - so.name = 'addio' - so.age = 2000 - self.assertEqual(so.name, 'addio') - self.assertEqual(so.age, 2000) - - def test_paranoid_setattr_nonpersistent(self): - config.session.execute("DROP TABLE IF EXISTS my_app.Test2StorageObj") - so = Test2StorageObj("myobj") - so.name = 'my_name' - self.assertEquals(so.name, 'my_name') - - def set_name_test(): - so.name = 1 - - self.assertRaises(cassandra.InvalidRequest, set_name_test) - so.age = 1 - self.assertEquals(so.age, 1) - - def set_age_test(): - so.age = 'my_name' - - self.assertRaises(cassandra.InvalidRequest, set_age_test) - - def test_paranoid_setattr_persistent(self): - config.session.execute("DROP TABLE IF EXISTS my_app.Test2StorageObj") - so = Test2StorageObj("t2") - so.name = 'my_name' - result = config.session.execute("SELECT name FROM my_app.Test2StorageObj") - for row in result: - cass_name = row.name - self.assertEquals(cass_name, 'my_name') - - def setNameTest(): - so.name = 1 - - self.assertRaises(cassandra.InvalidRequest, setNameTest) - so.age = 1 - result = config.session.execute("SELECT age FROM my_app.Test2StorageObj") - for row in result: - cass_age = row.age - self.assertEquals(cass_age, 1) - - def setAgeTest(): - so.age = 'my_name' - - self.assertRaises(cassandra.InvalidRequest, setAgeTest) - - def test_paranoid_setattr_float(self): - config.session.execute("DROP TABLE IF EXISTS my_app.Test2StorageObj") - so = Test2StorageObjFloat("t2_2") - so.age = 2.0 - - def test_nestedso_notpersistent(self): - config.session.execute("DROP TABLE IF EXISTS my_app.Test2StorageObj") - config.session.execute("DROP TABLE IF EXISTS my_app.Test3StorageObj") - config.session.execute("DROP TABLE IF EXISTS my_app.test4bstorageobj") - - my_nested_so = Test3StorageObj() - - my_nested_so.myso.name = 'Link' - self.assertEquals('Link', my_nested_so.myso.name) - my_nested_so.myso.age = 10 - self.assertEquals(10, my_nested_so.myso.age) - - error = False - try: - config.session.execute('SELECT * FROM my_app.Test3StorageObj') - except cassandra.InvalidRequest: - error = True - self.assertEquals(True, error) - - my_nested_so.myso2.test[0] = 'position0' - self.assertEquals('position0', my_nested_so.myso2.test[0]) - - my_nested_so2 = Test4StorageObj() - - my_nested_so2.myotherso.name = 'Link' - self.assertEquals('Link', my_nested_so2.myotherso.name) - my_nested_so2.myotherso.age = 10 - self.assertEquals(10, my_nested_so2.myotherso.age) - - error = False - try: - config.session.execute('SELECT * FROM my_app.myso') - except cassandra.InvalidRequest: - error = True - self.assertEquals(True, error) - - my_nested_so3 = Test4bStorageObj('mynested') - my_nested_subso = my_nested_so3.myotherso - - my_other_nested = getByID(my_nested_subso.storage_id) - my_other_nested.name = 'bla' - my_other_nested.age = 5 - error = False - try: - result = config.session.execute('SELECT * FROM my_app.Test2StorageObj') - except cassandra.InvalidRequest: - error = True - self.assertEquals(False, error) - for row in result: - query_res = row - self.assertEquals(5, query_res.age) - self.assertEquals('bla', query_res.name) - - def test_nestedso_persistent(self): - config.session.execute("DROP TABLE IF EXISTS my_app.Test3StorageObj") - config.session.execute("DROP TABLE IF EXISTS my_app.test2storageobj") - config.session.execute("DROP TABLE IF EXISTS my_app.teststorageobj") - config.session.execute("DROP TABLE IF EXISTS my_app.teststorageobj_test") - - my_nested_so = Test3StorageObj('mynewso') - self.assertEquals(True, my_nested_so._is_persistent) - self.assertEquals(True, my_nested_so.myso._is_persistent) - self.assertEquals(True, my_nested_so.myso2._is_persistent) - - my_nested_so.myso.name = 'Link' - my_nested_so.myso.age = 10 - error = False - try: - result = config.session.execute('SELECT * FROM my_app.test2storageobj') - except cassandra.InvalidRequest: - error = True - self.assertEquals(False, error) - for row in result: - query_res = row - self.assertEquals(10, query_res.age) - self.assertEquals('Link', query_res.name) - - my_nested_so.myso2.name = 'position0' - self.assertEquals('position0', my_nested_so.myso2.name) - - def test_nestedso_topersistent(self): - config.session.execute("DROP TABLE IF EXISTS my_app.Test3StorageObj") - config.session.execute("DROP TABLE IF EXISTS my_app.test2storageobj") - config.session.execute("DROP TABLE IF EXISTS my_app.teststorageobj") - config.session.execute("DROP TABLE IF EXISTS my_app.teststorageobj_test") - - my_nested_so = Test3StorageObj() - - my_nested_so.myso.name = 'Link' - self.assertEquals('Link', my_nested_so.myso.name) - my_nested_so.myso.age = 10 - self.assertEquals(10, my_nested_so.myso.age) - error = False - try: - result = config.session.execute('SELECT * FROM my_app.test2storageobj') - except cassandra.InvalidRequest: - error = True - self.assertEquals(True, error) - - my_nested_so.make_persistent('mynewso') - - error = False - try: - result = config.session.execute('SELECT * FROM my_app.test2storageobj') - except cassandra.InvalidRequest: - error = True - self.assertEquals(False, error) - for row in result: - query_res = row - self.assertEquals(10, query_res.age) - self.assertEquals('Link', query_res.name) - - def test_nestedso_sets_gets(self): - config.session.execute("DROP TABLE IF EXISTS my_app.Test3StorageObj") - config.session.execute("DROP TABLE IF EXISTS my_app.test2storageobj") - config.session.execute("DROP TABLE IF EXISTS my_app.teststorageobj") - config.session.execute("DROP TABLE IF EXISTS my_app.teststorageobj_test") - - my_nested_so = Test3StorageObj() - - my_nested_so.myso.name = 'Link' - self.assertEquals('Link', my_nested_so.myso.name) - my_nested_so.myso.age = 10 - self.assertEquals(10, my_nested_so.myso.age) - my_nested_so.myso.weight = 70 - self.assertEquals(70, my_nested_so.myso.weight) - error = False - try: - result = config.session.execute('SELECT * FROM my_app.mynewso_myso') - except cassandra.InvalidRequest: - error = True - self.assertEquals(True, error) - - my_nested_so.make_persistent('mynewso') - - error = False - try: - result = config.session.execute('SELECT * FROM my_app.Test2StorageObj') - except cassandra.InvalidRequest: - error = True - self.assertEquals(False, error) - for row in result: - query_res = row - self.assertEquals(10, query_res.age) - self.assertEquals('Link', query_res.name) - error = False - try: - _ = query_res.weight - except: - error = True - self.assertEquals(True, error) - my_nested_so.myso.weight = 50 - self.assertEquals(50, my_nested_so.myso.weight) - result = config.session.execute('SELECT * FROM my_app.Test2StorageObj') - for row in result: - query_res = row - error = False - try: - _ = query_res.weight - except: - error = True - self.assertEquals(True, error) - - def test_nestedso_sets_gets_complex(self): - config.session.execute("DROP TABLE IF EXISTS my_app.Test3StorageObj") - config.session.execute("DROP TABLE IF EXISTS my_app.test2storageobj") - config.session.execute("DROP TABLE IF EXISTS my_app.tnsgc") - config.session.execute("DROP TABLE IF EXISTS my_app.tnsgc_test") - config.session.execute("DROP TABLE IF EXISTS my_app.tnsgc_test_0") - config.session.execute("DROP TABLE IF EXISTS my_app.tnsgc_test_1") - - my_nested_so = Test3StorageObj() - - error = False - try: - _ = config.session.execute('SELECT * FROM my_app.TestStorageObj') - except cassandra.InvalidRequest: - error = True - self.assertEquals(True, error) - - my_nested_so.make_persistent('tnsgc') - - # We create the nested persistent objects only after they are accessed by the first time - error = False - try: - _ = config.session.execute('SELECT * FROM my_app.TestStorageObj') - except cassandra.InvalidRequest: - error = True - self.assertEquals(True, error) - - for i in range(0, 100): - my_nested_so.myso2.test[i] = 'position' + str(i) - time.sleep(5) - count, = config.session.execute("SELECT COUNT(*) FROM my_app.tnsgc_myso2_test")[0] - self.assertEquals(100, count) - - def test_nestedso_deletepersistent(self): - config.session.execute("DROP TABLE IF EXISTS my_app.Test3StorageObj") - config.session.execute("DROP TABLE IF EXISTS my_app.test2storageobj") - config.session.execute("DROP TABLE IF EXISTS my_app.tndp") - - my_nested_so = Test3StorageObj('tndp') - - self.assertEquals(True, my_nested_so._is_persistent) - my_nested_so.myso.name = 'Link' - self.assertEquals('Link', my_nested_so.myso.name) - my_nested_so.myso.age = 10 - self.assertEquals(10, my_nested_so.myso.age) - - my_nested_so.delete_persistent() - - self.assertEquals(False, my_nested_so._is_persistent) - entries = 0 - try: - _ = config.session.execute('SELECT * FROM my_app.test2storageobj') - except cassandra.InvalidRequest: - entries += 1 - self.assertEquals(0, entries) - - def test_nestedso_dictofsos(self): - config.session.execute("DROP TABLE IF EXISTS my_app.test5storageobj") - config.session.execute("DROP TABLE IF EXISTS my_app.test5storageobj_test2") - config.session.execute("DROP TABLE IF EXISTS my_app.Test2StorageObj") - my_nested_so = Test5StorageObj() - my_nested_so.test2[0] = Test2StorageObj() - my_nested_so.make_persistent('topstorageobj') - self.assertEquals(True, my_nested_so._is_persistent) - self.assertEquals(True, my_nested_so.test2._is_persistent) - self.assertEquals(True, my_nested_so.test2[0]._is_persistent) - - my_nested_so.test2[0].name = 'Link' - self.assertEquals('Link', my_nested_so.test2[0].name) - my_nested_so.test2[0].age = 10 - self.assertEquals(10, my_nested_so.test2[0].age) - - def test_nestedso_dictofsos_noname(self): - ''' - this test similar to test_nestedso_dictofsos with the difference that the StorageDict - used as an attribute in Test7StorageObj has the form where no name has been given for the - StorageObj nor the Integer. In this case, a default name is used (key0,val0). - ''' - config.session.execute("DROP TABLE IF EXISTS my_app.test2storageobj") - config.session.execute("DROP TABLE IF EXISTS my_app.test7storageobj") - config.session.execute("DROP TABLE IF EXISTS my_app.test7storageobj_test2") - - my_nested_so = Test7StorageObj() - my_nested_so.test2[0] = Test2StorageObj() - my_nested_so.make_persistent('topstorageobj2') - self.assertEquals(True, my_nested_so._is_persistent) - self.assertEquals(True, my_nested_so.test2._is_persistent) - self.assertEquals(True, my_nested_so.test2[0]._is_persistent) - - my_nested_so.test2[0].name = 'Link' - self.assertEquals('Link', my_nested_so.test2[0].name) - my_nested_so.test2[0].age = 10 - self.assertEquals(10, my_nested_so.test2[0].age) - - def test_nestedso_retrievedata(self): - config.session.execute("DROP TABLE IF EXISTS my_app.Test5StorageObj") - config.session.execute("DROP TABLE IF EXISTS my_app.test5storageobj_test2") - config.session.execute("DROP TABLE IF EXISTS my_app.Test2StorageObj") - - my_nested_so = Test5StorageObj('tnr') - my_nested_so.test2[0] = Test2StorageObj('something') - self.assertEquals(True, my_nested_so._is_persistent) - self.assertEquals(True, my_nested_so.test2._is_persistent) - self.assertEquals(True, my_nested_so.test2[0]._is_persistent) - - my_nested_so.test2[0].name = 'Link' - self.assertEquals('Link', my_nested_so.test2[0].name) - my_nested_so.test2[0].age = 10 - self.assertEquals(10, my_nested_so.test2[0].age) - - del my_nested_so - - my_nested_so2 = Test5StorageObj('tnr') - - self.assertEquals('Link', my_nested_so2.test2[0].name) - self.assertEquals(10, my_nested_so2.test2[0].age) - - def test_numpy_persistent(self): - config.session.execute("DROP TABLE IF EXISTS my_app.TestStorageObjNumpy") - config.session.execute("DROP TABLE IF EXISTS my_app.teststorageobjnumpy_mynumpy_numpies") - my_so = TestStorageObjNumpy('tnp') - - def test_numpy_set(self): - config.session.execute("DROP TABLE IF EXISTS my_app.TestStorageObjNumpy") - config.session.execute("DROP TABLE IF EXISTS my_app.teststorageobjnumpy_mynumpy_numpies") - my_so = TestStorageObjNumpy() - my_so.mynumpy = np.random.rand(3, 2) - my_so.make_persistent('mynewso') - - def test_numpy_get(self): - config.session.execute("DROP TABLE IF EXISTS my_app.TestStorageObjNumpy") - config.session.execute("DROP TABLE IF EXISTS my_app.TestStorageObjNumpy_mynumpy") - config.session.execute("DROP TABLE IF EXISTS my_app.teststorageobjnumpy_mynumpy_numpies") - my_so = TestStorageObjNumpy('mynewso') - mynumpy = np.random.rand(3, 2) - my_so.mynumpy = mynumpy - import time - time.sleep(2) - self.assertTrue(np.array_equal(mynumpy, my_so.mynumpy)) - - def test_numpy_topersistent(self): - config.session.execute("DROP TABLE IF EXISTS my_app.TestStorageObjNumpy") - config.session.execute("DROP TABLE IF EXISTS my_app.teststorageobjnumpy_mynumpy_numpies") - my_so = TestStorageObjNumpy() - my_so.mynumpy = np.random.rand(3, 2) - my_so.make_persistent('mynewso') - - def test_numpydict_persistent(self): - config.session.execute("DROP TABLE IF EXISTS my_app.TestStorageObjNumpy") - config.session.execute("DROP TABLE IF EXISTS my_app.teststorageobjnumpy_mynumpy_numpies") - my_so = TestStorageObjNumpyDict('mynewso') - - def test_numpydict_set(self): - config.session.execute("DROP TABLE IF EXISTS my_app.TestStorageObjNumpy") - config.session.execute("DROP TABLE IF EXISTS my_app.teststorageobjnumpy_mynumpy_numpies") - my_so = TestStorageObjNumpyDict('mynewso') - my_so.mynumpydict[0] = np.random.rand(3, 2) - - def test_numpydict_to_persistent(self): - config.session.execute("DROP TABLE IF EXISTS my_app.TestStorageObjNumpy") - config.session.execute("DROP TABLE IF EXISTS my_app.teststorageobjnumpy_mynumpy_numpies") - my_so = TestStorageObjNumpyDict() - my_so.mynumpydict[0] = np.random.rand(3, 2) - my_so.make_persistent('mynewso') - - def test_numpydict_get(self): - config.session.execute("DROP TABLE IF EXISTS my_app.TestStorageObjNumpy") - config.session.execute("DROP TABLE IF EXISTS my_app.teststorageobjnumpy_mynumpy_numpies") - my_so = TestStorageObjNumpyDict() - mynumpydict = np.random.rand(3, 2) - my_so.mynumpydict[0] = mynumpydict - my_so.make_persistent('mynewso') - import time - time.sleep(2) - self.assertTrue(np.array_equal(mynumpydict, my_so.mynumpydict[0])) - - def test_numpy_operations(self): - config.session.execute("DROP TABLE IF EXISTS my_app.mynewso") - config.session.execute("DROP TABLE IF EXISTS my_app.mynewso_mynumpy_numpies") - my_so = TestStorageObjNumpy() - base_numpy = np.arange(2048) - my_so.mynumpy = np.arange(2048) - my_so.make_persistent('mynewso') - import time - time.sleep(2) - self.assertTrue(np.array_equal(base_numpy, my_so.mynumpy)) - base_numpy += 1 - my_so.mynumpy += 1 - self.assertTrue(np.array_equal(base_numpy, my_so.mynumpy)) - self.assertEqual(np.average(base_numpy), np.average(my_so.mynumpy)) - self.assertEqual(np.mean(base_numpy), np.mean(my_so.mynumpy)) - - def test_numpy_ops_persistent(self): - config.session.execute("DROP TABLE IF EXISTS my_app.mynewso2") - config.session.execute("DROP TABLE IF EXISTS my_app.mynewso2_mynumpy_numpies") - my_so = TestStorageObjNumpy() - base_numpy = np.arange(2048) - my_so.mynumpy = np.arange(2048) - my_so.make_persistent('my_app.mynewso2') - self.assertTrue(np.array_equal(base_numpy, my_so.mynumpy)) - base_numpy += 1 - my_so.mynumpy += 1 - self.assertTrue(np.array_equal(base_numpy, my_so.mynumpy)) - - reloaded_so = TestStorageObjNumpy('mynewso') - self.assertTrue(np.array_equal(base_numpy, reloaded_so.mynumpy)) - self.assertEqual(np.average(base_numpy), np.average(reloaded_so.mynumpy)) - self.assertEqual(np.mean(base_numpy), np.mean(reloaded_so.mynumpy)) - - def test_numpy_reloading(self): - sizea, sizeb = (1000, 1000) - no = TestStorageObjNumpy("my_app.numpy_test_%d_%d" % (sizea, sizeb)) - a = np.ones((sizea, sizeb)) - no.mynumpy = a - del no - import gc - gc.collect() - no = TestStorageObjNumpy("my_app.numpy_test_%d_%d" % (sizea, sizeb)) - a = no.mynumpy - self.assertEqual(np.shape(a), (sizea, sizeb)) - self.assertEqual(np.sum(a), sizea * sizeb) - - def test_numpy_reloading_internals(self): - sizea, sizeb = (1000, 1000) - no = TestStorageObjNumpy("my_app.numpy_test_%d_%d" % (sizea, sizeb)) - a = np.ones((sizea, sizeb)) - no.mynumpy = a - initial_name_so = no._ksp + '.' + no._table - initial_name_np = no.mynumpy._ksp + '.' + no.mynumpy._table - del no - import gc - gc.collect() - no = TestStorageObjNumpy("my_app.numpy_test_%d_%d" % (sizea, sizeb)) - a = no.mynumpy - - final_name_so = no._ksp + '.' + no._table - final_name_np = no.mynumpy._ksp + '.' + no.mynumpy._table + '_numpies' - self.assertEqual(initial_name_so, final_name_so) - self.assertEqual(initial_name_np, final_name_np) - - def test_storagedict_assign(self): - config.session.execute("DROP TABLE IF EXISTS my_app.t2_1") - config.session.execute("DROP TABLE IF EXISTS my_app.t2_1_test") - config.session.execute("DROP TABLE IF EXISTS my_app.t2_1_test_0") - config.session.execute("DROP TABLE IF EXISTS my_app.t2_1_test_1") - config.session.execute("DROP TABLE IF EXISTS my_app.t2_1_test_2") - so = TestStorageObj("t2_1") - self.assertEquals('t2_1_test', so.test._table) - so.test = {} - self.assertEquals('t2_1_test_0', so.test._table) - so.test = {1: 'a', 2: 'b'} - self.assertEquals('t2_1_test_1', so.test._table) - so.test = {3: 'c', 4: 'd'} - self.assertEquals('t2_1_test_2', so.test._table) - - def test_storageobj_coherence_basic(self): - ''' - test that two StorageObjs pointing to the same table work correctly. - Changing data on one StorageObj is reflected on the other StorageObj. - ''' - config.session.execute("DROP TABLE IF EXISTS my_app.Test2StorageObj") - so = Test2StorageObj('test') - so.name = 'Oliver' - so.age = 21 - so2 = Test2StorageObj('test') - self.assertEqual(so.name, so2.name) - self.assertEqual(so.age, so2.age) - so.name = 'Benji' - so2 = Test2StorageObj('test') - self.assertEqual(so.name, so2.name) - self.assertEqual(so.age, so2.age) - config.session.execute("DROP TABLE IF EXISTS my_app.Test2StorageObj") - - def test_storageobj_coherence_complex1(self): - config.session.execute("DROP TABLE IF EXISTS my_app.Test3StorageObj") - config.session.execute("DROP TABLE IF EXISTS my_app.Test2StorageObj") - config.session.execute("DROP TABLE IF EXISTS my_app.teststorageobj_test") - config.session.execute("DROP TABLE IF EXISTS my_app.teststorageobj") - so = Test3StorageObj('test') - myso_attr = Test2StorageObj() - myso_attr.name = 'Oliver' - myso_attr.age = 21 - so.myso = myso_attr # creates my_app.test_myso_0, the original attribute pointed to test_myso - self.assertEqual(myso_attr.name, so.myso.name) - del myso_attr - self.assertEqual(so.myso.age, 21) - config.session.execute("DROP TABLE IF EXISTS my_app.Test3StorageObj") - config.session.execute("DROP TABLE IF EXISTS my_app.Test2StorageObj") - config.session.execute("DROP TABLE IF EXISTS my_app.teststorageobj_test") - config.session.execute("DROP TABLE IF EXISTS my_app.teststorageobj") - - def test_storageobj_coherence_complex2(self): - config.session.execute("DROP TABLE IF EXISTS my_app.Test3StorageObj") - config.session.execute("DROP TABLE IF EXISTS my_app.Test2StorageObj") - config.session.execute("DROP TABLE IF EXISTS my_app.teststorageobj_test") - config.session.execute("DROP TABLE IF EXISTS my_app.teststorageobj") - so = Test3StorageObj('test') - myso_attr = Test2StorageObj() - myso_attr.name = 'Oliver' - myso_attr.age = 21 - so.myso = myso_attr # creates my_app.test_myso_0, the original attribute pointed to test_myso - # now my_attr is persistent too, because it has been asigned to a persistent object - # Python behaviour, now the attribute points to the object, no copy made - self.assertTrue(so.myso is myso_attr) - # any change on the nested attribute should change the original and backwards - attr_value = 123 - myso_attr.some_attribute = attr_value - myso_attr.name = 'Benji' - self.assertTrue(hasattr(so.myso, 'some_attribute')) - self.assertEqual(so.myso.some_attribute, attr_value) - self.assertEqual(so.myso.name, 'Benji') - - # now we unreference the top persistent object called so which was made persistent as 'test' - del so - - # The object pointed by 'so.myso' should still exist because we still have one reference called 'myso_attr' - - self.assertTrue(myso_attr is not None) - self.assertTrue(isinstance(myso_attr, Test2StorageObj)) - self.assertEqual(myso_attr.name, 'Benji') - config.session.execute("DROP TABLE IF EXISTS my_app.Test3StorageObj") - config.session.execute("DROP TABLE IF EXISTS my_app.Test2StorageObj") - config.session.execute("DROP TABLE IF EXISTS my_app.teststorageobj_test") - config.session.execute("DROP TABLE IF EXISTS my_app.teststorageobj") - - def test_get_attr_1(self): - storage_obj = TestAttributes() - storage_obj.do_nothing_at_all() - value = 123 - storage_obj.setvalue(value) - returned = storage_obj.getvalue() - self.assertEqual(value, returned) - - def test_get_attr_2(self): - config.session.execute("DROP TABLE IF EXISTS my_app.TestAttributes") - storage_obj = TestAttributes() - storage_obj.do_nothing_at_all() - value = 123 - storage_obj.setvalue(value) - storage_obj.make_persistent("test_attr") - # check that the in memory attribute is kept - returned = storage_obj.getvalue() - self.assertEqual(value, returned) - # check that the method added by inheritance is correctly called - storage_obj.do_nothing_at_all() - - def method_nonexistent(): - storage_obj.i_dont_exist() - - # check that an attribute method which doesn't exist is detected - self.assertRaises(AttributeError, method_nonexistent) - - # check for private methods too (starting with underscore) - def method_nonexistent_pvt(): - storage_obj._pvt_dont_exist() - - self.assertRaises(AttributeError, method_nonexistent_pvt) - - config.session.execute("DROP TABLE IF EXISTS my_app.TestAttributes") - - def test_get_attr_3(self): - # the same as test_get_attr_2 but the object is persistent since the beginning - - config.session.execute("DROP TABLE IF EXISTS my_app.TestAttributes") - storage_obj = TestAttributes("test_attr") - storage_obj.do_nothing_at_all() - value = 123 - storage_obj.setvalue(value) - # check that the in memory attribute is kept - returned = storage_obj.getvalue() - self.assertEqual(value, returned) - # check that the method added by inheritance is correctly called - storage_obj.do_nothing_at_all() - - def method_nonexistent(): - storage_obj.i_dont_exist() - - # check that an attribute method which doesn't exist is detected - self.assertRaises(AttributeError, method_nonexistent) - - # check for private methods too (starting with underscore) - def method_nonexistent_pvt(): - storage_obj._pvt_dont_exist() - - self.assertRaises(AttributeError, method_nonexistent_pvt) - - storage_obj.key = 123 - returned = storage_obj.key - self.assertEqual(storage_obj.key, returned) - - config.session.execute("DROP TABLE IF EXISTS my_app.TestAttributes") - - def test_recreation_init(self): - """ - New StorageObj - Persistent attributes - Made persistent on the constructor. - """ - sobj_name = "my_app.test_attr6" - config.session.execute("DROP TABLE IF EXISTS {}".format(sobj_name)) - attr1 = 'Test1' - attr2 = 23 - storage_obj = Test2StorageObj(sobj_name) - storage_obj.name = attr1 - storage_obj.age = attr2 - uuid_sobj = storage_obj.storage_id - - storage_obj = None - result_set = iter(config.session.execute("SELECT * FROM hecuba.istorage WHERE storage_id={}".format(uuid_sobj))) - - try: - result = result_set.next() - except StopIteration as ex: - self.fail("StorageObj istorage data was not saved") - - self.assertEqual(result.name, sobj_name) - - storage_obj = Test2StorageObj(sobj_name) - - self.assertEqual(storage_obj.name, attr1) - self.assertEqual(storage_obj.age, attr2) - - def test_recreation_init2(self): - """ - New StorageObj - Has persistent and volatile attributes - Made persistent on the constructor. - """ - sobj_name = "my_app.test_attr" - config.session.execute("DROP TABLE IF EXISTS my_app.Test2StorageObj") - attr1 = 'Test1' - attr2 = 23 - storage_obj = Test2StorageObj(sobj_name) - storage_obj.name = attr1 - storage_obj.nonpersistent = attr2 - uuid_sobj = storage_obj.storage_id - - storage_obj = None - result_set = iter(config.session.execute("SELECT * FROM hecuba.istorage WHERE storage_id={}".format(uuid_sobj))) - - try: - result = result_set.next() - except StopIteration as ex: - self.fail("StorageObj istorage data was not saved") - - self.assertEqual(result.name, sobj_name) - - storage_obj = Test2StorageObj(sobj_name) - - self.assertEqual(storage_obj.name, attr1) - - with self.assertRaises(AttributeError): - attr = storage_obj.age - - with self.assertRaises(AttributeError): - attr = storage_obj.nonpersistent - - def test_recreation_make_pers(self): - """ - New StorageObj - Persistent attributes - Made persistent with make_persistent. - """ - sobj_name = "my_app.test_attr" - config.session.execute("DROP TABLE IF EXISTS {}".format(sobj_name)) - attr1 = 'Test1' - attr2 = 23 - storage_obj = Test2StorageObj() - storage_obj.make_persistent(sobj_name) - uuid_sobj = storage_obj.storage_id - - storage_obj = None - result_set = iter(config.session.execute("SELECT * FROM hecuba.istorage WHERE storage_id={}".format(uuid_sobj))) - - try: - result = result_set.next() - except StopIteration as ex: - self.fail("StorageObj istorage data was not saved") - - self.assertEqual(result.name, sobj_name) - - storage_obj = Test2StorageObj() - - storage_obj.name = attr1 - storage_obj.volatile = attr2 - - storage_obj.make_persistent(sobj_name) - - self.assertEqual(storage_obj.name, attr1) - self.assertEqual(storage_obj.volatile, attr2) - - with self.assertRaises(AttributeError): - attr = storage_obj.age - - def test_recreation_make_pers2(self): - """ - New StorageObj - Persistent attributes - Made persistent with make_persistent. - """ - sobj_name = "my_app.test_attr" - config.session.execute("DROP TABLE IF EXISTS {}".format(sobj_name)) - attr1 = 'Test1' - attr2 = 23 - storage_obj = Test2StorageObj() - storage_obj.name = attr1 - storage_obj.volatile = 'Ofcourse' - storage_obj.make_persistent(sobj_name) - uuid_sobj = storage_obj.storage_id - - storage_obj = None - result_set = iter(config.session.execute("SELECT * FROM hecuba.istorage WHERE storage_id={}".format(uuid_sobj))) - - try: - result = result_set.next() - except StopIteration as ex: - self.fail("StorageObj istorage data was not saved") - - self.assertEqual(result.name, sobj_name) - - storage_obj = Test2StorageObj() - storage_obj.age = attr2 - storage_obj.make_persistent(sobj_name) - - self.assertEqual(storage_obj.name, attr1) - self.assertEqual(storage_obj.age, attr2) - - with self.assertRaises(AttributeError): - attr = storage_obj.volatile - - def test_nested_recreation(self): - sobj_name = "my_app.test_attr" - config.session.execute("DROP TABLE IF EXISTS {}".format("my_app.test2storageobj")) - config.session.execute("DROP TABLE IF EXISTS {}".format("my_app.test4storageobj")) - - storage_obj = Test2StorageObj() - name_attr = 'Test1' - age_attr = 23 - storage_obj.name = name_attr - storage_obj.age = age_attr - - external_sobj = Test4StorageObj(sobj_name) - external_sobj.myotherso = storage_obj - - uuid_sobj_internal = storage_obj.storage_id - uuid_sobj_external = external_sobj.storage_id - - internal_name = external_sobj.myotherso._get_name() - storage_obj = None - external_sobj = None - - # Check that they have been correctly stored into hecuba.istorage - - result_set = iter( - config.session.execute("SELECT * FROM hecuba.istorage WHERE storage_id={}".format(uuid_sobj_external))) - - try: - result = result_set.next() - except StopIteration as exc: - self.fail("StorageObj istorage data was not saved") - - self.assertEqual(result.name, sobj_name) - - result_set = iter( - config.session.execute("SELECT * FROM hecuba.istorage WHERE storage_id={}".format(uuid_sobj_internal))) - - try: - result = result_set.next() - except StopIteration as exc: - self.fail("StorageObj istorage data was not saved") - - self.assertEqual(result.name, internal_name) - - # They are both present in hecuba.istorage - - result_set = iter( - config.session.execute( - "SELECT * FROM {} WHERE storage_id={}".format("my_app.Test4StorageObj", uuid_sobj_external))) - - try: - result = result_set.next() - except StopIteration as exc: - self.fail("StorageObj istorage data was not saved") - - self.assertEqual(result.myotherso, uuid_sobj_internal) - # They have been saved with the expected istorage ids - - external_sobj = Test4StorageObj(sobj_name) - # Check internal configuration is correct - self.assertEqual(external_sobj.storage_id, uuid_sobj_external) - self.assertEqual(external_sobj.myotherso.storage_id, uuid_sobj_internal) - self.assertEqual(external_sobj._get_name(), sobj_name) - self.assertEqual(external_sobj.myotherso._get_name(), internal_name) - - # Check data is correct - self.assertEqual(external_sobj.myotherso.name, name_attr) - self.assertEqual(external_sobj.myotherso.age, age_attr) - - def test_single_table(self): - config.session.execute("DROP TABLE IF EXISTS hecuba.Test2StorageObj") - my_obj1 = Test2StorageObj("my_app.my_obj1") - my_obj2 = Test2StorageObj("my_app.my_obj2") - my_obj1.name, my_obj2.name = "Adrian", "Adri" - my_obj1.age, my_obj2.age = 21, 23 - self.assertEqual(my_obj1._ksp, my_obj2._ksp) - self.assertEqual(my_obj1._table, my_obj2._table) - - res = config.session.execute("SELECT * FROM my_app.Test2StorageObj WHERE storage_id = %s" % my_obj1.storage_id) - res2 = config.session.execute( - "SELECT * FROM my_app.Test2StorageObj WHERE storage_id = %s" % my_obj2.storage_id) - self.assertEqual(res.one().name, "Adrian") - self.assertEqual(res2.one().name, "Adri") - self.assertEqual(res.one().age, 21) - self.assertEqual(res2.one().age, 23) - - def test_dict_single_table(self): - config.session.execute("DROP TABLE IF EXISTS my_app.Test2StorageObj") - config.session.execute("DROP TABLE IF EXISTS my_app.my_dict") - my_dict = Test5StorageObj("my_app.my_dict4") - for i in range(0, 20): - aux = Test2StorageObj("my_app.my_obj" + str(i)) - aux.name, aux.age = "RandomName" + str(i), 18 + i - my_dict.test2[i] = aux - - for i in range(0, 20): - self.assertEqual(my_dict.test2[i]._ksp, "my_app") - self.assertEqual(my_dict.test2[i]._table, "Test2StorageObj".lower()) - res = config.session.execute( - "SELECT * FROM my_app.Test2StorageObj WHERE storage_id = %s" % my_dict.test2[i].storage_id) - self.assertEqual(res.one().name, "RandomName" + str(i)) - self.assertEqual(res.one().age, 18 + i) - - -if __name__ == '__main__': - unittest.main() diff --git a/hecuba_py/tests/withcassandra/test2storageobj.py b/hecuba_py/tests/withcassandra/test2storageobj.py deleted file mode 100644 index 53df1232..00000000 --- a/hecuba_py/tests/withcassandra/test2storageobj.py +++ /dev/null @@ -1,9 +0,0 @@ -from hecuba.storageobj import StorageObj - - -class Test2StorageObj(StorageObj): - ''' - @ClassField name str - @ClassField age int - ''' - pass diff --git a/hecuba_py/tests/withcassandra/tutorial_tests.py b/hecuba_py/tests/withcassandra/tutorial_tests.py deleted file mode 100644 index 08aa67c9..00000000 --- a/hecuba_py/tests/withcassandra/tutorial_tests.py +++ /dev/null @@ -1,157 +0,0 @@ -import unittest -from hecuba import config -from hecuba.hdict import StorageDict -from hecuba.storageobj import StorageObj - - -class ExampleStoragedictClass(StorageDict): - ''' - @TypeSpec dict<, val1:str> - ''' - - -class ExampleStoragedictClassInit(StorageDict): - ''' - @TypeSpec dict<, val1:str> - ''' - - def __init__(self, **kwargs): - super(ExampleStoragedictClassInit, self).__init__(**kwargs) - self.update({0: 'first position'}) - - -class ExampleStoragedictClassInitMultiVal(StorageDict): - ''' - @TypeSpec dict<, val1:str, val2:str, val3:int> - ''' - - def __init__(self, **kwargs): - super(ExampleStoragedictClassInitMultiVal, self).__init__(**kwargs) - self.update({(0, 1): ['first position', 'second_position', 1000]}) - - -class ExampleStoragedictClassNames(StorageDict): - ''' - @TypeSpec dict<, value:str> - ''' - - -class ExampleStoragedictClassInitNames(StorageDict): - ''' - @TypeSpec dict<, value:str> - ''' - - def __init__(self, **kwargs): - super(ExampleStoragedictClassInitNames, self).__init__(**kwargs) - self.update({0: 'first position'}) - - -class ExampleStoragedictClassInitMultiValNames(StorageDict): - ''' - @TypeSpec dict<, value1:str, value2:str, value3:int> - ''' - - def __init__(self, **kwargs): - super(ExampleStoragedictClassInitMultiValNames, self).__init__(**kwargs) - self.update({(0, 1): ['first position', 'second_position', 1000]}) - - -class ExampleStorageObjClass(StorageObj): - ''' - @ClassField my_dict dict<, val1:str> - @ClassField my_release int - @ClassField my_version str - ''' - - -class ExampleStorageObjClassInit(StorageObj): - ''' - @ClassField my_dict dict<, val1:str> - @ClassField my_release int - @ClassField my_version str - ''' - - def __init__(self, **kwargs): - super(ExampleStorageObjClassInit, self).__init__(**kwargs) - self.my_dict = {0: 'first position'} - self.my_release = 2017 - self.my_version = '0.1' - - -class ExampleStorageObjClassNames(StorageObj): - ''' - @ClassField my_dict dict<, val1:str> - @ClassField my_release int - @ClassField my_version str - ''' - - -class TutorialTest(unittest.TestCase): - - def test_init_storagedict_test(self): - tablename = 'examplestoragedictclass1' - config.session.execute("DROP TABLE IF EXISTS my_app." + tablename) - my_example_class = ExampleStoragedictClass() - my_example_class.make_persistent(tablename) - - def test_init_storagedictwithinit_test(self): - tablename = 'examplestoragedictclass1' - config.session.execute("DROP TABLE IF EXISTS my_app." + tablename) - my_example_class = ExampleStoragedictClassInit() - StorageDict.__init__(my_example_class) - my_example_class.make_persistent(tablename) - - def test_init_storagedictwithinitmultival_test(self): - tablename = 'examplestoragedictclass1' - config.session.execute("DROP TABLE IF EXISTS my_app." + tablename) - my_example_class = ExampleStoragedictClassInitMultiVal() - StorageDict.__init__(my_example_class) - my_example_class.make_persistent(tablename) - - def test_init_storagedictnames_test(self): - tablename = 'examplestoragedictclass1' - config.session.execute("DROP TABLE IF EXISTS my_app." + tablename) - my_example_class = ExampleStoragedictClassNames() - my_example_class.make_persistent(tablename) - - def test_init_storagedictwithinitnames_test(self): - tablename = 'examplestoragedictclass1' - config.session.execute("DROP TABLE IF EXISTS my_app." + tablename) - my_example_class = ExampleStoragedictClassInitNames() - StorageDict.__init__(my_example_class) - my_example_class.make_persistent(tablename) - - def test_init_storagedictwithinitmultivalnames_test(self): - tablename = 'examplestoragedictclass1' - config.session.execute("DROP TABLE IF EXISTS my_app." + tablename) - my_example_class = ExampleStoragedictClassInitMultiValNames() - StorageDict.__init__(my_example_class) - my_example_class.make_persistent(tablename) - - def test_init_storageobj_test(self): - tablename = 'examplestorageobjclass1' - config.session.execute("DROP TABLE IF EXISTS my_app.ExampleStorageObjClass") - config.session.execute("DROP TABLE IF EXISTS my_app.ExampleStorageObjClass" + '_my_dict') - my_example_class = ExampleStorageObjClass() - my_example_class.make_persistent(tablename) - - def test_init_storageobjwithinit_test(self): - tablename = 'examplestorageobjclass1' - config.session.execute("DROP TABLE IF EXISTS my_app.ExampleStorageObjClassInit") - config.session.execute("DROP TABLE IF EXISTS my_app.ExampleStorageObjClassInit" + '_my_dict') - my_example_class = ExampleStorageObjClassInit() - StorageObj.__init__(my_example_class) - my_example_class.make_persistent(tablename) - - def test_init_storageobjnames_test(self): - tablename = 'test2.examplestorageobjclass1' - config.session.execute("DROP TABLE IF EXISTS my_app.ExampleStorageObjClassNames") - config.session.execute("DROP TABLE IF EXISTS my_app.ExampleStorageObjClassNames" + '_my_dict') - my_example_class = ExampleStorageObjClassNames() - my_example_class.make_persistent(tablename) - - def test_initializestoragedict_test(self): - tablename = 'examplestorageobjclass1' - config.session.execute("DROP TABLE IF EXISTS my_app." + tablename) - config.session.execute("DROP TABLE IF EXISTS my_app." + tablename + '_my_dict') - my_persistent_storageDict = StorageDict(tablename, [('position', 'int')], [('value', 'text')])