-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/60942/#review182262
-----------------------------------------------------------



The failing test case is `TestDiffCommand.test_cron_diff`. It fails to compare 
two `frozendict`s containing identical resources. We can reproduce this 
behaviour in isolation:

```
$ ./pants repl src/main/python/apache/aurora/client/

# Let's quickly verify that frozensets works as expected
>>> [1,2,3] == [1,2,3]
True
>>> frozenset([1,2,3]) == frozenset([1,2,3])
True # Good!

# Now let's do the same with a thrit Resource objects
>>> [Resource(numCpus=1), Resource(ramMb=2)] == [Resource(numCpus=1), 
>>> Resource(ramMb=2)]
True
>>> frozenset([Resource(numCpus=1), Resource(ramMb=2)]) == 
>>> frozenset([Resource(numCpus=1), Resource(ramMb=2)])
False # oh!...
```

Turns out `Resource` implements `__eq__` and `__ne__`  but *not* `__hash__`. 

The [Python 
docs](https://docs.python.org/2/reference/datamodel.html#object.__hash__) on 
this:
```
If a class [...] defines __cmp__() or __eq__() but not __hash__(), its 
instances will not be usable in hashed collections.
```

This points to a problem with Thrift. Indeed there is a related issue 
https://issues.apache.org/jira/browse/THRIFT-162. It is fixed in 0.10.0 but we 
are still on 0.9.3.


The tested class deals with leaky behaviour of the underlying `DiffFormater` 
that modifies tasks. If we move the necessary `deepcopy` into the 
`DiffFormatter`, we can prevent this behaviour from leaking out. This will also 
prevent us from hitting the faulty Thrift behaviour, thus fixing the test. The 
necessary diff can be something like:

```
diff --git a/src/main/python/apache/aurora/client/cli/diff_formatter.py 
b/src/main/python/apache/aurora/client/cli/diff_formatter.py
index 8804612..2f66e29 100644
--- a/src/main/python/apache/aurora/client/cli/diff_formatter.py
+++ b/src/main/python/apache/aurora/client/cli/diff_formatter.py
@@ -126,6 +126,8 @@ class DiffFormatter(object):
           format_ranges(r for r in chain.from_iterable(s.instances for s in 
summaries)))

   def diff_no_update_details(self, local_tasks):
+    # Deepcopy is important here as tasks will be modified for printing.
+    local_tasks = [deepcopy(t) for t in local_tasks]
     api = self.context.get_api(self.cluster)
     resp = api.query(api.build_query(self.role, self.name, env=self.env, 
statuses=ACTIVE_STATES))
     self.context.log_response_and_raise(
diff --git a/src/main/python/apache/aurora/client/cli/jobs.py 
b/src/main/python/apache/aurora/client/cli/jobs.py
index b79ae56..d6d2939 100644
--- a/src/main/python/apache/aurora/client/cli/jobs.py
+++ b/src/main/python/apache/aurora/client/cli/jobs.py
@@ -201,10 +201,7 @@ class DiffCommand(Verb):
         err_code=EXIT_INVALID_CONFIGURATION,
         err_msg="Error loading configuration")
     local_task = resp.result.populateJobResult.taskConfig
-    # Deepcopy is important here as tasks will be modified for printing.
-    local_tasks = [
-        deepcopy(local_task) for _ in range(config.instances())
-    ]
+    local_tasks = [local_task for _ in range(config.instances())]
     instances = (None if context.options.instance_spec.instance == 
ALL_INSTANCES else
                  context.options.instance_spec.instance)
     formatter = DiffFormatter(context, config, cluster, role, env, name)
```

What do you think?

- Stephan Erb


On Aug. 4, 2017, 4:04 p.m., Nicolás Donatucci wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/60942/
> -----------------------------------------------------------
> 
> (Updated Aug. 4, 2017, 4:04 p.m.)
> 
> 
> Review request for Aurora, Joshua Cohen, Stephan Erb, and Zameer Manji.
> 
> 
> Bugs: AURORA-1707
>     https://issues.apache.org/jira/browse/AURORA-1707
> 
> 
> Repository: aurora
> 
> 
> Description
> -------
> 
> Removed task level resource fields from the DB and the thrift-API.
> To do this, a new DB migration was added. When upgrading, it just drops the 
> task level resource fields. When downgrading, it creates the fields again and 
> populates them with information from the task_resource table.
> 
> IMPORTANT: One of the python client tests is failing (test_cron_diff). This 
> is not serious, I think it is a problem with the ordering of the elements of 
> Resources (had similar problems with other python client tests that instead 
> of comparing the Resources as a set, compared them as lists and thus order 
> mattered). Nevertheless, I could not fully understand the code of that test. 
> I was hoping someone could give me a hand with that. 
> But then again, it is a smaller issue and so the patch can start being 
> reviewed.
> 
> Issue Related: AURORA-1707
> 
> 
> Diffs
> -----
> 
>   api/src/main/thrift/org/apache/aurora/gen/api.thrift 
> 3749531b5412d7ca217736aa85eed8e6606225ad 
>   src/main/java/org/apache/aurora/scheduler/base/TaskTestUtil.java 
> 186fa1b3a4780c0536fb486d50a33133258110cd 
>   src/main/java/org/apache/aurora/scheduler/storage/db/TaskConfigManager.java 
> d2eb6aa6e4a155b2d28debab2ca10dfc76d57213 
>   src/main/java/org/apache/aurora/scheduler/storage/db/TaskConfigMapper.java 
> cda55c55680a19ed421299a8949299b21949787b 
>   
> src/main/java/org/apache/aurora/scheduler/storage/db/migration/V004_CreateTaskResourceTable.java
>  af106a8a9ee8c14122e98bcc0ec44b616f21d61f 
>   
> src/main/java/org/apache/aurora/scheduler/storage/db/migration/V011_DropResourceFields.java
>  PRE-CREATION 
>   
> src/main/java/org/apache/aurora/scheduler/storage/db/views/DbTaskConfig.java 
> 138cd5316adc73eed24fc7accc53885dd5d5bee5 
>   src/main/python/apache/aurora/client/cli/diff_formatter.py 
> 78717774aa3fbaf83a5fb850bc9f9f4a4038d70f 
>   
> src/main/resources/org/apache/aurora/scheduler/storage/db/TaskConfigMapper.xml
>  5422183e4a1fe122fc0e1aa871aa75ae102e322d 
>   src/main/resources/org/apache/aurora/scheduler/storage/db/schema.sql 
> 7a86f47af67adb3e488381d30ddf424549deefbc 
>   src/test/java/org/apache/aurora/scheduler/http/TestUtils.java 
> 689482c9f6c49bcca781834566edeb975d2f3af2 
>   
> src/test/java/org/apache/aurora/scheduler/storage/db/RowGarbageCollectorTest.java
>  caaba9b6dff46ff0b037759f1c817a321ae15ee4 
>   src/test/java/org/apache/aurora/scheduler/thrift/Fixtures.java 
> 43e32eede27bbf26363a3fd1ca34ffe6f8c01a73 
>   
> src/test/java/org/apache/aurora/scheduler/updater/UpdateAgentReserverImplTest.java
>  1bc2a778ad3f1543a055023f9ec3fe9e4a9523e3 
>   src/test/python/apache/aurora/client/cli/test_status.py 
> b0b7f96d8148f0dd1f6f45d1c5c6f830cabcfd5d 
>   src/test/python/apache/aurora/client/cli/util.py 
> 43db828ca1cccd91c88f016b4c994fef33182fbf 
>   src/test/python/apache/aurora/config/test_resources.py 
> 25a20f0b702189744a26b85053db34c37ff5b03c 
> 
> 
> Diff: https://reviews.apache.org/r/60942/diff/3/
> 
> 
> Testing
> -------
> 
> src/test/sh/org/apache/aurora/e2e/test_end_to_end.sh
> 
> 1 - Created a new VM with a fresh Aurora 0.18.0, ran the tests so that the db 
> would have something. Then upgraded to patched version and ran the tests 
> again. Everything worked and task level resource fields were no longer there.
> 2 - Created a new VM with a fresh patched version, ran the tests so that the 
> db would have something. Then downgraded to 0.18.0 and ran the tests again. 
> Everything worked and task level resources were there, with the correct 
> backfilled values.
> 
> 
> Thanks,
> 
> Nicolás Donatucci
> 
>

Reply via email to