Then, I believe we can remove that filter in the search criteria as you suggested and also remove the line 308.
On Wed, Nov 22, 2017 at 10:12 AM, Ivan Kudryavtsev <kudryavtsev...@bw-sw.com > wrote: > Yes, you are right, but there are no other ids in the query, and rarely > (like in my case) it leads to wrong results. > > 22 нояб. 2017 г. 7:07 ПП пользователь "Rafael Weingärtner" < > rafaelweingart...@gmail.com> написал: > > > The problem seems to be related to line 308 at > > com.cloud.tags.TaggedResourceManagerImpl.deleteTags(List<String>, > > ResourceObjectType, Map<String, String>). > > It is being sent a list of resourceUUID as the filter for resourceId > > > > On Wed, Nov 22, 2017 at 10:03 AM, Rafael Weingärtner < > > rafaelweingart...@gmail.com> wrote: > > > > > The resourceId is not a real DB ID. It is the UUID converted to Long > > :(.... > > > This table has four "ID" like fields, ID, UUID, resourceID, and > > > resourceUUID. > > > > > > On Wed, Nov 22, 2017 at 10:00 AM, Ivan Kudryavtsev < > > > kudryavtsev...@bw-sw.com> wrote: > > > > > >> Hi, I just enabled log all queries and copied actual query which I > have > > >> shown in the first mail. Also, I don't understand why the search > should > > >> look over inner ids... Is it a case when user can pass real db ids to > an > > >> api call? > > >> > > >> 22 нояб. 2017 г. 6:55 ПП пользователь "Rafael Weingärtner" < > > >> rafaelweingart...@gmail.com> написал: > > >> > > >> > Yes, this I understood ;) > > >> > > > >> > However, I do not understand how the SQL that is being generated has > > >> this > > >> > clause: " resource_tags.resource_id='2a4264fb-9f63-4d4f-9465- > > >> > c1bc5440ea60'". > > >> > The resourceId field in the entity is a long. So, even though that > > long > > >> > represents a String, in the final SQL that is generated it should > be a > > >> long > > >> > value there. > > >> > > > >> > > > >> > > > >> > On Wed, Nov 22, 2017 at 9:28 AM, Ivan Kudryavtsev < > > >> > kudryavtsev...@bw-sw.com> > > >> > wrote: > > >> > > > >> > > Take a look here: > > >> > > > > >> > > SELECT resource_tags.id, resource_tags.uuid, resource_tags.key, > > >> > > resource_tags.value, resource_tags.domain_id, > > >> resource_tags.account_id, > > >> > > resource_tags.resource_id, resource_tags.resource_uuid, > > >> > > resource_tags.resource_type, resource_tags.customer FROM > > resource_tags > > >> > > WHERE ( resource_tags.resource_id='2a4264fb-9f63-4d4f-9465- > > >> > c1bc5440ea60' > > >> > > OR resource_tags.resource_uuid=_binary'2a4264fb-9f63-4d4f- > > >> > > 9465-c1bc5440ea60' > > >> > > ) AND resource_tags.resource_type = 'Account'; > > >> > > > > >> > > +----+--------------------------------------+-------+------- > > >> > > +-----------+------------+-------------+-------------------- > > >> > > ------------------+---------------+----------+ > > >> > > | id | uuid | key | value | > > >> domain_id | > > >> > > account_id | resource_id | resource_uuid | > > >> > > resource_type | customer | > > >> > > +----+--------------------------------------+-------+------- > > >> > > +-----------+------------+-------------+-------------------- > > >> > > ------------------+---------------+----------+ > > >> > > | 7 | 95a1a314-2247-4622-a33f-b9b2680bc2e1 | test | me | > > >> 1 > > >> > | > > >> > > 2 | 2 | 3199fc71-cf39-11e7-af5d-dc0ea16ecd7f | > > >> Account > > >> > > | NULL | > > >> > > | 10 | 6c247aa1-5524-4910-9b5f-c6cfd9b3bdd9 | test3 | me | > > >> 1 > > >> > | > > >> > > 4 | 4 | 2a4264fb-9f63-4d4f-9465-c1bc5440ea60 | > > >> Account > > >> > > | NULL | > > >> > > | 12 | 25fb7848-af34-42f7-855e-0f5909a4e979 | test5 | me2 | > > >> 1 > > >> > | > > >> > > 4 | 4 | 2a4264fb-9f63-4d4f-9465-c1bc5440ea60 | > > >> Account > > >> > > | NULL | > > >> > > +----+--------------------------------------+-------+------- > > >> > > +-----------+------------+-------------+-------------------- > > >> > > ------------------+---------------+----------+ > > >> > > 3 rows in set, 1 warning (0.01 sec) > > >> > > > > >> > > Try to figure out why id=7 is selected here? > > >> > > > > >> > > Because: > > >> > > resource_tags.resource_id='2a4264fb-9f63-4d4f-9465-c1bc5440ea60' > > >> > > > > >> > > Matched unintentionally, because mysql converted uuid to int and > > got 2 > > >> > > which is matched to resource_id of 2 (id=7). > > >> > > > > >> > > 22 нояб. 2017 г. 6:23 ПП пользователь "Rafael Weingärtner" < > > >> > > rafaelweingart...@gmail.com> написал: > > >> > > > > >> > > > Ah, ok now it makes sense the "IN", I thought you were only > > talking > > >> > about > > >> > > > single values. > > >> > > > > > >> > > > > > >> > > > > > >> > > > I do not think that the UUID (resource UUID) is the > representation > > >> of > > >> > ID > > >> > > > value in Hexadecimal, if it is we could simply get rid of one of > > >> them. > > >> > I > > >> > > > really dislike these search criteria...I am not seeing what you > > are > > >> > > saying. > > >> > > > Let´s see this in SQL, so we can discuss. > > >> > > > > > >> > > > SELECT * FROM resource_tags > > >> > > > WHERE (resource_id in (....) OR resource_uuid in (...)) > > >> > > > AND resource_tags.resource_type = 'Account'; > > >> > > > > > >> > > > > > >> > > > That is what the programmer who coded that Search criteria > seemed > > to > > >> > > want, > > >> > > > right? I mean, the developer wanted to select resources that > match > > >> > either > > >> > > > the ID or UUID field. Also, we may have more than a single value > > to > > >> > > filter > > >> > > > in both ID and UUID. I am also assuming that UUID does not > > >> necessarily > > >> > > > represents the ID as a hexadecimal. > > >> > > > > > >> > > > The problem seems to be when it is being translated: > > >> > > > > > >> > > > > ( resource_tags.resource_id='2a4264fb-9f63-4d4f-9465- > c1bc5440e > > >> a60' > > >> > > > > OR > > >> > > > > resource_tags.resource_uuid=_binary'2a4264fb-9f63-4d4f- > > >> > > > 9465-c1bc5440ea60' > > >> > > > > ) > > >> > > > > > > >> > > > > > >> > > > It is not even using an “IN” structure in the SQL. Also, why is > > the > > >> > > > resource_id equals the UUID in the filter. Did you check the > > entity > > >> > that > > >> > > is > > >> > > > being sent as an example? Are the fields ID and UUID set with > the > > >> same > > >> > > > values? > > >> > > > > > >> > > > > > >> > > > > > >> > > > P.S. Normally the ID field of entities is not exposed to users > via > > >> API. > > >> > > The > > >> > > > field ID in the API is translated to UUID in ACS. The field ID > in > > >> the > > >> > > > database is intended as a dummy primary key for the table. > > >> > > > > > >> > > > > > >> > > > On Wed, Nov 22, 2017 at 9:05 AM, Ivan Kudryavtsev < > > >> > > > kudryavtsev...@bw-sw.com> > > >> > > > wrote: > > >> > > > > > >> > > > > Hi, Rafael, 'IN" because API call assumes that several > > resourceIds > > >> > can > > >> > > be > > >> > > > > provided, so IN solves it, EQ doesn't. > > >> > > > > > > >> > > > > But despite semantics ID/UUID you see that ID is integer and > > UUID > > >> is > > >> > > > string > > >> > > > > and that comparison does fault positive results, next when > > object > > >> > > access > > >> > > > > for caller is checked exception occured and no tag removal > > happen > > >> as > > >> > a > > >> > > > > result because int(2) eq '2afcffdsfdsfds-... (UUID)". > > >> > > > > > > >> > > > > 2017-11-22 18:01 GMT+07:00 Rafael Weingärtner < > > >> > > > rafaelweingart...@gmail.com > > >> > > > > >: > > >> > > > > > > >> > > > > > Are ID and UUID set with the same values in that entity? If > > not, > > >> > the > > >> > > > > > criteria seem correct. I mean, it is trying to filter for an > > ID > > >> if > > >> > it > > >> > > > > > exists or by UUID if it exists in the entity that is passed > as > > >> an > > >> > > > > example. > > >> > > > > > What I do not understand is that they are using “ > > >> > > SearchCriteria.Op.IN > > >> > > > ”, > > >> > > > > > but > > >> > > > > > in my opinion, it should be “SearchCriteria.Op.EQ”. > > >> > > > > > > > >> > > > > > On Wed, Nov 22, 2017 at 7:58 AM, Ivan Kudryavtsev < > > >> > > > > > kudryavtsev...@bw-sw.com> > > >> > > > > > wrote: > > >> > > > > > > > >> > > > > > > Hi, I found interesting behaviour with tags: > > >> > > > > > > > > >> > > > > > > mysql> SELECT resource_tags.id, resource_tags.uuid, > > >> > > > resource_tags.key, > > >> > > > > > > resource_tags.value, resource_tags.domain_id, > > >> > > > resource_tags.account_id, > > >> > > > > > > resource_tags.resource_id, resource_tags.resource_uuid, > > >> > > > > > > resource_tags.resource_type, resource_tags.customer FROM > > >> > > > resource_tags > > >> > > > > > > WHERE ( resource_tags.resource_id=' > > 2a4264fb-9f63-4d4f-9465- > > >> > > > > > c1bc5440ea60' > > >> > > > > > > OR > > >> > > > > > > resource_tags.resource_uuid=_binary'2a4264fb-9f63-4d4f- > > >> > > > > > 9465-c1bc5440ea60' > > >> > > > > > > ) > > >> > > > > > > AND resource_tags.resource_type = 'Account'; > > >> > > > > > > > > >> > > > > > > +----+------------------------ > > --------------+-------+------- > > >> > > > > > > +-----------+------------+---- > > ---------+-------------------- > > >> > > > > > > ------------------+---------------+----------+ > > >> > > > > > > | id | uuid | key | > value > > | > > >> > > > > domain_id | > > >> > > > > > > account_id | resource_id | resource_uuid > > >> | > > >> > > > > > > resource_type | customer | > > >> > > > > > > +----+------------------------ > > --------------+-------+------- > > >> > > > > > > +-----------+------------+---- > > ---------+-------------------- > > >> > > > > > > ------------------+---------------+----------+ > > >> > > > > > > | 7 | 95a1a314-2247-4622-a33f-b9b2680bc2e1 | test | me > > | > > >> > > > > 1 > > >> > > > > > | > > >> > > > > > > 2 | 2 | 3199fc71-cf39-11e7-af5d- > > dc0ea16ecd7f > > >> | > > >> > > > > Account > > >> > > > > > > | NULL | > > >> > > > > > > | 10 | 6c247aa1-5524-4910-9b5f-c6cfd9b3bdd9 | test3 | me > > | > > >> > > > > 1 > > >> > > > > > | > > >> > > > > > > 4 | 4 | 2a4264fb-9f63-4d4f-9465- > > c1bc5440ea60 > > >> | > > >> > > > > Account > > >> > > > > > > | NULL | > > >> > > > > > > | 12 | 25fb7848-af34-42f7-855e-0f5909a4e979 | test5 | me2 > > | > > >> > > > > 1 > > >> > > > > > | > > >> > > > > > > 4 | 4 | 2a4264fb-9f63-4d4f-9465- > > c1bc5440ea60 > > >> | > > >> > > > > Account > > >> > > > > > > | NULL | > > >> > > > > > > +----+------------------------ > > --------------+-------+------- > > >> > > > > > > +-----------+------------+---- > > ---------+-------------------- > > >> > > > > > > ------------------+---------------+----------+ > > >> > > > > > > 3 rows in set, 1 warning (0.01 sec) > > >> > > > > > > > > >> > > > > > > Don't see that "resource_type" is "account". I just play > > with > > >> it. > > >> > > > > > > > > >> > > > > > > Take a look at ID=7. This row is found because: > > >> > > > > > > > > >> > > > > > > resource_tags.resource_id='2a4264fb-9f63-4d4f-9465- > > c1bc5440e > > >> a60' > > >> > > > when > > >> > > > > > > right > > >> > > > > > > part is converted to int. Corresponding code is here: > > >> > > > > > > > > >> > > > > > > https://github.com/apache/cloudstack/blob/ > > 87ef8137534fa79810 > > >> > > > > 1f65c6691fcf > > >> > > > > > > 71513ac978/server/src/com/cloud/tags/ > > TaggedResourceManagerIm > > >> > > > > pl.java#L301 > > >> > > > > > > > > >> > > > > > > sb.and().op("resourceId", sb.entity().getResourceId(), > > >> > > > > > > SearchCriteria.Op.IN); > > >> > > > > > > sb.or("resourceUuid", sb.entity().getResourceUuid(), > > >> > > > > > SearchCriteria.Op.IN > > >> > > > > > > ); > > >> > > > > > > sb.cp(); > > >> > > > > > > sb.and("resourceType", sb.entity().getResourceType(), > > >> > > > > > > SearchCriteria.Op.EQ); > > >> > > > > > > > > >> > > > > > > I don't know why the writer uses "resourceId" or > > >> "resourceUuid". > > >> > I > > >> > > > > > suppose > > >> > > > > > > it's a bug and code should be transformed to: > > >> > > > > > > > > >> > > > > > > sb.and("resourceUuid", sb.entity().getResourceUuid(), > > >> > > > > > SearchCriteria.Op.IN > > >> > > > > > > ); > > >> > > > > > > sb.and("resourceType", sb.entity().getResourceType(), > > >> > > > > > > SearchCriteria.Op.EQ); > > >> > > > > > > > > >> > > > > > > Or MySQL query should be transformed to: > > >> > > > > > > > > >> > > > > > > mysql> SELECT resource_tags.id, resource_tags.uuid, > > >> > > > resource_tags.key, > > >> > > > > > > resource_tags.value, resource_tags.domain_id, > > >> > > > resource_tags.account_id, > > >> > > > > > > resource_tags.resource_id, resource_tags.resource_uuid, > > >> > > > > > > resource_tags.resource_type, resource_tags.customer FROM > > >> > > > resource_tags > > >> > > > > > > WHERE ( concat("%", resource_tags.resource_id) = > > >> > > > > > > '2a4264fb-9f63-4d4f-9465-c1bc5440ea60' OR > > >> > > > > > > resource_tags.resource_uuid=_binary'2a4264fb-9f63-4d4f- > > >> > > > > > 9465-c1bc5440ea60' > > >> > > > > > > ) > > >> > > > > > > AND resource_tags.resource_type = 'Account'; > > >> > > > > > > +----+------------------------ > > --------------+-------+------- > > >> > > > > > > +-----------+------------+---- > > ---------+-------------------- > > >> > > > > > > ------------------+---------------+----------+ > > >> > > > > > > | id | uuid | key | > value > > | > > >> > > > > domain_id | > > >> > > > > > > account_id | resource_id | resource_uuid > > >> | > > >> > > > > > > resource_type | customer | > > >> > > > > > > +----+------------------------ > > --------------+-------+------- > > >> > > > > > > +-----------+------------+---- > > ---------+-------------------- > > >> > > > > > > ------------------+---------------+----------+ > > >> > > > > > > | 10 | 6c247aa1-5524-4910-9b5f-c6cfd9b3bdd9 | test3 | me > > | > > >> > > > > 1 > > >> > > > > > | > > >> > > > > > > 4 | 4 | 2a4264fb-9f63-4d4f-9465- > > c1bc5440ea60 > > >> | > > >> > > > > Account > > >> > > > > > > | NULL | > > >> > > > > > > | 12 | 25fb7848-af34-42f7-855e-0f5909a4e979 | test5 | me2 > > | > > >> > > > > 1 > > >> > > > > > | > > >> > > > > > > 4 | 4 | 2a4264fb-9f63-4d4f-9465- > > c1bc5440ea60 > > >> | > > >> > > > > Account > > >> > > > > > > | NULL | > > >> > > > > > > +----+------------------------ > > --------------+-------+------- > > >> > > > > > > +-----------+------------+---- > > ---------+-------------------- > > >> > > > > > > ------------------+---------------+----------+ > > >> > > > > > > 2 rows in set (0.00 sec) > > >> > > > > > > > > >> > > > > > > Let me your thoughts and I'll fix it. Right now, obviously > > >> it's a > > >> > > > bug. > > >> > > > > > > > > >> > > > > > > > > >> > > > > > > > > >> > > > > > > -- > > >> > > > > > > With best regards, Ivan Kudryavtsev > > >> > > > > > > Bitworks Software, Ltd. > > >> > > > > > > Cell: +7-923-414-1515 <+7%20923%20414-15-15> > > >> > > > > > > WWW: http://bitworks.software/ <http://bw-sw.com/> > > >> > > > > > > > > >> > > > > > > > >> > > > > > > > >> > > > > > > > >> > > > > > -- > > >> > > > > > Rafael Weingärtner > > >> > > > > > > > >> > > > > > > >> > > > > > > >> > > > > > > >> > > > > -- > > >> > > > > With best regards, Ivan Kudryavtsev > > >> > > > > Bitworks Software, Ltd. > > >> > > > > Cell: +7-923-414-1515 > > >> > > > > WWW: http://bitworks.software/ <http://bw-sw.com/> > > >> > > > > > > >> > > > > > >> > > > > > >> > > > > > >> > > > -- > > >> > > > Rafael Weingärtner > > >> > > > > > >> > > > > >> > > > >> > > > >> > > > >> > -- > > >> > Rafael Weingärtner > > >> > > > >> > > > > > > > > > > > > -- > > > Rafael Weingärtner > > > > > > > > > > > -- > > Rafael Weingärtner > > > -- Rafael Weingärtner