Thursday, 2016-11-10

*** bobh_ has joined #openstack-mistral00:17
*** chlong has joined #openstack-mistral00:23
*** bobh_ has quit IRC00:44
*** bobh_ has joined #openstack-mistral02:10
*** bobh_ has quit IRC02:12
*** bobh_ has joined #openstack-mistral02:17
*** igormarnat has quit IRC02:24
*** igormarnat has joined #openstack-mistral02:24
*** bobh_ has quit IRC02:43
*** achatterjee has joined #openstack-mistral04:07
*** achatterjee has left #openstack-mistral04:08
*** hparekh has joined #openstack-mistral04:09
*** chlong has quit IRC04:13
*** sharatss has joined #openstack-mistral04:41
*** sharatss has quit IRC04:55
*** sharatss has joined #openstack-mistral05:00
openstackgerritSharat Sharma proposed openstack/mistral: Added senlin action pack  https://review.openstack.org/39558705:14
*** janki has joined #openstack-mistral05:50
*** jaosorior has joined #openstack-mistral05:51
*** harlowja_ has quit IRC06:33
*** jaosorior has quit IRC06:34
*** jaosorior has joined #openstack-mistral06:35
*** kamtamtun has joined #openstack-mistral06:42
*** chlong has joined #openstack-mistral06:58
*** chlong has quit IRC07:09
*** jtomasek has joined #openstack-mistral07:32
openstackgerritRenat Akhmerov proposed openstack/mistral: Fix error message format for task run and continue  https://review.openstack.org/39598807:33
openstackgerritRenat Akhmerov proposed openstack/mistral: Fix error message format for task run and continue  https://review.openstack.org/39598807:35
sharatssrakhmerov: hi07:37
rakhmerovhi :)07:38
sharatss8778 is the bind-port of senlin07:39
rakhmerovok07:39
openstackgerritRenat Akhmerov proposed openstack/mistral: Fix error message format for task run and continue  https://review.openstack.org/39598807:40
rakhmerovI just noticed that we use some hardcoded string07:40
rakhmerovwhich always looks slightly suspicious to me07:40
rakhmerovdo we use hardcoded strings in similar cases too? Did you check?07:40
sharatssso i had mentioned it in the return of SenlinAction07:40
sharatsswe have used it for Murano as well07:41
rakhmerovok07:41
rakhmerovit's a fake client anyway07:41
rakhmerovcan you pls fix other small issues?07:41
rakhmerovthey are minor but they reflect what we usually follow07:42
sharatssyes sure07:42
sharatssfake client is hardcoded even in Ironic and Barbican as well07:43
sharatssi will fix the other issues as of now07:43
rakhmerovok07:46
*** openstackgerrit has quit IRC07:48
*** openstackgerrit has joined #openstack-mistral07:48
openstackgerritSharat Sharma proposed openstack/mistral: Added senlin action pack  https://review.openstack.org/39558707:53
d0ugalrakhmerov: Hey07:53
rakhmerovd0ugal: yep, hi08:01
d0ugalrakhmerov: I spent some time looking at that transaction bug yesterday08:02
d0ugalrakhmerov: adding with db_api.transaction() around some of the API endpoints did resolve it for me.08:03
d0ugalusing a decorator or just manually - doesn't matter08:03
d0ugalbut in your comment you did make a good point, I don't know why the transaction is being started - I'd guess there is something wrong in the db_api code08:03
rakhmerovyes, but what's the root cause of it?08:03
d0ugalrakhmerov: good question.08:04
rakhmerovyes08:04
d0ugalI am trying to figure that out now08:04
rakhmerovthis is the most important part08:04
d0ugalrakhmerov: do you deploy on mysql or postgres?08:04
rakhmerovotherwise we may just mask the real problem08:04
rakhmerovmostly on mysql08:04
d0ugalrakhmerov: same here.08:04
d0ugalrakhmerov: so I found without patching the number of processes on the mistral table got to 3008:05
d0ugalwith the patch it stopped at 508:05
d0ugalit sounds like the problem is worse with postgres08:05
rakhmerovI assume that possible there may be a bug in oslo.db or even sqlalchemy08:05
rakhmerovbecause we don't do much on top of it regarding transaction management08:05
rakhmerovwe can ask also Winson from StackStorm08:06
rakhmerovthey use only Postgres08:06
rakhmerovsuccessfully08:06
d0ugalcool, that might be useful08:06
d0ugalMaybe there is some postgres configuration that would stop xavierhardy's db being overloaded.08:06
xavierhardyWe were also using PostgreSQL successfully up until now.08:08
xavierhardyfor the error what do we do ? remove the decorator when with db_api.transaction is already there or the opposite N08:10
xavierhardy*?08:10
d0ugalxavierhardy: I think we need to understand why the transaction is being created.08:12
rakhmerovxavierhardy: yes, this kind of problems require thorough investigation08:14
rakhmerovI really wanna know why transactions get started and don't finish08:14
xavierhardyIt comes from SQLAlchemy08:14
xavierhardyhttp://docs.sqlalchemy.org/en/latest/orm/session_transaction.html08:15
rakhmerovyou mean if we don't explicitly open a TX and then do some DB API operation?08:15
rakhmerovif so, why? isn't it supposed to be configured as "autocommit=true" if it's a single operation?08:16
xavierhardycommit has nothing to do here08:16
xavierhardysince we are getting rows most of the time and not editing them08:16
rakhmerovI guess it has a lot to do with transaction scope, no?08:16
xavierhardyyes08:17
rakhmerovso?08:17
rakhmerovok, let's get to the bottom line of it08:17
xavierhardybut where is the transaction scope, it's missing in most of the REST API function08:17
xavierhardy*functions08:17
rakhmerovwhat's your opinion on the root cause of this behavior?08:17
d0ugalxavierhardy: but what starts the transaction?08:17
rakhmerovwe may be missing some details08:17
rakhmerovyes08:18
rakhmerovok, here's my statement08:18
rakhmerovAny DB API method, if not encompassed into an explicitly open TX, should not leave any open transactions08:18
rakhmerovthis is how it should be08:19
rakhmerovif it's not true, we need to fix that08:19
rakhmerovnot REST controllers08:19
rakhmerovmakes sense?08:19
xavierhardyAny DB API method, if not encompassed into an explicitly open TX, should not leave any open transactions -> YES08:19
rakhmerovok08:20
xavierhardyThe problem is in the REST controllers08:20
xavierhardythe other components already seem to handle it properly08:20
rakhmerovbrr...08:20
rakhmerovbut why?08:20
rakhmerovI still don't understand, sorry08:20
rakhmerovd0ugal: do you?08:20
d0ugalrakhmerov: no, not really08:20
d0ugalMy question still is: What starts the transactions?08:21
rakhmerovif it's a problem of DB API why is it a problem of REST layer?08:21
xavierhardyYes, d0ugal, that's the question08:22
xavierhardyI think it's session.query08:22
rakhmerovok08:22
rakhmerovxavierhardy: can you try to investigate this?08:22
xavierhardyAlready am08:22
rakhmerovto name the exact reason08:22
rakhmerovok08:22
rakhmerovthanks, once I have a chance I'll look into this too08:23
d0ugalI am also looking FWIW08:23
xavierhardyhttp://docs.sqlalchemy.org/en/latest/orm/query.html08:23
xavierhardyQuery is produced in terms of a given Session, using the query() method08:23
xavierhardythe Session object’s usual behavior of maintaining a transaction and expiring all attributes after rollback or commit handles object state automatically.08:24
rakhmerovyes, that's fine08:24
rakhmerovbut may be we just don't pass some params when we open a session08:25
xavierhardyhttp://docs.sqlalchemy.org/en/latest/orm/session_basics.html#what-does-the-session-do08:25
rakhmerovwhich would tell SQLAlchemy to not keep the session open after this query is made08:25
xavierhardyOnce queries are issued or other objects are persisted with it, it requests a connection ... This connection represents an ongoing transaction, which remains in effect until the Session is instructed to commit or roll back its pending state.08:25
rakhmerovand I'm also wondering if we have the same behavior with mysql08:25
rakhmerovyes08:26
xavierhardyyes, you will because that's SQLAlchemy's role08:26
rakhmerovthere's "autocommit" property of the connection08:26
xavierhardyto abstract the DB as much as possible08:26
xavierhardybut we should not commit anything08:26
xavierhardyand to use that you'll need to wrap around as I did with the db_api.transaction08:26
xavierhardyQuerying something opens a transaction, that makes sense, your API call will be isolated from the other transactions and we also need that08:27
* d0ugal will brb, some people here to do work on my house08:28
openstackgerritMichal Gershenzon proposed openstack/mistral: Migrate mistral task_type  https://review.openstack.org/39574208:28
xavierhardyIf you are querying twice the DB in the same REST API call with 2 different transactions, you're either opening Pandora's box of concurrency or you have a reason to do it08:28
openstackgerritRenat Akhmerov proposed openstack/mistral: Fix error message format for task run and continue  https://review.openstack.org/39598808:29
openstackgerritRenat Akhmerov proposed openstack/mistral: Fix error message format in other task handler methods  https://review.openstack.org/39600908:29
xavierhardy(a reason can be, you have just committed something and you want to reuse it)08:29
xavierhardycoming back to the issue, I would need to know more about Pecan's session handling08:30
rakhmerovxavierhardy: agree on using 2 transactions08:30
rakhmerovwe don't do that08:30
rakhmerovxavierhardy: again, I don't think it's related to Pecan08:31
rakhmerovit's a problem of DB API08:31
xavierhardySQLAlchemy is meant to be thread-safe, so if we open too many threads, that could explain why we have many transactions08:32
rakhmerovwe don't open many threads08:32
xavierhardyhow does Pecan work ?08:32
xavierhardyI mean their client session handling08:32
rakhmerovno matter how SQLAlchemy works with sessions and transactions we need to make sure that if we call a single DB API methods w/o explicit transactions that no open transactions left after that08:33
xavierhardyI disagree08:33
rakhmerovI don't know exactly how it works08:33
rakhmerovwhy do you disagree?08:33
xavierhardyThat's creating 2 transactions for querying 2 objects for instance08:34
rakhmerovin such cases we open TX explicitly08:34
xavierhardyIf there's no modification in between, that leads to concurrency problems08:34
rakhmerovshow me the place where we use many transactions in one method08:35
xavierhardyFair enough, but that will lead to mis-use08:35
xavierhardythere's no such place, but there might be if you do that08:35
xavierhardyfor the moment, what we see is basically one transaction per API call08:36
xavierhardy*REST API call08:36
rakhmerovthat's why we have code review process08:36
rakhmerovto prevent having such anti-patterns08:36
xavierhardyI would be more inclined to raise an error if no transaction has been opened before08:36
xavierhardyor let the developer explicitly set a flag like "transaction=True/False" to explicitly use that behavior08:37
rakhmerovok, could please explain your point on multiple threads? Not sure I understood it08:37
xavierhardyOK08:37
rakhmerovreally, all I wanna know now: why after a call made to DB API we have some transactions08:38
xavierhardyMe tto08:38
xavierhardytoo08:38
xavierhardyWe know now that calling session.query for instance, opens a transaction08:38
rakhmerovyes, let's not talk about controllers08:38
rakhmerovfor now08:38
rakhmerovyes, that's fine08:38
rakhmerovagree08:38
xavierhardyWe know that that happens in each REST API call08:38
rakhmerovooh, gosh...08:39
xavierhardyIf those API calls were made in the same thread, we would have no problem08:39
rakhmerovwhy are you talking about REST again? It's irrelevant to the conversation :)08:39
xavierhardyNo, that's not08:39
xavierhardyTo understand the whole problem08:39
rakhmerovok, keep going..08:39
xavierhardywe must understand how Pecan works08:39
rakhmerovseems like I'm missing something08:39
rakhmerovsorry08:39
rakhmerovok08:39
xavierhardysession.query only opens a transaction if it's not done yet08:40
rakhmerovnot done what?08:40
xavierhardyif no transaction is open yet08:40
rakhmerovok08:40
rakhmerovis supposed to close the TX after it's made? query08:40
xavierhardySo the question is? Why are multiple transactions handling08:40
xavierhardyNo, it needs to be explicitly08:41
xavierhardy*to be done08:41
rakhmerovwhy explicitly?08:41
xavierhardyBecause it can't possibly know when to close it08:41
xavierhardySQLAlchemy does not handle that for you08:41
rakhmerovbut we should control it08:41
*** jpich has joined #openstack-mistral08:41
xavierhardyexcept when you commit or rollback08:41
xavierhardyYes, exactly08:42
rakhmerovwe know exactly if we opened a TX explicitly or not08:42
rakhmerovwe know it08:42
xavierhardyno08:42
rakhmerovin the current thread08:42
xavierhardywe don't08:42
rakhmerovwhy don't we know it?08:42
xavierhardybut we could find out08:42
rakhmerovlet me show you the code where we know it...08:42
xavierhardyok08:42
xavierhardyComing back to Pecan, it has means of handling database sessions08:44
xavierhardyhttps://pecan.readthedocs.io/en/latest/databases.html08:44
rakhmerovhttps://github.com/openstack/mistral/blob/master/mistral/db/sqlalchemy/base.py#L10608:44
rakhmerovspecifically https://github.com/openstack/mistral/blob/master/mistral/db/sqlalchemy/base.py#L9008:44
rakhmerovthat's where we know if TX was open or not08:44
rakhmerovthere may be a bug here, in this code08:45
rakhmerovhttps://github.com/openstack/mistral/blob/master/mistral/db/sqlalchemy/base.py#L12108:45
xavierhardyor it's not called at the right place08:45
rakhmerovthis is where we determine if we need to auto commit the TX08:45
rakhmerovas far as Pecan08:45
rakhmerovas far as I know (not confirmed!) it's single threaded08:46
rakhmerovlike most of other things in Python08:46
rakhmerovwhat we use to handle requests in parallel is WSGIService08:46
rakhmerovfrom oslo.service08:46
xavierhardy_secure_query is not session aware ?08:46
xavierhardyhttps://github.com/openstack/mistral/blob/a0bd4a9a4ee3fbccbab72291c7d4378b4d830408/mistral/db/v2/sqlalchemy/api.py#L11808:46
rakhmerovit creates physically multiple processes to handle requests08:46
xavierhardyOK08:47
rakhmerovyes, _secure_query is not because the implicit rule was: only all public methods should be marked with @session_aware08:47
rakhmerovto be sure that all subsequent calls use the same session08:48
xavierhardyagreed08:48
rakhmerovmaybe we are missing some @session_aware on some of the methods08:48
rakhmerovwe need to check08:48
xavierhardyagreed08:49
rakhmerovideally we need to see what REST method reproduces this problem and then we'll see what DB API method is not marked with it08:49
rakhmerovyep08:49
xavierhardyGET workflows08:49
xavierhardyis a good exmaple08:49
xavierhardyhowever, there should not be a need to commit08:50
xavierhardyjust closing the transaction should be enough08:50
d0ugalBack - sorry, that took longer than expected08:50
* d0ugal reads up08:50
xavierhardy(when we are just querying stuff)08:50
xavierhardywait, something's weird08:51
rakhmerovxavierhardy: doesn't matter for us, SQLAlchemy should take care of that08:51
rakhmerovif session.dirty is False it should always do a roll back instead of commit08:51
xavierhardytrue08:51
xavierhardyit's just using SQLAlchemy's magic08:51
rakhmerovyeah, sometimes it seems like magic08:52
rakhmerovbecause it has a notion of session08:52
rakhmerovon top of regular SQL stuff08:52
openstackgerritRenat Akhmerov proposed openstack/mistral: Fix error message format in other task handler methods  https://review.openstack.org/39600908:52
xavierhardyhow is get_thread_local supposed to return you whether SQLAlchemy has already an open session or not?08:55
rakhmerovif the session is stored in thread local storage it means it was already open08:56
rakhmerovit means that db_api.transaction() was called08:57
xavierhardyOK08:57
xavierhardyAnother proposal: what about disabling connection pooling ?08:57
xavierhardyIf you have separate processes and not threads, that should work08:58
xavierhardyI see it's already done :(08:58
* d0ugal is looking at how other projects handle transactions08:59
rakhmerovd0ugal: good luck!08:59
xavierhardyor wait no09:00
d0ugalrakhmerov: it seems we have much more transaction code than others09:00
rakhmerova lot of projects simply didn't have any support for them up until recently :)))09:00
rakhmerovyes09:00
d0ugalright09:00
rakhmerovthat's why I've written new code for this myself09:00
d0ugalI see09:00
xavierhardyIn Flask for example, there's an extension that makes sure that the transaction is closed09:00
xavierhardyat each API call09:01
xavierhardy*REST API09:01
d0ugalrakhmerov: Where do we create the session?09:01
rakhmerovxavierhardy: yeah, we could do that too. But my point is: I'm afraid that we will just mask a real problem behind those decorators etc.09:01
rakhmerovd0ugal: https://github.com/openstack/mistral/blob/master/mistral/db/sqlalchemy/base.py#L10609:02
xavierhardyAgreed09:02
xavierhardywhat about session pool ?09:02
xavierhardy*pools09:02
xavierhardy(basically what you do for migrations)09:03
d0ugalrakhmerov: we don't have a session.begin?09:03
d0ugalrakhmerov: sorry, I was already looking at this code but it confused me :-D09:03
rakhmerovxavierhardy: hm.. I'm not sure what you mean by that. I know connection pool09:03
xavierhardyWell, part of the problem is that many connections are open towards the DB, too many09:04
rakhmerovd0ugal: yes, we don't have it, a new TX starts effectively when we create a new session (or at least make a first query in it)09:04
xavierhardymore than one per process09:04
rakhmerovxavierhardy: how many?09:04
xavierhardyYesterday, I reached 50 connections on local desktop09:04
rakhmerovthere are config properties for that09:04
rakhmerovit's not many09:04
xavierhardyit is09:04
rakhmerovwe usually bumpt it up to 150 at least09:05
xavierhardyconsidering I only had 4 processes running09:05
xavierhardyand that I was not using any kind of redundancy09:05
xavierhardyand not even committing anything09:05
rakhmerovit doesn't really matter09:05
xavierhardythat's actually the problem I'm describing09:05
rakhmerovno, I mean09:06
rakhmerovit's just a config property that you can change09:06
xavierhardyand in those open connections, dangling transactions09:06
rakhmerovwait a sec09:06
xavierhardyso let's try it09:06
rakhmerov[database]09:08
rakhmerovpool_size = 2009:08
rakhmerovmax_overflow = 009:08
rakhmerovmax_pool_size = 100009:08
d0ugalrakhmerov: we use oslo_db.sqlalchemy.session.EngineFacade09:08
rakhmerovyou can change these params09:08
d0ugalrakhmerov: Did you know it is deprecated? :)09:08
xavierhardyfoud nthem, thanks09:08
rakhmerovby default I guess it's about 50 exactly09:08
rakhmerovd0ugal: no, I didn't09:08
xavierhardybut is it a pool for all the processes or per process ?09:08
d0ugalrakhmerov: in December 2014 too. it seems we should be using oslo_db.sqlalchemy.enginefacade09:09
d0ugalrakhmerov: I'll open a bug09:09
rakhmerovper process09:09
xavierhardyOK, the problem still happens09:09
xavierhardylet's see if I have put the configuration in the right file09:10
rakhmerovyeah, I don't think it's related to any pools09:10
rakhmerovwhat we need to do is: 1) Reproduce the situation when we have an open transaction after DB API call 2) see what DB API method it is 3) see if it's marked with @session_aware09:11
xavierhardyOK, but thanks for showing me the max_overflow09:11
xavierhardyit explains one of the behaviors I have seen09:11
rakhmerovif it is marked with that then we need to debug and see why session doesn't get committed09:11
rakhmerovok09:11
xavierhardyAfter reaching 50 open connections, it cleaned up partially09:11
xavierhardy1) easy: GET on workflow list09:13
xavierhardy2) get_workflow_definitions09:13
xavierhardymore exactly09:14
xavierhardysession.query09:14
xavierhardyfrom model_query09:14
rakhmerovok09:14
xavierhardy3) model_query is09:14
rakhmerovdo you see if that methods is called?09:14
rakhmerovI mean here: https://github.com/openstack/mistral/blob/master/mistral/db/sqlalchemy/base.py#L12109:15
rakhmerovor possibly here: https://github.com/openstack/mistral/blob/master/mistral/db/sqlalchemy/base.py#L12609:15
xavierhardyYes09:15
xavierhardywait09:15
rakhmerovor here: https://github.com/openstack/mistral/blob/master/mistral/db/sqlalchemy/base.py#L13009:16
xavierhardyyes09:17
xavierhardyOK, by limiting the pool, I have another behavior09:18
xavierhardyThe first call works, the second fails09:18
xavierhardy(because pool exceeded, but it shouldn't as it the same process)09:18
xavierhardy(and so reuse the same connection)09:18
rakhmerovxavierhardy: so seems like from Mistral all that's needed happens?09:18
rakhmerovcan you debug that session.commit call and see what happens inside?09:19
xavierhardywhat do you mean ?09:19
rakhmerovwhy TX still remains open09:19
xavierhardyOK, just understood your previous sentence09:19
rakhmerovok09:20
rakhmerovwe need to localize the problem09:20
rakhmerovand understand wether it's in Mistral (we don't close or clean up something or do it incorrectly) or in SQLAlchemy09:20
rakhmerovor oslo.db09:21
xavierhardywait there's another call09:21
xavierhardyget_workflow_definition_by_id09:21
xavierhardywait, something weird in secure_query09:22
xavierhardymistral/db/v2/sqlalchemy/api.py -> secure_query09:23
xavierhardyit returns a query object09:23
xavierhardybut it does not use it09:23
rakhmerovok09:23
rakhmerov:)09:23
rakhmerovI guess we're close to find a problem )09:24
xavierhardythen for example in _paginate_query09:24
xavierhardysame thing09:24
xavierhardy(uses _secure_query09:24
xavierhardyhowever, _secure_query uses our friend model_query09:24
xavierhardywhich is wrapped09:24
xavierhardy(model_query not paginate query)09:24
rakhmerovok09:24
xavierhardyand finally in for instance, get_collection09:25
xavierhardywe have a query.all09:25
xavierhardybut no wrapper09:25
xavierhardyactually model_query should not be wrapped09:26
rakhmerov:)09:26
xavierhardywhat should be are the functions use it09:26
xavierhardy*using it09:26
rakhmerovmodel_query?09:26
xavierhardymistral/db/sqlalchemy/base.py09:26
xavierhardyjust calls session.query09:27
rakhmerovline?09:27
xavierhardy22009:27
rakhmerovyes, it's just a base utility method09:27
xavierhardyOK09:27
rakhmerovon top of it we can call secure_model_query09:28
rakhmerovif it's a secure model (belongs to a tenant etc.)09:28
xavierhardyOK09:28
rakhmerovxavierhardy: sorry, I have to disappear for 1.5 hr09:28
rakhmerovmeeting09:28
rakhmerovwill ping you when I'm back09:28
xavierhardyBut I'm pretty sure that's there09:28
xavierhardyI'll pdb that and monitor the DB09:29
rakhmerovyes, please09:29
openstackgerritRenat Akhmerov proposed openstack/mistral: Fix error message format in other task handler methods  https://review.openstack.org/39600909:30
openstackgerritRenat Akhmerov proposed openstack/mistral: Fix error message format in action handler  https://review.openstack.org/39603809:30
xavierhardyright after leaving model_query the idle in transaction session appears09:32
xavierhardyand after query.all()09:33
xavierhardyanother idle in transaction session appears09:33
xavierhardyso 2 sessions (and 2 transactions) in the same function call09:33
openstackgerritRenat Akhmerov proposed openstack/mistral: Fix error message format in action handler  https://review.openstack.org/39603809:37
rakhmerovxavierhardy: which means we open two sessions (by mistake) but close only one, right?09:38
xavierhardyexactly09:41
xavierhardymodel_query opens and close its transaction09:41
xavierhardyand does not even do anything with it, does not even query anything09:41
xavierhardyand then comes get_all09:41
xavierhardythat opens a new transaction09:41
xavierhardybut it's not closed09:42
xavierhardymaking get_collection session aware solves the problem09:42
rakhmerovyeah, so seems like something is just not wrapped with @session_aware09:42
xavierhardyline 17909:42
rakhmerovyeah09:42
rakhmerovok09:42
xavierhardymistral/db/v2/sqlalchemy/api.py09:42
xavierhardywe have to look for all similar cases09:43
rakhmerovxavierhardy: I think it was broken during some refactoring that we did this summer09:43
rakhmerovyes09:43
xavierhardy_get_db_object_by_name09:43
xavierhardy_get_db_object_by_id09:43
xavierhardy_get_db_object_by_name_or_id09:43
xavierhardy_delete_all09:44
rakhmerovwait a sec09:46
rakhmerovxavierhardy: as far as _get_collection09:46
rakhmerovwhere exactly do we open a new session instead of using an existing one?09:47
xavierhardyget_completed_task_executions09:47
rakhmerovI'm looking at the method09:47
xavierhardyin the wrapper09:47
rakhmerovline09:47
rakhmerov?09:47
xavierhardymistral/db/sqlalchemy/base.py09:47
xavierhardy12109:48
xavierhardyget_incomplete_task_executions09:48
xavierhardyget_incomplete_task_executions_count09:48
rakhmerovooh09:48
rakhmerovwait a sec09:48
rakhmerovso09:48
rakhmerovtell me if I'm wrong09:48
rakhmerovin many methods we use this wrapper multiple times09:49
rakhmerovI mean, for example, we have a call09:49
rakhmerovwhich is not wrapped with @session_aware09:49
xavierhardyget_resource_member09:49
xavierhardyyes09:49
rakhmerovinside, we have a call which is wrapped with it09:49
rakhmerovand then we call something again inside the first one which is also wrapped with it09:50
rakhmerovyeah09:50
rakhmerovmakes sense09:50
xavierhardyyou can call the wrapper again09:50
xavierhardythat shouldn't be a problem09:50
rakhmerovit will open a new TX09:51
xavierhardybut the whole session should be wrapped09:51
rakhmerovif those wrappers are not overlapping09:51
rakhmerovit's a problem because we open many sessions whereas we don't need to09:51
xavierhardyyes09:51
rakhmerovbut I don't quite see where we don't close a session09:51
rakhmerovwhere we need to09:51
xavierhardyafter the actual query09:52
xavierhardyfor example when calling09:52
xavierhardy.all()09:52
xavierhardybecause it's not wrapped09:52
rakhmerovoooh!09:53
rakhmerovyes09:53
xavierhardyadd to the previous list09:53
rakhmerovgot it09:53
xavierhardyget_resource_members09:53
xavierhardy_get_accepted_resources09:53
xavierhardy_get_event_trigger09:53
rakhmerovbecause query.all has to be in a session09:53
xavierhardyyes09:53
rakhmerovooh gosh...09:54
rakhmerovsuch a mess...09:54
xavierhardyit's everywhere in that file09:54
xavierhardynot only what comes from this summer's refactoring09:54
rakhmerovI haven't look at this quite a while09:54
xavierhardybut yes, I did copy/paste this stuff09:54
xavierhardyand potentially increased this problem09:54
rakhmerovthat's ok09:55
rakhmerovthe real problem is that the right usage of @session_aware is not too obvious09:55
rakhmerovwe need to fix this all09:55
rakhmerovand ideally test it09:55
rakhmerovwe should test it for sure09:55
rakhmerovinterested in fixing it?09:56
rakhmerovd0ugal: following our conversation?09:56
rakhmerovd0ugal: we found the problem09:56
d0ugalrakhmerov: oops, sorry, I thought you went to a meeting so stopped :)09:56
* d0ugal reads09:56
xavierhardyinterested in fixing it, but I won't have time to write test for that09:56
rakhmerovthe meeting was postponed for 30 mins09:57
d0ugalxavierhardy: I can try and help with that, I have some time.09:57
rakhmerovxavierhardy, d0ugal: let me take care of this09:57
xavierhardybut how do we test it ? that's also a meaningful question09:57
rakhmerovd0ugal: can you?09:57
xavierhardywe check that we have only one transaction that was created and that is closed ?09:57
rakhmerovxavierhardy: we already have test for pretty much all DB API calls09:57
xavierhardyyes, I get that09:58
d0ugalrakhmerov: I don't mind who does it :)09:58
xavierhardybut testing this exact problem09:58
xavierhardy?09:58
rakhmerovso we just need need to check that they 1) don't open more than 1 session 2) don't leave sessions open09:58
d0ugalI guess we don't test this exact problem, or it would fail ;)09:58
rakhmerovwe don't09:58
rakhmerovyeah, I mean we could just add some additional checks09:59
rakhmerovto existing tests09:59
d0ugalsure09:59
d0ugalCan we mock it out and verify how many times it is called?09:59
rakhmerovyeah, something like that09:59
xavierhardynot sure it's sufficient10:00
xavierhardybecause it will be called several times10:00
xavierhardywhat is important is lower10:00
rakhmerovd0ugal: this is really a huge problem, we need to fix it rather sooner than later10:00
d0ugalright10:00
xavierhardythe actual number of sessions and transactions10:00
d0ugalrakhmerov: Yeah, I agree :)10:00
xavierhardyI can/must fix that today10:00
rakhmerov:)10:00
xavierhardyfor our production to run again10:00
rakhmerovI feel ashamed that we have this mess10:01
xavierhardybut as I said, I have limited time to test it10:01
xavierhardyand tomorrow is a national holiday (France)10:01
rakhmerovbut the reason is why we didn't see it clearly before is because we use explicit transactions everywhere10:01
rakhmerovexcept REST layer10:01
d0ugalrakhmerov: hah10:01
d0ugalindeed10:01
d0ugalxavierhardy: do you want to try and prepare a fix?10:02
rakhmerovxavierhardy, d0ugal: we could split the work, xavierhardy could prepare a fix (if have time), and d0ugal could proceed with testing10:02
xavierhardyWill do10:02
xavierhardyright now10:02
d0ugalSure, that works for me10:02
xavierhardyplease make sure in the review to check that I haven't forgotten any function10:03
xavierhardyhere is the list I have come up with10:03
xavierhardy_get_collection, _get_db_object_by_name, _get_db_object_by_id, _get_db_object_by_name_or_id, _delete_all, get_completed_task_executions, get_incomplete_task_executions,  get_incomplete_task_executions_count,  get_resource_member,  _get_accepted_resources,  _get_event_trigger10:03
openstackgerritSharat Sharma proposed openstack/mistral: Added senlin action pack  https://review.openstack.org/39558710:03
xavierhardythese are the lowest level functions that have this problem10:03
d0ugalokay, I'll take a look10:03
xavierhardyI'll grab a tea, and fix those ASAP and send for review after running the tests once10:04
d0ugalxavierhardy: Great10:04
d0ugalbrb10:04
*** jaosorior is now known as jaosorior_lunch10:10
* ddeja is rading all10:10
ddejaso, basically, we don't use the session_aware wrapper in all needed places?10:10
d0ugalddeja: Yeah, I think that sounds about right10:12
d0ugalbut I am still catching up too :)10:12
ddejamaybe when xavierhardy send his fix for reviews, I can catch it10:13
ddejabtw. congrats d0ugal, it's great to have you in a core team!10:13
d0ugalddeja: Thanks :)10:13
d0ugalThis issue is a fun introduction :-D10:13
ddejaThat's what happens when someone use your software on production :D10:14
xavierhardyOne more thing10:18
xavierhardysome more high level functions are affected10:18
xavierhardyget_all in mistral/utils/rest_utils.py10:19
xavierhardyif "resource_function" is defined, it does several queries10:20
xavierhardythey all should be in the same transaction too10:20
xavierhardyso we also need to check the REST API controller10:20
xavierhardy(sorry Renat ;) )10:20
d0ugallol10:20
xavierhardyin that case, do we use the with db_api.transaction or the session aware wrapper ?10:21
d0ugalLooking10:22
d0ugalxavierhardy: I would use with db_api.transaction() for those10:24
d0ugalsince it is at a higher level10:24
d0ugalbut not totally sure10:24
xavierhardyThat's what I think too10:25
xavierhardyadd get_resource_members to my list (lower level)10:26
d0ugalxavierhardy: silly question, how do you tell which functions require it?10:27
xavierhardywhen it's calling querying more than one thing on the DB10:27
xavierhardyand no db_api.transaction is present10:28
xavierhardyI try to find the lowest level function that satifies these conditions10:28
xavierhardyif only one query is done, the session aware decorator will handle it correctly10:28
d0ugalxavierhardy: okay, makes sense, thanks.10:29
ddejaxavierhardy: wait, so maybe we should fix something in session aware decoreator?10:29
ddejaif it cannot properly handle more the one query10:29
xavierhardyby query, I mean not only creating a query object but also using it (all(), first(), one())10:29
xavierhardyIt can10:29
xavierhardyIf the session is already created, it does not close or commit10:30
xavierhardythat's correct10:30
xavierhardyso calling it twice, will result in a commit in the higher level function10:30
xavierhardy(twice and nested)10:30
ddejaok10:30
ddejaoh, and lower would never get committed?10:31
* ddeja is trying to understand10:31
ddejabut I hope to got it once I see the patches10:31
xavierhardylook at the decorator10:32
xavierhardymistral/db/sqlalchemy/base.py10:32
ddejaooooooh10:32
xavierhardyline 10610:32
xavierhardysession_aware10:32
ddejaif created: session.commit10:32
xavierhardyyes10:32
ddejagot it10:32
xavierhardyand same thing for close10:33
xavierhardyand the finally10:33
ddejaok, I got it, thanks10:33
ddejato be honest, I don't see an easy fix, but I can wait for the patch to see it10:37
xavierhardywe just have to add the decorator everywhere it is required (given the criteria above)10:38
xavierhardythat will fix dangling transactions10:39
xavierhardythen, on the higher layers (the REST controller basically), we need to make sure that 2 subsequent db_api calls are nested into a single transaction10:39
xavierhardybecause else, we risk concurrency problems10:39
xavierhardyrace conditions10:39
xavierhardytypically, look at mistral/api/controllers/v2/event_trigger.py EventTriggersController:delete10:40
xavierhardyit gets the event trigger and then deletes it10:40
xavierhardyif another process deletes the same event trigger between those two, it will raise a 500 internal server error for the other10:41
xavierhardyprocess10:41
xavierhardybtw, I think I found all (but please double check) functions where this second problem occurs10:41
xavierhardyhere is the list10:41
xavierhardyI guess it should be in another commit10:42
xavierhardymistral/api/controllers/v2/task.py TasksController:put, mistral/api/controllers/v2/member.py MembersController:post, mistral/api/controllers/v2/execution.py ExecutionsController:put, mistral/api/controllers/v2/event_trigger.py EventTriggersController:put, mistral/api/controllers/v2/event_trigger.py EventTriggersController:delete, mistral/api/controllers/v2/action_execution.py ActionExecutionsController:delete, mistral/utils/rest10:42
rakhmerovguys10:48
rakhmerovddeja: hi, yeah, that's an interesting reading10:48
rakhmerovI think the right approach is to add @session_aware to ALL public functions10:49
rakhmerovmethods10:49
rakhmerovnot low level methods10:49
xavierhardyOK10:50
rakhmerovthis will guarantee that we have the same scope (and the same sqlalchemy session) for the entire method call stack10:50
rakhmerovmakes sense?10:50
rakhmerovbecause, think about it.. If we have a TX open explicitly then everything is fine10:50
xavierhardya wait, which API are we talking about ?10:50
xavierhardydb_api10:50
xavierhardy ?10:50
xavierhardyor higher ?10:51
rakhmerovso essentially @session_aware on a public method (exposed on DB API) is a replacement for explicit TX10:51
rakhmerovDB API10:51
xavierhardyyes10:51
xavierhardyOK10:51
xavierhardyagreed10:51
rakhmerovok10:51
rakhmerovjust wanted to make sure we're on the same page10:51
ddejarakhmerov: agree10:52
rakhmerovok10:52
xavierhardywhat about the transactions in the controller ?10:52
xavierhardythis list10:53
xavierhardymistral/api/controllers/v2/task.py TasksController:put, mistral/api/controllers/v2/member.py MembersController:post, mistral/api/controllers/v2/execution.py ExecutionsController:put, mistral/api/controllers/v2/event_trigger.py EventTriggersController:put, mistral/api/controllers/v2/event_trigger.py EventTriggersController:delete, mistral/api/controllers/v2/action_execution.py ActionExecutionsController:delete, mistral/utils/rest10:53
rakhmerovwhat about them?10:53
rakhmerovsorry, I missed last 30 mins of the conversation10:53
ddejaoh, we would close the transactions too early and we would have concurency problems.10:53
xavierhardy(assuming the dangling transaction problem is fixed)10:54
rakhmerovxavierhardy, ddeja, d0ugal: ok, on controllers10:54
xavierhardy(on the lower level)10:54
rakhmerovhere's my opinion10:54
rakhmerovI was agains decorating all the controller methods blindly because (I left a comment about that) we need to keep transactions as short as possible10:54
rakhmerovbesides DB stuff we also do some conversions, logging etc. inside those methods10:55
xavierhardysure10:55
rakhmerovwhich increases length of transactions10:55
rakhmerovso my preference would be just using "with db_api.transaction():" explicitly where we need them10:55
d0ugalso the context manager makes sense there10:55
d0ugalYeah10:56
rakhmerovyes10:56
xavierhardytotally agree10:56
rakhmerovif we see that we need a TX (e.g. when we need lazy loading or simply multiple DB operations) we can open it explicitly10:57
rakhmerovon a minimal scope10:57
rakhmerovok10:57
xavierhardyone more question10:59
ddejabut hm, one concern. We call with db_api.transaction. Then inside the transaction we call some method that is 'session_aware'. Does it mean that sesion_aware would close the session and therefore we are not in the transaction anymore?10:59
xavierhardydo we agree those are 2 separate PRs ?10:59
xavierhardyno, for the same reason as before10:59
xavierhardyit checks that the session is already open10:59
xavierhardyand does not close it10:59
xavierhardycorrect me if I'm wrong rakhmerov11:00
ddejaoh, created is true, if it *created* the session on the beggining11:00
ddejaof the decorator code11:00
rakhmerovxavierhardy, ddeja: exactly correct11:01
rakhmerovthat's the purpose of this method11:01
rakhmerovto open a new session if it's not opened yet11:01
rakhmerovby db_api.transaction()11:01
rakhmerovit needs to make sure that all subcalls will use the same instance of session11:02
ddejaoh, so now I'm lost again why there are hanging transaction. But maybe guys you can proceed with the fix instead of elaborating on this and then I can maybe understand it :)11:02
rakhmerovddeja: sec, I'll explain it11:03
xavierhardyI'm doing it as we speak... i mean write ;)11:03
rakhmerovit's easy11:03
rakhmerovooh, ok11:03
xavierhardyxavierhardy: do we agree those are 2 separate PRs ?11:04
xavierhardyrakhmerov11:04
xavierhardy(the transaction handling in the REST API controller and the DB API problem)11:04
rakhmerovd0ugal, hparekh: can you please also look at https://review.openstack.org/#/c/395988/?11:05
rakhmerovsame thing as in the patch you just looked at11:05
d0ugalrakhmerov: sure11:05
rakhmerovthanks11:05
rakhmerovxavierhardy: PRs?11:06
rakhmerovwhat do you mean? )11:06
d0ugalreviews/patches11:06
xavierhardyPR is Pull Request11:06
d0ugal(PRs = pull request, github naming)11:06
xavierhardyso yes, review/patches11:06
rakhmerovoh11:06
rakhmerovyes11:06
xavierhardyOK11:06
openstackgerritXavier Hardy proposed openstack/mistral: Fix REST API dangling transactions  https://review.openstack.org/39569611:15
xavierhardyhttps://review.openstack.org/#/c/39569611:15
d0ugalcool, looking11:18
d0ugalddeja: ^11:18
d0ugalrakhmerov: ^11:18
rakhmerovok11:18
*** hparekh has quit IRC11:19
ddejathe code looks OK, but since I dont 100% understand the problem I'll wait with giving the rate11:20
rakhmerovwoooow!11:23
rakhmerovhttp://logs.openstack.org/96/395696/2/check/gate-mistral-python34/7e9550c/testr_results.html.gz11:23
rakhmerovit's for this patch11:23
d0ugallol11:23
rakhmerovI looked at the changes and I believe they are correct11:23
rakhmerovBUT!11:23
rakhmerovthese changes revealed a bunch of problems in tests11:23
rakhmerovwhere we don't use db_api.transaction() but we need to11:24
rakhmerovxavierhardy: I'm not sure if you have enough patience to fix all of that )11:24
rakhmerovduring today11:24
d0ugaloh, wow11:24
d0ugalthis might take a bit of fixing11:24
rakhmerovyes11:24
* d0ugal runs away11:25
rakhmerovI could probably fix it pretty quickly11:25
rakhmerovbecause I already fixed a bunch of places like this11:25
d0ugalright11:25
d0ugalI would be happy to help of course, but I guess I will be much slower11:25
rakhmerovbtw, I often didn't understand why lazy loading sometimes works even after calling DB API methods11:25
rakhmerovbut now it's all clear :)11:26
rakhmerovbecause sessions didn't get closed properly11:26
rakhmerovmaan... this is huge11:26
d0ugallol11:26
rakhmerovxavierhardy: what do you say? Willing to fix these tests?11:26
rakhmerovif you don't have time we can take over11:27
rakhmerovthe size of the patch will be crazy11:27
ddejarakhmerov: maybe it would be easier to fire a bunch of patches11:27
ddejain each we add session_aware to a new method in DB aPI11:28
ddejaand fix mistral in needed places11:28
xavierhardyIt's not really a question of patiences11:28
xavierhardy*patience11:28
xavierhardyit's more a question of assignment at work11:28
xavierhardyMistral is not the only project I'm on (other are proprietary)11:28
xavierhardybut today, our production is broken, so I must fix this11:29
rakhmerovxavierhardy: ok, go ahead11:29
rakhmerovlet us know if you need help11:30
rakhmerovddeja: yes, we can do multiple patches if needed11:30
rakhmerovbut the changes are pretty simple11:30
rakhmerovxavierhardy: thanks a ton for bringing this up11:31
rakhmerovand sorry for having this problem still11:31
ddejarakhmerov: all of this tests must use with db_api.transaction, right?11:33
rakhmerovyes11:33
ddejaok, I see11:33
rakhmerovtypically we do something like this11:33
rakhmerovwf_ex = db_api.get_workflow_execution(id)11:33
rakhmerovtask_execs = wf_ex.task_executions11:34
rakhmerovthe last thing will fail if both methods are not under transaction11:34
rakhmerovbecause of lazy loading11:34
ddejayup11:34
openstackgerritXavier Hardy proposed openstack/mistral: Fix possible DB race conditions in REST controller  https://review.openstack.org/39612811:38
xavierhardy1) We need to fix the commit message11:40
xavierhardy2) We need to fix a bunch of failing tests11:40
xavierhardy?11:40
*** chlong has joined #openstack-mistral11:43
*** chlong has quit IRC11:44
d0ugalrakhmerov: ^11:52
d0ugalxavierhardy: I think the commit message on the initial review is wrong - the new review is better, but could do with more detail11:53
d0ugalxavierhardy: and for 2, I think that a number of the unit tests have been broken by this fix (as they were wrong initiall)11:53
*** dprince has joined #openstack-mistral12:19
openstackgerritMerged openstack/mistral: Fix error message format for task run and continue  https://review.openstack.org/39598812:28
openstackgerritMerged openstack/mistral: Fix error message format in other task handler methods  https://review.openstack.org/39600912:28
openstackgerritMerged openstack/mistral: Fix error message format in action handler  https://review.openstack.org/39603812:28
*** bobh_ has joined #openstack-mistral12:29
*** jaosorior_lunch is now known as jaosorior12:34
*** bobh_ has quit IRC12:40
*** ^Gal^ has quit IRC12:53
xavierhardyis that normal that Jenkins has not built yet?12:55
xavierhardyI have a problem with tox in my build environment, it takes more than 15 minutes to install the dependencies12:57
d0ugalxavierhardy: It's the TripleO CI, it takes a while12:57
d0ugalxavierhardy: it just finished12:57
d0ugalxavierhardy: it is a good sign that it passed :)12:58
xavierhardyOK, what about tox ?12:58
d0ugalxavierhardy: I'm not sure, it shouldn't take that long.12:58
d0ugalxavierhardy: do you have any errors?12:58
d0ugalxavierhardy: The Mistral tests do take some time, but not that long IIRC12:59
d0ugalxavierhardy: Are you running all the Python versions? It might be quicker to work with one first. 'tox -e py27'13:00
xavierhardyI have that with 2.7 and 3.513:00
xavierhardyand pep813:01
d0ugalok13:01
xavierhardyno, it's  in our build environment13:01
d0ugaloh, I see13:01
xavierhardyit does not even start the test (it gets killed after 15 minutes13:01
xavierhardy)13:01
d0ugalStrange, unless you have an error/traceback I'm not sure what it could be13:02
*** catintheroof has joined #openstack-mistral13:08
xavierhardyIt does not matter for now, I'm running the tests locally13:38
*** kamtamtun has quit IRC13:45
xavierhardyI have configured the tests this way:14:06
xavierhardy./run_tests.sh --db-type postgres -N -n14:06
xavierhardyand I end up with sqlite errors ....14:06
xavierhardy./run_tests.sh --db-type postgresql -N -n14:08
xavierhardyI can't launch the tests on my build env nor on my desk for reasons that I can't explain14:14
xavierhardyoslo_config.cfg.NoSuchOptError: no such option mistral in group [service_available]14:19
xavierhardyhow do I load the configuration file for the tests ?14:19
xavierhardyd0ugal, rakhmerov14:21
*** jaosorior has quit IRC14:34
*** jaosorior has joined #openstack-mistral14:35
d0ugalxavierhardy: I'm not sure, I generally run the tests against sqlite14:37
xavierhardy rakhmerov, are you sure the session aware decorator is able to fetch the transaction open by with db_api.transaction15:01
xavierhardyI have some doubts seen the errors15:01
xavierhardyoh, my mistake, I did not "call" with db_api.transction15:07
xavierhardy(no "()")15:07
xavierhardystill, same error15:09
xavierhardyah, ok update_event_triggers calls db_api.transaction too15:13
*** jaosorior has quit IRC15:20
*** bobh_ has joined #openstack-mistral15:24
xavierhardyI have tons of TypeError: exceptions must be old-style classes or derived from BaseException, not NoneType15:26
xavierhardyI'll at least push the first fixes15:26
openstackgerritXavier Hardy proposed openstack/mistral: Fix possible DB race conditions in REST controller  https://review.openstack.org/39612815:29
xavierhardyany idea about those lazy loading errors ?15:38
xavierhardyit basically happens because the transaction is already closed when we try to load some attributes from an object15:43
xavierhardyso I guess (need to test though), we need to merge both change reviews15:43
xavierhardyoh, OK, the test are actually broken15:47
xavierhardyit's not inside the API code anymore15:47
xavierhardysuch as test_create_and_get_and_load_task_execution15:48
xavierhardywhich needs to be in transaction too15:48
ddejaxavierhardy: yes, we've talked about this with rakhmerov before. Some tests need to be run in transactions15:48
xavierhardysorry, I was not following what you meant15:49
xavierhardynow, I see it15:49
xavierhardyOK, fixing15:49
*** rrecio has joined #openstack-mistral15:53
xavierhardygrep "lazy" /tmp/console.html | wc15:54
xavierhardy23015:54
xavierhardythat's what he meant with patience (2 hours later...)15:54
ddejaI think so15:54
*** rrecio has quit IRC15:54
*** rrecio has joined #openstack-mistral15:55
xavierhardywhy not make this systematic16:05
xavierhardy?16:05
xavierhardyat setUp and tearDown ?16:05
*** janki has quit IRC16:11
ddejabecouse we would like to have transactions as short as possible16:12
xavierhardyin the tests too ?16:12
ddejaI'm not sure16:15
ddejabut if we do so, we make tests pass faster, which is good16:16
xavierhardydoes it ?16:16
xavierhardyanyway, looking at the tests, it's not possible to make the transaction start atthe beginning and end at the end all the time16:16
ddejaI see16:17
xavierhardyI push a first batch16:17
xavierhardyI'm done for today I guess16:17
openstackgerritXavier Hardy proposed openstack/mistral: Fix REST API dangling transactions  https://review.openstack.org/39569616:19
ddejaok, thanks xavierhardy :)16:20
*** harlowja has joined #openstack-mistral16:31
*** harlowja has quit IRC16:32
*** harlowja has joined #openstack-mistral16:34
*** bobh_ has quit IRC16:44
*** catinthe_ has joined #openstack-mistral16:45
*** catintheroof has quit IRC16:46
*** jpich has quit IRC17:06
*** igormarnat has quit IRC18:03
*** akuznetsova has quit IRC18:04
*** rakhmerov has quit IRC18:04
*** rakhmerov has joined #openstack-mistral18:07
*** akuznetsova has joined #openstack-mistral18:07
*** igormarnat has joined #openstack-mistral18:09
*** hrybacki has joined #openstack-mistral18:37
*** jamielennox|away is now known as jamielennox18:37
hrybackihey all. I'm seeing receiving an 'Enviornment not found <stack> ' from Mistral (newton) exception calling `openstack overcloud node delete --stack <stack>' I verified that the stack id is correct -- any pointers? https://paste.fedoraproject.org/477444/79992414/18:38
hrybackijournalctl logs for ^^ https://paste.fedoraproject.org/477464/14788013/ -- see line ~16618:38
*** shardy has quit IRC18:41
*** dprince has quit IRC18:48
*** dprince has joined #openstack-mistral19:03
*** bobh_ has joined #openstack-mistral19:05
*** openstackgerrit has quit IRC19:48
*** openstackgerrit has joined #openstack-mistral19:48
*** gyee has joined #openstack-mistral20:27
*** bobh_ has quit IRC20:49
*** dprince has quit IRC20:50
*** gyee has quit IRC20:54
*** gyee has joined #openstack-mistral21:32
*** sharatss has quit IRC21:35
*** sharatss has joined #openstack-mistral21:37
*** bobh has joined #openstack-mistral21:38
*** bobh has quit IRC21:38
*** bobh has joined #openstack-mistral21:38
*** bobh has quit IRC21:42
*** catinthe_ has quit IRC21:59
*** Kiall has quit IRC22:38
*** rrecio_ has joined #openstack-mistral22:57
*** rrecio_ has quit IRC22:57
*** rrecio has quit IRC23:00
*** catintheroof has joined #openstack-mistral23:05
*** catintheroof has quit IRC23:09
*** catintheroof has joined #openstack-mistral23:17

Generated by irclog2html.py 2.14.0 by Marius Gedminas - find it at mg.pov.lt!