def _startModelHelper(conn, metricObj, swarmParams, logger): """ Start the model :param conn: SQLAlchemy Connection object for executing SQL :type conn: sqlalchemy.engine.Connection :param metricObj: metric, freshly-loaded :type metricObj: sqlalchemy.engine.RowProxy (see repository.getMetric()) :param swarmParams: non-None swarmParams generated via scalar_metric_utils.generateSwarmParams(). :param logger: logger object :returns: True if model was started; False if not :raises htmengine.exceptions.ObjectNotFoundError: if the metric doesn't exist; this may happen if it got deleted by another process in the meantime. :raises htmengine.exceptions.MetricStatusChangedError: if Metric status was changed by someone else (most likely another process) before this operation could complete """ if swarmParams is None: raise ValueError( "startModel: 'swarmParams' must be non-None: metric=%s" % (metricObj.uid, )) if metricObj.status not in (MetricStatus.UNMONITORED, MetricStatus.PENDING_DATA): if metricObj.status in (MetricStatus.CREATE_PENDING, MetricStatus.ACTIVE): return False logger.error("Unexpected metric status; metric=%r", metricObj) raise ValueError("startModel: unexpected metric status; metric=%r" % (metricObj, )) startTime = time.time() # Save swarm parameters and update metric status refStatus = metricObj.status repository.updateMetricColumnsForRefStatus( conn, metricObj.uid, refStatus, { "status": MetricStatus.CREATE_PENDING, "model_params": htmengine.utils.jsonEncode(swarmParams) }) metricObj = repository.getMetric( conn, metricObj.uid, fields=[schema.metric.c.uid, schema.metric.c.status]) # refresh if metricObj.status != MetricStatus.CREATE_PENDING: raise app_exceptions.MetricStatusChangedError( "startModel: unable to start model=%s; " "metric status morphed from %s to %s" % ( metricObj.uid, refStatus, metricObj.status, )) # Request to create the CLA model try: model_swapper_utils.createHTMModel(metricObj.uid, swarmParams) except Exception: logger.exception("startModel: createHTMModel failed.") repository.setMetricStatus(conn, metricObj.uid, status=MetricStatus.ERROR, message=repr(sys.exc_info()[1])) raise logger.info("startModel: started model=%r; duration=%.4fs", metricObj, time.time() - startTime) return True
def _startModelHelper(conn, metricObj, swarmParams, logger): """ Start the model :param conn: SQLAlchemy Connection object for executing SQL :type conn: sqlalchemy.engine.Connection :param metricObj: metric, freshly-loaded :type metricObj: sqlalchemy.engine.RowProxy (see repository.getMetric()) :param swarmParams: non-None swarmParams generated via scalar_metric_utils.generateSwarmParams(). :param logger: logger object :returns: True if model was started; False if not :raises htmengine.exceptions.ObjectNotFoundError: if the metric doesn't exist; this may happen if it got deleted by another process in the meantime. :raises htmengine.exceptions.MetricStatusChangedError: if Metric status was changed by someone else (most likely another process) before this operation could complete """ if swarmParams is None: raise ValueError( "startModel: 'swarmParams' must be non-None: metric=%s" % (metricObj.uid,)) if metricObj.status not in (MetricStatus.UNMONITORED, MetricStatus.PENDING_DATA): if metricObj.status in (MetricStatus.CREATE_PENDING, MetricStatus.ACTIVE): return False logger.error("Unexpected metric status; metric=%r", metricObj) raise ValueError("startModel: unexpected metric status; metric=%r" % (metricObj,)) startTime = time.time() # Save swarm parameters and update metric status refStatus = metricObj.status repository.updateMetricColumnsForRefStatus( conn, metricObj.uid, refStatus, {"status": MetricStatus.CREATE_PENDING, "model_params": htmengine.utils.jsonEncode(swarmParams)}) metricObj = repository.getMetric(conn, metricObj.uid, fields=[schema.metric.c.uid, schema.metric.c.status]) # refresh if metricObj.status != MetricStatus.CREATE_PENDING: raise app_exceptions.MetricStatusChangedError( "startModel: unable to start model=%s; " "metric status morphed from %s to %s" % (metricObj.uid, refStatus, metricObj.status,)) # Request to create the CLA model try: model_swapper_utils.createHTMModel(metricObj.uid, swarmParams) except Exception: logger.exception("startModel: createHTMModel failed.") repository.setMetricStatus(conn, metricObj.uid, status=MetricStatus.ERROR, message=repr(sys.exc_info()[1])) raise logger.info("startModel: started model=%r; duration=%.4fs", metricObj, time.time() - startTime) return True