You are viewing a plain text version of this content. The canonical link for it is here.
Posted to reviews@aurora.apache.org by Jordan Ly <jo...@gmail.com> on 2017/11/27 18:04:24 UTC

Re: Review Request 63973: Enable custom offer scoring modules for task assignment

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

(Updated Nov. 27, 2017, 6:04 p.m.)


Review request for Aurora, David McLaughlin, Santhosh Kumar Shanmugham, Stephan Erb, and Bill Farner.


Changes
-------

Fix build style/PMD issues


Repository: aurora


Description
-------

Major portions of the refactor:

* Refactor `OfferManager` to do filtering of offers (added `getMatching` and `getAllMatching` methods) as opposed to TaskAssigner
* Refactor `TaskAssigner`, allow for injection of custom "scoring" class through `OfferRanker` interface

And some minor things as well:

* Moved `TaskAssignerImpl`, `TaskSchedulerImpl`, and `HostOffers` into their own upper-level classes
* Moved `TaskAssigner` to the `scheduling` package and out of the `state` package
* Renamed some methods in `OfferManager` to avoid code stutter
* Renaming of some classes (e.g. `FirstFitTaskAssigner` -> `TaskAssignerImpl`)
* And a slew of others

Overall, the goal of this refactor is to allow for the easy injection of custom offer "scoring" modules via the `OfferRanker` interface. Callers will not have to replace the entire `TaskAssigner` module, but instead just provide a function that chooses from a list of offers that should already fit the task.

Going through this review, I would start with the `maybeAssign`/`launchUsingOffer` methods in `TaskAssigner`. Then, I would look at `getMatching`/`getAllMatching` in `HostOffers`.


Diffs (updated)
-----

  RELEASE-NOTES.md e622a8d38425a99c2965d64147fa0e680e5de517 
  docs/reference/scheduler-configuration.md 6c385b5be2b64117989c624ce93c78609cfea6c5 
  src/jmh/java/org/apache/aurora/benchmark/Offers.java 2b463267af6e7ae7fa16736de3b1e3d7d5bd99a8 
  src/jmh/java/org/apache/aurora/benchmark/SchedulingBenchmarks.java 1708a5063afd12de5d2138e763a19d1cf8dc9714 
  src/jmh/java/org/apache/aurora/benchmark/fakes/FakeOfferManager.java 201aa81db7f607a70c7d44011857576f45b7e9da 
  src/main/java/org/apache/aurora/scheduler/app/AppModule.java 3204cca5446d0f798ace622d334473bf6db13733 
  src/main/java/org/apache/aurora/scheduler/config/CliOptions.java d4537e386af53ec9bff661ed23d61a5bd4893edf 
  src/main/java/org/apache/aurora/scheduler/filter/AttributeAggregate.java 60f141d34d862f200ae1346a38a71bba57551059 
  src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilter.java 36608a9f027c95723c31f9915852112beb367223 
  src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilterImpl.java df51d4cf4893899613683603ab4aa9aefa88faa6 
  src/main/java/org/apache/aurora/scheduler/http/Offers.java f22ca6e5402d8ec7241376de14a9051ab0cfbfc6 
  src/main/java/org/apache/aurora/scheduler/mesos/MesosCallbackHandler.java fd5874d51cfbca1b98d15623a9c845d208d43b1f 
  src/main/java/org/apache/aurora/scheduler/offers/HostOffers.java PRE-CREATION 
  src/main/java/org/apache/aurora/scheduler/offers/OfferManager.java 96b0f46e69255944fa0f00621db315e22d68515c 
  src/main/java/org/apache/aurora/scheduler/offers/OfferManagerImpl.java PRE-CREATION 
  src/main/java/org/apache/aurora/scheduler/offers/OfferSettings.java 57fc1a18f1b82decc780ba0069ab4dd0c125f77d 
  src/main/java/org/apache/aurora/scheduler/offers/OffersModule.java 4a6ea8dac97ed2f5df47e4d16fa65a3b516988bd 
  src/main/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessor.java 766d3b24fd64de96b82d3dd2a17f7a80331889d8 
  src/main/java/org/apache/aurora/scheduler/preemptor/Preemptor.java 82a0ff67e9f70fed305f8f1bf38e3cf7955b9ce7 
  src/main/java/org/apache/aurora/scheduler/scheduling/FirstFitOfferRanker.java PRE-CREATION 
  src/main/java/org/apache/aurora/scheduler/scheduling/OfferRanker.java PRE-CREATION 
  src/main/java/org/apache/aurora/scheduler/scheduling/SchedulingModule.java 0796712a00e3cba595ceb049833933b9a70c2f9a 
  src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssigner.java PRE-CREATION 
  src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssignerImpl.java PRE-CREATION 
  src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssignerImplModule.java PRE-CREATION 
  src/main/java/org/apache/aurora/scheduler/scheduling/TaskScheduler.java 0002b0ceb429a404ac9dd0ae7e5ea9f6362fa100 
  src/main/java/org/apache/aurora/scheduler/scheduling/TaskSchedulerImpl.java PRE-CREATION 
  src/main/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerModule.java dc244eeaa0d292a06d8750cb340fb379701ad49f 
  src/main/java/org/apache/aurora/scheduler/state/StateModule.java b7a3c0be592c13181edf2e8c241a2ad351962e06 
  src/main/java/org/apache/aurora/scheduler/state/TaskAssigner.java cdd0d15872248b19d5eb52d25537f2f863fd5c77 
  src/main/java/org/apache/aurora/scheduler/stats/AsyncStatsModule.java 6033c01477bec7a491128e3089ffc1b1c3f1c150 
  src/test/java/org/apache/aurora/scheduler/config/CommandLineTest.java 0ec4de636e2fa0b671f8c1368e6d225747f215b6 
  src/test/java/org/apache/aurora/scheduler/http/OffersTest.java 30699596a1c95199df7504f62c5c18cab1be1c6c 
  src/test/java/org/apache/aurora/scheduler/mesos/MesosCallbackHandlerTest.java 45ae6bb5d12de66271a99aad0cda9632da22acea 
  src/test/java/org/apache/aurora/scheduler/offers/OfferManagerImplTest.java 6b18296ffdd7e1a5e989236db967c5e752a8a55f 
  src/test/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessorTest.java c76b3e338298d63834b4265d769649d39b9ae219 
  src/test/java/org/apache/aurora/scheduler/preemptor/PreemptorImplTest.java f14cba144856b23531467a7b8a3fd695ad8beee8 
  src/test/java/org/apache/aurora/scheduler/preemptor/PreemptorModuleTest.java 97c238ce30142a94a1fd9c6c7055fa95f2512cce 
  src/test/java/org/apache/aurora/scheduler/scheduling/FirstFitOfferRankerTest.java PRE-CREATION 
  src/test/java/org/apache/aurora/scheduler/scheduling/TaskSchedulerImplTest.java 7a4525a190a662e82b9ba98346fae0b25a8ea673 
  src/test/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerTest.java 58f9de2731633664f4140d785c3a6df0cde063b4 
  src/test/java/org/apache/aurora/scheduler/stats/AsyncStatsModuleTest.java f8e802342e753ee6a23ba7e1c2ab5151b85cadb3 


Diff: https://reviews.apache.org/r/63973/diff/4/

Changes: https://reviews.apache.org/r/63973/diff/3-4/


Testing
-------

Tests coming soon, but they should be relatively close to what we have now on master since we don't really add/remove features but just move them around.

Ran some benchmarks as well to ensure performance parity:

```
MASTER
Benchmark                                                                      Mode  Cnt       Score       Error  Units
SchedulingBenchmarks.ClusterFullUtilizationBenchmark.runBenchmark             thrpt   10  113910.922 ± 26263.903  ops/s
SchedulingBenchmarks.FillClusterBenchmark.runBenchmark                        thrpt   10     263.043 ±   299.686  ops/s
SchedulingBenchmarks.InsufficientResourcesSchedulingBenchmark.runBenchmark    thrpt   10   12353.669 ±   433.182  ops/s
SchedulingBenchmarks.LimitConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10     893.263 ±    54.882  ops/s
SchedulingBenchmarks.ValueConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10   11478.420 ±  1068.819  ops/s
```
and
```
MY PATCH
Benchmark                                                                      Mode  Cnt       Score       Error  Units
SchedulingBenchmarks.ClusterFullUtilizationBenchmark.runBenchmark             thrpt   10  124041.966 ± 33331.424  ops/s
SchedulingBenchmarks.FillClusterBenchmark.runBenchmark                        thrpt   10    1030.434 ±  1223.539  ops/s
SchedulingBenchmarks.InsufficientResourcesSchedulingBenchmark.runBenchmark    thrpt   10   12305.154 ±   375.814  ops/s
SchedulingBenchmarks.LimitConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10    1080.267 ±    74.635  ops/s
SchedulingBenchmarks.ValueConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10   11604.642 ±   586.248  ops/s
```

Not exactly sure why `FillClusterBenchmark` increased so dramatically -- I will look into that while testing as well.


Thanks,

Jordan Ly


Re: Review Request 63973: Enable custom offer scoring modules for task assignment

Posted by Bill Farner <wf...@apache.org>.
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/63973/#review191928
-----------------------------------------------------------


Ship it!




Ship It!

- Bill Farner


On Nov. 27, 2017, 11:41 a.m., Jordan Ly wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/63973/
> -----------------------------------------------------------
> 
> (Updated Nov. 27, 2017, 11:41 a.m.)
> 
> 
> Review request for Aurora, David McLaughlin, Santhosh Kumar Shanmugham, Stephan Erb, and Bill Farner.
> 
> 
> Repository: aurora
> 
> 
> Description
> -------
> 
> Major portions of the refactor:
> 
> * Refactor `OfferManager` to do filtering of offers (added `getMatching` and `getAllMatching` methods) as opposed to TaskAssigner
> * Refactor `TaskAssigner`, allow for injection of custom "scoring" class through `OfferRanker` interface
> 
> And some minor things as well:
> 
> * Moved `TaskAssignerImpl`, `TaskSchedulerImpl`, and `HostOffers` into their own upper-level classes
> * Moved `TaskAssigner` to the `scheduling` package and out of the `state` package
> * Renamed some methods in `OfferManager` to avoid code stutter
> * Renaming of some classes (e.g. `FirstFitTaskAssigner` -> `TaskAssignerImpl`)
> * And a slew of others
> 
> Overall, the goal of this refactor is to allow for the easy injection of custom offer "scoring" modules via the `OfferRanker` interface. Callers will not have to replace the entire `TaskAssigner` module, but instead just provide a function that chooses from a list of offers that should already fit the task.
> 
> Going through this review, I would start with the `maybeAssign`/`launchUsingOffer` methods in `TaskAssigner`. Then, I would look at `getMatching`/`getAllMatching` in `HostOffers`.
> 
> 
> Diffs
> -----
> 
>   RELEASE-NOTES.md e622a8d38425a99c2965d64147fa0e680e5de517 
>   docs/reference/scheduler-configuration.md 6c385b5be2b64117989c624ce93c78609cfea6c5 
>   src/jmh/java/org/apache/aurora/benchmark/Offers.java 2b463267af6e7ae7fa16736de3b1e3d7d5bd99a8 
>   src/jmh/java/org/apache/aurora/benchmark/SchedulingBenchmarks.java 1708a5063afd12de5d2138e763a19d1cf8dc9714 
>   src/jmh/java/org/apache/aurora/benchmark/fakes/FakeOfferManager.java 201aa81db7f607a70c7d44011857576f45b7e9da 
>   src/main/java/org/apache/aurora/scheduler/app/AppModule.java 3204cca5446d0f798ace622d334473bf6db13733 
>   src/main/java/org/apache/aurora/scheduler/config/CliOptions.java d4537e386af53ec9bff661ed23d61a5bd4893edf 
>   src/main/java/org/apache/aurora/scheduler/filter/AttributeAggregate.java 60f141d34d862f200ae1346a38a71bba57551059 
>   src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilter.java 36608a9f027c95723c31f9915852112beb367223 
>   src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilterImpl.java df51d4cf4893899613683603ab4aa9aefa88faa6 
>   src/main/java/org/apache/aurora/scheduler/http/Offers.java f22ca6e5402d8ec7241376de14a9051ab0cfbfc6 
>   src/main/java/org/apache/aurora/scheduler/mesos/MesosCallbackHandler.java fd5874d51cfbca1b98d15623a9c845d208d43b1f 
>   src/main/java/org/apache/aurora/scheduler/offers/HostOffers.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferManager.java 96b0f46e69255944fa0f00621db315e22d68515c 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferManagerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferSettings.java 57fc1a18f1b82decc780ba0069ab4dd0c125f77d 
>   src/main/java/org/apache/aurora/scheduler/offers/OffersModule.java 4a6ea8dac97ed2f5df47e4d16fa65a3b516988bd 
>   src/main/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessor.java 766d3b24fd64de96b82d3dd2a17f7a80331889d8 
>   src/main/java/org/apache/aurora/scheduler/preemptor/Preemptor.java 82a0ff67e9f70fed305f8f1bf38e3cf7955b9ce7 
>   src/main/java/org/apache/aurora/scheduler/scheduling/FirstFitOfferSelector.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/OfferSelector.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/SchedulingModule.java 0796712a00e3cba595ceb049833933b9a70c2f9a 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssigner.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssignerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssignerImplModule.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskScheduler.java 0002b0ceb429a404ac9dd0ae7e5ea9f6362fa100 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskSchedulerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerModule.java dc244eeaa0d292a06d8750cb340fb379701ad49f 
>   src/main/java/org/apache/aurora/scheduler/state/StateModule.java b7a3c0be592c13181edf2e8c241a2ad351962e06 
>   src/main/java/org/apache/aurora/scheduler/state/TaskAssigner.java cdd0d15872248b19d5eb52d25537f2f863fd5c77 
>   src/main/java/org/apache/aurora/scheduler/stats/AsyncStatsModule.java 6033c01477bec7a491128e3089ffc1b1c3f1c150 
>   src/test/java/org/apache/aurora/scheduler/config/CommandLineTest.java 0ec4de636e2fa0b671f8c1368e6d225747f215b6 
>   src/test/java/org/apache/aurora/scheduler/http/OffersTest.java 30699596a1c95199df7504f62c5c18cab1be1c6c 
>   src/test/java/org/apache/aurora/scheduler/mesos/MesosCallbackHandlerTest.java 45ae6bb5d12de66271a99aad0cda9632da22acea 
>   src/test/java/org/apache/aurora/scheduler/offers/OfferManagerImplTest.java 6b18296ffdd7e1a5e989236db967c5e752a8a55f 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessorTest.java c76b3e338298d63834b4265d769649d39b9ae219 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PreemptorImplTest.java f14cba144856b23531467a7b8a3fd695ad8beee8 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PreemptorModuleTest.java 97c238ce30142a94a1fd9c6c7055fa95f2512cce 
>   src/test/java/org/apache/aurora/scheduler/scheduling/FirstFitOfferSelectorTest.java PRE-CREATION 
>   src/test/java/org/apache/aurora/scheduler/scheduling/TaskSchedulerImplTest.java 7a4525a190a662e82b9ba98346fae0b25a8ea673 
>   src/test/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerTest.java 58f9de2731633664f4140d785c3a6df0cde063b4 
>   src/test/java/org/apache/aurora/scheduler/stats/AsyncStatsModuleTest.java f8e802342e753ee6a23ba7e1c2ab5151b85cadb3 
> 
> 
> Diff: https://reviews.apache.org/r/63973/diff/5/
> 
> 
> Testing
> -------
> 
> Tests coming soon, but they should be relatively close to what we have now on master since we don't really add/remove features but just move them around.
> 
> Ran some benchmarks as well to ensure performance parity:
> 
> ```
> MASTER
> Benchmark                                                                      Mode  Cnt       Score       Error  Units
> SchedulingBenchmarks.ClusterFullUtilizationBenchmark.runBenchmark             thrpt   10  113910.922 ± 26263.903  ops/s
> SchedulingBenchmarks.FillClusterBenchmark.runBenchmark                        thrpt   10     263.043 ±   299.686  ops/s
> SchedulingBenchmarks.InsufficientResourcesSchedulingBenchmark.runBenchmark    thrpt   10   12353.669 ±   433.182  ops/s
> SchedulingBenchmarks.LimitConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10     893.263 ±    54.882  ops/s
> SchedulingBenchmarks.ValueConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10   11478.420 ±  1068.819  ops/s
> ```
> and
> ```
> MY PATCH
> Benchmark                                                                      Mode  Cnt       Score       Error  Units
> SchedulingBenchmarks.ClusterFullUtilizationBenchmark.runBenchmark             thrpt   10  124041.966 ± 33331.424  ops/s
> SchedulingBenchmarks.FillClusterBenchmark.runBenchmark                        thrpt   10    1030.434 ±  1223.539  ops/s
> SchedulingBenchmarks.InsufficientResourcesSchedulingBenchmark.runBenchmark    thrpt   10   12305.154 ±   375.814  ops/s
> SchedulingBenchmarks.LimitConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10    1080.267 ±    74.635  ops/s
> SchedulingBenchmarks.ValueConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10   11604.642 ±   586.248  ops/s
> ```
> 
> Not exactly sure why `FillClusterBenchmark` increased so dramatically -- I will look into that while testing as well.
> 
> 
> Thanks,
> 
> Jordan Ly
> 
>


Re: Review Request 63973: Enable custom offer scoring modules for task assignment

Posted by Jordan Ly <jo...@gmail.com>.
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/63973/#review191984
-----------------------------------------------------------



@ReviewBot retry

- Jordan Ly


On Nov. 27, 2017, 7:41 p.m., Jordan Ly wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/63973/
> -----------------------------------------------------------
> 
> (Updated Nov. 27, 2017, 7:41 p.m.)
> 
> 
> Review request for Aurora, David McLaughlin, Santhosh Kumar Shanmugham, Stephan Erb, and Bill Farner.
> 
> 
> Repository: aurora
> 
> 
> Description
> -------
> 
> Major portions of the refactor:
> 
> * Refactor `OfferManager` to do filtering of offers (added `getMatching` and `getAllMatching` methods) as opposed to TaskAssigner
> * Refactor `TaskAssigner`, allow for injection of custom "scoring" class through `OfferRanker` interface
> 
> And some minor things as well:
> 
> * Moved `TaskAssignerImpl`, `TaskSchedulerImpl`, and `HostOffers` into their own upper-level classes
> * Moved `TaskAssigner` to the `scheduling` package and out of the `state` package
> * Renamed some methods in `OfferManager` to avoid code stutter
> * Renaming of some classes (e.g. `FirstFitTaskAssigner` -> `TaskAssignerImpl`)
> * And a slew of others
> 
> Overall, the goal of this refactor is to allow for the easy injection of custom offer "scoring" modules via the `OfferRanker` interface. Callers will not have to replace the entire `TaskAssigner` module, but instead just provide a function that chooses from a list of offers that should already fit the task.
> 
> Going through this review, I would start with the `maybeAssign`/`launchUsingOffer` methods in `TaskAssigner`. Then, I would look at `getMatching`/`getAllMatching` in `HostOffers`.
> 
> 
> Diffs
> -----
> 
>   RELEASE-NOTES.md e622a8d38425a99c2965d64147fa0e680e5de517 
>   docs/reference/scheduler-configuration.md 6c385b5be2b64117989c624ce93c78609cfea6c5 
>   src/jmh/java/org/apache/aurora/benchmark/Offers.java 2b463267af6e7ae7fa16736de3b1e3d7d5bd99a8 
>   src/jmh/java/org/apache/aurora/benchmark/SchedulingBenchmarks.java 1708a5063afd12de5d2138e763a19d1cf8dc9714 
>   src/jmh/java/org/apache/aurora/benchmark/fakes/FakeOfferManager.java 201aa81db7f607a70c7d44011857576f45b7e9da 
>   src/main/java/org/apache/aurora/scheduler/app/AppModule.java 3204cca5446d0f798ace622d334473bf6db13733 
>   src/main/java/org/apache/aurora/scheduler/config/CliOptions.java d4537e386af53ec9bff661ed23d61a5bd4893edf 
>   src/main/java/org/apache/aurora/scheduler/filter/AttributeAggregate.java 60f141d34d862f200ae1346a38a71bba57551059 
>   src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilter.java 36608a9f027c95723c31f9915852112beb367223 
>   src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilterImpl.java df51d4cf4893899613683603ab4aa9aefa88faa6 
>   src/main/java/org/apache/aurora/scheduler/http/Offers.java f22ca6e5402d8ec7241376de14a9051ab0cfbfc6 
>   src/main/java/org/apache/aurora/scheduler/mesos/MesosCallbackHandler.java fd5874d51cfbca1b98d15623a9c845d208d43b1f 
>   src/main/java/org/apache/aurora/scheduler/offers/HostOffers.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferManager.java 96b0f46e69255944fa0f00621db315e22d68515c 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferManagerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferSettings.java 57fc1a18f1b82decc780ba0069ab4dd0c125f77d 
>   src/main/java/org/apache/aurora/scheduler/offers/OffersModule.java 4a6ea8dac97ed2f5df47e4d16fa65a3b516988bd 
>   src/main/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessor.java 766d3b24fd64de96b82d3dd2a17f7a80331889d8 
>   src/main/java/org/apache/aurora/scheduler/preemptor/Preemptor.java 82a0ff67e9f70fed305f8f1bf38e3cf7955b9ce7 
>   src/main/java/org/apache/aurora/scheduler/scheduling/FirstFitOfferSelector.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/OfferSelector.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/SchedulingModule.java 0796712a00e3cba595ceb049833933b9a70c2f9a 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssigner.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssignerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssignerImplModule.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskScheduler.java 0002b0ceb429a404ac9dd0ae7e5ea9f6362fa100 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskSchedulerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerModule.java dc244eeaa0d292a06d8750cb340fb379701ad49f 
>   src/main/java/org/apache/aurora/scheduler/state/StateModule.java b7a3c0be592c13181edf2e8c241a2ad351962e06 
>   src/main/java/org/apache/aurora/scheduler/state/TaskAssigner.java cdd0d15872248b19d5eb52d25537f2f863fd5c77 
>   src/main/java/org/apache/aurora/scheduler/stats/AsyncStatsModule.java 6033c01477bec7a491128e3089ffc1b1c3f1c150 
>   src/test/java/org/apache/aurora/scheduler/config/CommandLineTest.java 0ec4de636e2fa0b671f8c1368e6d225747f215b6 
>   src/test/java/org/apache/aurora/scheduler/http/OffersTest.java 30699596a1c95199df7504f62c5c18cab1be1c6c 
>   src/test/java/org/apache/aurora/scheduler/mesos/MesosCallbackHandlerTest.java 45ae6bb5d12de66271a99aad0cda9632da22acea 
>   src/test/java/org/apache/aurora/scheduler/offers/OfferManagerImplTest.java 6b18296ffdd7e1a5e989236db967c5e752a8a55f 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessorTest.java c76b3e338298d63834b4265d769649d39b9ae219 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PreemptorImplTest.java f14cba144856b23531467a7b8a3fd695ad8beee8 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PreemptorModuleTest.java 97c238ce30142a94a1fd9c6c7055fa95f2512cce 
>   src/test/java/org/apache/aurora/scheduler/scheduling/FirstFitOfferSelectorTest.java PRE-CREATION 
>   src/test/java/org/apache/aurora/scheduler/scheduling/TaskSchedulerImplTest.java 7a4525a190a662e82b9ba98346fae0b25a8ea673 
>   src/test/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerTest.java 58f9de2731633664f4140d785c3a6df0cde063b4 
>   src/test/java/org/apache/aurora/scheduler/stats/AsyncStatsModuleTest.java f8e802342e753ee6a23ba7e1c2ab5151b85cadb3 
> 
> 
> Diff: https://reviews.apache.org/r/63973/diff/5/
> 
> 
> Testing
> -------
> 
> Ran some benchmarks as well to ensure performance parity:
> 
> ```
> MASTER
> Benchmark                                                                      Mode  Cnt       Score       Error  Units
> SchedulingBenchmarks.ClusterFullUtilizationBenchmark.runBenchmark             thrpt   10  138060.371 ± 17807.792  ops/s
> SchedulingBenchmarks.FillClusterBenchmark.runBenchmark                        thrpt   10     847.428 ±  1144.232  ops/s
> SchedulingBenchmarks.InsufficientResourcesSchedulingBenchmark.runBenchmark    thrpt   10   12484.444 ±  1788.357  ops/s
> SchedulingBenchmarks.LimitConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10     905.377 ±   356.045  ops/s
> SchedulingBenchmarks.ValueConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10   11973.847 ±  1703.385  ops/s
> ```
> and
> ```
> MY PATCH
> Benchmark                                                                      Mode  Cnt       Score       Error  Units
> SchedulingBenchmarks.ClusterFullUtilizationBenchmark.runBenchmark             thrpt   10  124041.966 ± 33331.424  ops/s
> SchedulingBenchmarks.FillClusterBenchmark.runBenchmark                        thrpt   10    1030.434 ±  1223.539  ops/s
> SchedulingBenchmarks.InsufficientResourcesSchedulingBenchmark.runBenchmark    thrpt   10   12305.154 ±   375.814  ops/s
> SchedulingBenchmarks.LimitConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10    1080.267 ±    74.635  ops/s
> SchedulingBenchmarks.ValueConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10   11604.642 ±   586.248  ops/s
> ```
> 
> Edit 11/27: reran master and got similar benchmarks. Probably a difference in environment caused the original disparity.
> 
> 
> Thanks,
> 
> Jordan Ly
> 
>


Re: Review Request 63973: Enable custom offer scoring modules for task assignment

Posted by Aurora ReviewBot <wf...@apache.org>.
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/63973/#review191993
-----------------------------------------------------------



Master (21af250) is green with this patch.
  ./build-support/jenkins/build.sh

However, it appears that it might lack test coverage.

I will refresh this build result if you post a review containing "@ReviewBot retry"

- Aurora ReviewBot


On Nov. 27, 2017, 7:41 p.m., Jordan Ly wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/63973/
> -----------------------------------------------------------
> 
> (Updated Nov. 27, 2017, 7:41 p.m.)
> 
> 
> Review request for Aurora, David McLaughlin, Santhosh Kumar Shanmugham, Stephan Erb, and Bill Farner.
> 
> 
> Repository: aurora
> 
> 
> Description
> -------
> 
> Major portions of the refactor:
> 
> * Refactor `OfferManager` to do filtering of offers (added `getMatching` and `getAllMatching` methods) as opposed to TaskAssigner
> * Refactor `TaskAssigner`, allow for injection of custom "scoring" class through `OfferRanker` interface
> 
> And some minor things as well:
> 
> * Moved `TaskAssignerImpl`, `TaskSchedulerImpl`, and `HostOffers` into their own upper-level classes
> * Moved `TaskAssigner` to the `scheduling` package and out of the `state` package
> * Renamed some methods in `OfferManager` to avoid code stutter
> * Renaming of some classes (e.g. `FirstFitTaskAssigner` -> `TaskAssignerImpl`)
> * And a slew of others
> 
> Overall, the goal of this refactor is to allow for the easy injection of custom offer "scoring" modules via the `OfferRanker` interface. Callers will not have to replace the entire `TaskAssigner` module, but instead just provide a function that chooses from a list of offers that should already fit the task.
> 
> Going through this review, I would start with the `maybeAssign`/`launchUsingOffer` methods in `TaskAssigner`. Then, I would look at `getMatching`/`getAllMatching` in `HostOffers`.
> 
> 
> Diffs
> -----
> 
>   RELEASE-NOTES.md e622a8d38425a99c2965d64147fa0e680e5de517 
>   docs/reference/scheduler-configuration.md 6c385b5be2b64117989c624ce93c78609cfea6c5 
>   src/jmh/java/org/apache/aurora/benchmark/Offers.java 2b463267af6e7ae7fa16736de3b1e3d7d5bd99a8 
>   src/jmh/java/org/apache/aurora/benchmark/SchedulingBenchmarks.java 1708a5063afd12de5d2138e763a19d1cf8dc9714 
>   src/jmh/java/org/apache/aurora/benchmark/fakes/FakeOfferManager.java 201aa81db7f607a70c7d44011857576f45b7e9da 
>   src/main/java/org/apache/aurora/scheduler/app/AppModule.java 3204cca5446d0f798ace622d334473bf6db13733 
>   src/main/java/org/apache/aurora/scheduler/config/CliOptions.java d4537e386af53ec9bff661ed23d61a5bd4893edf 
>   src/main/java/org/apache/aurora/scheduler/filter/AttributeAggregate.java 60f141d34d862f200ae1346a38a71bba57551059 
>   src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilter.java 36608a9f027c95723c31f9915852112beb367223 
>   src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilterImpl.java df51d4cf4893899613683603ab4aa9aefa88faa6 
>   src/main/java/org/apache/aurora/scheduler/http/Offers.java f22ca6e5402d8ec7241376de14a9051ab0cfbfc6 
>   src/main/java/org/apache/aurora/scheduler/mesos/MesosCallbackHandler.java fd5874d51cfbca1b98d15623a9c845d208d43b1f 
>   src/main/java/org/apache/aurora/scheduler/offers/HostOffers.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferManager.java 96b0f46e69255944fa0f00621db315e22d68515c 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferManagerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferSettings.java 57fc1a18f1b82decc780ba0069ab4dd0c125f77d 
>   src/main/java/org/apache/aurora/scheduler/offers/OffersModule.java 4a6ea8dac97ed2f5df47e4d16fa65a3b516988bd 
>   src/main/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessor.java 766d3b24fd64de96b82d3dd2a17f7a80331889d8 
>   src/main/java/org/apache/aurora/scheduler/preemptor/Preemptor.java 82a0ff67e9f70fed305f8f1bf38e3cf7955b9ce7 
>   src/main/java/org/apache/aurora/scheduler/scheduling/FirstFitOfferSelector.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/OfferSelector.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/SchedulingModule.java 0796712a00e3cba595ceb049833933b9a70c2f9a 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssigner.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssignerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssignerImplModule.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskScheduler.java 0002b0ceb429a404ac9dd0ae7e5ea9f6362fa100 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskSchedulerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerModule.java dc244eeaa0d292a06d8750cb340fb379701ad49f 
>   src/main/java/org/apache/aurora/scheduler/state/StateModule.java b7a3c0be592c13181edf2e8c241a2ad351962e06 
>   src/main/java/org/apache/aurora/scheduler/state/TaskAssigner.java cdd0d15872248b19d5eb52d25537f2f863fd5c77 
>   src/main/java/org/apache/aurora/scheduler/stats/AsyncStatsModule.java 6033c01477bec7a491128e3089ffc1b1c3f1c150 
>   src/test/java/org/apache/aurora/scheduler/config/CommandLineTest.java 0ec4de636e2fa0b671f8c1368e6d225747f215b6 
>   src/test/java/org/apache/aurora/scheduler/http/OffersTest.java 30699596a1c95199df7504f62c5c18cab1be1c6c 
>   src/test/java/org/apache/aurora/scheduler/mesos/MesosCallbackHandlerTest.java 45ae6bb5d12de66271a99aad0cda9632da22acea 
>   src/test/java/org/apache/aurora/scheduler/offers/OfferManagerImplTest.java 6b18296ffdd7e1a5e989236db967c5e752a8a55f 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessorTest.java c76b3e338298d63834b4265d769649d39b9ae219 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PreemptorImplTest.java f14cba144856b23531467a7b8a3fd695ad8beee8 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PreemptorModuleTest.java 97c238ce30142a94a1fd9c6c7055fa95f2512cce 
>   src/test/java/org/apache/aurora/scheduler/scheduling/FirstFitOfferSelectorTest.java PRE-CREATION 
>   src/test/java/org/apache/aurora/scheduler/scheduling/TaskSchedulerImplTest.java 7a4525a190a662e82b9ba98346fae0b25a8ea673 
>   src/test/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerTest.java 58f9de2731633664f4140d785c3a6df0cde063b4 
>   src/test/java/org/apache/aurora/scheduler/stats/AsyncStatsModuleTest.java f8e802342e753ee6a23ba7e1c2ab5151b85cadb3 
> 
> 
> Diff: https://reviews.apache.org/r/63973/diff/5/
> 
> 
> Testing
> -------
> 
> Ran some benchmarks as well to ensure performance parity:
> 
> ```
> MASTER
> Benchmark                                                                      Mode  Cnt       Score       Error  Units
> SchedulingBenchmarks.ClusterFullUtilizationBenchmark.runBenchmark             thrpt   10  138060.371 ± 17807.792  ops/s
> SchedulingBenchmarks.FillClusterBenchmark.runBenchmark                        thrpt   10     847.428 ±  1144.232  ops/s
> SchedulingBenchmarks.InsufficientResourcesSchedulingBenchmark.runBenchmark    thrpt   10   12484.444 ±  1788.357  ops/s
> SchedulingBenchmarks.LimitConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10     905.377 ±   356.045  ops/s
> SchedulingBenchmarks.ValueConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10   11973.847 ±  1703.385  ops/s
> ```
> and
> ```
> MY PATCH
> Benchmark                                                                      Mode  Cnt       Score       Error  Units
> SchedulingBenchmarks.ClusterFullUtilizationBenchmark.runBenchmark             thrpt   10  124041.966 ± 33331.424  ops/s
> SchedulingBenchmarks.FillClusterBenchmark.runBenchmark                        thrpt   10    1030.434 ±  1223.539  ops/s
> SchedulingBenchmarks.InsufficientResourcesSchedulingBenchmark.runBenchmark    thrpt   10   12305.154 ±   375.814  ops/s
> SchedulingBenchmarks.LimitConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10    1080.267 ±    74.635  ops/s
> SchedulingBenchmarks.ValueConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10   11604.642 ±   586.248  ops/s
> ```
> 
> Edit 11/27: reran master and got similar benchmarks. Probably a difference in environment caused the original disparity.
> 
> 
> Thanks,
> 
> Jordan Ly
> 
>


Re: Review Request 63973: Enable custom offer scoring modules for task assignment

Posted by Jordan Ly <jo...@gmail.com>.
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/63973/#review191940
-----------------------------------------------------------



@ReviewBot retry

- Jordan Ly


On Nov. 27, 2017, 7:41 p.m., Jordan Ly wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/63973/
> -----------------------------------------------------------
> 
> (Updated Nov. 27, 2017, 7:41 p.m.)
> 
> 
> Review request for Aurora, David McLaughlin, Santhosh Kumar Shanmugham, Stephan Erb, and Bill Farner.
> 
> 
> Repository: aurora
> 
> 
> Description
> -------
> 
> Major portions of the refactor:
> 
> * Refactor `OfferManager` to do filtering of offers (added `getMatching` and `getAllMatching` methods) as opposed to TaskAssigner
> * Refactor `TaskAssigner`, allow for injection of custom "scoring" class through `OfferRanker` interface
> 
> And some minor things as well:
> 
> * Moved `TaskAssignerImpl`, `TaskSchedulerImpl`, and `HostOffers` into their own upper-level classes
> * Moved `TaskAssigner` to the `scheduling` package and out of the `state` package
> * Renamed some methods in `OfferManager` to avoid code stutter
> * Renaming of some classes (e.g. `FirstFitTaskAssigner` -> `TaskAssignerImpl`)
> * And a slew of others
> 
> Overall, the goal of this refactor is to allow for the easy injection of custom offer "scoring" modules via the `OfferRanker` interface. Callers will not have to replace the entire `TaskAssigner` module, but instead just provide a function that chooses from a list of offers that should already fit the task.
> 
> Going through this review, I would start with the `maybeAssign`/`launchUsingOffer` methods in `TaskAssigner`. Then, I would look at `getMatching`/`getAllMatching` in `HostOffers`.
> 
> 
> Diffs
> -----
> 
>   RELEASE-NOTES.md e622a8d38425a99c2965d64147fa0e680e5de517 
>   docs/reference/scheduler-configuration.md 6c385b5be2b64117989c624ce93c78609cfea6c5 
>   src/jmh/java/org/apache/aurora/benchmark/Offers.java 2b463267af6e7ae7fa16736de3b1e3d7d5bd99a8 
>   src/jmh/java/org/apache/aurora/benchmark/SchedulingBenchmarks.java 1708a5063afd12de5d2138e763a19d1cf8dc9714 
>   src/jmh/java/org/apache/aurora/benchmark/fakes/FakeOfferManager.java 201aa81db7f607a70c7d44011857576f45b7e9da 
>   src/main/java/org/apache/aurora/scheduler/app/AppModule.java 3204cca5446d0f798ace622d334473bf6db13733 
>   src/main/java/org/apache/aurora/scheduler/config/CliOptions.java d4537e386af53ec9bff661ed23d61a5bd4893edf 
>   src/main/java/org/apache/aurora/scheduler/filter/AttributeAggregate.java 60f141d34d862f200ae1346a38a71bba57551059 
>   src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilter.java 36608a9f027c95723c31f9915852112beb367223 
>   src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilterImpl.java df51d4cf4893899613683603ab4aa9aefa88faa6 
>   src/main/java/org/apache/aurora/scheduler/http/Offers.java f22ca6e5402d8ec7241376de14a9051ab0cfbfc6 
>   src/main/java/org/apache/aurora/scheduler/mesos/MesosCallbackHandler.java fd5874d51cfbca1b98d15623a9c845d208d43b1f 
>   src/main/java/org/apache/aurora/scheduler/offers/HostOffers.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferManager.java 96b0f46e69255944fa0f00621db315e22d68515c 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferManagerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferSettings.java 57fc1a18f1b82decc780ba0069ab4dd0c125f77d 
>   src/main/java/org/apache/aurora/scheduler/offers/OffersModule.java 4a6ea8dac97ed2f5df47e4d16fa65a3b516988bd 
>   src/main/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessor.java 766d3b24fd64de96b82d3dd2a17f7a80331889d8 
>   src/main/java/org/apache/aurora/scheduler/preemptor/Preemptor.java 82a0ff67e9f70fed305f8f1bf38e3cf7955b9ce7 
>   src/main/java/org/apache/aurora/scheduler/scheduling/FirstFitOfferSelector.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/OfferSelector.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/SchedulingModule.java 0796712a00e3cba595ceb049833933b9a70c2f9a 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssigner.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssignerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssignerImplModule.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskScheduler.java 0002b0ceb429a404ac9dd0ae7e5ea9f6362fa100 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskSchedulerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerModule.java dc244eeaa0d292a06d8750cb340fb379701ad49f 
>   src/main/java/org/apache/aurora/scheduler/state/StateModule.java b7a3c0be592c13181edf2e8c241a2ad351962e06 
>   src/main/java/org/apache/aurora/scheduler/state/TaskAssigner.java cdd0d15872248b19d5eb52d25537f2f863fd5c77 
>   src/main/java/org/apache/aurora/scheduler/stats/AsyncStatsModule.java 6033c01477bec7a491128e3089ffc1b1c3f1c150 
>   src/test/java/org/apache/aurora/scheduler/config/CommandLineTest.java 0ec4de636e2fa0b671f8c1368e6d225747f215b6 
>   src/test/java/org/apache/aurora/scheduler/http/OffersTest.java 30699596a1c95199df7504f62c5c18cab1be1c6c 
>   src/test/java/org/apache/aurora/scheduler/mesos/MesosCallbackHandlerTest.java 45ae6bb5d12de66271a99aad0cda9632da22acea 
>   src/test/java/org/apache/aurora/scheduler/offers/OfferManagerImplTest.java 6b18296ffdd7e1a5e989236db967c5e752a8a55f 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessorTest.java c76b3e338298d63834b4265d769649d39b9ae219 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PreemptorImplTest.java f14cba144856b23531467a7b8a3fd695ad8beee8 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PreemptorModuleTest.java 97c238ce30142a94a1fd9c6c7055fa95f2512cce 
>   src/test/java/org/apache/aurora/scheduler/scheduling/FirstFitOfferSelectorTest.java PRE-CREATION 
>   src/test/java/org/apache/aurora/scheduler/scheduling/TaskSchedulerImplTest.java 7a4525a190a662e82b9ba98346fae0b25a8ea673 
>   src/test/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerTest.java 58f9de2731633664f4140d785c3a6df0cde063b4 
>   src/test/java/org/apache/aurora/scheduler/stats/AsyncStatsModuleTest.java f8e802342e753ee6a23ba7e1c2ab5151b85cadb3 
> 
> 
> Diff: https://reviews.apache.org/r/63973/diff/5/
> 
> 
> Testing
> -------
> 
> Tests coming soon, but they should be relatively close to what we have now on master since we don't really add/remove features but just move them around.
> 
> Ran some benchmarks as well to ensure performance parity:
> 
> ```
> MASTER
> Benchmark                                                                      Mode  Cnt       Score       Error  Units
> SchedulingBenchmarks.ClusterFullUtilizationBenchmark.runBenchmark             thrpt   10  113910.922 ± 26263.903  ops/s
> SchedulingBenchmarks.FillClusterBenchmark.runBenchmark                        thrpt   10     263.043 ±   299.686  ops/s
> SchedulingBenchmarks.InsufficientResourcesSchedulingBenchmark.runBenchmark    thrpt   10   12353.669 ±   433.182  ops/s
> SchedulingBenchmarks.LimitConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10     893.263 ±    54.882  ops/s
> SchedulingBenchmarks.ValueConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10   11478.420 ±  1068.819  ops/s
> ```
> and
> ```
> MY PATCH
> Benchmark                                                                      Mode  Cnt       Score       Error  Units
> SchedulingBenchmarks.ClusterFullUtilizationBenchmark.runBenchmark             thrpt   10  124041.966 ± 33331.424  ops/s
> SchedulingBenchmarks.FillClusterBenchmark.runBenchmark                        thrpt   10    1030.434 ±  1223.539  ops/s
> SchedulingBenchmarks.InsufficientResourcesSchedulingBenchmark.runBenchmark    thrpt   10   12305.154 ±   375.814  ops/s
> SchedulingBenchmarks.LimitConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10    1080.267 ±    74.635  ops/s
> SchedulingBenchmarks.ValueConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10   11604.642 ±   586.248  ops/s
> ```
> 
> Not exactly sure why `FillClusterBenchmark` increased so dramatically -- I will look into that while testing as well.
> 
> 
> Thanks,
> 
> Jordan Ly
> 
>


Re: Review Request 63973: Enable custom offer scoring modules for task assignment

Posted by David McLaughlin <da...@dmclaughlin.com>.
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/63973/#review191992
-----------------------------------------------------------


Ship it!




Ship It!

- David McLaughlin


On Nov. 27, 2017, 7:41 p.m., Jordan Ly wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/63973/
> -----------------------------------------------------------
> 
> (Updated Nov. 27, 2017, 7:41 p.m.)
> 
> 
> Review request for Aurora, David McLaughlin, Santhosh Kumar Shanmugham, Stephan Erb, and Bill Farner.
> 
> 
> Repository: aurora
> 
> 
> Description
> -------
> 
> Major portions of the refactor:
> 
> * Refactor `OfferManager` to do filtering of offers (added `getMatching` and `getAllMatching` methods) as opposed to TaskAssigner
> * Refactor `TaskAssigner`, allow for injection of custom "scoring" class through `OfferRanker` interface
> 
> And some minor things as well:
> 
> * Moved `TaskAssignerImpl`, `TaskSchedulerImpl`, and `HostOffers` into their own upper-level classes
> * Moved `TaskAssigner` to the `scheduling` package and out of the `state` package
> * Renamed some methods in `OfferManager` to avoid code stutter
> * Renaming of some classes (e.g. `FirstFitTaskAssigner` -> `TaskAssignerImpl`)
> * And a slew of others
> 
> Overall, the goal of this refactor is to allow for the easy injection of custom offer "scoring" modules via the `OfferRanker` interface. Callers will not have to replace the entire `TaskAssigner` module, but instead just provide a function that chooses from a list of offers that should already fit the task.
> 
> Going through this review, I would start with the `maybeAssign`/`launchUsingOffer` methods in `TaskAssigner`. Then, I would look at `getMatching`/`getAllMatching` in `HostOffers`.
> 
> 
> Diffs
> -----
> 
>   RELEASE-NOTES.md e622a8d38425a99c2965d64147fa0e680e5de517 
>   docs/reference/scheduler-configuration.md 6c385b5be2b64117989c624ce93c78609cfea6c5 
>   src/jmh/java/org/apache/aurora/benchmark/Offers.java 2b463267af6e7ae7fa16736de3b1e3d7d5bd99a8 
>   src/jmh/java/org/apache/aurora/benchmark/SchedulingBenchmarks.java 1708a5063afd12de5d2138e763a19d1cf8dc9714 
>   src/jmh/java/org/apache/aurora/benchmark/fakes/FakeOfferManager.java 201aa81db7f607a70c7d44011857576f45b7e9da 
>   src/main/java/org/apache/aurora/scheduler/app/AppModule.java 3204cca5446d0f798ace622d334473bf6db13733 
>   src/main/java/org/apache/aurora/scheduler/config/CliOptions.java d4537e386af53ec9bff661ed23d61a5bd4893edf 
>   src/main/java/org/apache/aurora/scheduler/filter/AttributeAggregate.java 60f141d34d862f200ae1346a38a71bba57551059 
>   src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilter.java 36608a9f027c95723c31f9915852112beb367223 
>   src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilterImpl.java df51d4cf4893899613683603ab4aa9aefa88faa6 
>   src/main/java/org/apache/aurora/scheduler/http/Offers.java f22ca6e5402d8ec7241376de14a9051ab0cfbfc6 
>   src/main/java/org/apache/aurora/scheduler/mesos/MesosCallbackHandler.java fd5874d51cfbca1b98d15623a9c845d208d43b1f 
>   src/main/java/org/apache/aurora/scheduler/offers/HostOffers.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferManager.java 96b0f46e69255944fa0f00621db315e22d68515c 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferManagerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferSettings.java 57fc1a18f1b82decc780ba0069ab4dd0c125f77d 
>   src/main/java/org/apache/aurora/scheduler/offers/OffersModule.java 4a6ea8dac97ed2f5df47e4d16fa65a3b516988bd 
>   src/main/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessor.java 766d3b24fd64de96b82d3dd2a17f7a80331889d8 
>   src/main/java/org/apache/aurora/scheduler/preemptor/Preemptor.java 82a0ff67e9f70fed305f8f1bf38e3cf7955b9ce7 
>   src/main/java/org/apache/aurora/scheduler/scheduling/FirstFitOfferSelector.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/OfferSelector.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/SchedulingModule.java 0796712a00e3cba595ceb049833933b9a70c2f9a 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssigner.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssignerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssignerImplModule.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskScheduler.java 0002b0ceb429a404ac9dd0ae7e5ea9f6362fa100 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskSchedulerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerModule.java dc244eeaa0d292a06d8750cb340fb379701ad49f 
>   src/main/java/org/apache/aurora/scheduler/state/StateModule.java b7a3c0be592c13181edf2e8c241a2ad351962e06 
>   src/main/java/org/apache/aurora/scheduler/state/TaskAssigner.java cdd0d15872248b19d5eb52d25537f2f863fd5c77 
>   src/main/java/org/apache/aurora/scheduler/stats/AsyncStatsModule.java 6033c01477bec7a491128e3089ffc1b1c3f1c150 
>   src/test/java/org/apache/aurora/scheduler/config/CommandLineTest.java 0ec4de636e2fa0b671f8c1368e6d225747f215b6 
>   src/test/java/org/apache/aurora/scheduler/http/OffersTest.java 30699596a1c95199df7504f62c5c18cab1be1c6c 
>   src/test/java/org/apache/aurora/scheduler/mesos/MesosCallbackHandlerTest.java 45ae6bb5d12de66271a99aad0cda9632da22acea 
>   src/test/java/org/apache/aurora/scheduler/offers/OfferManagerImplTest.java 6b18296ffdd7e1a5e989236db967c5e752a8a55f 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessorTest.java c76b3e338298d63834b4265d769649d39b9ae219 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PreemptorImplTest.java f14cba144856b23531467a7b8a3fd695ad8beee8 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PreemptorModuleTest.java 97c238ce30142a94a1fd9c6c7055fa95f2512cce 
>   src/test/java/org/apache/aurora/scheduler/scheduling/FirstFitOfferSelectorTest.java PRE-CREATION 
>   src/test/java/org/apache/aurora/scheduler/scheduling/TaskSchedulerImplTest.java 7a4525a190a662e82b9ba98346fae0b25a8ea673 
>   src/test/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerTest.java 58f9de2731633664f4140d785c3a6df0cde063b4 
>   src/test/java/org/apache/aurora/scheduler/stats/AsyncStatsModuleTest.java f8e802342e753ee6a23ba7e1c2ab5151b85cadb3 
> 
> 
> Diff: https://reviews.apache.org/r/63973/diff/5/
> 
> 
> Testing
> -------
> 
> Ran some benchmarks as well to ensure performance parity:
> 
> ```
> MASTER
> Benchmark                                                                      Mode  Cnt       Score       Error  Units
> SchedulingBenchmarks.ClusterFullUtilizationBenchmark.runBenchmark             thrpt   10  138060.371 ± 17807.792  ops/s
> SchedulingBenchmarks.FillClusterBenchmark.runBenchmark                        thrpt   10     847.428 ±  1144.232  ops/s
> SchedulingBenchmarks.InsufficientResourcesSchedulingBenchmark.runBenchmark    thrpt   10   12484.444 ±  1788.357  ops/s
> SchedulingBenchmarks.LimitConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10     905.377 ±   356.045  ops/s
> SchedulingBenchmarks.ValueConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10   11973.847 ±  1703.385  ops/s
> ```
> and
> ```
> MY PATCH
> Benchmark                                                                      Mode  Cnt       Score       Error  Units
> SchedulingBenchmarks.ClusterFullUtilizationBenchmark.runBenchmark             thrpt   10  124041.966 ± 33331.424  ops/s
> SchedulingBenchmarks.FillClusterBenchmark.runBenchmark                        thrpt   10    1030.434 ±  1223.539  ops/s
> SchedulingBenchmarks.InsufficientResourcesSchedulingBenchmark.runBenchmark    thrpt   10   12305.154 ±   375.814  ops/s
> SchedulingBenchmarks.LimitConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10    1080.267 ±    74.635  ops/s
> SchedulingBenchmarks.ValueConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10   11604.642 ±   586.248  ops/s
> ```
> 
> Edit 11/27: reran master and got similar benchmarks. Probably a difference in environment caused the original disparity.
> 
> 
> Thanks,
> 
> Jordan Ly
> 
>


Re: Review Request 63973: Enable custom offer scoring modules for task assignment

Posted by Aurora ReviewBot <wf...@apache.org>.
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/63973/#review191956
-----------------------------------------------------------



Master (0f3dc93) is red with this patch.
  ./build-support/jenkins/build.sh

Done with analysis
:spotbugsTest

Scanning archives (0 / 436)
Scanning archives (1 / 436)
Scanning archives (2 / 436)
Scanning archives (3 / 436)
Scanning archives (4 / 436)
Scanning archives (5 / 436)
Scanning archives (6 / 436)
Scanning archives (7 / 436)
Scanning archives (8 / 436)
Scanning archives (9 / 436)
Scanning archives (10 / 436)
Scanning archives (11 / 436)
Scanning archives (12 / 436)
Scanning archives (13 / 436)
Scanning archives (14 / 436)
Scanning archives (15 / 436)
Scanning archives (16 / 436)
Scanning archives (17 / 436)
Scanning archives (18 / 436)
Scanning archives (19 / 436)
Scanning archives (20 / 436)
Scanning archives (21 / 436)
Scanning archives (22 / 436)
Scanning archives (23 / 436)
Scanning archives (24 / 436)
Scanning archives (25 / 436)
Scanning archives (26 / 436)
Scanning archives (27 / 436)
Scanning archives (28 / 436)
Scanning archives (29 / 436)
Scanning archives (30 / 436)
Scanning archives (31 / 436)
Scanning archives (32 / 436)
Scanning archives (33 / 436)
Scanning archives (34 / 436)
Scanning archives (35 / 436)
Scanning archives (36 / 436)
Scanning archives (37 / 436)
Scanning archives (38 / 436)
Scanning archives (39 / 436)
Scanning archives (40 / 436)
Scanning archives (41 / 436)
Scanning archives (42 / 436)
Scanning archives (43 / 436)
Scanning archives (44 / 436)
Scanning archives (45 / 436)
Scanning archives (46 / 436)
Scanning archives (47 / 436)
Scanning archives (48 / 436)
Scanning archives (49 / 436)
Scanning archives (50 / 436)
Scanning archives (51 / 436)
Scanning archives (52 / 436)
Scanning archives (53 / 436)
Scanning archives (54 / 436)
Scanning archives (55 / 436)
Scanning archives (56 / 436)
Scanning archives (57 / 436)
Scanning archives (58 / 436)
Scanning archives (59 / 436)
Scanning archives (60 / 436)
Scanning archives (61 / 436)
Scanning archives (62 / 436)
Scanning archives (63 / 436)
Scanning archives (64 / 436)
Scanning archives (65 / 436)
Scanning archives (66 / 436)
Scanning archives (67 / 436)
Scanning archives (68 / 436)
Scanning archives (69 / 436)
Scanning archives (70 / 436)
Scanning archives (71 / 436)
Scanning archives (72 / 436)
Scanning archives (73 / 436)
Scanning archives (74 / 436)
Scanning archives (75 / 436)
Scanning archives (76 / 436)
Scanning archives (77 / 436)
Scanning archives (78 / 436)
Scanning archives (79 / 436)
Scanning archives (80 / 436)
Scanning archives (81 / 436)
Scanning archives (82 / 436)
Scanning archives (83 / 436)
Scanning archives (84 / 436)
Scanning archives (85 / 436)
Scanning archives (86 / 436)
Scanning archives (87 / 436)
Scanning archives (88 / 436)
Scanning archives (89 / 436)
Scanning archives (90 / 436)
Scanning archives (91 / 436)
Scanning archives (92 / 436)
Scanning archives (93 / 436)
Scanning archives (94 / 436)
Scanning archives (95 / 436)
Scanning archives (96 / 436)
Scanning archives (97 / 436)
Scanning archives (98 / 436)
Scanning archives (99 / 436)
Scanning archives (100 / 436)
Scanning archives (101 / 436)
Scanning archives (102 / 436)
Scanning archives (103 / 436)
Scanning archives (104 / 436)
Scanning archives (105 / 436)
Scanning archives (106 / 436)
Scanning archives (107 / 436)
Scanning archives (108 / 436)
Scanning archives (109 / 436)
Scanning archives (110 / 436)
Scanning archives (111 / 436)
Scanning archives (112 / 436)
Scanning archives (113 / 436)
Scanning archives (114 / 436)
Scanning archives (115 / 436)
Scanning archives (116 / 436)
Scanning archives (117 / 436)
Scanning archives (118 / 436)
Scanning archives (119 / 436)
Scanning archives (120 / 436)
Scanning archives (121 / 436)
Scanning archives (122 / 436)
Scanning archives (123 / 436)
Scanning archives (124 / 436)
Scanning archives (125 / 436)
Scanning archives (126 / 436)
Scanning archives (127 / 436)
Scanning archives (128 / 436)
Scanning archives (129 / 436)
Scanning archives (130 / 436)
Scanning archives (131 / 436)
Scanning archives (132 / 436)
Scanning archives (133 / 436)
Scanning archives (134 / 436)
Scanning archives (135 / 436)
Scanning archives (136 / 436)
Scanning archives (137 / 436)
Scanning archives (138 / 436)
Scanning archives (139 / 436)
Scanning archives (140 / 436)
Scanning archives (141 / 436)
Scanning archives (142 / 436)
Scanning archives (143 / 436)
Scanning archives (144 / 436)
Scanning archives (145 / 436)
Scanning archives (146 / 436)
Scanning archives (147 / 436)
Scanning archives (148 / 436)
Scanning archives (149 / 436)
Scanning archives (150 / 436)
Scanning archives (151 / 436)
Scanning archives (152 / 436)
Scanning archives (153 / 436)
Scanning archives (154 / 436)
Scanning archives (155 / 436)
Scanning archives (156 / 436)
Scanning archives (157 / 436)
Scanning archives (158 / 436)
Scanning archives (159 / 436)
Scanning archives (160 / 436)
Scanning archives (161 / 436)
Scanning archives (162 / 436)
Scanning archives (163 / 436)
Scanning archives (164 / 436)
Scanning archives (165 / 436)
Scanning archives (166 / 436)
Scanning archives (167 / 436)
Scanning archives (168 / 436)
Scanning archives (169 / 436)
Scanning archives (170 / 436)
Scanning archives (171 / 436)
Scanning archives (172 / 436)
Scanning archives (173 / 436)
Scanning archives (174 / 436)
Scanning archives (175 / 436)
Scanning archives (176 / 436)
Scanning archives (177 / 436)
Scanning archives (178 / 436)
Scanning archives (179 / 436)
Scanning archives (180 / 436)
Scanning archives (181 / 436)
Scanning archives (182 / 436)
Scanning archives (183 / 436)
Scanning archives (184 / 436)
Scanning archives (185 / 436)
Scanning archives (186 / 436)
Scanning archives (187 / 436)
Scanning archives (188 / 436)
Scanning archives (189 / 436)
Scanning archives (190 / 436)
Scanning archives (191 / 436)
Scanning archives (192 / 436)
Scanning archives (193 / 436)
Scanning archives (194 / 436)
Scanning archives (195 / 436)
Scanning archives (196 / 436)
Scanning archives (197 / 436)
Scanning archives (198 / 436)
Scanning archives (199 / 436)
Scanning archives (200 / 436)
Scanning archives (201 / 436)
Scanning archives (202 / 436)
Scanning archives (203 / 436)
Scanning archives (204 / 436)
Scanning archives (205 / 436)
Scanning archives (206 / 436)
Scanning archives (207 / 436)
Scanning archives (208 / 436)
Scanning archives (209 / 436)
Scanning archives (210 / 436)
Scanning archives (211 / 436)
Scanning archives (212 / 436)
Scanning archives (213 / 436)
Scanning archives (214 / 436)
Scanning archives (215 / 436)
Scanning archives (216 / 436)
Scanning archives (217 / 436)
Scanning archives (218 / 436)
Scanning archives (219 / 436)
Scanning archives (220 / 436)
Scanning archives (221 / 436)
Scanning archives (222 / 436)
Scanning archives (223 / 436)
Scanning archives (224 / 436)
Scanning archives (225 / 436)
Scanning archives (226 / 436)
Scanning archives (227 / 436)
Scanning archives (228 / 436)
Scanning archives (229 / 436)
Scanning archives (230 / 436)
Scanning archives (231 / 436)
Scanning archives (232 / 436)
Scanning archives (233 / 436)
Scanning archives (234 / 436)
Scanning archives (235 / 436)
Scanning archives (236 / 436)
Scanning archives (237 / 436)
Scanning archives (238 / 436)
Scanning archives (239 / 436)
Scanning archives (240 / 436)
Scanning archives (241 / 436)
Scanning archives (242 / 436)
Scanning archives (243 / 436)
Scanning archives (244 / 436)
Scanning archives (245 / 436)
Scanning archives (246 / 436)
Scanning archives (247 / 436)
Scanning archives (248 / 436)
Scanning archives (249 / 436)
Scanning archives (250 / 436)
Scanning archives (251 / 436)
Scanning archives (252 / 436)
Scanning archives (253 / 436)
Scanning archives (254 / 436)
Scanning archives (255 / 436)
Scanning archives (256 / 436)
Scanning archives (257 / 436)
Scanning archives (258 / 436)
Scanning archives (259 / 436)
Scanning archives (260 / 436)
Scanning archives (261 / 436)
Scanning archives (262 / 436)
Scanning archives (263 / 436)
Scanning archives (264 / 436)
Scanning archives (265 / 436)
Scanning archives (266 / 436)
Scanning archives (267 / 436)
Scanning archives (268 / 436)
Scanning archives (269 / 436)
Scanning archives (270 / 436)
Scanning archives (271 / 436)
Scanning archives (272 / 436)
Scanning archives (273 / 436)
Scanning archives (274 / 436)
Scanning archives (275 / 436)
Scanning archives (276 / 436)
Scanning archives (277 / 436)
Scanning archives (278 / 436)
Scanning archives (279 / 436)
Scanning archives (280 / 436)
Scanning archives (281 / 436)
Scanning archives (282 / 436)
Scanning archives (283 / 436)
Scanning archives (284 / 436)
Scanning archives (285 / 436)
Scanning archives (286 / 436)
Scanning archives (287 / 436)
Scanning archives (288 / 436)
Scanning archives (289 / 436)
Scanning archives (290 / 436)
Scanning archives (291 / 436)
Scanning archives (292 / 436)
Scanning archives (293 / 436)
Scanning archives (294 / 436)
Scanning archives (295 / 436)
Scanning archives (296 / 436)
Scanning archives (297 / 436)
Scanning archives (298 / 436)
Scanning archives (299 / 436)
Scanning archives (300 / 436)
Scanning archives (301 / 436)
Scanning archives (302 / 436)
Scanning archives (303 / 436)
Scanning archives (304 / 436)
Scanning archives (305 / 436)
Scanning archives (306 / 436)
Scanning archives (307 / 436)
Scanning archives (308 / 436)
Scanning archives (309 / 436)
Scanning archives (310 / 436)
Scanning archives (311 / 436)
Scanning archives (312 / 436)
Scanning archives (313 / 436)
Scanning archives (314 / 436)
Scanning archives (315 / 436)
Scanning archives (316 / 436)
Scanning archives (317 / 436)
Scanning archives (318 / 436)
Scanning archives (319 / 436)
Scanning archives (320 / 436)
Scanning archives (321 / 436)
Scanning archives (322 / 436)
Scanning archives (323 / 436)
Scanning archives (324 / 436)
Scanning archives (325 / 436)
Scanning archives (326 / 436)
Scanning archives (327 / 436)
Scanning archives (328 / 436)
Scanning archives (329 / 436)
Scanning archives (330 / 436)
Scanning archives (331 / 436)
Scanning archives (332 / 436)
Scanning archives (333 / 436)
Scanning archives (334 / 436)
Scanning archives (335 / 436)
Scanning archives (336 / 436)
Scanning archives (337 / 436)
Scanning archives (338 / 436)
Scanning archives (339 / 436)
Scanning archives (340 / 436)
Scanning archives (341 / 436)
Scanning archives (342 / 436)
Scanning archives (343 / 436)
Scanning archives (344 / 436)
Scanning archives (345 / 436)
Scanning archives (346 / 436)
Scanning archives (347 / 436)
Scanning archives (348 / 436)
Scanning archives (349 / 436)
Scanning archives (350 / 436)
Scanning archives (351 / 436)
Scanning archives (352 / 436)
Scanning archives (353 / 436)
Scanning archives (354 / 436)
Scanning archives (355 / 436)
Scanning archives (356 / 436)
Scanning archives (357 / 436)
Scanning archives (358 / 436)
Scanning archives (359 / 436)
Scanning archives (360 / 436)
Scanning archives (361 / 436)
Scanning archives (362 / 436)
Scanning archives (363 / 436)
Scanning archives (364 / 436)
Scanning archives (365 / 436)
Scanning archives (366 / 436)
Scanning archives (367 / 436)
Scanning archives (368 / 436)
Scanning archives (369 / 436)
Scanning archives (370 / 436)
Scanning archives (371 / 436)
Scanning archives (372 / 436)
Scanning archives (373 / 436)
Scanning archives (374 / 436)
Scanning archives (375 / 436)
Scanning archives (376 / 436)
Scanning archives (377 / 436)
Scanning archives (378 / 436)
Scanning archives (379 / 436)
Scanning archives (380 / 436)
Scanning archives (381 / 436)
Scanning archives (382 / 436)
Scanning archives (383 / 436)
Scanning archives (384 / 436)
Scanning archives (385 / 436)
Scanning archives (386 / 436)
Scanning archives (387 / 436)
Scanning archives (388 / 436)
Scanning archives (389 / 436)
Scanning archives (390 / 436)
Scanning archives (391 / 436)
Scanning archives (392 / 436)
Scanning archives (393 / 436)
Scanning archives (394 / 436)
Scanning archives (395 / 436)
Scanning archives (396 / 436)
Scanning archives (397 / 436)
Scanning archives (398 / 436)
Scanning archives (399 / 436)
Scanning archives (400 / 436)
Scanning archives (401 / 436)
Scanning archives (402 / 436)
Scanning archives (403 / 436)
Scanning archives (404 / 436)
Scanning archives (405 / 436)
Scanning archives (406 / 436)
Scanning archives (407 / 436)
Scanning archives (408 / 436)
Scanning archives (409 / 436)
Scanning archives (410 / 436)
Scanning archives (411 / 436)
Scanning archives (412 / 436)
Scanning archives (413 / 436)
Scanning archives (414 / 436)
Scanning archives (415 / 436)
Scanning archives (416 / 436)
Scanning archives (417 / 436)
Scanning archives (418 / 436)
Scanning archives (419 / 436)
Scanning archives (420 / 436)
Scanning archives (421 / 436)
Scanning archives (422 / 436)
Scanning archives (423 / 436)
Scanning archives (424 / 436)
Scanning archives (425 / 436)
Scanning archives (426 / 436)
Scanning archives (427 / 436)
Scanning archives (428 / 436)
Scanning archives (429 / 436)
Scanning archives (430 / 436)
Scanning archives (431 / 436)
Scanning archives (432 / 436)
Scanning archives (433 / 436)
Scanning archives (434 / 436)
Scanning archives (435 / 436)
Scanning archives (436 / 436)

2 analysis passes to perform

Pass 1: Analyzing classes (0 / 1780) - 00% complete
Pass 1: Analyzing classes (1 / 1780) - 00% complete
Pass 1: Analyzing classes (2 / 1780) - 00% complete
Pass 1: Analyzing classes (3 / 1780) - 00% complete
Pass 1: Analyzing classes (4 / 1780) - 00% complete
Pass 1: Analyzing classes (5 / 1780) - 00% complete
Pass 1: Analyzing classes (6 / 1780) - 00% complete
Pass 1: Analyzing classes (7 / 1780) - 00% complete
Pass 1: Analyzing classes (8 / 1780) - 00% complete
Pass 1: Analyzing classes (9 / 1780) - 00% complete
Pass 1: Analyzing classes (10 / 1780) - 00% complete
Pass 1: Analyzing classes (11 / 1780) - 00% complete
Pass 1: Analyzing classes (12 / 1780) - 00% complete
Pass 1: Analyzing classes (13 / 1780) - 00% complete
Pass 1: Analyzing classes (14 / 1780) - 00% complete
Pass 1: Analyzing classes (15 / 1780) - 00% complete
Pass 1: Analyzing classes (16 / 1780) - 00% complete
Pass 1: Analyzing classes (17 / 1780) - 00% complete
Pass 1: Analyzing classes (18 / 1780) - 01% complete
Pass 1: Analyzing classes (19 / 1780) - 01% complete
Pass 1: Analyzing classes (20 / 1780) - 01% complete
Pass 1: Analyzing classes (21 / 1780) - 01% complete
Pass 1: Analyzing classes (22 / 1780) - 01% complete
Pass 1: Analyzing classes (23 / 1780) - 01% complete
Pass 1: Analyzing classes (24 / 1780) - 01% complete
Pass 1: Analyzing classes (25 / 1780) - 01% complete
Pass 1: Analyzing classes (26 / 1780) - 01% complete
Pass 1: Analyzing classes (27 / 1780) - 01% complete
Pass 1: Analyzing classes (28 / 1780) - 01% complete
Pass 1: Analyzing classes (29 / 1780) - 01% complete
Pass 1: Analyzing classes (30 / 1780) - 01% complete
Pass 1: Analyzing classes (31 / 1780) - 01% complete
Pass 1: Analyzing classes (32 / 1780) - 01% complete
Pass 1: Analyzing classes (33 / 1780) - 01% complete
Pass 1: Analyzing classes (34 / 1780) - 01% complete
Pass 1: Analyzing classes (35 / 1780) - 01% complete
Pass 1: Analyzing classes (36 / 1780) - 02% complete
Pass 1: Analyzing classes (37 / 1780) - 02% complete
Pass 1: Analyzing classes (38 / 1780) - 02% complete
Pass 1: Analyzing classes (39 / 1780) - 02% complete
Pass 1: Analyzing classes (40 / 1780) - 02% complete
Pass 1: Analyzing classes (41 / 1780) - 02% complete
Pass 1: Analyzing classes (42 / 1780) - 02% complete
Pass 1: Analyzing classes (43 / 1780) - 02% complete
Pass 1: Analyzing classes (44 / 1780) - 02% complete
Pass 1: Analyzing classes (45 / 1780) - 02% complete
Pass 1: Analyzing classes (46 / 1780) - 02% complete
Pass 1: Analyzing classes (47 / 1780) - 02% complete
Pass 1: Analyzing classes (48 / 1780) - 02% complete
Pass 1: Analyzing classes (49 / 1780) - 02% complete
Pass 1: Analyzing classes (50 / 1780) - 02% complete
Pass 1: Analyzing classes (51 / 1780) - 02% complete
Pass 1: Analyzing classes (52 / 1780) - 02% complete
Pass 1: Analyzing classes (53 / 1780) - 02% complete
Pass 1: Analyzing classes (54 / 1780) - 03% complete
Pass 1: Analyzing classes (55 / 1780) - 03% complete
Pass 1: Analyzing classes (56 / 1780) - 03% complete
Pass 1: Analyzing classes (57 / 1780) - 03% complete
Pass 1: Analyzing classes (58 / 1780) - 03% complete
Pass 1: Analyzing classes (59 / 1780) - 03% complete
Pass 1: Analyzing classes (60 / 1780) - 03% complete
Pass 1: Analyzing classes (61 / 1780) - 03% complete
Pass 1: Analyzing classes (62 / 1780) - 03% complete
Pass 1: Analyzing classes (63 / 1780) - 03% complete
Pass 1: Analyzing classes (64 / 1780) - 03% complete
Pass 1: Analyzing classes (65 / 1780) - 03% complete
Pass 1: Analyzing classes (66 / 1780) - 03% complete
Pass 1: Analyzing classes (67 / 1780) - 03% complete
Pass 1: Analyzing classes (68 / 1780) - 03% complete
Pass 1: Analyzing classes (69 / 1780) - 03% complete
Pass 1: Analyzing classes (70 / 1780) - 03% complete
Pass 1: Analyzing classes (71 / 1780) - 03% complete
Pass 1: Analyzing classes (72 / 1780) - 04% complete
Pass 1: Analyzing classes (73 / 1780) - 04% complete
Pass 1: Analyzing classes (74 / 1780) - 04% complete
Pass 1: Analyzing classes (75 / 1780) - 04% complete
Pass 1: Analyzing classes (76 / 1780) - 04% complete
Pass 1: Analyzing classes (77 / 1780) - 04% complete
Pass 1: Analyzing classes (78 / 1780) - 04% complete
Pass 1: Analyzing classes (79 / 1780) - 04% complete
Pass 1: Analyzing classes (80 / 1780) - 04% complete
Pass 1: Analyzing classes (81 / 1780) - 04% complete
Pass 1: Analyzing classes (82 / 1780) - 04% complete
Pass 1: Analyzing classes (83 / 1780) - 04% complete
Pass 1: Analyzing classes (84 / 1780) - 04% complete
Pass 1: Analyzing classes (85 / 1780) - 04% complete
Pass 1: Analyzing classes (86 / 1780) - 04% complete
Pass 1: Analyzing classes (87 / 1780) - 04% complete
Pass 1: Analyzing classes (88 / 1780) - 04% complete
Pass 1: Analyzing classes (89 / 1780) - 05% complete
Pass 1: Analyzing classes (90 / 1780) - 05% complete
Pass 1: Analyzing classes (91 / 1780) - 05% complete
Pass 1: Analyzing classes (92 / 1780) - 05% complete
Pass 1: Analyzing classes (93 / 1780) - 05% complete
Pass 1: Analyzing classes (94 / 1780) - 05% complete
Pass 1: Analyzing classes (95 / 1780) - 05% complete
Pass 1: Analyzing classes (96 / 1780) - 05% complete
Pass 1: Analyzing classes (97 / 1780) - 05% complete
Pass 1: Analyzing classes (98 / 1780) - 05% complete
Pass 1: Analyzing classes (99 / 1780) - 05% complete
Pass 1: Analyzing classes (100 / 1780) - 05% complete
Pass 1: Analyzing classes (101 / 1780) - 05% complete
Pass 1: Analyzing classes (102 / 1780) - 05% complete
Pass 1: Analyzing classes (103 / 1780) - 05% complete
Pass 1: Analyzing classes (104 / 1780) - 05% complete
Pass 1: Analyzing classes (105 / 1780) - 05% complete
Pass 1: Analyzing classes (106 / 1780) - 05% complete
Pass 1: Analyzing classes (107 / 1780) - 06% complete
Pass 1: Analyzing classes (108 / 1780) - 06% complete
Pass 1: Analyzing classes (109 / 1780) - 06% complete
Pass 1: Analyzing classes (110 / 1780) - 06% complete
Pass 1: Analyzing classes (111 / 1780) - 06% complete
Pass 1: Analyzing classes (112 / 1780) - 06% complete
Pass 1: Analyzing classes (113 / 1780) - 06% complete
Pass 1: Analyzing classes (114 / 1780) - 06% complete
Pass 1: Analyzing classes (115 / 1780) - 06% complete
Pass 1: Analyzing classes (116 / 1780) - 06% complete
Pass 1: Analyzing classes (117 / 1780) - 06% complete
Pass 1: Analyzing classes (118 / 1780) - 06% complete
Pass 1: Analyzing classes (119 / 1780) - 06% complete
Pass 1: Analyzing classes (120 / 1780) - 06% complete
Pass 1: Analyzing classes (121 / 1780) - 06% complete
Pass 1: Analyzing classes (122 / 1780) - 06% complete
Pass 1: Analyzing classes (123 / 1780) - 06% complete
Pass 1: Analyzing classes (124 / 1780) - 06% complete
Pass 1: Analyzing classes (125 / 1780) - 07% complete
Pass 1: Analyzing classes (126 / 1780) - 07% complete
Pass 1: Analyzing classes (127 / 1780) - 07% complete
Pass 1: Analyzing classes (128 / 1780) - 07% complete
Pass 1: Analyzing classes (129 / 1780) - 07% complete
Pass 1: Analyzing classes (130 / 1780) - 07% complete
Pass 1: Analyzing classes (131 / 1780) - 07% complete
Pass 1: Analyzing classes (132 / 1780) - 07% complete
Pass 1: Analyzing classes (133 / 1780) - 07% complete
Pass 1: Analyzing classes (134 / 1780) - 07% complete
Pass 1: Analyzing classes (135 / 1780) - 07% complete
Pass 1: Analyzing classes (136 / 1780) - 07% complete
Pass 1: Analyzing classes (137 / 1780) - 07% complete
Pass 1: Analyzing classes (138 / 1780) - 07% complete
Pass 1: Analyzing classes (139 / 1780) - 07% complete
Pass 1: Analyzing classes (140 / 1780) - 07% complete
Pass 1: Analyzing classes (141 / 1780) - 07% complete
Pass 1: Analyzing classes (142 / 1780) - 07% complete
Pass 1: Analyzing classes (143 / 1780) - 08% complete
Pass 1: Analyzing classes (144 / 1780) - 08% complete
Pass 1: Analyzing classes (145 / 1780) - 08% complete
Pass 1: Analyzing classes (146 / 1780) - 08% complete
Pass 1: Analyzing classes (147 / 1780) - 08% complete
Pass 1: Analyzing classes (148 / 1780) - 08% complete
Pass 1: Analyzing classes (149 / 1780) - 08% complete
Pass 1: Analyzing classes (150 / 1780) - 08% complete
Pass 1: Analyzing classes (151 / 1780) - 08% complete
Pass 1: Analyzing classes (152 / 1780) - 08% complete
Pass 1: Analyzing classes (153 / 1780) - 08% complete
Pass 1: Analyzing classes (154 / 1780) - 08% complete
Pass 1: Analyzing classes (155 / 1780) - 08% complete
Pass 1: Analyzing classes (156 / 1780) - 08% complete
Pass 1: Analyzing classes (157 / 1780) - 08% complete
Pass 1: Analyzing classes (158 / 1780) - 08% complete
Pass 1: Analyzing classes (159 / 1780) - 08% complete
Pass 1: Analyzing classes (160 / 1780) - 08% complete
Pass 1: Analyzing classes (161 / 1780) - 09% complete
Pass 1: Analyzing classes (162 / 1780) - 09% complete
Pass 1: Analyzing classes (163 / 1780) - 09% complete
Pass 1: Analyzing classes (164 / 1780) - 09% complete
Pass 1: Analyzing classes (165 / 1780) - 09% complete
Pass 1: Analyzing classes (166 / 1780) - 09% complete
Pass 1: Analyzing classes (167 / 1780) - 09% complete
Pass 1: Analyzing classes (168 / 1780) - 09% complete
Pass 1: Analyzing classes (169 / 1780) - 09% complete
Pass 1: Analyzing classes (170 / 1780) - 09% complete
Pass 1: Analyzing classes (171 / 1780) - 09% complete
Pass 1: Analyzing classes (172 / 1780) - 09% complete
Pass 1: Analyzing classes (173 / 1780) - 09% complete
Pass 1: Analyzing classes (174 / 1780) - 09% complete
Pass 1: Analyzing classes (175 / 1780) - 09% complete
Pass 1: Analyzing classes (176 / 1780) - 09% complete
Pass 1: Analyzing classes (177 / 1780) - 09% complete
Pass 1: Analyzing classes (178 / 1780) - 10% complete
Pass 1: Analyzing classes (179 / 1780) - 10% complete
Pass 1: Analyzing classes (180 / 1780) - 10% complete
Pass 1: Analyzing classes (181 / 1780) - 10% complete
Pass 1: Analyzing classes (182 / 1780) - 10% complete
Pass 1: Analyzing classes (183 / 1780) - 10% complete
Pass 1: Analyzing classes (184 / 1780) - 10% complete
Pass 1: Analyzing classes (185 / 1780) - 10% complete
Pass 1: Analyzing classes (186 / 1780) - 10% complete
Pass 1: Analyzing classes (187 / 1780) - 10% complete
Pass 1: Analyzing classes (188 / 1780) - 10% complete
Pass 1: Analyzing classes (189 / 1780) - 10% complete
Pass 1: Analyzing classes (190 / 1780) - 10% complete
Pass 1: Analyzing classes (191 / 1780) - 10% complete
Pass 1: Analyzing classes (192 / 1780) - 10% complete
Pass 1: Analyzing classes (193 / 1780) - 10% complete
Pass 1: Analyzing classes (194 / 1780) - 10% complete
Pass 1: Analyzing classes (195 / 1780) - 10% complete
Pass 1: Analyzing classes (196 / 1780) - 11% complete
Pass 1: Analyzing classes (197 / 1780) - 11% complete
Pass 1: Analyzing classes (198 / 1780) - 11% complete
Pass 1: Analyzing classes (199 / 1780) - 11% complete
Pass 1: Analyzing classes (200 / 1780) - 11% complete
Pass 1: Analyzing classes (201 / 1780) - 11% complete
Pass 1: Analyzing classes (202 / 1780) - 11% complete
Pass 1: Analyzing classes (203 / 1780) - 11% complete
Pass 1: Analyzing classes (204 / 1780) - 11% complete
Pass 1: Analyzing classes (205 / 1780) - 11% complete
Pass 1: Analyzing classes (206 / 1780) - 11% complete
Pass 1: Analyzing classes (207 / 1780) - 11% complete
Pass 1: Analyzing classes (208 / 1780) - 11% complete
Pass 1: Analyzing classes (209 / 1780) - 11% complete
Pass 1: Analyzing classes (210 / 1780) - 11% complete
Pass 1: Analyzing classes (211 / 1780) - 11% complete
Pass 1: Analyzing classes (212 / 1780) - 11% complete
Pass 1: Analyzing classes (213 / 1780) - 11% complete
Pass 1: Analyzing classes (214 / 1780) - 12% complete
Pass 1: Analyzing classes (215 / 1780) - 12% complete
Pass 1: Analyzing classes (216 / 1780) - 12% complete
Pass 1: Analyzing classes (217 / 1780) - 12% complete
Pass 1: Analyzing classes (218 / 1780) - 12% complete
Pass 1: Analyzing classes (219 / 1780) - 12% complete
Pass 1: Analyzing classes (220 / 1780) - 12% complete
Pass 1: Analyzing classes (221 / 1780) - 12% complete
Pass 1: Analyzing classes (222 / 1780) - 12% complete
Pass 1: Analyzing classes (223 / 1780) - 12% complete
Pass 1: Analyzing classes (224 / 1780) - 12% complete
Pass 1: Analyzing classes (225 / 1780) - 12% complete
Pass 1: Analyzing classes (226 / 1780) - 12% complete
Pass 1: Analyzing classes (227 / 1780) - 12% complete
Pass 1: Analyzing classes (228 / 1780) - 12% complete
Pass 1: Analyzing classes (229 / 1780) - 12% complete
Pass 1: Analyzing classes (230 / 1780) - 12% complete
Pass 1: Analyzing classes (231 / 1780) - 12% complete
Pass 1: Analyzing classes (232 / 1780) - 13% complete
Pass 1: Analyzing classes (233 / 1780) - 13% complete
Pass 1: Analyzing classes (234 / 1780) - 13% complete
Pass 1: Analyzing classes (235 / 1780) - 13% complete
Pass 1: Analyzing classes (236 / 1780) - 13% complete
Pass 1: Analyzing classes (237 / 1780) - 13% complete
Pass 1: Analyzing classes (238 / 1780) - 13% complete
Pass 1: Analyzing classes (239 / 1780) - 13% complete
Pass 1: Analyzing classes (240 / 1780) - 13% complete
Pass 1: Analyzing classes (241 / 1780) - 13% complete
Pass 1: Analyzing classes (242 / 1780) - 13% complete
Pass 1: Analyzing classes (243 / 1780) - 13% complete
Pass 1: Analyzing classes (244 / 1780) - 13% complete
Pass 1: Analyzing classes (245 / 1780) - 13% complete
Pass 1: Analyzing classes (246 / 1780) - 13% complete
Pass 1: Analyzing classes (247 / 1780) - 13% complete
Pass 1: Analyzing classes (248 / 1780) - 13% complete
Pass 1: Analyzing classes (249 / 1780) - 13% complete
Pass 1: Analyzing classes (250 / 1780) - 14% complete
Pass 1: Analyzing classes (251 / 1780) - 14% complete
Pass 1: Analyzing classes (252 / 1780) - 14% complete
Pass 1: Analyzing classes (253 / 1780) - 14% complete
Pass 1: Analyzing classes (254 / 1780) - 14% complete
Pass 1: Analyzing classes (255 / 1780) - 14% complete
Pass 1: Analyzing classes (256 / 1780) - 14% complete
Pass 1: Analyzing classes (257 / 1780) - 14% complete
Pass 1: Analyzing classes (258 / 1780) - 14% complete
Pass 1: Analyzing classes (259 / 1780) - 14% complete
Pass 1: Analyzing classes (260 / 1780) - 14% complete
Pass 1: Analyzing classes (261 / 1780) - 14% complete
Pass 1: Analyzing classes (262 / 1780) - 14% complete
Pass 1: Analyzing classes (263 / 1780) - 14% complete
Pass 1: Analyzing classes (264 / 1780) - 14% complete
Pass 1: Analyzing classes (265 / 1780) - 14% complete
Pass 1: Analyzing classes (266 / 1780) - 14% complete
Pass 1: Analyzing classes (267 / 1780) - 15% complete
Pass 1: Analyzing classes (268 / 1780) - 15% complete
Pass 1: Analyzing classes (269 / 1780) - 15% complete
Pass 1: Analyzing classes (270 / 1780) - 15% complete
Pass 1: Analyzing classes (271 / 1780) - 15% complete
Pass 1: Analyzing classes (272 / 1780) - 15% complete
Pass 1: Analyzing classes (273 / 1780) - 15% complete
Pass 1: Analyzing classes (274 / 1780) - 15% complete
Pass 1: Analyzing classes (275 / 1780) - 15% complete
Pass 1: Analyzing classes (276 / 1780) - 15% complete
Pass 1: Analyzing classes (277 / 1780) - 15% complete
Pass 1: Analyzing classes (278 / 1780) - 15% complete
Pass 1: Analyzing classes (279 / 1780) - 15% complete
Pass 1: Analyzing classes (280 / 1780) - 15% complete
Pass 1: Analyzing classes (281 / 1780) - 15% complete
Pass 1: Analyzing classes (282 / 1780) - 15% complete
Pass 1: Analyzing classes (283 / 1780) - 15% complete
Pass 1: Analyzing classes (284 / 1780) - 15% complete
Pass 1: Analyzing classes (285 / 1780) - 16% complete
Pass 1: Analyzing classes (286 / 1780) - 16% complete
Pass 1: Analyzing classes (287 / 1780) - 16% complete
Pass 1: Analyzing classes (288 / 1780) - 16% complete
Pass 1: Analyzing classes (289 / 1780) - 16% complete
Pass 1: Analyzing classes (290 / 1780) - 16% complete
Pass 1: Analyzing classes (291 / 1780) - 16% complete
Pass 1: Analyzing classes (292 / 1780) - 16% complete
Pass 1: Analyzing classes (293 / 1780) - 16% complete
Pass 1: Analyzing classes (294 / 1780) - 16% complete
Pass 1: Analyzing classes (295 / 1780) - 16% complete
Pass 1: Analyzing classes (296 / 1780) - 16% complete
Pass 1: Analyzing classes (297 / 1780) - 16% complete
Pass 1: Analyzing classes (298 / 1780) - 16% complete
Pass 1: Analyzing classes (299 / 1780) - 16% complete
Pass 1: Analyzing classes (300 / 1780) - 16% complete
Pass 1: Analyzing classes (301 / 1780) - 16% complete
Pass 1: Analyzing classes (302 / 1780) - 16% complete
Pass 1: Analyzing classes (303 / 1780) - 17% complete
Pass 1: Analyzing classes (304 / 1780) - 17% complete
Pass 1: Analyzing classes (305 / 1780) - 17% complete
Pass 1: Analyzing classes (306 / 1780) - 17% complete
Pass 1: Analyzing classes (307 / 1780) - 17% complete
Pass 1: Analyzing classes (308 / 1780) - 17% complete
Pass 1: Analyzing classes (309 / 1780) - 17% complete
Pass 1: Analyzing classes (310 / 1780) - 17% complete
Pass 1: Analyzing classes (311 / 1780) - 17% complete
Pass 1: Analyzing classes (312 / 1780) - 17% complete
Pass 1: Analyzing classes (313 / 1780) - 17% complete
Pass 1: Analyzing classes (314 / 1780) - 17% complete
Pass 1: Analyzing classes (315 / 1780) - 17% complete
Pass 1: Analyzing classes (316 / 1780) - 17% complete
Pass 1: Analyzing classes (317 / 1780) - 17% complete
Pass 1: Analyzing classes (318 / 1780) - 17% complete
Pass 1: Analyzing classes (319 / 1780) - 17% complete
Pass 1: Analyzing classes (320 / 1780) - 17% complete
Pass 1: Analyzing classes (321 / 1780) - 18% complete
Pass 1: Analyzing classes (322 / 1780) - 18% complete
Pass 1: Analyzing classes (323 / 1780) - 18% complete
Pass 1: Analyzing classes (324 / 1780) - 18% complete
Pass 1: Analyzing classes (325 / 1780) - 18% complete
Pass 1: Analyzing classes (326 / 1780) - 18% complete
Pass 1: Analyzing classes (327 / 1780) - 18% complete
Pass 1: Analyzing classes (328 / 1780) - 18% complete
Pass 1: Analyzing classes (329 / 1780) - 18% complete
Pass 1: Analyzing classes (330 / 1780) - 18% complete
Pass 1: Analyzing classes (331 / 1780) - 18% complete
Pass 1: Analyzing classes (332 / 1780) - 18% complete
Pass 1: Analyzing classes (333 / 1780) - 18% complete
Pass 1: Analyzing classes (334 / 1780) - 18% complete
Pass 1: Analyzing classes (335 / 1780) - 18% complete
Pass 1: Analyzing classes (336 / 1780) - 18% complete
Pass 1: Analyzing classes (337 / 1780) - 18% complete
Pass 1: Analyzing classes (338 / 1780) - 18% complete
Pass 1: Analyzing classes (339 / 1780) - 19% complete
Pass 1: Analyzing classes (340 / 1780) - 19% complete
Pass 1: Analyzing classes (341 / 1780) - 19% complete
Pass 1: Analyzing classes (342 / 1780) - 19% complete
Pass 1: Analyzing classes (343 / 1780) - 19% complete
Pass 1: Analyzing classes (344 / 1780) - 19% complete
Pass 1: Analyzing classes (345 / 1780) - 19% complete
Pass 1: Analyzing classes (346 / 1780) - 19% complete
Pass 1: Analyzing classes (347 / 1780) - 19% complete
Pass 1: Analyzing classes (348 / 1780) - 19% complete
Pass 1: Analyzing classes (349 / 1780) - 19% complete
Pass 1: Analyzing classes (350 / 1780) - 19% complete
Pass 1: Analyzing classes (351 / 1780) - 19% complete
Pass 1: Analyzing classes (352 / 1780) - 19% complete
Pass 1: Analyzing classes (353 / 1780) - 19% complete
Pass 1: Analyzing classes (354 / 1780) - 19% complete
Pass 1: Analyzing classes (355 / 1780) - 19% complete
Pass 1: Analyzing classes (356 / 1780) - 20% complete
Pass 1: Analyzing classes (357 / 1780) - 20% complete
Pass 1: Analyzing classes (358 / 1780) - 20% complete
Pass 1: Analyzing classes (359 / 1780) - 20% complete
Pass 1: Analyzing classes (360 / 1780) - 20% complete
Pass 1: Analyzing classes (361 / 1780) - 20% complete
Pass 1: Analyzing classes (362 / 1780) - 20% complete
Pass 1: Analyzing classes (363 / 1780) - 20% complete
Pass 1: Analyzing classes (364 / 1780) - 20% complete
Pass 1: Analyzing classes (365 / 1780) - 20% complete
Pass 1: Analyzing classes (366 / 1780) - 20% complete
Pass 1: Analyzing classes (367 / 1780) - 20% complete
Pass 1: Analyzing classes (368 / 1780) - 20% complete
Pass 1: Analyzing classes (369 / 1780) - 20% complete
Pass 1: Analyzing classes (370 / 1780) - 20% complete
Pass 1: Analyzing classes (371 / 1780) - 20% complete
Pass 1: Analyzing classes (372 / 1780) - 20% complete
Pass 1: Analyzing classes (373 / 1780) - 20% complete
Pass 1: Analyzing classes (374 / 1780) - 21% complete
Pass 1: Analyzing classes (375 / 1780) - 21% complete
Pass 1: Analyzing classes (376 / 1780) - 21% complete
Pass 1: Analyzing classes (377 / 1780) - 21% complete
Pass 1: Analyzing classes (378 / 1780) - 21% complete
Pass 1: Analyzing classes (379 / 1780) - 21% complete
Pass 1: Analyzing classes (380 / 1780) - 21% complete
Pass 1: Analyzing classes (381 / 1780) - 21% complete
Pass 1: Analyzing classes (382 / 1780) - 21% complete
Pass 1: Analyzing classes (383 / 1780) - 21% complete
Pass 1: Analyzing classes (384 / 1780) - 21% complete
Pass 1: Analyzing classes (385 / 1780) - 21% complete
Pass 1: Analyzing classes (386 / 1780) - 21% complete
Pass 1: Analyzing classes (387 / 1780) - 21% complete
Pass 1: Analyzing classes (388 / 1780) - 21% complete
Pass 1: Analyzing classes (389 / 1780) - 21% complete
Pass 1: Analyzing classes (390 / 1780) - 21% complete
Pass 1: Analyzing classes (391 / 1780) - 21% complete
Pass 1: Analyzing classes (392 / 1780) - 22% complete
Pass 1: Analyzing classes (393 / 1780) - 22% complete
Pass 1: Analyzing classes (394 / 1780) - 22% complete
Pass 1: Analyzing classes (395 / 1780) - 22% complete
Pass 1: Analyzing classes (396 / 1780) - 22% complete
Pass 1: Analyzing classes (397 / 1780) - 22% complete
Pass 1: Analyzing classes (398 / 1780) - 22% complete
Pass 1: Analyzing classes (399 / 1780) - 22% complete
Pass 1: Analyzing classes (400 / 1780) - 22% complete
Pass 1: Analyzing classes (401 / 1780) - 22% complete
Pass 1: Analyzing classes (402 / 1780) - 22% complete
Pass 1: Analyzing classes (403 / 1780) - 22% complete
Pass 1: Analyzing classes (404 / 1780) - 22% complete
Pass 1: Analyzing classes (405 / 1780) - 22% complete
Pass 1: Analyzing classes (406 / 1780) - 22% complete
Pass 1: Analyzing classes (407 / 1780) - 22% complete
Pass 1: Analyzing classes (408 / 1780) - 22% complete
Pass 1: Analyzing classes (409 / 1780) - 22% complete
Pass 1: Analyzing classes (410 / 1780) - 23% complete
Pass 1: Analyzing classes (411 / 1780) - 23% complete
Pass 1: Analyzing classes (412 / 1780) - 23% complete
Pass 1: Analyzing classes (413 / 1780) - 23% complete
Pass 1: Analyzing classes (414 / 1780) - 23% complete
Pass 1: Analyzing classes (415 / 1780) - 23% complete
Pass 1: Analyzing classes (416 / 1780) - 23% complete
Pass 1: Analyzing classes (417 / 1780) - 23% complete
Pass 1: Analyzing classes (418 / 1780) - 23% complete
Pass 1: Analyzing classes (419 / 1780) - 23% complete
Pass 1: Analyzing classes (420 / 1780) - 23% complete
Pass 1: Analyzing classes (421 / 1780) - 23% complete
Pass 1: Analyzing classes (422 / 1780) - 23% complete
Pass 1: Analyzing classes (423 / 1780) - 23% complete
Pass 1: Analyzing classes (424 / 1780) - 23% complete
Pass 1: Analyzing classes (425 / 1780) - 23% complete
Pass 1: Analyzing classes (426 / 1780) - 23% complete
Pass 1: Analyzing classes (427 / 1780) - 23% complete
Pass 1: Analyzing classes (428 / 1780) - 24% complete
Pass 1: Analyzing classes (429 / 1780) - 24% complete
Pass 1: Analyzing classes (430 / 1780) - 24% complete
Pass 1: Analyzing classes (431 / 1780) - 24% complete
Pass 1: Analyzing classes (432 / 1780) - 24% complete
Pass 1: Analyzing classes (433 / 1780) - 24% complete
Pass 1: Analyzing classes (434 / 1780) - 24% complete
Pass 1: Analyzing classes (435 / 1780) - 24% complete
Pass 1: Analyzing classes (436 / 1780) - 24% complete
Pass 1: Analyzing classes (437 / 1780) - 24% complete
Pass 1: Analyzing classes (438 / 1780) - 24% complete
Pass 1: Analyzing classes (439 / 1780) - 24% complete
Pass 1: Analyzing classes (440 / 1780) - 24% complete
Pass 1: Analyzing classes (441 / 1780) - 24% complete
Pass 1: Analyzing classes (442 / 1780) - 24% complete
Pass 1: Analyzing classes (443 / 1780) - 24% complete
Pass 1: Analyzing classes (444 / 1780) - 24% complete
Pass 1: Analyzing classes (445 / 1780) - 25% complete
Pass 1: Analyzing classes (446 / 1780) - 25% complete
Pass 1: Analyzing classes (447 / 1780) - 25% complete
Pass 1: Analyzing classes (448 / 1780) - 25% complete
Pass 1: Analyzing classes (449 / 1780) - 25% complete
Pass 1: Analyzing classes (450 / 1780) - 25% complete
Pass 1: Analyzing classes (451 / 1780) - 25% complete
Pass 1: Analyzing classes (452 / 1780) - 25% complete
Pass 1: Analyzing classes (453 / 1780) - 25% complete
Pass 1: Analyzing classes (454 / 1780) - 25% complete
Pass 1: Analyzing classes (455 / 1780) - 25% complete
Pass 1: Analyzing classes (456 / 1780) - 25% complete
Pass 1: Analyzing classes (457 / 1780) - 25% complete
Pass 1: Analyzing classes (458 / 1780) - 25% complete
Pass 1: Analyzing classes (459 / 1780) - 25% complete
Pass 1: Analyzing classes (460 / 1780) - 25% complete
Pass 1: Analyzing classes (461 / 1780) - 25% complete
Pass 1: Analyzing classes (462 / 1780) - 25% complete
Pass 1: Analyzing classes (463 / 1780) - 26% complete
Pass 1: Analyzing classes (464 / 1780) - 26% complete
Pass 1: Analyzing classes (465 / 1780) - 26% complete
Pass 1: Analyzing classes (466 / 1780) - 26% complete
Pass 1: Analyzing classes (467 / 1780) - 26% complete
Pass 1: Analyzing classes (468 / 1780) - 26% complete
Pass 1: Analyzing classes (469 / 1780) - 26% complete
Pass 1: Analyzing classes (470 / 1780) - 26% complete
Pass 1: Analyzing classes (471 / 1780) - 26% complete
Pass 1: Analyzing classes (472 / 1780) - 26% complete
Pass 1: Analyzing classes (473 / 1780) - 26% complete
Pass 1: Analyzing classes (474 / 1780) - 26% complete
Pass 1: Analyzing classes (475 / 1780) - 26% complete
Pass 1: Analyzing classes (476 / 1780) - 26% complete
Pass 1: Analyzing classes (477 / 1780) - 26% complete
Pass 1: Analyzing classes (478 / 1780) - 26% complete
Pass 1: Analyzing classes (479 / 1780) - 26% complete
Pass 1: Analyzing classes (480 / 1780) - 26% complete
Pass 1: Analyzing classes (481 / 1780) - 27% complete
Pass 1: Analyzing classes (482 / 1780) - 27% complete
Pass 1: Analyzing classes (483 / 1780) - 27% complete
Pass 1: Analyzing classes (484 / 1780) - 27% complete
Pass 1: Analyzing classes (485 / 1780) - 27% complete
Pass 1: Analyzing classes (486 / 1780) - 27% complete
Pass 1: Analyzing classes (487 / 1780) - 27% complete
Pass 1: Analyzing classes (488 / 1780) - 27% complete
Pass 1: Analyzing classes (489 / 1780) - 27% complete
Pass 1: Analyzing classes (490 / 1780) - 27% complete
Pass 1: Analyzing classes (491 / 1780) - 27% complete
Pass 1: Analyzing classes (492 / 1780) - 27% complete
Pass 1: Analyzing classes (493 / 1780) - 27% complete
Pass 1: Analyzing classes (494 / 1780) - 27% complete
Pass 1: Analyzing classes (495 / 1780) - 27% complete
Pass 1: Analyzing classes (496 / 1780) - 27% complete
Pass 1: Analyzing classes (497 / 1780) - 27% complete
Pass 1: Analyzing classes (498 / 1780) - 27% complete
Pass 1: Analyzing classes (499 / 1780) - 28% complete
Pass 1: Analyzing classes (500 / 1780) - 28% complete
Pass 1: Analyzing classes (501 / 1780) - 28% complete
Pass 1: Analyzing classes (502 / 1780) - 28% complete
Pass 1: Analyzing classes (503 / 1780) - 28% complete
Pass 1: Analyzing classes (504 / 1780) - 28% complete
Pass 1: Analyzing classes (505 / 1780) - 28% complete
Pass 1: Analyzing classes (506 / 1780) - 28% complete
Pass 1: Analyzing classes (507 / 1780) - 28% complete
Pass 1: Analyzing classes (508 / 1780) - 28% complete
Pass 1: Analyzing classes (509 / 1780) - 28% complete
Pass 1: Analyzing classes (510 / 1780) - 28% complete
Pass 1: Analyzing classes (511 / 1780) - 28% complete
Pass 1: Analyzing classes (512 / 1780) - 28% complete
Pass 1: Analyzing classes (513 / 1780) - 28% complete
Pass 1: Analyzing classes (514 / 1780) - 28% complete
Pass 1: Analyzing classes (515 / 1780) - 28% complete
Pass 1: Analyzing classes (516 / 1780) - 28% complete
Pass 1: Analyzing classes (517 / 1780) - 29% complete
Pass 1: Analyzing classes (518 / 1780) - 29% complete
Pass 1: Analyzing classes (519 / 1780) - 29% complete
Pass 1: Analyzing classes (520 / 1780) - 29% complete
Pass 1: Analyzing classes (521 / 1780) - 29% complete
Pass 1: Analyzing classes (522 / 1780) - 29% complete
Pass 1: Analyzing classes (523 / 1780) - 29% complete
Pass 1: Analyzing classes (524 / 1780) - 29% complete
Pass 1: Analyzing classes (525 / 1780) - 29% complete
Pass 1: Analyzing classes (526 / 1780) - 29% complete
Pass 1: Analyzing classes (527 / 1780) - 29% complete
Pass 1: Analyzing classes (528 / 1780) - 29% complete
Pass 1: Analyzing classes (529 / 1780) - 29% complete
Pass 1: Analyzing classes (530 / 1780) - 29% complete
Pass 1: Analyzing classes (531 / 1780) - 29% complete
Pass 1: Analyzing classes (532 / 1780) - 29% complete
Pass 1: Analyzing classes (533 / 1780) - 29% complete
Pass 1: Analyzing classes (534 / 1780) - 30% complete
Pass 1: Analyzing classes (535 / 1780) - 30% complete
Pass 1: Analyzing classes (536 / 1780) - 30% complete
Pass 1: Analyzing classes (537 / 1780) - 30% complete
Pass 1: Analyzing classes (538 / 1780) - 30% complete
Pass 1: Analyzing classes (539 / 1780) - 30% complete
Pass 1: Analyzing classes (540 / 1780) - 30% complete
Pass 1: Analyzing classes (541 / 1780) - 30% complete
Pass 1: Analyzing classes (542 / 1780) - 30% complete
Pass 1: Analyzing classes (543 / 1780) - 30% complete
Pass 1: Analyzing classes (544 / 1780) - 30% complete
Pass 1: Analyzing classes (545 / 1780) - 30% complete
Pass 1: Analyzing classes (546 / 1780) - 30% complete
Pass 1: Analyzing classes (547 / 1780) - 30% complete
Pass 1: Analyzing classes (548 / 1780) - 30% complete
Pass 1: Analyzing classes (549 / 1780) - 30% complete
Pass 1: Analyzing classes (550 / 1780) - 30% complete
Pass 1: Analyzing classes (551 / 1780) - 30% complete
Pass 1: Analyzing classes (552 / 1780) - 31% complete
Pass 1: Analyzing classes (553 / 1780) - 31% complete
Pass 1: Analyzing classes (554 / 1780) - 31% complete
Pass 1: Analyzing classes (555 / 1780) - 31% complete
Pass 1: Analyzing classes (556 / 1780) - 31% complete
Pass 1: Analyzing classes (557 / 1780) - 31% complete
Pass 1: Analyzing classes (558 / 1780) - 31% complete
Pass 1: Analyzing classes (559 / 1780) - 31% complete
Pass 1: Analyzing classes (560 / 1780) - 31% complete
Pass 1: Analyzing classes (561 / 1780) - 31% complete
Pass 1: Analyzing classes (562 / 1780) - 31% complete
Pass 1: Analyzing classes (563 / 1780) - 31% complete
Pass 1: Analyzing classes (564 / 1780) - 31% complete
Pass 1: Analyzing classes (565 / 1780) - 31% complete
Pass 1: Analyzing classes (566 / 1780) - 31% complete
Pass 1: Analyzing classes (567 / 1780) - 31% complete
Pass 1: Analyzing classes (568 / 1780) - 31% complete
Pass 1: Analyzing classes (569 / 1780) - 31% complete
Pass 1: Analyzing classes (570 / 1780) - 32% complete
Pass 1: Analyzing classes (571 / 1780) - 32% complete
Pass 1: Analyzing classes (572 / 1780) - 32% complete
Pass 1: Analyzing classes (573 / 1780) - 32% complete
Pass 1: Analyzing classes (574 / 1780) - 32% complete
Pass 1: Analyzing classes (575 / 1780) - 32% complete
Pass 1: Analyzing classes (576 / 1780) - 32% complete
Pass 1: Analyzing classes (577 / 1780) - 32% complete
Pass 1: Analyzing classes (578 / 1780) - 32% complete
Pass 1: Analyzing classes (579 / 1780) - 32% complete
Pass 1: Analyzing classes (580 / 1780) - 32% complete
Pass 1: Analyzing classes (581 / 1780) - 32% complete
Pass 1: Analyzing classes (582 / 1780) - 32% complete
Pass 1: Analyzing classes (583 / 1780) - 32% complete
Pass 1: Analyzing classes (584 / 1780) - 32% complete
Pass 1: Analyzing classes (585 / 1780) - 32% complete
Pass 1: Analyzing classes (586 / 1780) - 32% complete
Pass 1: Analyzing classes (587 / 1780) - 32% complete
Pass 1: Analyzing classes (588 / 1780) - 33% complete
Pass 1: Analyzing classes (589 / 1780) - 33% complete
Pass 1: Analyzing classes (590 / 1780) - 33% complete
Pass 1: Analyzing classes (591 / 1780) - 33% complete
Pass 1: Analyzing classes (592 / 1780) - 33% complete
Pass 1: Analyzing classes (593 / 1780) - 33% complete
Pass 1: Analyzing classes (594 / 1780) - 33% complete
Pass 1: Analyzing classes (595 / 1780) - 33% complete
Pass 1: Analyzing classes (596 / 1780) - 33% complete
Pass 1: Analyzing classes (597 / 1780) - 33% complete
Pass 1: Analyzing classes (598 / 1780) - 33% complete
Pass 1: Analyzing classes (599 / 1780) - 33% complete
Pass 1: Analyzing classes (600 / 1780) - 33% complete
Pass 1: Analyzing classes (601 / 1780) - 33% complete
Pass 1: Analyzing classes (602 / 1780) - 33% complete
Pass 1: Analyzing classes (603 / 1780) - 33% complete
Pass 1: Analyzing classes (604 / 1780) - 33% complete
Pass 1: Analyzing classes (605 / 1780) - 33% complete
Pass 1: Analyzing classes (606 / 1780) - 34% complete
Pass 1: Analyzing classes (607 / 1780) - 34% complete
Pass 1: Analyzing classes (608 / 1780) - 34% complete
Pass 1: Analyzing classes (609 / 1780) - 34% complete
Pass 1: Analyzing classes (610 / 1780) - 34% complete
Pass 1: Analyzing classes (611 / 1780) - 34% complete
Pass 1: Analyzing classes (612 / 1780) - 34% complete
Pass 1: Analyzing classes (613 / 1780) - 34% complete
Pass 1: Analyzing classes (614 / 1780) - 34% complete
Pass 1: Analyzing classes (615 / 1780) - 34% complete
Pass 1: Analyzing classes (616 / 1780) - 34% complete
Pass 1: Analyzing classes (617 / 1780) - 34% complete
Pass 1: Analyzing classes (618 / 1780) - 34% complete
Pass 1: Analyzing classes (619 / 1780) - 34% complete
Pass 1: Analyzing classes (620 / 1780) - 34% complete
Pass 1: Analyzing classes (621 / 1780) - 34% complete
Pass 1: Analyzing classes (622 / 1780) - 34% complete
Pass 1: Analyzing classes (623 / 1780) - 35% complete
Pass 1: Analyzing classes (624 / 1780) - 35% complete
Pass 1: Analyzing classes (625 / 1780) - 35% complete
Pass 1: Analyzing classes (626 / 1780) - 35% complete
Pass 1: Analyzing classes (627 / 1780) - 35% complete
Pass 1: Analyzing classes (628 / 1780) - 35% complete
Pass 1: Analyzing classes (629 / 1780) - 35% complete
Pass 1: Analyzing classes (630 / 1780) - 35% complete
Pass 1: Analyzing classes (631 / 1780) - 35% complete
Pass 1: Analyzing classes (632 / 1780) - 35% complete
Pass 1: Analyzing classes (633 / 1780) - 35% complete
Pass 1: Analyzing classes (634 / 1780) - 35% complete
Pass 1: Analyzing classes (635 / 1780) - 35% complete
Pass 1: Analyzing classes (636 / 1780) - 35% complete
Pass 1: Analyzing classes (637 / 1780) - 35% complete
Pass 1: Analyzing classes (638 / 1780) - 35% complete
Pass 1: Analyzing classes (639 / 1780) - 35% complete
Pass 1: Analyzing classes (640 / 1780) - 35% complete
Pass 1: Analyzing classes (641 / 1780) - 36% complete
Pass 1: Analyzing classes (642 / 1780) - 36% complete
Pass 1: Analyzing classes (643 / 1780) - 36% complete
Pass 1: Analyzing classes (644 / 1780) - 36% complete
Pass 1: Analyzing classes (645 / 1780) - 36% complete
Pass 1: Analyzing classes (646 / 1780) - 36% complete
Pass 1: Analyzing classes (647 / 1780) - 36% complete
Pass 1: Analyzing classes (648 / 1780) - 36% complete
Pass 1: Analyzing classes (649 / 1780) - 36% complete
Pass 1: Analyzing classes (650 / 1780) - 36% complete
Pass 1: Analyzing classes (651 / 1780) - 36% complete
Pass 1: Analyzing classes (652 / 1780) - 36% complete
Pass 1: Analyzing classes (653 / 1780) - 36% complete
Pass 1: Analyzing classes (654 / 1780) - 36% complete
Pass 1: Analyzing classes (655 / 1780) - 36% complete
Pass 1: Analyzing classes (656 / 1780) - 36% complete
Pass 1: Analyzing classes (657 / 1780) - 36% complete
Pass 1: Analyzing classes (658 / 1780) - 36% complete
Pass 1: Analyzing classes (659 / 1780) - 37% complete
Pass 1: Analyzing classes (660 / 1780) - 37% complete
Pass 1: Analyzing classes (661 / 1780) - 37% complete
Pass 1: Analyzing classes (662 / 1780) - 37% complete
Pass 1: Analyzing classes (663 / 1780) - 37% complete
Pass 1: Analyzing classes (664 / 1780) - 37% complete
Pass 1: Analyzing classes (665 / 1780) - 37% complete
Pass 1: Analyzing classes (666 / 1780) - 37% complete
Pass 1: Analyzing classes (667 / 1780) - 37% complete
Pass 1: Analyzing classes (668 / 1780) - 37% complete
Pass 1: Analyzing classes (669 / 1780) - 37% complete
Pass 1: Analyzing classes (670 / 1780) - 37% complete
Pass 1: Analyzing classes (671 / 1780) - 37% complete
Pass 1: Analyzing classes (672 / 1780) - 37% complete
Pass 1: Analyzing classes (673 / 1780) - 37% complete
Pass 1: Analyzing classes (674 / 1780) - 37% complete
Pass 1: Analyzing classes (675 / 1780) - 37% complete
Pass 1: Analyzing classes (676 / 1780) - 37% complete
Pass 1: Analyzing classes (677 / 1780) - 38% complete
Pass 1: Analyzing classes (678 / 1780) - 38% complete
Pass 1: Analyzing classes (679 / 1780) - 38% complete
Pass 1: Analyzing classes (680 / 1780) - 38% complete
Pass 1: Analyzing classes (681 / 1780) - 38% complete
Pass 1: Analyzing classes (682 / 1780) - 38% complete
Pass 1: Analyzing classes (683 / 1780) - 38% complete
Pass 1: Analyzing classes (684 / 1780) - 38% complete
Pass 1: Analyzing classes (685 / 1780) - 38% complete
Pass 1: Analyzing classes (686 / 1780) - 38% complete
Pass 1: Analyzing classes (687 / 1780) - 38% complete
Pass 1: Analyzing classes (688 / 1780) - 38% complete
Pass 1: Analyzing classes (689 / 1780) - 38% complete
Pass 1: Analyzing classes (690 / 1780) - 38% complete
Pass 1: Analyzing classes (691 / 1780) - 38% complete
Pass 1: Analyzing classes (692 / 1780) - 38% complete
Pass 1: Analyzing classes (693 / 1780) - 38% complete
Pass 1: Analyzing classes (694 / 1780) - 38% complete
Pass 1: Analyzing classes (695 / 1780) - 39% complete
Pass 1: Analyzing classes (696 / 1780) - 39% complete
Pass 1: Analyzing classes (697 / 1780) - 39% complete
Pass 1: Analyzing classes (698 / 1780) - 39% complete
Pass 1: Analyzing classes (699 / 1780) - 39% complete
Pass 1: Analyzing classes (700 / 1780) - 39% complete
Pass 1: Analyzing classes (701 / 1780) - 39% complete
Pass 1: Analyzing classes (702 / 1780) - 39% complete
Pass 1: Analyzing classes (703 / 1780) - 39% complete
Pass 1: Analyzing classes (704 / 1780) - 39% complete
Pass 1: Analyzing classes (705 / 1780) - 39% complete
Pass 1: Analyzing classes (706 / 1780) - 39% complete
Pass 1: Analyzing classes (707 / 1780) - 39% complete
Pass 1: Analyzing classes (708 / 1780) - 39% complete
Pass 1: Analyzing classes (709 / 1780) - 39% complete
Pass 1: Analyzing classes (710 / 1780) - 39% complete
Pass 1: Analyzing classes (711 / 1780) - 39% complete
Pass 1: Analyzing classes (712 / 1780) - 40% complete
Pass 1: Analyzing classes (713 / 1780) - 40% complete
Pass 1: Analyzing classes (714 / 1780) - 40% complete
Pass 1: Analyzing classes (715 / 1780) - 40% complete
Pass 1: Analyzing classes (716 / 1780) - 40% complete
Pass 1: Analyzing classes (717 / 1780) - 40% complete
Pass 1: Analyzing classes (718 / 1780) - 40% complete
Pass 1: Analyzing classes (719 / 1780) - 40% complete
Pass 1: Analyzing classes (720 / 1780) - 40% complete
Pass 1: Analyzing classes (721 / 1780) - 40% complete
Pass 1: Analyzing classes (722 / 1780) - 40% complete
Pass 1: Analyzing classes (723 / 1780) - 40% complete
Pass 1: Analyzing classes (724 / 1780) - 40% complete
Pass 1: Analyzing classes (725 / 1780) - 40% complete
Pass 1: Analyzing classes (726 / 1780) - 40% complete
Pass 1: Analyzing classes (727 / 1780) - 40% complete
Pass 1: Analyzing classes (728 / 1780) - 40% complete
Pass 1: Analyzing classes (729 / 1780) - 40% complete
Pass 1: Analyzing classes (730 / 1780) - 41% complete
Pass 1: Analyzing classes (731 / 1780) - 41% complete
Pass 1: Analyzing classes (732 / 1780) - 41% complete
Pass 1: Analyzing classes (733 / 1780) - 41% complete
Pass 1: Analyzing classes (734 / 1780) - 41% complete
Pass 1: Analyzing classes (735 / 1780) - 41% complete
Pass 1: Analyzing classes (736 / 1780) - 41% complete
Pass 1: Analyzing classes (737 / 1780) - 41% complete
Pass 1: Analyzing classes (738 / 1780) - 41% complete
Pass 1: Analyzing classes (739 / 1780) - 41% complete
Pass 1: Analyzing classes (740 / 1780) - 41% complete
Pass 1: Analyzing classes (741 / 1780) - 41% complete
Pass 1: Analyzing classes (742 / 1780) - 41% complete
Pass 1: Analyzing classes (743 / 1780) - 41% complete
Pass 1: Analyzing classes (744 / 1780) - 41% complete
Pass 1: Analyzing classes (745 / 1780) - 41% complete
Pass 1: Analyzing classes (746 / 1780) - 41% complete
Pass 1: Analyzing classes (747 / 1780) - 41% complete
Pass 1: Analyzing classes (748 / 1780) - 42% complete
Pass 1: Analyzing classes (749 / 1780) - 42% complete
Pass 1: Analyzing classes (750 / 1780) - 42% complete
Pass 1: Analyzing classes (751 / 1780) - 42% complete
Pass 1: Analyzing classes (752 / 1780) - 42% complete
Pass 1: Analyzing classes (753 / 1780) - 42% complete
Pass 1: Analyzing classes (754 / 1780) - 42% complete
Pass 1: Analyzing classes (755 / 1780) - 42% complete
Pass 1: Analyzing classes (756 / 1780) - 42% complete
Pass 1: Analyzing classes (757 / 1780) - 42% complete
Pass 1: Analyzing classes (758 / 1780) - 42% complete
Pass 1: Analyzing classes (759 / 1780) - 42% complete
Pass 1: Analyzing classes (760 / 1780) - 42% complete
Pass 1: Analyzing classes (761 / 1780) - 42% complete
Pass 1: Analyzing classes (762 / 1780) - 42% complete
Pass 1: Analyzing classes (763 / 1780) - 42% complete
Pass 1: Analyzing classes (764 / 1780) - 42% complete
Pass 1: Analyzing classes (765 / 1780) - 42% complete
Pass 1: Analyzing classes (766 / 1780) - 43% complete
Pass 1: Analyzing classes (767 / 1780) - 43% complete
Pass 1: Analyzing classes (768 / 1780) - 43% complete
Pass 1: Analyzing classes (769 / 1780) - 43% complete
Pass 1: Analyzing classes (770 / 1780) - 43% complete
Pass 1: Analyzing classes (771 / 1780) - 43% complete
Pass 1: Analyzing classes (772 / 1780) - 43% complete
Pass 1: Analyzing classes (773 / 1780) - 43% complete
Pass 1: Analyzing classes (774 / 1780) - 43% complete
Pass 1: Analyzing classes (775 / 1780) - 43% complete
Pass 1: Analyzing classes (776 / 1780) - 43% complete
Pass 1: Analyzing classes (777 / 1780) - 43% complete
Pass 1: Analyzing classes (778 / 1780) - 43% complete
Pass 1: Analyzing classes (779 / 1780) - 43% complete
Pass 1: Analyzing classes (780 / 1780) - 43% complete
Pass 1: Analyzing classes (781 / 1780) - 43% complete
Pass 1: Analyzing classes (782 / 1780) - 43% complete
Pass 1: Analyzing classes (783 / 1780) - 43% complete
Pass 1: Analyzing classes (784 / 1780) - 44% complete
Pass 1: Analyzing classes (785 / 1780) - 44% complete
Pass 1: Analyzing classes (786 / 1780) - 44% complete
Pass 1: Analyzing classes (787 / 1780) - 44% complete
Pass 1: Analyzing classes (788 / 1780) - 44% complete
Pass 1: Analyzing classes (789 / 1780) - 44% complete
Pass 1: Analyzing classes (790 / 1780) - 44% complete
Pass 1: Analyzing classes (791 / 1780) - 44% complete
Pass 1: Analyzing classes (792 / 1780) - 44% complete
Pass 1: Analyzing classes (793 / 1780) - 44% complete
Pass 1: Analyzing classes (794 / 1780) - 44% complete
Pass 1: Analyzing classes (795 / 1780) - 44% complete
Pass 1: Analyzing classes (796 / 1780) - 44% complete
Pass 1: Analyzing classes (797 / 1780) - 44% complete
Pass 1: Analyzing classes (798 / 1780) - 44% complete
Pass 1: Analyzing classes (799 / 1780) - 44% complete
Pass 1: Analyzing classes (800 / 1780) - 44% complete
Pass 1: Analyzing classes (801 / 1780) - 45% complete
Pass 1: Analyzing classes (802 / 1780) - 45% complete
Pass 1: Analyzing classes (803 / 1780) - 45% complete
Pass 1: Analyzing classes (804 / 1780) - 45% complete
Pass 1: Analyzing classes (805 / 1780) - 45% complete
Pass 1: Analyzing classes (806 / 1780) - 45% complete
Pass 1: Analyzing classes (807 / 1780) - 45% complete
Pass 1: Analyzing classes (808 / 1780) - 45% complete
Pass 1: Analyzing classes (809 / 1780) - 45% complete
Pass 1: Analyzing classes (810 / 1780) - 45% complete
Pass 1: Analyzing classes (811 / 1780) - 45% complete
Pass 1: Analyzing classes (812 / 1780) - 45% complete
Pass 1: Analyzing classes (813 / 1780) - 45% complete
Pass 1: Analyzing classes (814 / 1780) - 45% complete
Pass 1: Analyzing classes (815 / 1780) - 45% complete
Pass 1: Analyzing classes (816 / 1780) - 45% complete
Pass 1: Analyzing classes (817 / 1780) - 45% complete
Pass 1: Analyzing classes (818 / 1780) - 45% complete
Pass 1: Analyzing classes (819 / 1780) - 46% complete
Pass 1: Analyzing classes (820 / 1780) - 46% complete
Pass 1: Analyzing classes (821 / 1780) - 46% complete
Pass 1: Analyzing classes (822 / 1780) - 46% complete
Pass 1: Analyzing classes (823 / 1780) - 46% complete
Pass 1: Analyzing classes (824 / 1780) - 46% complete
Pass 1: Analyzing classes (825 / 1780) - 46% complete
Pass 1: Analyzing classes (826 / 1780) - 46% complete
Pass 1: Analyzing classes (827 / 1780) - 46% complete
Pass 1: Analyzing classes (828 / 1780) - 46% complete
Pass 1: Analyzing classes (829 / 1780) - 46% complete
Pass 1: Analyzing classes (830 / 1780) - 46% complete
Pass 1: Analyzing classes (831 / 1780) - 46% complete
Pass 1: Analyzing classes (832 / 1780) - 46% complete
Pass 1: Analyzing classes (833 / 1780) - 46% complete
Pass 1: Analyzing classes (834 / 1780) - 46% complete
Pass 1: Analyzing classes (835 / 1780) - 46% complete
Pass 1: Analyzing classes (836 / 1780) - 46% complete
Pass 1: Analyzing classes (837 / 1780) - 47% complete
Pass 1: Analyzing classes (838 / 1780) - 47% complete
Pass 1: Analyzing classes (839 / 1780) - 47% complete
Pass 1: Analyzing classes (840 / 1780) - 47% complete
Pass 1: Analyzing classes (841 / 1780) - 47% complete
Pass 1: Analyzing classes (842 / 1780) - 47% complete
Pass 1: Analyzing classes (843 / 1780) - 47% complete
Pass 1: Analyzing classes (844 / 1780) - 47% complete
Pass 1: Analyzing classes (845 / 1780) - 47% complete
Pass 1: Analyzing classes (846 / 1780) - 47% complete
Pass 1: Analyzing classes (847 / 1780) - 47% complete
Pass 1: Analyzing classes (848 / 1780) - 47% complete
Pass 1: Analyzing classes (849 / 1780) - 47% complete
Pass 1: Analyzing classes (850 / 1780) - 47% complete
Pass 1: Analyzing classes (851 / 1780) - 47% complete
Pass 1: Analyzing classes (852 / 1780) - 47% complete
Pass 1: Analyzing classes (853 / 1780) - 47% complete
Pass 1: Analyzing classes (854 / 1780) - 47% complete
Pass 1: Analyzing classes (855 / 1780) - 48% complete
Pass 1: Analyzing classes (856 / 1780) - 48% complete
Pass 1: Analyzing classes (857 / 1780) - 48% complete
Pass 1: Analyzing classes (858 / 1780) - 48% complete
Pass 1: Analyzing classes (859 / 1780) - 48% complete
Pass 1: Analyzing classes (860 / 1780) - 48% complete
Pass 1: Analyzing classes (861 / 1780) - 48% complete
Pass 1: Analyzing classes (862 / 1780) - 48% complete
Pass 1: Analyzing classes (863 / 1780) - 48% complete
Pass 1: Analyzing classes (864 / 1780) - 48% complete
Pass 1: Analyzing classes (865 / 1780) - 48% complete
Pass 1: Analyzing classes (866 / 1780) - 48% complete
Pass 1: Analyzing classes (867 / 1780) - 48% complete
Pass 1: Analyzing classes (868 / 1780) - 48% complete
Pass 1: Analyzing classes (869 / 1780) - 48% complete
Pass 1: Analyzing classes (870 / 1780) - 48% complete
Pass 1: Analyzing classes (871 / 1780) - 48% complete
Pass 1: Analyzing classes (872 / 1780) - 48% complete
Pass 1: Analyzing classes (873 / 1780) - 49% complete
Pass 1: Analyzing classes (874 / 1780) - 49% complete
Pass 1: Analyzing classes (875 / 1780) - 49% complete
Pass 1: Analyzing classes (876 / 1780) - 49% complete
Pass 1: Analyzing classes (877 / 1780) - 49% complete
Pass 1: Analyzing classes (878 / 1780) - 49% complete
Pass 1: Analyzing classes (879 / 1780) - 49% complete
Pass 1: Analyzing classes (880 / 1780) - 49% complete
Pass 1: Analyzing classes (881 / 1780) - 49% complete
Pass 1: Analyzing classes (882 / 1780) - 49% complete
Pass 1: Analyzing classes (883 / 1780) - 49% complete
Pass 1: Analyzing classes (884 / 1780) - 49% complete
Pass 1: Analyzing classes (885 / 1780) - 49% complete
Pass 1: Analyzing classes (886 / 1780) - 49% complete
Pass 1: Analyzing classes (887 / 1780) - 49% complete
Pass 1: Analyzing classes (888 / 1780) - 49% complete
Pass 1: Analyzing classes (889 / 1780) - 49% complete
Pass 1: Analyzing classes (890 / 1780) - 50% complete
Pass 1: Analyzing classes (891 / 1780) - 50% complete
Pass 1: Analyzing classes (892 / 1780) - 50% complete
Pass 1: Analyzing classes (893 / 1780) - 50% complete
Pass 1: Analyzing classes (894 / 1780) - 50% complete
Pass 1: Analyzing classes (895 / 1780) - 50% complete
Pass 1: Analyzing classes (896 / 1780) - 50% complete
Pass 1: Analyzing classes (897 / 1780) - 50% complete
Pass 1: Analyzing classes (898 / 1780) - 50% complete
Pass 1: Analyzing classes (899 / 1780) - 50% complete
Pass 1: Analyzing classes (900 / 1780) - 50% complete
Pass 1: Analyzing classes (901 / 1780) - 50% complete
Pass 1: Analyzing classes (902 / 1780) - 50% complete
Pass 1: Analyzing classes (903 / 1780) - 50% complete
Pass 1: Analyzing classes (904 / 1780) - 50% complete
Pass 1: Analyzing classes (905 / 1780) - 50% complete
Pass 1: Analyzing classes (906 / 1780) - 50% complete
Pass 1: Analyzing classes (907 / 1780) - 50% complete
Pass 1: Analyzing classes (908 / 1780) - 51% complete
Pass 1: Analyzing classes (909 / 1780) - 51% complete
Pass 1: Analyzing classes (910 / 1780) - 51% complete
Pass 1: Analyzing classes (911 / 1780) - 51% complete
Pass 1: Analyzing classes (912 / 1780) - 51% complete
Pass 1: Analyzing classes (913 / 1780) - 51% complete
Pass 1: Analyzing classes (914 / 1780) - 51% complete
Pass 1: Analyzing classes (915 / 1780) - 51% complete
Pass 1: Analyzing classes (916 / 1780) - 51% complete
Pass 1: Analyzing classes (917 / 1780) - 51% complete
Pass 1: Analyzing classes (918 / 1780) - 51% complete
Pass 1: Analyzing classes (919 / 1780) - 51% complete
Pass 1: Analyzing classes (920 / 1780) - 51% complete
Pass 1: Analyzing classes (921 / 1780) - 51% complete
Pass 1: Analyzing classes (922 / 1780) - 51% complete
Pass 1: Analyzing classes (923 / 1780) - 51% complete
Pass 1: Analyzing classes (924 / 1780) - 51% complete
Pass 1: Analyzing classes (925 / 1780) - 51% complete
Pass 1: Analyzing classes (926 / 1780) - 52% complete
Pass 1: Analyzing classes (927 / 1780) - 52% complete
Pass 1: Analyzing classes (928 / 1780) - 52% complete
Pass 1: Analyzing classes (929 / 1780) - 52% complete
Pass 1: Analyzing classes (930 / 1780) - 52% complete
Pass 1: Analyzing classes (931 / 1780) - 52% complete
Pass 1: Analyzing classes (932 / 1780) - 52% complete
Pass 1: Analyzing classes (933 / 1780) - 52% complete
Pass 1: Analyzing classes (934 / 1780) - 52% complete
Pass 1: Analyzing classes (935 / 1780) - 52% complete
Pass 1: Analyzing classes (936 / 1780) - 52% complete
Pass 1: Analyzing classes (937 / 1780) - 52% complete
Pass 1: Analyzing classes (938 / 1780) - 52% complete
Pass 1: Analyzing classes (939 / 1780) - 52% complete
Pass 1: Analyzing classes (940 / 1780) - 52% complete
Pass 1: Analyzing classes (941 / 1780) - 52% complete
Pass 1: Analyzing classes (942 / 1780) - 52% complete
Pass 1: Analyzing classes (943 / 1780) - 52% complete
Pass 1: Analyzing classes (944 / 1780) - 53% complete
Pass 1: Analyzing classes (945 / 1780) - 53% complete
Pass 1: Analyzing classes (946 / 1780) - 53% complete
Pass 1: Analyzing classes (947 / 1780) - 53% complete
Pass 1: Analyzing classes (948 / 1780) - 53% complete
Pass 1: Analyzing classes (949 / 1780) - 53% complete
Pass 1: Analyzing classes (950 / 1780) - 53% complete
Pass 1: Analyzing classes (951 / 1780) - 53% complete
Pass 1: Analyzing classes (952 / 1780) - 53% complete
Pass 1: Analyzing classes (953 / 1780) - 53% complete
Pass 1: Analyzing classes (954 / 1780) - 53% complete
Pass 1: Analyzing classes (955 / 1780) - 53% complete
Pass 1: Analyzing classes (956 / 1780) - 53% complete
Pass 1: Analyzing classes (957 / 1780) - 53% complete
Pass 1: Analyzing classes (958 / 1780) - 53% complete
Pass 1: Analyzing classes (959 / 1780) - 53% complete
Pass 1: Analyzing classes (960 / 1780) - 53% complete
Pass 1: Analyzing classes (961 / 1780) - 53% complete
Pass 1: Analyzing classes (962 / 1780) - 54% complete
Pass 1: Analyzing classes (963 / 1780) - 54% complete
Pass 1: Analyzing classes (964 / 1780) - 54% complete
Pass 1: Analyzing classes (965 / 1780) - 54% complete
Pass 1: Analyzing classes (966 / 1780) - 54% complete
Pass 1: Analyzing classes (967 / 1780) - 54% complete
Pass 1: Analyzing classes (968 / 1780) - 54% complete
Pass 1: Analyzing classes (969 / 1780) - 54% complete
Pass 1: Analyzing classes (970 / 1780) - 54% complete
Pass 1: Analyzing classes (971 / 1780) - 54% complete
Pass 1: Analyzing classes (972 / 1780) - 54% complete
Pass 1: Analyzing classes (973 / 1780) - 54% complete
Pass 1: Analyzing classes (974 / 1780) - 54% complete
Pass 1: Analyzing classes (975 / 1780) - 54% complete
Pass 1: Analyzing classes (976 / 1780) - 54% complete
Pass 1: Analyzing classes (977 / 1780) - 54% complete
Pass 1: Analyzing classes (978 / 1780) - 54% complete
Pass 1: Analyzing classes (979 / 1780) - 55% complete
Pass 1: Analyzing classes (980 / 1780) - 55% complete
Pass 1: Analyzing classes (981 / 1780) - 55% complete
Pass 1: Analyzing classes (982 / 1780) - 55% complete
Pass 1: Analyzing classes (983 / 1780) - 55% complete
Pass 1: Analyzing classes (984 / 1780) - 55% complete
Pass 1: Analyzing classes (985 / 1780) - 55% complete
Pass 1: Analyzing classes (986 / 1780) - 55% complete
Pass 1: Analyzing classes (987 / 1780) - 55% complete
Pass 1: Analyzing classes (988 / 1780) - 55% complete
Pass 1: Analyzing classes (989 / 1780) - 55% complete
Pass 1: Analyzing classes (990 / 1780) - 55% complete
Pass 1: Analyzing classes (991 / 1780) - 55% complete
Pass 1: Analyzing classes (992 / 1780) - 55% complete
Pass 1: Analyzing classes (993 / 1780) - 55% complete
Pass 1: Analyzing classes (994 / 1780) - 55% complete
Pass 1: Analyzing classes (995 / 1780) - 55% complete
Pass 1: Analyzing classes (996 / 1780) - 55% complete
Pass 1: Analyzing classes (997 / 1780) - 56% complete
Pass 1: Analyzing classes (998 / 1780) - 56% complete
Pass 1: Analyzing classes (999 / 1780) - 56% complete
Pass 1: Analyzing classes (1000 / 1780) - 56% complete
Pass 1: Analyzing classes (1001 / 1780) - 56% complete
Pass 1: Analyzing classes (1002 / 1780) - 56% complete
Pass 1: Analyzing classes (1003 / 1780) - 56% complete
Pass 1: Analyzing classes (1004 / 1780) - 56% complete
Pass 1: Analyzing classes (1005 / 1780) - 56% complete
Pass 1: Analyzing classes (1006 / 1780) - 56% complete
Pass 1: Analyzing classes (1007 / 1780) - 56% complete
Pass 1: Analyzing classes (1008 / 1780) - 56% complete
Pass 1: Analyzing classes (1009 / 1780) - 56% complete
Pass 1: Analyzing classes (1010 / 1780) - 56% complete
Pass 1: Analyzing classes (1011 / 1780) - 56% complete
Pass 1: Analyzing classes (1012 / 1780) - 56% complete
Pass 1: Analyzing classes (1013 / 1780) - 56% complete
Pass 1: Analyzing classes (1014 / 1780) - 56% complete
Pass 1: Analyzing classes (1015 / 1780) - 57% complete
Pass 1: Analyzing classes (1016 / 1780) - 57% complete
Pass 1: Analyzing classes (1017 / 1780) - 57% complete
Pass 1: Analyzing classes (1018 / 1780) - 57% complete
Pass 1: Analyzing classes (1019 / 1780) - 57% complete
Pass 1: Analyzing classes (1020 / 1780) - 57% complete
Pass 1: Analyzing classes (1021 / 1780) - 57% complete
Pass 1: Analyzing classes (1022 / 1780) - 57% complete
Pass 1: Analyzing classes (1023 / 1780) - 57% complete
Pass 1: Analyzing classes (1024 / 1780) - 57% complete
Pass 1: Analyzing classes (1025 / 1780) - 57% complete
Pass 1: Analyzing classes (1026 / 1780) - 57% complete
Pass 1: Analyzing classes (1027 / 1780) - 57% complete
Pass 1: Analyzing classes (1028 / 1780) - 57% complete
Pass 1: Analyzing classes (1029 / 1780) - 57% complete
Pass 1: Analyzing classes (1030 / 1780) - 57% complete
Pass 1: Analyzing classes (1031 / 1780) - 57% complete
Pass 1: Analyzing classes (1032 / 1780) - 57% complete
Pass 1: Analyzing classes (1033 / 1780) - 58% complete
Pass 1: Analyzing classes (1034 / 1780) - 58% complete
Pass 1: Analyzing classes (1035 / 1780) - 58% complete
Pass 1: Analyzing classes (1036 / 1780) - 58% complete
Pass 1: Analyzing classes (1037 / 1780) - 58% complete
Pass 1: Analyzing classes (1038 / 1780) - 58% complete
Pass 1: Analyzing classes (1039 / 1780) - 58% complete
Pass 1: Analyzing classes (1040 / 1780) - 58% complete
Pass 1: Analyzing classes (1041 / 1780) - 58% complete
Pass 1: Analyzing classes (1042 / 1780) - 58% complete
Pass 1: Analyzing classes (1043 / 1780) - 58% complete
Pass 1: Analyzing classes (1044 / 1780) - 58% complete
Pass 1: Analyzing classes (1045 / 1780) - 58% complete
Pass 1: Analyzing classes (1046 / 1780) - 58% complete
Pass 1: Analyzing classes (1047 / 1780) - 58% complete
Pass 1: Analyzing classes (1048 / 1780) - 58% complete
Pass 1: Analyzing classes (1049 / 1780) - 58% complete
Pass 1: Analyzing classes (1050 / 1780) - 58% complete
Pass 1: Analyzing classes (1051 / 1780) - 59% complete
Pass 1: Analyzing classes (1052 / 1780) - 59% complete
Pass 1: Analyzing classes (1053 / 1780) - 59% complete
Pass 1: Analyzing classes (1054 / 1780) - 59% complete
Pass 1: Analyzing classes (1055 / 1780) - 59% complete
Pass 1: Analyzing classes (1056 / 1780) - 59% complete
Pass 1: Analyzing classes (1057 / 1780) - 59% complete
Pass 1: Analyzing classes (1058 / 1780) - 59% complete
Pass 1: Analyzing classes (1059 / 1780) - 59% complete
Pass 1: Analyzing classes (1060 / 1780) - 59% complete
Pass 1: Analyzing classes (1061 / 1780) - 59% complete
Pass 1: Analyzing classes (1062 / 1780) - 59% complete
Pass 1: Analyzing classes (1063 / 1780) - 59% complete
Pass 1: Analyzing classes (1064 / 1780) - 59% complete
Pass 1: Analyzing classes (1065 / 1780) - 59% complete
Pass 1: Analyzing classes (1066 / 1780) - 59% complete
Pass 1: Analyzing classes (1067 / 1780) - 59% complete
Pass 1: Analyzing classes (1068 / 1780) - 60% complete
Pass 1: Analyzing classes (1069 / 1780) - 60% complete
Pass 1: Analyzing classes (1070 / 1780) - 60% complete
Pass 1: Analyzing classes (1071 / 1780) - 60% complete
Pass 1: Analyzing classes (1072 / 1780) - 60% complete
Pass 1: Analyzing classes (1073 / 1780) - 60% complete
Pass 1: Analyzing classes (1074 / 1780) - 60% complete
Pass 1: Analyzing classes (1075 / 1780) - 60% complete
Pass 1: Analyzing classes (1076 / 1780) - 60% complete
Pass 1: Analyzing classes (1077 / 1780) - 60% complete
Pass 1: Analyzing classes (1078 / 1780) - 60% complete
Pass 1: Analyzing classes (1079 / 1780) - 60% complete
Pass 1: Analyzing classes (1080 / 1780) - 60% complete
Pass 1: Analyzing classes (1081 / 1780) - 60% complete
Pass 1: Analyzing classes (1082 / 1780) - 60% complete
Pass 1: Analyzing classes (1083 / 1780) - 60% complete
Pass 1: Analyzing classes (1084 / 1780) - 60% complete
Pass 1: Analyzing classes (1085 / 1780) - 60% complete
Pass 1: Analyzing classes (1086 / 1780) - 61% complete
Pass 1: Analyzing classes (1087 / 1780) - 61% complete
Pass 1: Analyzing classes (1088 / 1780) - 61% complete
Pass 1: Analyzing classes (1089 / 1780) - 61% complete
Pass 1: Analyzing classes (1090 / 1780) - 61% complete
Pass 1: Analyzing classes (1091 / 1780) - 61% complete
Pass 1: Analyzing classes (1092 / 1780) - 61% complete
Pass 1: Analyzing classes (1093 / 1780) - 61% complete
Pass 1: Analyzing classes (1094 / 1780) - 61% complete
Pass 1: Analyzing classes (1095 / 1780) - 61% complete
Pass 1: Analyzing classes (1096 / 1780) - 61% complete
Pass 1: Analyzing classes (1097 / 1780) - 61% complete
Pass 1: Analyzing classes (1098 / 1780) - 61% complete
Pass 1: Analyzing classes (1099 / 1780) - 61% complete
Pass 1: Analyzing classes (1100 / 1780) - 61% complete
Pass 1: Analyzing classes (1101 / 1780) - 61% complete
Pass 1: Analyzing classes (1102 / 1780) - 61% complete
Pass 1: Analyzing classes (1103 / 1780) - 61% complete
Pass 1: Analyzing classes (1104 / 1780) - 62% complete
Pass 1: Analyzing classes (1105 / 1780) - 62% complete
Pass 1: Analyzing classes (1106 / 1780) - 62% complete
Pass 1: Analyzing classes (1107 / 1780) - 62% complete
Pass 1: Analyzing classes (1108 / 1780) - 62% complete
Pass 1: Analyzing classes (1109 / 1780) - 62% complete
Pass 1: Analyzing classes (1110 / 1780) - 62% complete
Pass 1: Analyzing classes (1111 / 1780) - 62% complete
Pass 1: Analyzing classes (1112 / 1780) - 62% complete
Pass 1: Analyzing classes (1113 / 1780) - 62% complete
Pass 1: Analyzing classes (1114 / 1780) - 62% complete
Pass 1: Analyzing classes (1115 / 1780) - 62% complete
Pass 1: Analyzing classes (1116 / 1780) - 62% complete
Pass 1: Analyzing classes (1117 / 1780) - 62% complete
Pass 1: Analyzing classes (1118 / 1780) - 62% complete
Pass 1: Analyzing classes (1119 / 1780) - 62% complete
Pass 1: Analyzing classes (1120 / 1780) - 62% complete
Pass 1: Analyzing classes (1121 / 1780) - 62% complete
Pass 1: Analyzing classes (1122 / 1780) - 63% complete
Pass 1: Analyzing classes (1123 / 1780) - 63% complete
Pass 1: Analyzing classes (1124 / 1780) - 63% complete
Pass 1: Analyzing classes (1125 / 1780) - 63% complete
Pass 1: Analyzing classes (1126 / 1780) - 63% complete
Pass 1: Analyzing classes (1127 / 1780) - 63% complete
Pass 1: Analyzing classes (1128 / 1780) - 63% complete
Pass 1: Analyzing classes (1129 / 1780) - 63% complete
Pass 1: Analyzing classes (1130 / 1780) - 63% complete
Pass 1: Analyzing classes (1131 / 1780) - 63% complete
Pass 1: Analyzing classes (1132 / 1780) - 63% complete
Pass 1: Analyzing classes (1133 / 1780) - 63% complete
Pass 1: Analyzing classes (1134 / 1780) - 63% complete
Pass 1: Analyzing classes (1135 / 1780) - 63% complete
Pass 1: Analyzing classes (1136 / 1780) - 63% complete
Pass 1: Analyzing classes (1137 / 1780) - 63% complete
Pass 1: Analyzing classes (1138 / 1780) - 63% complete
Pass 1: Analyzing classes (1139 / 1780) - 63% complete
Pass 1: Analyzing classes (1140 / 1780) - 64% complete
Pass 1: Analyzing classes (1141 / 1780) - 64% complete
Pass 1: Analyzing classes (1142 / 1780) - 64% complete
Pass 1: Analyzing classes (1143 / 1780) - 64% complete
Pass 1: Analyzing classes (1144 / 1780) - 64% complete
Pass 1: Analyzing classes (1145 / 1780) - 64% complete
Pass 1: Analyzing classes (1146 / 1780) - 64% complete
Pass 1: Analyzing classes (1147 / 1780) - 64% complete
Pass 1: Analyzing classes (1148 / 1780) - 64% complete
Pass 1: Analyzing classes (1149 / 1780) - 64% complete
Pass 1: Analyzing classes (1150 / 1780) - 64% complete
Pass 1: Analyzing classes (1151 / 1780) - 64% complete
Pass 1: Analyzing classes (1152 / 1780) - 64% complete
Pass 1: Analyzing classes (1153 / 1780) - 64% complete
Pass 1: Analyzing classes (1154 / 1780) - 64% complete
Pass 1: Analyzing classes (1155 / 1780) - 64% complete
Pass 1: Analyzing classes (1156 / 1780) - 64% complete
Pass 1: Analyzing classes (1157 / 1780) - 65% complete
Pass 1: Analyzing classes (1158 / 1780) - 65% complete
Pass 1: Analyzing classes (1159 / 1780) - 65% complete
Pass 1: Analyzing classes (1160 / 1780) - 65% complete
Pass 1: Analyzing classes (1161 / 1780) - 65% complete
Pass 1: Analyzing classes (1162 / 1780) - 65% complete
Pass 1: Analyzing classes (1163 / 1780) - 65% complete
Pass 1: Analyzing classes (1164 / 1780) - 65% complete
Pass 1: Analyzing classes (1165 / 1780) - 65% complete
Pass 1: Analyzing classes (1166 / 1780) - 65% complete
Pass 1: Analyzing classes (1167 / 1780) - 65% complete
Pass 1: Analyzing classes (1168 / 1780) - 65% complete
Pass 1: Analyzing classes (1169 / 1780) - 65% complete
Pass 1: Analyzing classes (1170 / 1780) - 65% complete
Pass 1: Analyzing classes (1171 / 1780) - 65% complete
Pass 1: Analyzing classes (1172 / 1780) - 65% complete
Pass 1: Analyzing classes (1173 / 1780) - 65% complete
Pass 1: Analyzing classes (1174 / 1780) - 65% complete
Pass 1: Analyzing classes (1175 / 1780) - 66% complete
Pass 1: Analyzing classes (1176 / 1780) - 66% complete
Pass 1: Analyzing classes (1177 / 1780) - 66% complete
Pass 1: Analyzing classes (1178 / 1780) - 66% complete
Pass 1: Analyzing classes (1179 / 1780) - 66% complete
Pass 1: Analyzing classes (1180 / 1780) - 66% complete
Pass 1: Analyzing classes (1181 / 1780) - 66% complete
Pass 1: Analyzing classes (1182 / 1780) - 66% complete
Pass 1: Analyzing classes (1183 / 1780) - 66% complete
Pass 1: Analyzing classes (1184 / 1780) - 66% complete
Pass 1: Analyzing classes (1185 / 1780) - 66% complete
Pass 1: Analyzing classes (1186 / 1780) - 66% complete
Pass 1: Analyzing classes (1187 / 1780) - 66% complete
Pass 1: Analyzing classes (1188 / 1780) - 66% complete
Pass 1: Analyzing classes (1189 / 1780) - 66% complete
Pass 1: Analyzing classes (1190 / 1780) - 66% complete
Pass 1: Analyzing classes (1191 / 1780) - 66% complete
Pass 1: Analyzing classes (1192 / 1780) - 66% complete
Pass 1: Analyzing classes (1193 / 1780) - 67% complete
Pass 1: Analyzing classes (1194 / 1780) - 67% complete
Pass 1: Analyzing classes (1195 / 1780) - 67% complete
Pass 1: Analyzing classes (1196 / 1780) - 67% complete
Pass 1: Analyzing classes (1197 / 1780) - 67% complete
Pass 1: Analyzing classes (1198 / 1780) - 67% complete
Pass 1: Analyzing classes (1199 / 1780) - 67% complete
Pass 1: Analyzing classes (1200 / 1780) - 67% complete
Pass 1: Analyzing classes (1201 / 1780) - 67% complete
Pass 1: Analyzing classes (1202 / 1780) - 67% complete
Pass 1: Analyzing classes (1203 / 1780) - 67% complete
Pass 1: Analyzing classes (1204 / 1780) - 67% complete
Pass 1: Analyzing classes (1205 / 1780) - 67% complete
Pass 1: Analyzing classes (1206 / 1780) - 67% complete
Pass 1: Analyzing classes (1207 / 1780) - 67% complete
Pass 1: Analyzing classes (1208 / 1780) - 67% complete
Pass 1: Analyzing classes (1209 / 1780) - 67% complete
Pass 1: Analyzing classes (1210 / 1780) - 67% complete
Pass 1: Analyzing classes (1211 / 1780) - 68% complete
Pass 1: Analyzing classes (1212 / 1780) - 68% complete
Pass 1: Analyzing classes (1213 / 1780) - 68% complete
Pass 1: Analyzing classes (1214 / 1780) - 68% complete
Pass 1: Analyzing classes (1215 / 1780) - 68% complete
Pass 1: Analyzing classes (1216 / 1780) - 68% complete
Pass 1: Analyzing classes (1217 / 1780) - 68% complete
Pass 1: Analyzing classes (1218 / 1780) - 68% complete
Pass 1: Analyzing classes (1219 / 1780) - 68% complete
Pass 1: Analyzing classes (1220 / 1780) - 68% complete
Pass 1: Analyzing classes (1221 / 1780) - 68% complete
Pass 1: Analyzing classes (1222 / 1780) - 68% complete
Pass 1: Analyzing classes (1223 / 1780) - 68% complete
Pass 1: Analyzing classes (1224 / 1780) - 68% complete
Pass 1: Analyzing classes (1225 / 1780) - 68% complete
Pass 1: Analyzing classes (1226 / 1780) - 68% complete
Pass 1: Analyzing classes (1227 / 1780) - 68% complete
Pass 1: Analyzing classes (1228 / 1780) - 68% complete
Pass 1: Analyzing classes (1229 / 1780) - 69% complete
Pass 1: Analyzing classes (1230 / 1780) - 69% complete
Pass 1: Analyzing classes (1231 / 1780) - 69% complete
Pass 1: Analyzing classes (1232 / 1780) - 69% complete
Pass 1: Analyzing classes (1233 / 1780) - 69% complete
Pass 1: Analyzing classes (1234 / 1780) - 69% complete
Pass 1: Analyzing classes (1235 / 1780) - 69% complete
Pass 1: Analyzing classes (1236 / 1780) - 69% complete
Pass 1: Analyzing classes (1237 / 1780) - 69% complete
Pass 1: Analyzing classes (1238 / 1780) - 69% complete
Pass 1: Analyzing classes (1239 / 1780) - 69% complete
Pass 1: Analyzing classes (1240 / 1780) - 69% complete
Pass 1: Analyzing classes (1241 / 1780) - 69% complete
Pass 1: Analyzing classes (1242 / 1780) - 69% complete
Pass 1: Analyzing classes (1243 / 1780) - 69% complete
Pass 1: Analyzing classes (1244 / 1780) - 69% complete
Pass 1: Analyzing classes (1245 / 1780) - 69% complete
Pass 1: Analyzing classes (1246 / 1780) - 70% complete
Pass 1: Analyzing classes (1247 / 1780) - 70% complete
Pass 1: Analyzing classes (1248 / 1780) - 70% complete
Pass 1: Analyzing classes (1249 / 1780) - 70% complete
Pass 1: Analyzing classes (1250 / 1780) - 70% complete
Pass 1: Analyzing classes (1251 / 1780) - 70% complete
Pass 1: Analyzing classes (1252 / 1780) - 70% complete
Pass 1: Analyzing classes (1253 / 1780) - 70% complete
Pass 1: Analyzing classes (1254 / 1780) - 70% complete
Pass 1: Analyzing classes (1255 / 1780) - 70% complete
Pass 1: Analyzing classes (1256 / 1780) - 70% complete
Pass 1: Analyzing classes (1257 / 1780) - 70% complete
Pass 1: Analyzing classes (1258 / 1780) - 70% complete
Pass 1: Analyzing classes (1259 / 1780) - 70% complete
Pass 1: Analyzing classes (1260 / 1780) - 70% complete
Pass 1: Analyzing classes (1261 / 1780) - 70% complete
Pass 1: Analyzing classes (1262 / 1780) - 70% complete
Pass 1: Analyzing classes (1263 / 1780) - 70% complete
Pass 1: Analyzing classes (1264 / 1780) - 71% complete
Pass 1: Analyzing classes (1265 / 1780) - 71% complete
Pass 1: Analyzing classes (1266 / 1780) - 71% complete
Pass 1: Analyzing classes (1267 / 1780) - 71% complete
Pass 1: Analyzing classes (1268 / 1780) - 71% complete
Pass 1: Analyzing classes (1269 / 1780) - 71% complete
Pass 1: Analyzing classes (1270 / 1780) - 71% complete
Pass 1: Analyzing classes (1271 / 1780) - 71% complete
Pass 1: Analyzing classes (1272 / 1780) - 71% complete
Pass 1: Analyzing classes (1273 / 1780) - 71% complete
Pass 1: Analyzing classes (1274 / 1780) - 71% complete
Pass 1: Analyzing classes (1275 / 1780) - 71% complete
Pass 1: Analyzing classes (1276 / 1780) - 71% complete
Pass 1: Analyzing classes (1277 / 1780) - 71% complete
Pass 1: Analyzing classes (1278 / 1780) - 71% complete
Pass 1: Analyzing classes (1279 / 1780) - 71% complete
Pass 1: Analyzing classes (1280 / 1780) - 71% complete
Pass 1: Analyzing classes (1281 / 1780) - 71% complete
Pass 1: Analyzing classes (1282 / 1780) - 72% complete
Pass 1: Analyzing classes (1283 / 1780) - 72% complete
Pass 1: Analyzing classes (1284 / 1780) - 72% complete
Pass 1: Analyzing classes (1285 / 1780) - 72% complete
Pass 1: Analyzing classes (1286 / 1780) - 72% complete
Pass 1: Analyzing classes (1287 / 1780) - 72% complete
Pass 1: Analyzing classes (1288 / 1780) - 72% complete
Pass 1: Analyzing classes (1289 / 1780) - 72% complete
Pass 1: Analyzing classes (1290 / 1780) - 72% complete
Pass 1: Analyzing classes (1291 / 1780) - 72% complete
Pass 1: Analyzing classes (1292 / 1780) - 72% complete
Pass 1: Analyzing classes (1293 / 1780) - 72% complete
Pass 1: Analyzing classes (1294 / 1780) - 72% complete
Pass 1: Analyzing classes (1295 / 1780) - 72% complete
Pass 1: Analyzing classes (1296 / 1780) - 72% complete
Pass 1: Analyzing classes (1297 / 1780) - 72% complete
Pass 1: Analyzing classes (1298 / 1780) - 72% complete
Pass 1: Analyzing classes (1299 / 1780) - 72% complete
Pass 1: Analyzing classes (1300 / 1780) - 73% complete
Pass 1: Analyzing classes (1301 / 1780) - 73% complete
Pass 1: Analyzing classes (1302 / 1780) - 73% complete
Pass 1: Analyzing classes (1303 / 1780) - 73% complete
Pass 1: Analyzing classes (1304 / 1780) - 73% complete
Pass 1: Analyzing classes (1305 / 1780) - 73% complete
Pass 1: Analyzing classes (1306 / 1780) - 73% complete
Pass 1: Analyzing classes (1307 / 1780) - 73% complete
Pass 1: Analyzing classes (1308 / 1780) - 73% complete
Pass 1: Analyzing classes (1309 / 1780) - 73% complete
Pass 1: Analyzing classes (1310 / 1780) - 73% complete
Pass 1: Analyzing classes (1311 / 1780) - 73% complete
Pass 1: Analyzing classes (1312 / 1780) - 73% complete
Pass 1: Analyzing classes (1313 / 1780) - 73% complete
Pass 1: Analyzing classes (1314 / 1780) - 73% complete
Pass 1: Analyzing classes (1315 / 1780) - 73% complete
Pass 1: Analyzing classes (1316 / 1780) - 73% complete
Pass 1: Analyzing classes (1317 / 1780) - 73% complete
Pass 1: Analyzing classes (1318 / 1780) - 74% complete
Pass 1: Analyzing classes (1319 / 1780) - 74% complete
Pass 1: Analyzing classes (1320 / 1780) - 74% complete
Pass 1: Analyzing classes (1321 / 1780) - 74% complete
Pass 1: Analyzing classes (1322 / 1780) - 74% complete
Pass 1: Analyzing classes (1323 / 1780) - 74% complete
Pass 1: Analyzing classes (1324 / 1780) - 74% complete
Pass 1: Analyzing classes (1325 / 1780) - 74% complete
Pass 1: Analyzing classes (1326 / 1780) - 74% complete
Pass 1: Analyzing classes (1327 / 1780) - 74% complete
Pass 1: Analyzing classes (1328 / 1780) - 74% complete
Pass 1: Analyzing classes (1329 / 1780) - 74% complete
Pass 1: Analyzing classes (1330 / 1780) - 74% complete
Pass 1: Analyzing classes (1331 / 1780) - 74% complete
Pass 1: Analyzing classes (1332 / 1780) - 74% complete
Pass 1: Analyzing classes (1333 / 1780) - 74% complete
Pass 1: Analyzing classes (1334 / 1780) - 74% complete
Pass 1: Analyzing classes (1335 / 1780) - 75% complete
Pass 1: Analyzing classes (1336 / 1780) - 75% complete
Pass 1: Analyzing classes (1337 / 1780) - 75% complete
Pass 1: Analyzing classes (1338 / 1780) - 75% complete
Pass 1: Analyzing classes (1339 / 1780) - 75% complete
Pass 1: Analyzing classes (1340 / 1780) - 75% complete
Pass 1: Analyzing classes (1341 / 1780) - 75% complete
Pass 1: Analyzing classes (1342 / 1780) - 75% complete
Pass 1: Analyzing classes (1343 / 1780) - 75% complete
Pass 1: Analyzing classes (1344 / 1780) - 75% complete
Pass 1: Analyzing classes (1345 / 1780) - 75% complete
Pass 1: Analyzing classes (1346 / 1780) - 75% complete
Pass 1: Analyzing classes (1347 / 1780) - 75% complete
Pass 1: Analyzing classes (1348 / 1780) - 75% complete
Pass 1: Analyzing classes (1349 / 1780) - 75% complete
Pass 1: Analyzing classes (1350 / 1780) - 75% complete
Pass 1: Analyzing classes (1351 / 1780) - 75% complete
Pass 1: Analyzing classes (1352 / 1780) - 75% complete
Pass 1: Analyzing classes (1353 / 1780) - 76% complete
Pass 1: Analyzing classes (1354 / 1780) - 76% complete
Pass 1: Analyzing classes (1355 / 1780) - 76% complete
Pass 1: Analyzing classes (1356 / 1780) - 76% complete
Pass 1: Analyzing classes (1357 / 1780) - 76% complete
Pass 1: Analyzing classes (1358 / 1780) - 76% complete
Pass 1: Analyzing classes (1359 / 1780) - 76% complete
Pass 1: Analyzing classes (1360 / 1780) - 76% complete
Pass 1: Analyzing classes (1361 / 1780) - 76% complete
Pass 1: Analyzing classes (1362 / 1780) - 76% complete
Pass 1: Analyzing classes (1363 / 1780) - 76% complete
Pass 1: Analyzing classes (1364 / 1780) - 76% complete
Pass 1: Analyzing classes (1365 / 1780) - 76% complete
Pass 1: Analyzing classes (1366 / 1780) - 76% complete
Pass 1: Analyzing classes (1367 / 1780) - 76% complete
Pass 1: Analyzing classes (1368 / 1780) - 76% complete
Pass 1: Analyzing classes (1369 / 1780) - 76% complete
Pass 1: Analyzing classes (1370 / 1780) - 76% complete
Pass 1: Analyzing classes (1371 / 1780) - 77% complete
Pass 1: Analyzing classes (1372 / 1780) - 77% complete
Pass 1: Analyzing classes (1373 / 1780) - 77% complete
Pass 1: Analyzing classes (1374 / 1780) - 77% complete
Pass 1: Analyzing classes (1375 / 1780) - 77% complete
Pass 1: Analyzing classes (1376 / 1780) - 77% complete
Pass 1: Analyzing classes (1377 / 1780) - 77% complete
Pass 1: Analyzing classes (1378 / 1780) - 77% complete
Pass 1: Analyzing classes (1379 / 1780) - 77% complete
Pass 1: Analyzing classes (1380 / 1780) - 77% complete
Pass 1: Analyzing classes (1381 / 1780) - 77% complete
Pass 1: Analyzing classes (1382 / 1780) - 77% complete
Pass 1: Analyzing classes (1383 / 1780) - 77% complete
Pass 1: Analyzing classes (1384 / 1780) - 77% complete
Pass 1: Analyzing classes (1385 / 1780) - 77% complete
Pass 1: Analyzing classes (1386 / 1780) - 77% complete
Pass 1: Analyzing classes (1387 / 1780) - 77% complete
Pass 1: Analyzing classes (1388 / 1780) - 77% complete
Pass 1: Analyzing classes (1389 / 1780) - 78% complete
Pass 1: Analyzing classes (1390 / 1780) - 78% complete
Pass 1: Analyzing classes (1391 / 1780) - 78% complete
Pass 1: Analyzing classes (1392 / 1780) - 78% complete
Pass 1: Analyzing classes (1393 / 1780) - 78% complete
Pass 1: Analyzing classes (1394 / 1780) - 78% complete
Pass 1: Analyzing classes (1395 / 1780) - 78% complete
Pass 1: Analyzing classes (1396 / 1780) - 78% complete
Pass 1: Analyzing classes (1397 / 1780) - 78% complete
Pass 1: Analyzing classes (1398 / 1780) - 78% complete
Pass 1: Analyzing classes (1399 / 1780) - 78% complete
Pass 1: Analyzing classes (1400 / 1780) - 78% complete
Pass 1: Analyzing classes (1401 / 1780) - 78% complete
Pass 1: Analyzing classes (1402 / 1780) - 78% complete
Pass 1: Analyzing classes (1403 / 1780) - 78% complete
Pass 1: Analyzing classes (1404 / 1780) - 78% complete
Pass 1: Analyzing classes (1405 / 1780) - 78% complete
Pass 1: Analyzing classes (1406 / 1780) - 78% complete
Pass 1: Analyzing classes (1407 / 1780) - 79% complete
Pass 1: Analyzing classes (1408 / 1780) - 79% complete
Pass 1: Analyzing classes (1409 / 1780) - 79% complete
Pass 1: Analyzing classes (1410 / 1780) - 79% complete
Pass 1: Analyzing classes (1411 / 1780) - 79% complete
Pass 1: Analyzing classes (1412 / 1780) - 79% complete
Pass 1: Analyzing classes (1413 / 1780) - 79% complete
Pass 1: Analyzing classes (1414 / 1780) - 79% complete
Pass 1: Analyzing classes (1415 / 1780) - 79% complete
Pass 1: Analyzing classes (1416 / 1780) - 79% complete
Pass 1: Analyzing classes (1417 / 1780) - 79% complete
Pass 1: Analyzing classes (1418 / 1780) - 79% complete
Pass 1: Analyzing classes (1419 / 1780) - 79% complete
Pass 1: Analyzing classes (1420 / 1780) - 79% complete
Pass 1: Analyzing classes (1421 / 1780) - 79% complete
Pass 1: Analyzing classes (1422 / 1780) - 79% complete
Pass 1: Analyzing classes (1423 / 1780) - 79% complete
Pass 1: Analyzing classes (1424 / 1780) - 80% complete
Pass 1: Analyzing classes (1425 / 1780) - 80% complete
Pass 1: Analyzing classes (1426 / 1780) - 80% complete
Pass 1: Analyzing classes (1427 / 1780) - 80% complete
Pass 1: Analyzing classes (1428 / 1780) - 80% complete
Pass 1: Analyzing classes (1429 / 1780) - 80% complete
Pass 1: Analyzing classes (1430 / 1780) - 80% complete
Pass 1: Analyzing classes (1431 / 1780) - 80% complete
Pass 1: Analyzing classes (1432 / 1780) - 80% complete
Pass 1: Analyzing classes (1433 / 1780) - 80% complete
Pass 1: Analyzing classes (1434 / 1780) - 80% complete
Pass 1: Analyzing classes (1435 / 1780) - 80% complete
Pass 1: Analyzing classes (1436 / 1780) - 80% complete
Pass 1: Analyzing classes (1437 / 1780) - 80% complete
Pass 1: Analyzing classes (1438 / 1780) - 80% complete
Pass 1: Analyzing classes (1439 / 1780) - 80% complete
Pass 1: Analyzing classes (1440 / 1780) - 80% complete
Pass 1: Analyzing classes (1441 / 1780) - 80% complete
Pass 1: Analyzing classes (1442 / 1780) - 81% complete
Pass 1: Analyzing classes (1443 / 1780) - 81% complete
Pass 1: Analyzing classes (1444 / 1780) - 81% complete
Pass 1: Analyzing classes (1445 / 1780) - 81% complete
Pass 1: Analyzing classes (1446 / 1780) - 81% complete
Pass 1: Analyzing classes (1447 / 1780) - 81% complete
Pass 1: Analyzing classes (1448 / 1780) - 81% complete
Pass 1: Analyzing classes (1449 / 1780) - 81% complete
Pass 1: Analyzing classes (1450 / 1780) - 81% complete
Pass 1: Analyzing classes (1451 / 1780) - 81% complete
Pass 1: Analyzing classes (1452 / 1780) - 81% complete
Pass 1: Analyzing classes (1453 / 1780) - 81% complete
Pass 1: Analyzing classes (1454 / 1780) - 81% complete
Pass 1: Analyzing classes (1455 / 1780) - 81% complete
Pass 1: Analyzing classes (1456 / 1780) - 81% complete
Pass 1: Analyzing classes (1457 / 1780) - 81% complete
Pass 1: Analyzing classes (1458 / 1780) - 81% complete
Pass 1: Analyzing classes (1459 / 1780) - 81% complete
Pass 1: Analyzing classes (1460 / 1780) - 82% complete
Pass 1: Analyzing classes (1461 / 1780) - 82% complete
Pass 1: Analyzing classes (1462 / 1780) - 82% complete
Pass 1: Analyzing classes (1463 / 1780) - 82% complete
Pass 1: Analyzing classes (1464 / 1780) - 82% complete
Pass 1: Analyzing classes (1465 / 1780) - 82% complete
Pass 1: Analyzing classes (1466 / 1780) - 82% complete
Pass 1: Analyzing classes (1467 / 1780) - 82% complete
Pass 1: Analyzing classes (1468 / 1780) - 82% complete
Pass 1: Analyzing classes (1469 / 1780) - 82% complete
Pass 1: Analyzing classes (1470 / 1780) - 82% complete
Pass 1: Analyzing classes (1471 / 1780) - 82% complete
Pass 1: Analyzing classes (1472 / 1780) - 82% complete
Pass 1: Analyzing classes (1473 / 1780) - 82% complete
Pass 1: Analyzing classes (1474 / 1780) - 82% complete
Pass 1: Analyzing classes (1475 / 1780) - 82% complete
Pass 1: Analyzing classes (1476 / 1780) - 82% complete
Pass 1: Analyzing classes (1477 / 1780) - 82% complete
Pass 1: Analyzing classes (1478 / 1780) - 83% complete
Pass 1: Analyzing classes (1479 / 1780) - 83% complete
Pass 1: Analyzing classes (1480 / 1780) - 83% complete
Pass 1: Analyzing classes (1481 / 1780) - 83% complete
Pass 1: Analyzing classes (1482 / 1780) - 83% complete
Pass 1: Analyzing classes (1483 / 1780) - 83% complete
Pass 1: Analyzing classes (1484 / 1780) - 83% complete
Pass 1: Analyzing classes (1485 / 1780) - 83% complete
Pass 1: Analyzing classes (1486 / 1780) - 83% complete
Pass 1: Analyzing classes (1487 / 1780) - 83% complete
Pass 1: Analyzing classes (1488 / 1780) - 83% complete
Pass 1: Analyzing classes (1489 / 1780) - 83% complete
Pass 1: Analyzing classes (1490 / 1780) - 83% complete
Pass 1: Analyzing classes (1491 / 1780) - 83% complete
Pass 1: Analyzing classes (1492 / 1780) - 83% complete
Pass 1: Analyzing classes (1493 / 1780) - 83% complete
Pass 1: Analyzing classes (1494 / 1780) - 83% complete
Pass 1: Analyzing classes (1495 / 1780) - 83% complete
Pass 1: Analyzing classes (1496 / 1780) - 84% complete
Pass 1: Analyzing classes (1497 / 1780) - 84% complete
Pass 1: Analyzing classes (1498 / 1780) - 84% complete
Pass 1: Analyzing classes (1499 / 1780) - 84% complete
Pass 1: Analyzing classes (1500 / 1780) - 84% complete
Pass 1: Analyzing classes (1501 / 1780) - 84% complete
Pass 1: Analyzing classes (1502 / 1780) - 84% complete
Pass 1: Analyzing classes (1503 / 1780) - 84% complete
Pass 1: Analyzing classes (1504 / 1780) - 84% complete
Pass 1: Analyzing classes (1505 / 1780) - 84% complete
Pass 1: Analyzing classes (1506 / 1780) - 84% complete
Pass 1: Analyzing classes (1507 / 1780) - 84% complete
Pass 1: Analyzing classes (1508 / 1780) - 84% complete
Pass 1: Analyzing classes (1509 / 1780) - 84% complete
Pass 1: Analyzing classes (1510 / 1780) - 84% complete
Pass 1: Analyzing classes (1511 / 1780) - 84% complete
Pass 1: Analyzing classes (1512 / 1780) - 84% complete
Pass 1: Analyzing classes (1513 / 1780) - 85% complete
Pass 1: Analyzing classes (1514 / 1780) - 85% complete
Pass 1: Analyzing classes (1515 / 1780) - 85% complete
Pass 1: Analyzing classes (1516 / 1780) - 85% complete
Pass 1: Analyzing classes (1517 / 1780) - 85% complete
Pass 1: Analyzing classes (1518 / 1780) - 85% complete
Pass 1: Analyzing classes (1519 / 1780) - 85% complete
Pass 1: Analyzing classes (1520 / 1780) - 85% complete
Pass 1: Analyzing classes (1521 / 1780) - 85% complete
Pass 1: Analyzing classes (1522 / 1780) - 85% complete
Pass 1: Analyzing classes (1523 / 1780) - 85% complete
Pass 1: Analyzing classes (1524 / 1780) - 85% complete
Pass 1: Analyzing classes (1525 / 1780) - 85% complete
Pass 1: Analyzing classes (1526 / 1780) - 85% complete
Pass 1: Analyzing classes (1527 / 1780) - 85% complete
Pass 1: Analyzing classes (1528 / 1780) - 85% complete
Pass 1: Analyzing classes (1529 / 1780) - 85% complete
Pass 1: Analyzing classes (1530 / 1780) - 85% complete
Pass 1: Analyzing classes (1531 / 1780) - 86% complete
Pass 1: Analyzing classes (1532 / 1780) - 86% complete
Pass 1: Analyzing classes (1533 / 1780) - 86% complete
Pass 1: Analyzing classes (1534 / 1780) - 86% complete
Pass 1: Analyzing classes (1535 / 1780) - 86% complete
Pass 1: Analyzing classes (1536 / 1780) - 86% complete
Pass 1: Analyzing classes (1537 / 1780) - 86% complete
Pass 1: Analyzing classes (1538 / 1780) - 86% complete
Pass 1: Analyzing classes (1539 / 1780) - 86% complete
Pass 1: Analyzing classes (1540 / 1780) - 86% complete
Pass 1: Analyzing classes (1541 / 1780) - 86% complete
Pass 1: Analyzing classes (1542 / 1780) - 86% complete
Pass 1: Analyzing classes (1543 / 1780) - 86% complete
Pass 1: Analyzing classes (1544 / 1780) - 86% complete
Pass 1: Analyzing classes (1545 / 1780) - 86% complete
Pass 1: Analyzing classes (1546 / 1780) - 86% complete
Pass 1: Analyzing classes (1547 / 1780) - 86% complete
Pass 1: Analyzing classes (1548 / 1780) - 86% complete
Pass 1: Analyzing classes (1549 / 1780) - 87% complete
Pass 1: Analyzing classes (1550 / 1780) - 87% complete
Pass 1: Analyzing classes (1551 / 1780) - 87% complete
Pass 1: Analyzing classes (1552 / 1780) - 87% complete
Pass 1: Analyzing classes (1553 / 1780) - 87% complete
Pass 1: Analyzing classes (1554 / 1780) - 87% complete
Pass 1: Analyzing classes (1555 / 1780) - 87% complete
Pass 1: Analyzing classes (1556 / 1780) - 87% complete
Pass 1: Analyzing classes (1557 / 1780) - 87% complete
Pass 1: Analyzing classes (1558 / 1780) - 87% complete
Pass 1: Analyzing classes (1559 / 1780) - 87% complete
Pass 1: Analyzing classes (1560 / 1780) - 87% complete
Pass 1: Analyzing classes (1561 / 1780) - 87% complete
Pass 1: Analyzing classes (1562 / 1780) - 87% complete
Pass 1: Analyzing classes (1563 / 1780) - 87% complete
Pass 1: Analyzing classes (1564 / 1780) - 87% complete
Pass 1: Analyzing classes (1565 / 1780) - 87% complete
Pass 1: Analyzing classes (1566 / 1780) - 87% complete
Pass 1: Analyzing classes (1567 / 1780) - 88% complete
Pass 1: Analyzing classes (1568 / 1780) - 88% complete
Pass 1: Analyzing classes (1569 / 1780) - 88% complete
Pass 1: Analyzing classes (1570 / 1780) - 88% complete
Pass 1: Analyzing classes (1571 / 1780) - 88% complete
Pass 1: Analyzing classes (1572 / 1780) - 88% complete
Pass 1: Analyzing classes (1573 / 1780) - 88% complete
Pass 1: Analyzing classes (1574 / 1780) - 88% complete
Pass 1: Analyzing classes (1575 / 1780) - 88% complete
Pass 1: Analyzing classes (1576 / 1780) - 88% complete
Pass 1: Analyzing classes (1577 / 1780) - 88% complete
Pass 1: Analyzing classes (1578 / 1780) - 88% complete
Pass 1: Analyzing classes (1579 / 1780) - 88% complete
Pass 1: Analyzing classes (1580 / 1780) - 88% complete
Pass 1: Analyzing classes (1581 / 1780) - 88% complete
Pass 1: Analyzing classes (1582 / 1780) - 88% complete
Pass 1: Analyzing classes (1583 / 1780) - 88% complete
Pass 1: Analyzing classes (1584 / 1780) - 88% complete
Pass 1: Analyzing classes (1585 / 1780) - 89% complete
Pass 1: Analyzing classes (1586 / 1780) - 89% complete
Pass 1: Analyzing classes (1587 / 1780) - 89% complete
Pass 1: Analyzing classes (1588 / 1780) - 89% complete
Pass 1: Analyzing classes (1589 / 1780) - 89% complete
Pass 1: Analyzing classes (1590 / 1780) - 89% complete
Pass 1: Analyzing classes (1591 / 1780) - 89% complete
Pass 1: Analyzing classes (1592 / 1780) - 89% complete
Pass 1: Analyzing classes (1593 / 1780) - 89% complete
Pass 1: Analyzing classes (1594 / 1780) - 89% complete
Pass 1: Analyzing classes (1595 / 1780) - 89% complete
Pass 1: Analyzing classes (1596 / 1780) - 89% complete
Pass 1: Analyzing classes (1597 / 1780) - 89% complete
Pass 1: Analyzing classes (1598 / 1780) - 89% complete
Pass 1: Analyzing classes (1599 / 1780) - 89% complete
Pass 1: Analyzing classes (1600 / 1780) - 89% complete
Pass 1: Analyzing classes (1601 / 1780) - 89% complete
Pass 1: Analyzing classes (1602 / 1780) - 90% complete
Pass 1: Analyzing classes (1603 / 1780) - 90% complete
Pass 1: Analyzing classes (1604 / 1780) - 90% complete
Pass 1: Analyzing classes (1605 / 1780) - 90% complete
Pass 1: Analyzing classes (1606 / 1780) - 90% complete
Pass 1: Analyzing classes (1607 / 1780) - 90% complete
Pass 1: Analyzing classes (1608 / 1780) - 90% complete
Pass 1: Analyzing classes (1609 / 1780) - 90% complete
Pass 1: Analyzing classes (1610 / 1780) - 90% complete
Pass 1: Analyzing classes (1611 / 1780) - 90% complete
Pass 1: Analyzing classes (1612 / 1780) - 90% complete
Pass 1: Analyzing classes (1613 / 1780) - 90% complete
Pass 1: Analyzing classes (1614 / 1780) - 90% complete
Pass 1: Analyzing classes (1615 / 1780) - 90% complete
Pass 1: Analyzing classes (1616 / 1780) - 90% complete
Pass 1: Analyzing classes (1617 / 1780) - 90% complete
Pass 1: Analyzing classes (1618 / 1780) - 90% complete
Pass 1: Analyzing classes (1619 / 1780) - 90% complete
Pass 1: Analyzing classes (1620 / 1780) - 91% complete
Pass 1: Analyzing classes (1621 / 1780) - 91% complete
Pass 1: Analyzing classes (1622 / 1780) - 91% complete
Pass 1: Analyzing classes (1623 / 1780) - 91% complete
Pass 1: Analyzing classes (1624 / 1780) - 91% complete
Pass 1: Analyzing classes (1625 / 1780) - 91% complete
Pass 1: Analyzing classes (1626 / 1780) - 91% complete
Pass 1: Analyzing classes (1627 / 1780) - 91% complete
Pass 1: Analyzing classes (1628 / 1780) - 91% complete
Pass 1: Analyzing classes (1629 / 1780) - 91% complete
Pass 1: Analyzing classes (1630 / 1780) - 91% complete
Pass 1: Analyzing classes (1631 / 1780) - 91% complete
Pass 1: Analyzing classes (1632 / 1780) - 91% complete
Pass 1: Analyzing classes (1633 / 1780) - 91% complete
Pass 1: Analyzing classes (1634 / 1780) - 91% complete
Pass 1: Analyzing classes (1635 / 1780) - 91% complete
Pass 1: Analyzing classes (1636 / 1780) - 91% complete
Pass 1: Analyzing classes (1637 / 1780) - 91% complete
Pass 1: Analyzing classes (1638 / 1780) - 92% complete
Pass 1: Analyzing classes (1639 / 1780) - 92% complete
Pass 1: Analyzing classes (1640 / 1780) - 92% complete
Pass 1: Analyzing classes (1641 / 1780) - 92% complete
Pass 1: Analyzing classes (1642 / 1780) - 92% complete
Pass 1: Analyzing classes (1643 / 1780) - 92% complete
Pass 1: Analyzing classes (1644 / 1780) - 92% complete
Pass 1: Analyzing classes (1645 / 1780) - 92% complete
Pass 1: Analyzing classes (1646 / 1780) - 92% complete
Pass 1: Analyzing classes (1647 / 1780) - 92% complete
Pass 1: Analyzing classes (1648 / 1780) - 92% complete
Pass 1: Analyzing classes (1649 / 1780) - 92% complete
Pass 1: Analyzing classes (1650 / 1780) - 92% complete
Pass 1: Analyzing classes (1651 / 1780) - 92% complete
Pass 1: Analyzing classes (1652 / 1780) - 92% complete
Pass 1: Analyzing classes (1653 / 1780) - 92% complete
Pass 1: Analyzing classes (1654 / 1780) - 92% complete
Pass 1: Analyzing classes (1655 / 1780) - 92% complete
Pass 1: Analyzing classes (1656 / 1780) - 93% complete
Pass 1: Analyzing classes (1657 / 1780) - 93% complete
Pass 1: Analyzing classes (1658 / 1780) - 93% complete
Pass 1: Analyzing classes (1659 / 1780) - 93% complete
Pass 1: Analyzing classes (1660 / 1780) - 93% complete
Pass 1: Analyzing classes (1661 / 1780) - 93% complete
Pass 1: Analyzing classes (1662 / 1780) - 93% complete
Pass 1: Analyzing classes (1663 / 1780) - 93% complete
Pass 1: Analyzing classes (1664 / 1780) - 93% complete
Pass 1: Analyzing classes (1665 / 1780) - 93% complete
Pass 1: Analyzing classes (1666 / 1780) - 93% complete
Pass 1: Analyzing classes (1667 / 1780) - 93% complete
Pass 1: Analyzing classes (1668 / 1780) - 93% complete
Pass 1: Analyzing classes (1669 / 1780) - 93% complete
Pass 1: Analyzing classes (1670 / 1780) - 93% complete
Pass 1: Analyzing classes (1671 / 1780) - 93% complete
Pass 1: Analyzing classes (1672 / 1780) - 93% complete
Pass 1: Analyzing classes (1673 / 1780) - 93% complete
Pass 1: Analyzing classes (1674 / 1780) - 94% complete
Pass 1: Analyzing classes (1675 / 1780) - 94% complete
Pass 1: Analyzing classes (1676 / 1780) - 94% complete
Pass 1: Analyzing classes (1677 / 1780) - 94% complete
Pass 1: Analyzing classes (1678 / 1780) - 94% complete
Pass 1: Analyzing classes (1679 / 1780) - 94% complete
Pass 1: Analyzing classes (1680 / 1780) - 94% complete
Pass 1: Analyzing classes (1681 / 1780) - 94% complete
Pass 1: Analyzing classes (1682 / 1780) - 94% complete
Pass 1: Analyzing classes (1683 / 1780) - 94% complete
Pass 1: Analyzing classes (1684 / 1780) - 94% complete
Pass 1: Analyzing classes (1685 / 1780) - 94% complete
Pass 1: Analyzing classes (1686 / 1780) - 94% complete
Pass 1: Analyzing classes (1687 / 1780) - 94% complete
Pass 1: Analyzing classes (1688 / 1780) - 94% complete
Pass 1: Analyzing classes (1689 / 1780) - 94% complete
Pass 1: Analyzing classes (1690 / 1780) - 94% complete
Pass 1: Analyzing classes (1691 / 1780) - 95% complete
Pass 1: Analyzing classes (1692 / 1780) - 95% complete
Pass 1: Analyzing classes (1693 / 1780) - 95% complete
Pass 1: Analyzing classes (1694 / 1780) - 95% complete
Pass 1: Analyzing classes (1695 / 1780) - 95% complete
Pass 1: Analyzing classes (1696 / 1780) - 95% complete
Pass 1: Analyzing classes (1697 / 1780) - 95% complete
Pass 1: Analyzing classes (1698 / 1780) - 95% complete
Pass 1: Analyzing classes (1699 / 1780) - 95% complete
Pass 1: Analyzing classes (1700 / 1780) - 95% complete
Pass 1: Analyzing classes (1701 / 1780) - 95% complete
Pass 1: Analyzing classes (1702 / 1780) - 95% complete
Pass 1: Analyzing classes (1703 / 1780) - 95% complete
Pass 1: Analyzing classes (1704 / 1780) - 95% complete
Pass 1: Analyzing classes (1705 / 1780) - 95% complete
Pass 1: Analyzing classes (1706 / 1780) - 95% complete
Pass 1: Analyzing classes (1707 / 1780) - 95% complete
Pass 1: Analyzing classes (1708 / 1780) - 95% complete
Pass 1: Analyzing classes (1709 / 1780) - 96% complete
Pass 1: Analyzing classes (1710 / 1780) - 96% complete
Pass 1: Analyzing classes (1711 / 1780) - 96% complete
Pass 1: Analyzing classes (1712 / 1780) - 96% complete
Pass 1: Analyzing classes (1713 / 1780) - 96% complete
Pass 1: Analyzing classes (1714 / 1780) - 96% complete
Pass 1: Analyzing classes (1715 / 1780) - 96% complete
Pass 1: Analyzing classes (1716 / 1780) - 96% complete
Pass 1: Analyzing classes (1717 / 1780) - 96% complete
Pass 1: Analyzing classes (1718 / 1780) - 96% complete
Pass 1: Analyzing classes (1719 / 1780) - 96% complete
Pass 1: Analyzing classes (1720 / 1780) - 96% complete
Pass 1: Analyzing classes (1721 / 1780) - 96% complete
Pass 1: Analyzing classes (1722 / 1780) - 96% complete
Pass 1: Analyzing classes (1723 / 1780) - 96% complete
Pass 1: Analyzing classes (1724 / 1780) - 96% complete
Pass 1: Analyzing classes (1725 / 1780) - 96% complete
Pass 1: Analyzing classes (1726 / 1780) - 96% complete
Pass 1: Analyzing classes (1727 / 1780) - 97% complete
Pass 1: Analyzing classes (1728 / 1780) - 97% complete
Pass 1: Analyzing classes (1729 / 1780) - 97% complete
Pass 1: Analyzing classes (1730 / 1780) - 97% complete
Pass 1: Analyzing classes (1731 / 1780) - 97% complete
Pass 1: Analyzing classes (1732 / 1780) - 97% complete
Pass 1: Analyzing classes (1733 / 1780) - 97% complete
Pass 1: Analyzing classes (1734 / 1780) - 97% complete
Pass 1: Analyzing classes (1735 / 1780) - 97% complete
Pass 1: Analyzing classes (1736 / 1780) - 97% complete
Pass 1: Analyzing classes (1737 / 1780) - 97% complete
Pass 1: Analyzing classes (1738 / 1780) - 97% complete
Pass 1: Analyzing classes (1739 / 1780) - 97% complete
Pass 1: Analyzing classes (1740 / 1780) - 97% complete
Pass 1: Analyzing classes (1741 / 1780) - 97% complete
Pass 1: Analyzing classes (1742 / 1780) - 97% complete
Pass 1: Analyzing classes (1743 / 1780) - 97% complete
Pass 1: Analyzing classes (1744 / 1780) - 97% complete
Pass 1: Analyzing classes (1745 / 1780) - 98% complete
Pass 1: Analyzing classes (1746 / 1780) - 98% complete
Pass 1: Analyzing classes (1747 / 1780) - 98% complete
Pass 1: Analyzing classes (1748 / 1780) - 98% complete
Pass 1: Analyzing classes (1749 / 1780) - 98% complete
Pass 1: Analyzing classes (1750 / 1780) - 98% complete
Pass 1: Analyzing classes (1751 / 1780) - 98% complete
Pass 1: Analyzing classes (1752 / 1780) - 98% complete
Pass 1: Analyzing classes (1753 / 1780) - 98% complete
Pass 1: Analyzing classes (1754 / 1780) - 98% complete
Pass 1: Analyzing classes (1755 / 1780) - 98% complete
Pass 1: Analyzing classes (1756 / 1780) - 98% complete
Pass 1: Analyzing classes (1757 / 1780) - 98% complete
Pass 1: Analyzing classes (1758 / 1780) - 98% complete
Pass 1: Analyzing classes (1759 / 1780) - 98% complete
Pass 1: Analyzing classes (1760 / 1780) - 98% complete
Pass 1: Analyzing classes (1761 / 1780) - 98% complete
Pass 1: Analyzing classes (1762 / 1780) - 98% complete
Pass 1: Analyzing classes (1763 / 1780) - 99% complete
Pass 1: Analyzing classes (1764 / 1780) - 99% complete
Pass 1: Analyzing classes (1765 / 1780) - 99% complete
Pass 1: Analyzing classes (1766 / 1780) - 99% complete
Pass 1: Analyzing classes (1767 / 1780) - 99% complete
Pass 1: Analyzing classes (1768 / 1780) - 99% complete
Pass 1: Analyzing classes (1769 / 1780) - 99% complete
Pass 1: Analyzing classes (1770 / 1780) - 99% complete
Pass 1: Analyzing classes (1771 / 1780) - 99% complete
Pass 1: Analyzing classes (1772 / 1780) - 99% complete
Pass 1: Analyzing classes (1773 / 1780) - 99% complete
Pass 1: Analyzing classes (1774 / 1780) - 99% complete
Pass 1: Analyzing classes (1775 / 1780) - 99% complete
Pass 1: Analyzing classes (1776 / 1780) - 99% complete
Pass 1: Analyzing classes (1777 / 1780) - 99% complete
Pass 1: Analyzing classes (1778 / 1780) - 99% complete
Pass 1: Analyzing classes (1779 / 1780) - 99% complete
Pass 1: Analyzing classes (1780 / 1780) - 100% complete

Pass 2: Analyzing classes (0 / 330) - 00% complete
Pass 2: Analyzing classes (1 / 330) - 00% complete
Pass 2: Analyzing classes (2 / 330) - 00% complete
Pass 2: Analyzing classes (3 / 330) - 00% complete
Pass 2: Analyzing classes (4 / 330) - 01% complete
Pass 2: Analyzing classes (5 / 330) - 01% complete
Pass 2: Analyzing classes (6 / 330) - 01% complete
Pass 2: Analyzing classes (7 / 330) - 02% complete
Pass 2: Analyzing classes (8 / 330) - 02% complete
Pass 2: Analyzing classes (9 / 330) - 02% complete
Pass 2: Analyzing classes (10 / 330) - 03% complete
Pass 2: Analyzing classes (11 / 330) - 03% complete
Pass 2: Analyzing classes (12 / 330) - 03% complete
Pass 2: Analyzing classes (13 / 330) - 03% complete
Pass 2: Analyzing classes (14 / 330) - 04% complete
Pass 2: Analyzing classes (15 / 330) - 04% complete
Pass 2: Analyzing classes (16 / 330) - 04% complete
Pass 2: Analyzing classes (17 / 330) - 05% complete
Pass 2: Analyzing classes (18 / 330) - 05% complete
Pass 2: Analyzing classes (19 / 330) - 05% complete
Pass 2: Analyzing classes (20 / 330) - 06% complete
Pass 2: Analyzing classes (21 / 330) - 06% complete
Pass 2: Analyzing classes (22 / 330) - 06% complete
Pass 2: Analyzing classes (23 / 330) - 06% complete
Pass 2: Analyzing classes (24 / 330) - 07% complete
Pass 2: Analyzing classes (25 / 330) - 07% complete
Pass 2: Analyzing classes (26 / 330) - 07% complete
Pass 2: Analyzing classes (27 / 330) - 08% complete
Pass 2: Analyzing classes (28 / 330) - 08% complete
Pass 2: Analyzing classes (29 / 330) - 08% complete
Pass 2: Analyzing classes (30 / 330) - 09% complete
Pass 2: Analyzing classes (31 / 330) - 09% complete
Pass 2: Analyzing classes (32 / 330) - 09% complete
Pass 2: Analyzing classes (33 / 330) - 10% complete
Pass 2: Analyzing classes (34 / 330) - 10% complete
Pass 2: Analyzing classes (35 / 330) - 10% complete
Pass 2: Analyzing classes (36 / 330) - 10% complete
Pass 2: Analyzing classes (37 / 330) - 11% complete
Pass 2: Analyzing classes (38 / 330) - 11% complete
Pass 2: Analyzing classes (39 / 330) - 11% complete
Pass 2: Analyzing classes (40 / 330) - 12% complete
Pass 2: Analyzing classes (41 / 330) - 12% complete
Pass 2: Analyzing classes (42 / 330) - 12% complete
Pass 2: Analyzing classes (43 / 330) - 13% complete
Pass 2: Analyzing classes (44 / 330) - 13% complete
Pass 2: Analyzing classes (45 / 330) - 13% complete
Pass 2: Analyzing classes (46 / 330) - 13% complete
Pass 2: Analyzing classes (47 / 330) - 14% complete
Pass 2: Analyzing classes (48 / 330) - 14% complete
Pass 2: Analyzing classes (49 / 330) - 14% complete
Pass 2: Analyzing classes (50 / 330) - 15% complete
Pass 2: Analyzing classes (51 / 330) - 15% complete
Pass 2: Analyzing classes (52 / 330) - 15% complete
Pass 2: Analyzing classes (53 / 330) - 16% complete
Pass 2: Analyzing classes (54 / 330) - 16% complete
Pass 2: Analyzing classes (55 / 330) - 16% complete
Pass 2: Analyzing classes (56 / 330) - 16% complete
Pass 2: Analyzing classes (57 / 330) - 17% complete
Pass 2: Analyzing classes (58 / 330) - 17% complete
Pass 2: Analyzing classes (59 / 330) - 17% complete
Pass 2: Analyzing classes (60 / 330) - 18% complete
Pass 2: Analyzing classes (61 / 330) - 18% complete
Pass 2: Analyzing classes (62 / 330) - 18% complete
Pass 2: Analyzing classes (63 / 330) - 19% complete
Pass 2: Analyzing classes (64 / 330) - 19% complete
Pass 2: Analyzing classes (65 / 330) - 19% complete
Pass 2: Analyzing classes (66 / 330) - 20% complete
Pass 2: Analyzing classes (67 / 330) - 20% complete
Pass 2: Analyzing classes (68 / 330) - 20% complete
Pass 2: Analyzing classes (69 / 330) - 20% complete
Pass 2: Analyzing classes (70 / 330) - 21% complete
Pass 2: Analyzing classes (71 / 330) - 21% complete
Pass 2: Analyzing classes (72 / 330) - 21% complete
Pass 2: Analyzing classes (73 / 330) - 22% complete
Pass 2: Analyzing classes (74 / 330) - 22% complete
Pass 2: Analyzing classes (75 / 330) - 22% complete
Pass 2: Analyzing classes (76 / 330) - 23% complete
Pass 2: Analyzing classes (77 / 330) - 23% complete
Pass 2: Analyzing classes (78 / 330) - 23% complete
Pass 2: Analyzing classes (79 / 330) - 23% complete
Pass 2: Analyzing classes (80 / 330) - 24% complete
Pass 2: Analyzing classes (81 / 330) - 24% complete
Pass 2: Analyzing classes (82 / 330) - 24% complete
Pass 2: Analyzing classes (83 / 330) - 25% complete
Pass 2: Analyzing classes (84 / 330) - 25% complete
Pass 2: Analyzing classes (85 / 330) - 25% complete
Pass 2: Analyzing classes (86 / 330) - 26% complete
Pass 2: Analyzing classes (87 / 330) - 26% complete
Pass 2: Analyzing classes (88 / 330) - 26% complete
Pass 2: Analyzing classes (89 / 330) - 26% complete
Pass 2: Analyzing classes (90 / 330) - 27% complete
Pass 2: Analyzing classes (91 / 330) - 27% complete
Pass 2: Analyzing classes (92 / 330) - 27% complete
Pass 2: Analyzing classes (93 / 330) - 28% complete
Pass 2: Analyzing classes (94 / 330) - 28% complete
Pass 2: Analyzing classes (95 / 330) - 28% complete
Pass 2: Analyzing classes (96 / 330) - 29% complete
Pass 2: Analyzing classes (97 / 330) - 29% complete
Pass 2: Analyzing classes (98 / 330) - 29% complete
Pass 2: Analyzing classes (99 / 330) - 30% complete
Pass 2: Analyzing classes (100 / 330) - 30% complete
Pass 2: Analyzing classes (101 / 330) - 30% complete
Pass 2: Analyzing classes (102 / 330) - 30% complete
Pass 2: Analyzing classes (103 / 330) - 31% complete
Pass 2: Analyzing classes (104 / 330) - 31% complete
Pass 2: Analyzing classes (105 / 330) - 31% complete
Pass 2: Analyzing classes (106 / 330) - 32% complete
Pass 2: Analyzing classes (107 / 330) - 32% complete
Pass 2: Analyzing classes (108 / 330) - 32% complete
Pass 2: Analyzing classes (109 / 330) - 33% complete
Pass 2: Analyzing classes (110 / 330) - 33% complete
Pass 2: Analyzing classes (111 / 330) - 33% complete
Pass 2: Analyzing classes (112 / 330) - 33% complete
Pass 2: Analyzing classes (113 / 330) - 34% complete
Pass 2: Analyzing classes (114 / 330) - 34% complete
Pass 2: Analyzing classes (115 / 330) - 34% complete
Pass 2: Analyzing classes (116 / 330) - 35% complete
Pass 2: Analyzing classes (117 / 330) - 35% complete
Pass 2: Analyzing classes (118 / 330) - 35% complete
Pass 2: Analyzing classes (119 / 330) - 36% complete
Pass 2: Analyzing classes (120 / 330) - 36% complete
Pass 2: Analyzing classes (121 / 330) - 36% complete
Pass 2: Analyzing classes (122 / 330) - 36% complete
Pass 2: Analyzing classes (123 / 330) - 37% complete
Pass 2: Analyzing classes (124 / 330) - 37% complete
Pass 2: Analyzing classes (125 / 330) - 37% complete
Pass 2: Analyzing classes (126 / 330) - 38% complete
Pass 2: Analyzing classes (127 / 330) - 38% complete
Pass 2: Analyzing classes (128 / 330) - 38% complete
Pass 2: Analyzing classes (129 / 330) - 39% complete
Pass 2: Analyzing classes (130 / 330) - 39% complete
Pass 2: Analyzing classes (131 / 330) - 39% complete
Pass 2: Analyzing classes (132 / 330) - 40% complete
Pass 2: Analyzing classes (133 / 330) - 40% complete
Pass 2: Analyzing classes (134 / 330) - 40% complete
Pass 2: Analyzing classes (135 / 330) - 40% complete
Pass 2: Analyzing classes (136 / 330) - 41% complete
Pass 2: Analyzing classes (137 / 330) - 41% complete
Pass 2: Analyzing classes (138 / 330) - 41% complete
Pass 2: Analyzing classes (139 / 330) - 42% complete
Pass 2: Analyzing classes (140 / 330) - 42% complete
Pass 2: Analyzing classes (141 / 330) - 42% complete
Pass 2: Analyzing classes (142 / 330) - 43% complete
Pass 2: Analyzing classes (143 / 330) - 43% complete
Pass 2: Analyzing classes (144 / 330) - 43% complete
Pass 2: Analyzing classes (145 / 330) - 43% complete
Pass 2: Analyzing classes (146 / 330) - 44% complete
Pass 2: Analyzing classes (147 / 330) - 44% complete
Pass 2: Analyzing classes (148 / 330) - 44% complete
Pass 2: Analyzing classes (149 / 330) - 45% complete
Pass 2: Analyzing classes (150 / 330) - 45% complete
Pass 2: Analyzing classes (151 / 330) - 45% complete
Pass 2: Analyzing classes (152 / 330) - 46% complete
Pass 2: Analyzing classes (153 / 330) - 46% complete
Pass 2: Analyzing classes (154 / 330) - 46% complete
Pass 2: Analyzing classes (155 / 330) - 46% complete
Pass 2: Analyzing classes (156 / 330) - 47% complete
Pass 2: Analyzing classes (157 / 330) - 47% complete
Pass 2: Analyzing classes (158 / 330) - 47% complete
Pass 2: Analyzing classes (159 / 330) - 48% complete
Pass 2: Analyzing classes (160 / 330) - 48% complete
Pass 2: Analyzing classes (161 / 330) - 48% complete
Pass 2: Analyzing classes (162 / 330) - 49% complete
Pass 2: Analyzing classes (163 / 330) - 49% complete
Pass 2: Analyzing classes (164 / 330) - 49% complete
Pass 2: Analyzing classes (165 / 330) - 50% complete
Pass 2: Analyzing classes (166 / 330) - 50% complete
Pass 2: Analyzing classes (167 / 330) - 50% complete
Pass 2: Analyzing classes (168 / 330) - 50% complete
Pass 2: Analyzing classes (169 / 330) - 51% complete
Pass 2: Analyzing classes (170 / 330) - 51% complete
Pass 2: Analyzing classes (171 / 330) - 51% complete
Pass 2: Analyzing classes (172 / 330) - 52% complete
Pass 2: Analyzing classes (173 / 330) - 52% complete
Pass 2: Analyzing classes (174 / 330) - 52% complete
Pass 2: Analyzing classes (175 / 330) - 53% complete
Pass 2: Analyzing classes (176 / 330) - 53% complete
Pass 2: Analyzing classes (177 / 330) - 53% complete
Pass 2: Analyzing classes (178 / 330) - 53% complete
Pass 2: Analyzing classes (179 / 330) - 54% complete
Pass 2: Analyzing classes (180 / 330) - 54% complete
Pass 2: Analyzing classes (181 / 330) - 54% complete
Pass 2: Analyzing classes (182 / 330) - 55% complete
Pass 2: Analyzing classes (183 / 330) - 55% complete
Pass 2: Analyzing classes (184 / 330) - 55% complete
Pass 2: Analyzing classes (185 / 330) - 56% complete
Pass 2: Analyzing classes (186 / 330) - 56% complete
Pass 2: Analyzing classes (187 / 330) - 56% complete
Pass 2: Analyzing classes (188 / 330) - 56% complete
Pass 2: Analyzing classes (189 / 330) - 57% complete
Pass 2: Analyzing classes (190 / 330) - 57% complete
Pass 2: Analyzing classes (191 / 330) - 57% complete
Pass 2: Analyzing classes (192 / 330) - 58% complete
Pass 2: Analyzing classes (193 / 330) - 58% complete
Pass 2: Analyzing classes (194 / 330) - 58% complete
Pass 2: Analyzing classes (195 / 330) - 59% complete
Pass 2: Analyzing classes (196 / 330) - 59% complete
Pass 2: Analyzing classes (197 / 330) - 59% complete
Pass 2: Analyzing classes (198 / 330) - 60% complete
Pass 2: Analyzing classes (199 / 330) - 60% complete
Pass 2: Analyzing classes (200 / 330) - 60% complete
Pass 2: Analyzing classes (201 / 330) - 60% complete
Pass 2: Analyzing classes (202 / 330) - 61% complete
Pass 2: Analyzing classes (203 / 330) - 61% complete
Pass 2: Analyzing classes (204 / 330) - 61% complete
Pass 2: Analyzing classes (205 / 330) - 62% complete
Pass 2: Analyzing classes (206 / 330) - 62% complete
Pass 2: Analyzing classes (207 / 330) - 62% complete
Pass 2: Analyzing classes (208 / 330) - 63% complete
Pass 2: Analyzing classes (209 / 330) - 63% complete
Pass 2: Analyzing classes (210 / 330) - 63% complete
Pass 2: Analyzing classes (211 / 330) - 63% complete
Pass 2: Analyzing classes (212 / 330) - 64% complete
Pass 2: Analyzing classes (213 / 330) - 64% complete
Pass 2: Analyzing classes (214 / 330) - 64% complete
Pass 2: Analyzing classes (215 / 330) - 65% complete
Pass 2: Analyzing classes (216 / 330) - 65% complete
Pass 2: Analyzing classes (217 / 330) - 65% complete
Pass 2: Analyzing classes (218 / 330) - 66% complete
Pass 2: Analyzing classes (219 / 330) - 66% complete
Pass 2: Analyzing classes (220 / 330) - 66% complete
Pass 2: Analyzing classes (221 / 330) - 66% complete
Pass 2: Analyzing classes (222 / 330) - 67% complete
Pass 2: Analyzing classes (223 / 330) - 67% complete
Pass 2: Analyzing classes (224 / 330) - 67% complete
Pass 2: Analyzing classes (225 / 330) - 68% complete
Pass 2: Analyzing classes (226 / 330) - 68% complete
Pass 2: Analyzing classes (227 / 330) - 68% complete
Pass 2: Analyzing classes (228 / 330) - 69% complete
Pass 2: Analyzing classes (229 / 330) - 69% complete
Pass 2: Analyzing classes (230 / 330) - 69% complete
Pass 2: Analyzing classes (231 / 330) - 70% complete
Pass 2: Analyzing classes (232 / 330) - 70% complete
Pass 2: Analyzing classes (233 / 330) - 70% complete
Pass 2: Analyzing classes (234 / 330) - 70% complete
Pass 2: Analyzing classes (235 / 330) - 71% complete
Pass 2: Analyzing classes (236 / 330) - 71% complete
Pass 2: Analyzing classes (237 / 330) - 71% complete
Pass 2: Analyzing classes (238 / 330) - 72% complete
Pass 2: Analyzing classes (239 / 330) - 72% complete
Pass 2: Analyzing classes (240 / 330) - 72% complete
Pass 2: Analyzing classes (241 / 330) - 73% complete
Pass 2: Analyzing classes (242 / 330) - 73% complete
Pass 2: Analyzing classes (243 / 330) - 73% complete
Pass 2: Analyzing classes (244 / 330) - 73% complete
Pass 2: Analyzing classes (245 / 330) - 74% complete
Pass 2: Analyzing classes (246 / 330) - 74% complete
Pass 2: Analyzing classes (247 / 330) - 74% complete
Pass 2: Analyzing classes (248 / 330) - 75% complete
Pass 2: Analyzing classes (249 / 330) - 75% complete
Pass 2: Analyzing classes (250 / 330) - 75% complete
Pass 2: Analyzing classes (251 / 330) - 76% complete
Pass 2: Analyzing classes (252 / 330) - 76% complete
Pass 2: Analyzing classes (253 / 330) - 76% complete
Pass 2: Analyzing classes (254 / 330) - 76% complete
Pass 2: Analyzing classes (255 / 330) - 77% complete
Pass 2: Analyzing classes (256 / 330) - 77% complete
Pass 2: Analyzing classes (257 / 330) - 77% complete
Pass 2: Analyzing classes (258 / 330) - 78% complete
Pass 2: Analyzing classes (259 / 330) - 78% complete
Pass 2: Analyzing classes (260 / 330) - 78% complete
Pass 2: Analyzing classes (261 / 330) - 79% complete
Pass 2: Analyzing classes (262 / 330) - 79% complete
Pass 2: Analyzing classes (263 / 330) - 79% complete
Pass 2: Analyzing classes (264 / 330) - 80% complete
Pass 2: Analyzing classes (265 / 330) - 80% complete
Pass 2: Analyzing classes (266 / 330) - 80% complete
Pass 2: Analyzing classes (267 / 330) - 80% complete
Pass 2: Analyzing classes (268 / 330) - 81% complete
Pass 2: Analyzing classes (269 / 330) - 81% complete
Pass 2: Analyzing classes (270 / 330) - 81% complete
Pass 2: Analyzing classes (271 / 330) - 82% complete
Pass 2: Analyzing classes (272 / 330) - 82% complete
Pass 2: Analyzing classes (273 / 330) - 82% complete
Pass 2: Analyzing classes (274 / 330) - 83% complete
Pass 2: Analyzing classes (275 / 330) - 83% complete
Pass 2: Analyzing classes (276 / 330) - 83% complete
Pass 2: Analyzing classes (277 / 330) - 83% complete
Pass 2: Analyzing classes (278 / 330) - 84% complete
Pass 2: Analyzing classes (279 / 330) - 84% complete
Pass 2: Analyzing classes (280 / 330) - 84% complete
Pass 2: Analyzing classes (281 / 330) - 85% complete
Pass 2: Analyzing classes (282 / 330) - 85% complete
Pass 2: Analyzing classes (283 / 330) - 85% complete
Pass 2: Analyzing classes (284 / 330) - 86% complete
Pass 2: Analyzing classes (285 / 330) - 86% complete
Pass 2: Analyzing classes (286 / 330) - 86% complete
Pass 2: Analyzing classes (287 / 330) - 86% complete
Pass 2: Analyzing classes (288 / 330) - 87% complete
Pass 2: Analyzing classes (289 / 330) - 87% complete
Pass 2: Analyzing classes (290 / 330) - 87% complete
Pass 2: Analyzing classes (291 / 330) - 88% complete
Pass 2: Analyzing classes (292 / 330) - 88% complete
Pass 2: Analyzing classes (293 / 330) - 88% complete
Pass 2: Analyzing classes (294 / 330) - 89% complete
Pass 2: Analyzing classes (295 / 330) - 89% complete
Pass 2: Analyzing classes (296 / 330) - 89% complete
Pass 2: Analyzing classes (297 / 330) - 90% complete
Pass 2: Analyzing classes (298 / 330) - 90% complete
Pass 2: Analyzing classes (299 / 330) - 90% complete
Pass 2: Analyzing classes (300 / 330) - 90% complete
Pass 2: Analyzing classes (301 / 330) - 91% complete
Pass 2: Analyzing classes (302 / 330) - 91% complete
Pass 2: Analyzing classes (303 / 330) - 91% complete
Pass 2: Analyzing classes (304 / 330) - 92% complete
Pass 2: Analyzing classes (305 / 330) - 92% complete
Pass 2: Analyzing classes (306 / 330) - 92% complete
Pass 2: Analyzing classes (307 / 330) - 93% complete
Pass 2: Analyzing classes (308 / 330) - 93% complete
Pass 2: Analyzing classes (309 / 330) - 93% complete
Pass 2: Analyzing classes (310 / 330) - 93% complete
Pass 2: Analyzing classes (311 / 330) - 94% complete
Pass 2: Analyzing classes (312 / 330) - 94% complete
Pass 2: Analyzing classes (313 / 330) - 94% complete
Pass 2: Analyzing classes (314 / 330) - 95% complete
Pass 2: Analyzing classes (315 / 330) - 95% complete
Pass 2: Analyzing classes (316 / 330) - 95% complete
Pass 2: Analyzing classes (317 / 330) - 96% complete
Pass 2: Analyzing classes (318 / 330) - 96% complete
Pass 2: Analyzing classes (319 / 330) - 96% complete
Pass 2: Analyzing classes (320 / 330) - 96% complete
Pass 2: Analyzing classes (321 / 330) - 97% complete
Pass 2: Analyzing classes (322 / 330) - 97% complete
Pass 2: Analyzing classes (323 / 330) - 97% complete
Pass 2: Analyzing classes (324 / 330) - 98% complete
Pass 2: Analyzing classes (325 / 330) - 98% complete
Pass 2: Analyzing classes (326 / 330) - 98% complete
Pass 2: Analyzing classes (327 / 330) - 99% complete
Pass 2: Analyzing classes (328 / 330) - 99% complete
Pass 2: Analyzing classes (329 / 330) - 99% complete
Pass 2: Analyzing classes (330 / 330) - 100% complete
Done with analysis
:test

org.apache.aurora.scheduler.events.WebhookTest > testTaskChangedWithOldStateError FAILED
    java.lang.AssertionError at WebhookTest.java:208
I1128 00:08:21.894 [ShutdownHook, SchedulerMain] Stopping scheduler services. 

1078 tests completed, 1 failed, 1 skipped
:test FAILED
:jacocoTestReport
Download https://repo1.maven.org/maven2/org/jacoco/org.jacoco.ant/0.7.8/org.jacoco.ant-0.7.8.pom
Download https://repo1.maven.org/maven2/org/jacoco/org.jacoco.core/0.7.8/org.jacoco.core-0.7.8.pom
Download https://repo1.maven.org/maven2/org/jacoco/org.jacoco.report/0.7.8/org.jacoco.report-0.7.8.pom
Download https://repo1.maven.org/maven2/org/ow2/asm/asm-debug-all/5.1/asm-debug-all-5.1.pom
Download https://repo1.maven.org/maven2/org/jacoco/org.jacoco.ant/0.7.8/org.jacoco.ant-0.7.8.jar
Download https://repo1.maven.org/maven2/org/jacoco/org.jacoco.report/0.7.8/org.jacoco.report-0.7.8.jar
Download https://repo1.maven.org/maven2/org/ow2/asm/asm-debug-all/5.1/asm-debug-all-5.1.jar
Download https://repo1.maven.org/maven2/org/jacoco/org.jacoco.core/0.7.8/org.jacoco.core-0.7.8.jar
Coverage report generated: file:///home/jenkins/jenkins-slave/workspace/AuroraBot/dist/reports/jacoco/test/html/index.html
:jacocoTestCoverageVerification

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':test'.
> There were failing tests. See the report at: file:///home/jenkins/jenkins-slave/workspace/AuroraBot/dist/reports/tests/test/index.html

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

* Get more help at https://help.gradle.org

BUILD FAILED in 7m 56s
44 actionable tasks: 35 executed, 9 up-to-date


I will refresh this build result if you post a review containing "@ReviewBot retry"

- Aurora ReviewBot


On Nov. 27, 2017, 7:41 p.m., Jordan Ly wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/63973/
> -----------------------------------------------------------
> 
> (Updated Nov. 27, 2017, 7:41 p.m.)
> 
> 
> Review request for Aurora, David McLaughlin, Santhosh Kumar Shanmugham, Stephan Erb, and Bill Farner.
> 
> 
> Repository: aurora
> 
> 
> Description
> -------
> 
> Major portions of the refactor:
> 
> * Refactor `OfferManager` to do filtering of offers (added `getMatching` and `getAllMatching` methods) as opposed to TaskAssigner
> * Refactor `TaskAssigner`, allow for injection of custom "scoring" class through `OfferRanker` interface
> 
> And some minor things as well:
> 
> * Moved `TaskAssignerImpl`, `TaskSchedulerImpl`, and `HostOffers` into their own upper-level classes
> * Moved `TaskAssigner` to the `scheduling` package and out of the `state` package
> * Renamed some methods in `OfferManager` to avoid code stutter
> * Renaming of some classes (e.g. `FirstFitTaskAssigner` -> `TaskAssignerImpl`)
> * And a slew of others
> 
> Overall, the goal of this refactor is to allow for the easy injection of custom offer "scoring" modules via the `OfferRanker` interface. Callers will not have to replace the entire `TaskAssigner` module, but instead just provide a function that chooses from a list of offers that should already fit the task.
> 
> Going through this review, I would start with the `maybeAssign`/`launchUsingOffer` methods in `TaskAssigner`. Then, I would look at `getMatching`/`getAllMatching` in `HostOffers`.
> 
> 
> Diffs
> -----
> 
>   RELEASE-NOTES.md e622a8d38425a99c2965d64147fa0e680e5de517 
>   docs/reference/scheduler-configuration.md 6c385b5be2b64117989c624ce93c78609cfea6c5 
>   src/jmh/java/org/apache/aurora/benchmark/Offers.java 2b463267af6e7ae7fa16736de3b1e3d7d5bd99a8 
>   src/jmh/java/org/apache/aurora/benchmark/SchedulingBenchmarks.java 1708a5063afd12de5d2138e763a19d1cf8dc9714 
>   src/jmh/java/org/apache/aurora/benchmark/fakes/FakeOfferManager.java 201aa81db7f607a70c7d44011857576f45b7e9da 
>   src/main/java/org/apache/aurora/scheduler/app/AppModule.java 3204cca5446d0f798ace622d334473bf6db13733 
>   src/main/java/org/apache/aurora/scheduler/config/CliOptions.java d4537e386af53ec9bff661ed23d61a5bd4893edf 
>   src/main/java/org/apache/aurora/scheduler/filter/AttributeAggregate.java 60f141d34d862f200ae1346a38a71bba57551059 
>   src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilter.java 36608a9f027c95723c31f9915852112beb367223 
>   src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilterImpl.java df51d4cf4893899613683603ab4aa9aefa88faa6 
>   src/main/java/org/apache/aurora/scheduler/http/Offers.java f22ca6e5402d8ec7241376de14a9051ab0cfbfc6 
>   src/main/java/org/apache/aurora/scheduler/mesos/MesosCallbackHandler.java fd5874d51cfbca1b98d15623a9c845d208d43b1f 
>   src/main/java/org/apache/aurora/scheduler/offers/HostOffers.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferManager.java 96b0f46e69255944fa0f00621db315e22d68515c 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferManagerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferSettings.java 57fc1a18f1b82decc780ba0069ab4dd0c125f77d 
>   src/main/java/org/apache/aurora/scheduler/offers/OffersModule.java 4a6ea8dac97ed2f5df47e4d16fa65a3b516988bd 
>   src/main/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessor.java 766d3b24fd64de96b82d3dd2a17f7a80331889d8 
>   src/main/java/org/apache/aurora/scheduler/preemptor/Preemptor.java 82a0ff67e9f70fed305f8f1bf38e3cf7955b9ce7 
>   src/main/java/org/apache/aurora/scheduler/scheduling/FirstFitOfferSelector.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/OfferSelector.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/SchedulingModule.java 0796712a00e3cba595ceb049833933b9a70c2f9a 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssigner.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssignerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssignerImplModule.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskScheduler.java 0002b0ceb429a404ac9dd0ae7e5ea9f6362fa100 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskSchedulerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerModule.java dc244eeaa0d292a06d8750cb340fb379701ad49f 
>   src/main/java/org/apache/aurora/scheduler/state/StateModule.java b7a3c0be592c13181edf2e8c241a2ad351962e06 
>   src/main/java/org/apache/aurora/scheduler/state/TaskAssigner.java cdd0d15872248b19d5eb52d25537f2f863fd5c77 
>   src/main/java/org/apache/aurora/scheduler/stats/AsyncStatsModule.java 6033c01477bec7a491128e3089ffc1b1c3f1c150 
>   src/test/java/org/apache/aurora/scheduler/config/CommandLineTest.java 0ec4de636e2fa0b671f8c1368e6d225747f215b6 
>   src/test/java/org/apache/aurora/scheduler/http/OffersTest.java 30699596a1c95199df7504f62c5c18cab1be1c6c 
>   src/test/java/org/apache/aurora/scheduler/mesos/MesosCallbackHandlerTest.java 45ae6bb5d12de66271a99aad0cda9632da22acea 
>   src/test/java/org/apache/aurora/scheduler/offers/OfferManagerImplTest.java 6b18296ffdd7e1a5e989236db967c5e752a8a55f 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessorTest.java c76b3e338298d63834b4265d769649d39b9ae219 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PreemptorImplTest.java f14cba144856b23531467a7b8a3fd695ad8beee8 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PreemptorModuleTest.java 97c238ce30142a94a1fd9c6c7055fa95f2512cce 
>   src/test/java/org/apache/aurora/scheduler/scheduling/FirstFitOfferSelectorTest.java PRE-CREATION 
>   src/test/java/org/apache/aurora/scheduler/scheduling/TaskSchedulerImplTest.java 7a4525a190a662e82b9ba98346fae0b25a8ea673 
>   src/test/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerTest.java 58f9de2731633664f4140d785c3a6df0cde063b4 
>   src/test/java/org/apache/aurora/scheduler/stats/AsyncStatsModuleTest.java f8e802342e753ee6a23ba7e1c2ab5151b85cadb3 
> 
> 
> Diff: https://reviews.apache.org/r/63973/diff/5/
> 
> 
> Testing
> -------
> 
> Tests coming soon, but they should be relatively close to what we have now on master since we don't really add/remove features but just move them around.
> 
> Ran some benchmarks as well to ensure performance parity:
> 
> ```
> MASTER
> Benchmark                                                                      Mode  Cnt       Score       Error  Units
> SchedulingBenchmarks.ClusterFullUtilizationBenchmark.runBenchmark             thrpt   10  113910.922 ± 26263.903  ops/s
> SchedulingBenchmarks.FillClusterBenchmark.runBenchmark                        thrpt   10     263.043 ±   299.686  ops/s
> SchedulingBenchmarks.InsufficientResourcesSchedulingBenchmark.runBenchmark    thrpt   10   12353.669 ±   433.182  ops/s
> SchedulingBenchmarks.LimitConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10     893.263 ±    54.882  ops/s
> SchedulingBenchmarks.ValueConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10   11478.420 ±  1068.819  ops/s
> ```
> and
> ```
> MY PATCH
> Benchmark                                                                      Mode  Cnt       Score       Error  Units
> SchedulingBenchmarks.ClusterFullUtilizationBenchmark.runBenchmark             thrpt   10  124041.966 ± 33331.424  ops/s
> SchedulingBenchmarks.FillClusterBenchmark.runBenchmark                        thrpt   10    1030.434 ±  1223.539  ops/s
> SchedulingBenchmarks.InsufficientResourcesSchedulingBenchmark.runBenchmark    thrpt   10   12305.154 ±   375.814  ops/s
> SchedulingBenchmarks.LimitConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10    1080.267 ±    74.635  ops/s
> SchedulingBenchmarks.ValueConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10   11604.642 ±   586.248  ops/s
> ```
> 
> Not exactly sure why `FillClusterBenchmark` increased so dramatically -- I will look into that while testing as well.
> 
> 
> Thanks,
> 
> Jordan Ly
> 
>


Re: Review Request 63973: Enable custom offer scoring modules for task assignment

Posted by Aurora ReviewBot <wf...@apache.org>.
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/63973/#review191938
-----------------------------------------------------------



Master (0f3dc93) is red with this patch.
  ./build-support/jenkins/build.sh

                     DEBUG] Flipping task state from FINALIZING to SUCCESS
                     DEBUG] Flipping task state from FINALIZING to SUCCESS
                     DEBUG] Flipping task state from FINALIZING to SUCCESS
                     DEBUG] Flipping task state from FINALIZING to SUCCESS
                     DEBUG] Flipping task state from FINALIZING to SUCCESS
                     DEBUG] Flipping task state from FINALIZING to SUCCESS
                     DEBUG] Flipping task state from FINALIZING to SUCCESS
                     DEBUG] Flipping task state from FINALIZING to SUCCESS
                     DEBUG] Flipping task state from FINALIZING to SUCCESS
                     DEBUG] /tmp/tmpNvpTwG/checkpoints/hello_world-001/runner has no data (current offset = 613)
                     DEBUG] /tmp/tmpNvpTwG/checkpoints/hello_world-001/runner has no data (current offset = 613)
                     DEBUG] /tmp/tmpNvpTwG/checkpoints/hello_world-001/runner has no data (current offset = 613)
                     DEBUG] /tmp/tmpNvpTwG/checkpoints/hello_world-001/runner has no data (current offset = 613)
                     DEBUG] /tmp/tmpNvpTwG/checkpoints/hello_world-001/runner has no data (current offset = 613)
                     DEBUG] /tmp/tmpNvpTwG/checkpoints/hello_world-001/runner has no data (current offset = 613)
                     DEBUG] /tmp/tmpNvpTwG/checkpoints/hello_world-001/runner has no data (current offset = 613)
                     DEBUG] /tmp/tmpNvpTwG/checkpoints/hello_world-001/runner has no data (current offset = 613)
                     DEBUG] /tmp/tmpNvpTwG/checkpoints/hello_world-001/runner has no data (current offset = 613)
                     DEBUG] /tmp/tmpNvpTwG/checkpoints/hello_world-001/runner has no data (current offset = 613)
                     DEBUG] /tmp/tmpNvpTwG/checkpoints/hello_world-001/runner has no data (current offset = 613)
                     DEBUG] /tmp/tmpNvpTwG/checkpoints/hello_world-001/runner has no data (current offset = 613)
                     DEBUG] /tmp/tmpNvpTwG/checkpoints/hello_world-001/runner has no data (current offset = 613)
                     DEBUG] /tmp/tmpNvpTwG/checkpoints/hello_world-001/runner has no data (current offset = 613)
                     DEBUG] /tmp/tmpNvpTwG/checkpoints/hello_world-001/runner has no data (current offset = 613)
                     DEBUG] /tmp/tmpNvpTwG/checkpoints/hello_world-001/runner has no data (current offset = 613)
                     DEBUG] /tmp/tmpNvpTwG/checkpoints/hello_world-001/runner has no data (current offset = 613)
                     DEBUG] /tmp/tmpNvpTwG/checkpoints/hello_world-001/runner has no data (current offset = 613)
                     DEBUG] /tmp/tmpNvpTwG/checkpoints/hello_world-001/runner has no data (current offset = 613)
                     DEBUG] /tmp/tmpNvpTwG/checkpoints/hello_world-001/runner has no data (current offset = 613)
                     DEBUG] /tmp/tmpNvpTwG/checkpoints/hello_world-001/runner has no data (current offset = 613)
                     DEBUG] /tmp/tmpNvpTwG/checkpoints/hello_world-001/runner has no data (current offset = 613)
                     DEBUG] /tmp/tmpNvpTwG/checkpoints/hello_world-001/runner has no data (current offset = 613)
                      generated xml file: /home/jenkins/jenkins-slave/workspace/AuroraBot/dist/test-results/aaf4d108c31293299a0839bdc404a91802f80937.xml 
                      1 failed, 795 passed, 6 skipped, 1 warnings in 339.44 seconds 
                     
FAILURE


21:25:48 06:26   [complete]
               FAILURE


I will refresh this build result if you post a review containing "@ReviewBot retry"

- Aurora ReviewBot


On Nov. 27, 2017, 11:41 a.m., Jordan Ly wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/63973/
> -----------------------------------------------------------
> 
> (Updated Nov. 27, 2017, 11:41 a.m.)
> 
> 
> Review request for Aurora, David McLaughlin, Santhosh Kumar Shanmugham, Stephan Erb, and Bill Farner.
> 
> 
> Repository: aurora
> 
> 
> Description
> -------
> 
> Major portions of the refactor:
> 
> * Refactor `OfferManager` to do filtering of offers (added `getMatching` and `getAllMatching` methods) as opposed to TaskAssigner
> * Refactor `TaskAssigner`, allow for injection of custom "scoring" class through `OfferRanker` interface
> 
> And some minor things as well:
> 
> * Moved `TaskAssignerImpl`, `TaskSchedulerImpl`, and `HostOffers` into their own upper-level classes
> * Moved `TaskAssigner` to the `scheduling` package and out of the `state` package
> * Renamed some methods in `OfferManager` to avoid code stutter
> * Renaming of some classes (e.g. `FirstFitTaskAssigner` -> `TaskAssignerImpl`)
> * And a slew of others
> 
> Overall, the goal of this refactor is to allow for the easy injection of custom offer "scoring" modules via the `OfferRanker` interface. Callers will not have to replace the entire `TaskAssigner` module, but instead just provide a function that chooses from a list of offers that should already fit the task.
> 
> Going through this review, I would start with the `maybeAssign`/`launchUsingOffer` methods in `TaskAssigner`. Then, I would look at `getMatching`/`getAllMatching` in `HostOffers`.
> 
> 
> Diffs
> -----
> 
>   RELEASE-NOTES.md e622a8d38425a99c2965d64147fa0e680e5de517 
>   docs/reference/scheduler-configuration.md 6c385b5be2b64117989c624ce93c78609cfea6c5 
>   src/jmh/java/org/apache/aurora/benchmark/Offers.java 2b463267af6e7ae7fa16736de3b1e3d7d5bd99a8 
>   src/jmh/java/org/apache/aurora/benchmark/SchedulingBenchmarks.java 1708a5063afd12de5d2138e763a19d1cf8dc9714 
>   src/jmh/java/org/apache/aurora/benchmark/fakes/FakeOfferManager.java 201aa81db7f607a70c7d44011857576f45b7e9da 
>   src/main/java/org/apache/aurora/scheduler/app/AppModule.java 3204cca5446d0f798ace622d334473bf6db13733 
>   src/main/java/org/apache/aurora/scheduler/config/CliOptions.java d4537e386af53ec9bff661ed23d61a5bd4893edf 
>   src/main/java/org/apache/aurora/scheduler/filter/AttributeAggregate.java 60f141d34d862f200ae1346a38a71bba57551059 
>   src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilter.java 36608a9f027c95723c31f9915852112beb367223 
>   src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilterImpl.java df51d4cf4893899613683603ab4aa9aefa88faa6 
>   src/main/java/org/apache/aurora/scheduler/http/Offers.java f22ca6e5402d8ec7241376de14a9051ab0cfbfc6 
>   src/main/java/org/apache/aurora/scheduler/mesos/MesosCallbackHandler.java fd5874d51cfbca1b98d15623a9c845d208d43b1f 
>   src/main/java/org/apache/aurora/scheduler/offers/HostOffers.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferManager.java 96b0f46e69255944fa0f00621db315e22d68515c 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferManagerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferSettings.java 57fc1a18f1b82decc780ba0069ab4dd0c125f77d 
>   src/main/java/org/apache/aurora/scheduler/offers/OffersModule.java 4a6ea8dac97ed2f5df47e4d16fa65a3b516988bd 
>   src/main/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessor.java 766d3b24fd64de96b82d3dd2a17f7a80331889d8 
>   src/main/java/org/apache/aurora/scheduler/preemptor/Preemptor.java 82a0ff67e9f70fed305f8f1bf38e3cf7955b9ce7 
>   src/main/java/org/apache/aurora/scheduler/scheduling/FirstFitOfferSelector.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/OfferSelector.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/SchedulingModule.java 0796712a00e3cba595ceb049833933b9a70c2f9a 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssigner.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssignerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssignerImplModule.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskScheduler.java 0002b0ceb429a404ac9dd0ae7e5ea9f6362fa100 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskSchedulerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerModule.java dc244eeaa0d292a06d8750cb340fb379701ad49f 
>   src/main/java/org/apache/aurora/scheduler/state/StateModule.java b7a3c0be592c13181edf2e8c241a2ad351962e06 
>   src/main/java/org/apache/aurora/scheduler/state/TaskAssigner.java cdd0d15872248b19d5eb52d25537f2f863fd5c77 
>   src/main/java/org/apache/aurora/scheduler/stats/AsyncStatsModule.java 6033c01477bec7a491128e3089ffc1b1c3f1c150 
>   src/test/java/org/apache/aurora/scheduler/config/CommandLineTest.java 0ec4de636e2fa0b671f8c1368e6d225747f215b6 
>   src/test/java/org/apache/aurora/scheduler/http/OffersTest.java 30699596a1c95199df7504f62c5c18cab1be1c6c 
>   src/test/java/org/apache/aurora/scheduler/mesos/MesosCallbackHandlerTest.java 45ae6bb5d12de66271a99aad0cda9632da22acea 
>   src/test/java/org/apache/aurora/scheduler/offers/OfferManagerImplTest.java 6b18296ffdd7e1a5e989236db967c5e752a8a55f 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessorTest.java c76b3e338298d63834b4265d769649d39b9ae219 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PreemptorImplTest.java f14cba144856b23531467a7b8a3fd695ad8beee8 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PreemptorModuleTest.java 97c238ce30142a94a1fd9c6c7055fa95f2512cce 
>   src/test/java/org/apache/aurora/scheduler/scheduling/FirstFitOfferSelectorTest.java PRE-CREATION 
>   src/test/java/org/apache/aurora/scheduler/scheduling/TaskSchedulerImplTest.java 7a4525a190a662e82b9ba98346fae0b25a8ea673 
>   src/test/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerTest.java 58f9de2731633664f4140d785c3a6df0cde063b4 
>   src/test/java/org/apache/aurora/scheduler/stats/AsyncStatsModuleTest.java f8e802342e753ee6a23ba7e1c2ab5151b85cadb3 
> 
> 
> Diff: https://reviews.apache.org/r/63973/diff/5/
> 
> 
> Testing
> -------
> 
> Tests coming soon, but they should be relatively close to what we have now on master since we don't really add/remove features but just move them around.
> 
> Ran some benchmarks as well to ensure performance parity:
> 
> ```
> MASTER
> Benchmark                                                                      Mode  Cnt       Score       Error  Units
> SchedulingBenchmarks.ClusterFullUtilizationBenchmark.runBenchmark             thrpt   10  113910.922 ± 26263.903  ops/s
> SchedulingBenchmarks.FillClusterBenchmark.runBenchmark                        thrpt   10     263.043 ±   299.686  ops/s
> SchedulingBenchmarks.InsufficientResourcesSchedulingBenchmark.runBenchmark    thrpt   10   12353.669 ±   433.182  ops/s
> SchedulingBenchmarks.LimitConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10     893.263 ±    54.882  ops/s
> SchedulingBenchmarks.ValueConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10   11478.420 ±  1068.819  ops/s
> ```
> and
> ```
> MY PATCH
> Benchmark                                                                      Mode  Cnt       Score       Error  Units
> SchedulingBenchmarks.ClusterFullUtilizationBenchmark.runBenchmark             thrpt   10  124041.966 ± 33331.424  ops/s
> SchedulingBenchmarks.FillClusterBenchmark.runBenchmark                        thrpt   10    1030.434 ±  1223.539  ops/s
> SchedulingBenchmarks.InsufficientResourcesSchedulingBenchmark.runBenchmark    thrpt   10   12305.154 ±   375.814  ops/s
> SchedulingBenchmarks.LimitConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10    1080.267 ±    74.635  ops/s
> SchedulingBenchmarks.ValueConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10   11604.642 ±   586.248  ops/s
> ```
> 
> Not exactly sure why `FillClusterBenchmark` increased so dramatically -- I will look into that while testing as well.
> 
> 
> Thanks,
> 
> Jordan Ly
> 
>


Re: Review Request 63973: Enable custom offer scoring modules for task assignment

Posted by Jordan Ly <jo...@gmail.com>.
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/63973/
-----------------------------------------------------------

(Updated Nov. 27, 2017, 7:41 p.m.)


Review request for Aurora, David McLaughlin, Santhosh Kumar Shanmugham, Stephan Erb, and Bill Farner.


Changes
-------

Renamed OfferRanker -> OfferSelector, removed extra args from OfferSelector


Repository: aurora


Description
-------

Major portions of the refactor:

* Refactor `OfferManager` to do filtering of offers (added `getMatching` and `getAllMatching` methods) as opposed to TaskAssigner
* Refactor `TaskAssigner`, allow for injection of custom "scoring" class through `OfferRanker` interface

And some minor things as well:

* Moved `TaskAssignerImpl`, `TaskSchedulerImpl`, and `HostOffers` into their own upper-level classes
* Moved `TaskAssigner` to the `scheduling` package and out of the `state` package
* Renamed some methods in `OfferManager` to avoid code stutter
* Renaming of some classes (e.g. `FirstFitTaskAssigner` -> `TaskAssignerImpl`)
* And a slew of others

Overall, the goal of this refactor is to allow for the easy injection of custom offer "scoring" modules via the `OfferRanker` interface. Callers will not have to replace the entire `TaskAssigner` module, but instead just provide a function that chooses from a list of offers that should already fit the task.

Going through this review, I would start with the `maybeAssign`/`launchUsingOffer` methods in `TaskAssigner`. Then, I would look at `getMatching`/`getAllMatching` in `HostOffers`.


Diffs (updated)
-----

  RELEASE-NOTES.md e622a8d38425a99c2965d64147fa0e680e5de517 
  docs/reference/scheduler-configuration.md 6c385b5be2b64117989c624ce93c78609cfea6c5 
  src/jmh/java/org/apache/aurora/benchmark/Offers.java 2b463267af6e7ae7fa16736de3b1e3d7d5bd99a8 
  src/jmh/java/org/apache/aurora/benchmark/SchedulingBenchmarks.java 1708a5063afd12de5d2138e763a19d1cf8dc9714 
  src/jmh/java/org/apache/aurora/benchmark/fakes/FakeOfferManager.java 201aa81db7f607a70c7d44011857576f45b7e9da 
  src/main/java/org/apache/aurora/scheduler/app/AppModule.java 3204cca5446d0f798ace622d334473bf6db13733 
  src/main/java/org/apache/aurora/scheduler/config/CliOptions.java d4537e386af53ec9bff661ed23d61a5bd4893edf 
  src/main/java/org/apache/aurora/scheduler/filter/AttributeAggregate.java 60f141d34d862f200ae1346a38a71bba57551059 
  src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilter.java 36608a9f027c95723c31f9915852112beb367223 
  src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilterImpl.java df51d4cf4893899613683603ab4aa9aefa88faa6 
  src/main/java/org/apache/aurora/scheduler/http/Offers.java f22ca6e5402d8ec7241376de14a9051ab0cfbfc6 
  src/main/java/org/apache/aurora/scheduler/mesos/MesosCallbackHandler.java fd5874d51cfbca1b98d15623a9c845d208d43b1f 
  src/main/java/org/apache/aurora/scheduler/offers/HostOffers.java PRE-CREATION 
  src/main/java/org/apache/aurora/scheduler/offers/OfferManager.java 96b0f46e69255944fa0f00621db315e22d68515c 
  src/main/java/org/apache/aurora/scheduler/offers/OfferManagerImpl.java PRE-CREATION 
  src/main/java/org/apache/aurora/scheduler/offers/OfferSettings.java 57fc1a18f1b82decc780ba0069ab4dd0c125f77d 
  src/main/java/org/apache/aurora/scheduler/offers/OffersModule.java 4a6ea8dac97ed2f5df47e4d16fa65a3b516988bd 
  src/main/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessor.java 766d3b24fd64de96b82d3dd2a17f7a80331889d8 
  src/main/java/org/apache/aurora/scheduler/preemptor/Preemptor.java 82a0ff67e9f70fed305f8f1bf38e3cf7955b9ce7 
  src/main/java/org/apache/aurora/scheduler/scheduling/FirstFitOfferSelector.java PRE-CREATION 
  src/main/java/org/apache/aurora/scheduler/scheduling/OfferSelector.java PRE-CREATION 
  src/main/java/org/apache/aurora/scheduler/scheduling/SchedulingModule.java 0796712a00e3cba595ceb049833933b9a70c2f9a 
  src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssigner.java PRE-CREATION 
  src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssignerImpl.java PRE-CREATION 
  src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssignerImplModule.java PRE-CREATION 
  src/main/java/org/apache/aurora/scheduler/scheduling/TaskScheduler.java 0002b0ceb429a404ac9dd0ae7e5ea9f6362fa100 
  src/main/java/org/apache/aurora/scheduler/scheduling/TaskSchedulerImpl.java PRE-CREATION 
  src/main/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerModule.java dc244eeaa0d292a06d8750cb340fb379701ad49f 
  src/main/java/org/apache/aurora/scheduler/state/StateModule.java b7a3c0be592c13181edf2e8c241a2ad351962e06 
  src/main/java/org/apache/aurora/scheduler/state/TaskAssigner.java cdd0d15872248b19d5eb52d25537f2f863fd5c77 
  src/main/java/org/apache/aurora/scheduler/stats/AsyncStatsModule.java 6033c01477bec7a491128e3089ffc1b1c3f1c150 
  src/test/java/org/apache/aurora/scheduler/config/CommandLineTest.java 0ec4de636e2fa0b671f8c1368e6d225747f215b6 
  src/test/java/org/apache/aurora/scheduler/http/OffersTest.java 30699596a1c95199df7504f62c5c18cab1be1c6c 
  src/test/java/org/apache/aurora/scheduler/mesos/MesosCallbackHandlerTest.java 45ae6bb5d12de66271a99aad0cda9632da22acea 
  src/test/java/org/apache/aurora/scheduler/offers/OfferManagerImplTest.java 6b18296ffdd7e1a5e989236db967c5e752a8a55f 
  src/test/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessorTest.java c76b3e338298d63834b4265d769649d39b9ae219 
  src/test/java/org/apache/aurora/scheduler/preemptor/PreemptorImplTest.java f14cba144856b23531467a7b8a3fd695ad8beee8 
  src/test/java/org/apache/aurora/scheduler/preemptor/PreemptorModuleTest.java 97c238ce30142a94a1fd9c6c7055fa95f2512cce 
  src/test/java/org/apache/aurora/scheduler/scheduling/FirstFitOfferSelectorTest.java PRE-CREATION 
  src/test/java/org/apache/aurora/scheduler/scheduling/TaskSchedulerImplTest.java 7a4525a190a662e82b9ba98346fae0b25a8ea673 
  src/test/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerTest.java 58f9de2731633664f4140d785c3a6df0cde063b4 
  src/test/java/org/apache/aurora/scheduler/stats/AsyncStatsModuleTest.java f8e802342e753ee6a23ba7e1c2ab5151b85cadb3 


Diff: https://reviews.apache.org/r/63973/diff/5/

Changes: https://reviews.apache.org/r/63973/diff/4-5/


Testing
-------

Tests coming soon, but they should be relatively close to what we have now on master since we don't really add/remove features but just move them around.

Ran some benchmarks as well to ensure performance parity:

```
MASTER
Benchmark                                                                      Mode  Cnt       Score       Error  Units
SchedulingBenchmarks.ClusterFullUtilizationBenchmark.runBenchmark             thrpt   10  113910.922 ± 26263.903  ops/s
SchedulingBenchmarks.FillClusterBenchmark.runBenchmark                        thrpt   10     263.043 ±   299.686  ops/s
SchedulingBenchmarks.InsufficientResourcesSchedulingBenchmark.runBenchmark    thrpt   10   12353.669 ±   433.182  ops/s
SchedulingBenchmarks.LimitConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10     893.263 ±    54.882  ops/s
SchedulingBenchmarks.ValueConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10   11478.420 ±  1068.819  ops/s
```
and
```
MY PATCH
Benchmark                                                                      Mode  Cnt       Score       Error  Units
SchedulingBenchmarks.ClusterFullUtilizationBenchmark.runBenchmark             thrpt   10  124041.966 ± 33331.424  ops/s
SchedulingBenchmarks.FillClusterBenchmark.runBenchmark                        thrpt   10    1030.434 ±  1223.539  ops/s
SchedulingBenchmarks.InsufficientResourcesSchedulingBenchmark.runBenchmark    thrpt   10   12305.154 ±   375.814  ops/s
SchedulingBenchmarks.LimitConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10    1080.267 ±    74.635  ops/s
SchedulingBenchmarks.ValueConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10   11604.642 ±   586.248  ops/s
```

Not exactly sure why `FillClusterBenchmark` increased so dramatically -- I will look into that while testing as well.


Thanks,

Jordan Ly


Re: Review Request 63973: Enable custom offer scoring modules for task assignment

Posted by Aurora ReviewBot <wf...@apache.org>.
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/63973/#review191913
-----------------------------------------------------------



Master (0f3dc93) is green with this patch.
  ./build-support/jenkins/build.sh

However, it appears that it might lack test coverage.

I will refresh this build result if you post a review containing "@ReviewBot retry"

- Aurora ReviewBot


On Nov. 27, 2017, 6:04 p.m., Jordan Ly wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/63973/
> -----------------------------------------------------------
> 
> (Updated Nov. 27, 2017, 6:04 p.m.)
> 
> 
> Review request for Aurora, David McLaughlin, Santhosh Kumar Shanmugham, Stephan Erb, and Bill Farner.
> 
> 
> Repository: aurora
> 
> 
> Description
> -------
> 
> Major portions of the refactor:
> 
> * Refactor `OfferManager` to do filtering of offers (added `getMatching` and `getAllMatching` methods) as opposed to TaskAssigner
> * Refactor `TaskAssigner`, allow for injection of custom "scoring" class through `OfferRanker` interface
> 
> And some minor things as well:
> 
> * Moved `TaskAssignerImpl`, `TaskSchedulerImpl`, and `HostOffers` into their own upper-level classes
> * Moved `TaskAssigner` to the `scheduling` package and out of the `state` package
> * Renamed some methods in `OfferManager` to avoid code stutter
> * Renaming of some classes (e.g. `FirstFitTaskAssigner` -> `TaskAssignerImpl`)
> * And a slew of others
> 
> Overall, the goal of this refactor is to allow for the easy injection of custom offer "scoring" modules via the `OfferRanker` interface. Callers will not have to replace the entire `TaskAssigner` module, but instead just provide a function that chooses from a list of offers that should already fit the task.
> 
> Going through this review, I would start with the `maybeAssign`/`launchUsingOffer` methods in `TaskAssigner`. Then, I would look at `getMatching`/`getAllMatching` in `HostOffers`.
> 
> 
> Diffs
> -----
> 
>   RELEASE-NOTES.md e622a8d38425a99c2965d64147fa0e680e5de517 
>   docs/reference/scheduler-configuration.md 6c385b5be2b64117989c624ce93c78609cfea6c5 
>   src/jmh/java/org/apache/aurora/benchmark/Offers.java 2b463267af6e7ae7fa16736de3b1e3d7d5bd99a8 
>   src/jmh/java/org/apache/aurora/benchmark/SchedulingBenchmarks.java 1708a5063afd12de5d2138e763a19d1cf8dc9714 
>   src/jmh/java/org/apache/aurora/benchmark/fakes/FakeOfferManager.java 201aa81db7f607a70c7d44011857576f45b7e9da 
>   src/main/java/org/apache/aurora/scheduler/app/AppModule.java 3204cca5446d0f798ace622d334473bf6db13733 
>   src/main/java/org/apache/aurora/scheduler/config/CliOptions.java d4537e386af53ec9bff661ed23d61a5bd4893edf 
>   src/main/java/org/apache/aurora/scheduler/filter/AttributeAggregate.java 60f141d34d862f200ae1346a38a71bba57551059 
>   src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilter.java 36608a9f027c95723c31f9915852112beb367223 
>   src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilterImpl.java df51d4cf4893899613683603ab4aa9aefa88faa6 
>   src/main/java/org/apache/aurora/scheduler/http/Offers.java f22ca6e5402d8ec7241376de14a9051ab0cfbfc6 
>   src/main/java/org/apache/aurora/scheduler/mesos/MesosCallbackHandler.java fd5874d51cfbca1b98d15623a9c845d208d43b1f 
>   src/main/java/org/apache/aurora/scheduler/offers/HostOffers.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferManager.java 96b0f46e69255944fa0f00621db315e22d68515c 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferManagerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferSettings.java 57fc1a18f1b82decc780ba0069ab4dd0c125f77d 
>   src/main/java/org/apache/aurora/scheduler/offers/OffersModule.java 4a6ea8dac97ed2f5df47e4d16fa65a3b516988bd 
>   src/main/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessor.java 766d3b24fd64de96b82d3dd2a17f7a80331889d8 
>   src/main/java/org/apache/aurora/scheduler/preemptor/Preemptor.java 82a0ff67e9f70fed305f8f1bf38e3cf7955b9ce7 
>   src/main/java/org/apache/aurora/scheduler/scheduling/FirstFitOfferRanker.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/OfferRanker.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/SchedulingModule.java 0796712a00e3cba595ceb049833933b9a70c2f9a 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssigner.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssignerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssignerImplModule.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskScheduler.java 0002b0ceb429a404ac9dd0ae7e5ea9f6362fa100 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskSchedulerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerModule.java dc244eeaa0d292a06d8750cb340fb379701ad49f 
>   src/main/java/org/apache/aurora/scheduler/state/StateModule.java b7a3c0be592c13181edf2e8c241a2ad351962e06 
>   src/main/java/org/apache/aurora/scheduler/state/TaskAssigner.java cdd0d15872248b19d5eb52d25537f2f863fd5c77 
>   src/main/java/org/apache/aurora/scheduler/stats/AsyncStatsModule.java 6033c01477bec7a491128e3089ffc1b1c3f1c150 
>   src/test/java/org/apache/aurora/scheduler/config/CommandLineTest.java 0ec4de636e2fa0b671f8c1368e6d225747f215b6 
>   src/test/java/org/apache/aurora/scheduler/http/OffersTest.java 30699596a1c95199df7504f62c5c18cab1be1c6c 
>   src/test/java/org/apache/aurora/scheduler/mesos/MesosCallbackHandlerTest.java 45ae6bb5d12de66271a99aad0cda9632da22acea 
>   src/test/java/org/apache/aurora/scheduler/offers/OfferManagerImplTest.java 6b18296ffdd7e1a5e989236db967c5e752a8a55f 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessorTest.java c76b3e338298d63834b4265d769649d39b9ae219 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PreemptorImplTest.java f14cba144856b23531467a7b8a3fd695ad8beee8 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PreemptorModuleTest.java 97c238ce30142a94a1fd9c6c7055fa95f2512cce 
>   src/test/java/org/apache/aurora/scheduler/scheduling/FirstFitOfferRankerTest.java PRE-CREATION 
>   src/test/java/org/apache/aurora/scheduler/scheduling/TaskSchedulerImplTest.java 7a4525a190a662e82b9ba98346fae0b25a8ea673 
>   src/test/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerTest.java 58f9de2731633664f4140d785c3a6df0cde063b4 
>   src/test/java/org/apache/aurora/scheduler/stats/AsyncStatsModuleTest.java f8e802342e753ee6a23ba7e1c2ab5151b85cadb3 
> 
> 
> Diff: https://reviews.apache.org/r/63973/diff/4/
> 
> 
> Testing
> -------
> 
> Tests coming soon, but they should be relatively close to what we have now on master since we don't really add/remove features but just move them around.
> 
> Ran some benchmarks as well to ensure performance parity:
> 
> ```
> MASTER
> Benchmark                                                                      Mode  Cnt       Score       Error  Units
> SchedulingBenchmarks.ClusterFullUtilizationBenchmark.runBenchmark             thrpt   10  113910.922 ± 26263.903  ops/s
> SchedulingBenchmarks.FillClusterBenchmark.runBenchmark                        thrpt   10     263.043 ±   299.686  ops/s
> SchedulingBenchmarks.InsufficientResourcesSchedulingBenchmark.runBenchmark    thrpt   10   12353.669 ±   433.182  ops/s
> SchedulingBenchmarks.LimitConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10     893.263 ±    54.882  ops/s
> SchedulingBenchmarks.ValueConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10   11478.420 ±  1068.819  ops/s
> ```
> and
> ```
> MY PATCH
> Benchmark                                                                      Mode  Cnt       Score       Error  Units
> SchedulingBenchmarks.ClusterFullUtilizationBenchmark.runBenchmark             thrpt   10  124041.966 ± 33331.424  ops/s
> SchedulingBenchmarks.FillClusterBenchmark.runBenchmark                        thrpt   10    1030.434 ±  1223.539  ops/s
> SchedulingBenchmarks.InsufficientResourcesSchedulingBenchmark.runBenchmark    thrpt   10   12305.154 ±   375.814  ops/s
> SchedulingBenchmarks.LimitConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10    1080.267 ±    74.635  ops/s
> SchedulingBenchmarks.ValueConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10   11604.642 ±   586.248  ops/s
> ```
> 
> Not exactly sure why `FillClusterBenchmark` increased so dramatically -- I will look into that while testing as well.
> 
> 
> Thanks,
> 
> Jordan Ly
> 
>


Re: Review Request 63973: Enable custom offer scoring modules for task assignment

Posted by Jordan Ly <jo...@gmail.com>.

> On Nov. 27, 2017, 7:08 p.m., Bill Farner wrote:
> > src/main/java/org/apache/aurora/scheduler/scheduling/OfferRanker.java
> > Lines 39 (patched)
> > <https://reviews.apache.org/r/63973/diff/4/?file=1901775#file1901775line39>
> >
> >     Nit with potentially far-reaching implications for naming - this interface doesn't really have anything to do with ranking.  Something like `OfferSelector` seems more fitting.  The command line arg and release note entry will need to change as well if you agree and proceed.

I agree, changed.


> On Nov. 27, 2017, 7:08 p.m., Bill Farner wrote:
> > src/main/java/org/apache/aurora/scheduler/scheduling/OfferRanker.java
> > Lines 40-42 (patched)
> > <https://reviews.apache.org/r/63973/diff/4/?file=1901775#file1901775line40>
> >
> >     These parameters are a bit curious, and seem to suggest intent not spelled out in docs or used in practice within this patch.
> >     
> >     Why does the implementer need more than `Iterable<HostOffer>` and `ResourceRequest`?

I originally gave `groupKey` and `task` in case an implementator needed the extra information. However, I now realize you can derive `groupKey` from `resourceRequest`, and `task` only contains the task/instance ID which I don't think should be terribly useful for scheduling.

Removed.


- Jordan


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


On Nov. 27, 2017, 7:41 p.m., Jordan Ly wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/63973/
> -----------------------------------------------------------
> 
> (Updated Nov. 27, 2017, 7:41 p.m.)
> 
> 
> Review request for Aurora, David McLaughlin, Santhosh Kumar Shanmugham, Stephan Erb, and Bill Farner.
> 
> 
> Repository: aurora
> 
> 
> Description
> -------
> 
> Major portions of the refactor:
> 
> * Refactor `OfferManager` to do filtering of offers (added `getMatching` and `getAllMatching` methods) as opposed to TaskAssigner
> * Refactor `TaskAssigner`, allow for injection of custom "scoring" class through `OfferRanker` interface
> 
> And some minor things as well:
> 
> * Moved `TaskAssignerImpl`, `TaskSchedulerImpl`, and `HostOffers` into their own upper-level classes
> * Moved `TaskAssigner` to the `scheduling` package and out of the `state` package
> * Renamed some methods in `OfferManager` to avoid code stutter
> * Renaming of some classes (e.g. `FirstFitTaskAssigner` -> `TaskAssignerImpl`)
> * And a slew of others
> 
> Overall, the goal of this refactor is to allow for the easy injection of custom offer "scoring" modules via the `OfferRanker` interface. Callers will not have to replace the entire `TaskAssigner` module, but instead just provide a function that chooses from a list of offers that should already fit the task.
> 
> Going through this review, I would start with the `maybeAssign`/`launchUsingOffer` methods in `TaskAssigner`. Then, I would look at `getMatching`/`getAllMatching` in `HostOffers`.
> 
> 
> Diffs
> -----
> 
>   RELEASE-NOTES.md e622a8d38425a99c2965d64147fa0e680e5de517 
>   docs/reference/scheduler-configuration.md 6c385b5be2b64117989c624ce93c78609cfea6c5 
>   src/jmh/java/org/apache/aurora/benchmark/Offers.java 2b463267af6e7ae7fa16736de3b1e3d7d5bd99a8 
>   src/jmh/java/org/apache/aurora/benchmark/SchedulingBenchmarks.java 1708a5063afd12de5d2138e763a19d1cf8dc9714 
>   src/jmh/java/org/apache/aurora/benchmark/fakes/FakeOfferManager.java 201aa81db7f607a70c7d44011857576f45b7e9da 
>   src/main/java/org/apache/aurora/scheduler/app/AppModule.java 3204cca5446d0f798ace622d334473bf6db13733 
>   src/main/java/org/apache/aurora/scheduler/config/CliOptions.java d4537e386af53ec9bff661ed23d61a5bd4893edf 
>   src/main/java/org/apache/aurora/scheduler/filter/AttributeAggregate.java 60f141d34d862f200ae1346a38a71bba57551059 
>   src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilter.java 36608a9f027c95723c31f9915852112beb367223 
>   src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilterImpl.java df51d4cf4893899613683603ab4aa9aefa88faa6 
>   src/main/java/org/apache/aurora/scheduler/http/Offers.java f22ca6e5402d8ec7241376de14a9051ab0cfbfc6 
>   src/main/java/org/apache/aurora/scheduler/mesos/MesosCallbackHandler.java fd5874d51cfbca1b98d15623a9c845d208d43b1f 
>   src/main/java/org/apache/aurora/scheduler/offers/HostOffers.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferManager.java 96b0f46e69255944fa0f00621db315e22d68515c 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferManagerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferSettings.java 57fc1a18f1b82decc780ba0069ab4dd0c125f77d 
>   src/main/java/org/apache/aurora/scheduler/offers/OffersModule.java 4a6ea8dac97ed2f5df47e4d16fa65a3b516988bd 
>   src/main/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessor.java 766d3b24fd64de96b82d3dd2a17f7a80331889d8 
>   src/main/java/org/apache/aurora/scheduler/preemptor/Preemptor.java 82a0ff67e9f70fed305f8f1bf38e3cf7955b9ce7 
>   src/main/java/org/apache/aurora/scheduler/scheduling/FirstFitOfferSelector.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/OfferSelector.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/SchedulingModule.java 0796712a00e3cba595ceb049833933b9a70c2f9a 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssigner.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssignerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssignerImplModule.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskScheduler.java 0002b0ceb429a404ac9dd0ae7e5ea9f6362fa100 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskSchedulerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerModule.java dc244eeaa0d292a06d8750cb340fb379701ad49f 
>   src/main/java/org/apache/aurora/scheduler/state/StateModule.java b7a3c0be592c13181edf2e8c241a2ad351962e06 
>   src/main/java/org/apache/aurora/scheduler/state/TaskAssigner.java cdd0d15872248b19d5eb52d25537f2f863fd5c77 
>   src/main/java/org/apache/aurora/scheduler/stats/AsyncStatsModule.java 6033c01477bec7a491128e3089ffc1b1c3f1c150 
>   src/test/java/org/apache/aurora/scheduler/config/CommandLineTest.java 0ec4de636e2fa0b671f8c1368e6d225747f215b6 
>   src/test/java/org/apache/aurora/scheduler/http/OffersTest.java 30699596a1c95199df7504f62c5c18cab1be1c6c 
>   src/test/java/org/apache/aurora/scheduler/mesos/MesosCallbackHandlerTest.java 45ae6bb5d12de66271a99aad0cda9632da22acea 
>   src/test/java/org/apache/aurora/scheduler/offers/OfferManagerImplTest.java 6b18296ffdd7e1a5e989236db967c5e752a8a55f 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessorTest.java c76b3e338298d63834b4265d769649d39b9ae219 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PreemptorImplTest.java f14cba144856b23531467a7b8a3fd695ad8beee8 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PreemptorModuleTest.java 97c238ce30142a94a1fd9c6c7055fa95f2512cce 
>   src/test/java/org/apache/aurora/scheduler/scheduling/FirstFitOfferSelectorTest.java PRE-CREATION 
>   src/test/java/org/apache/aurora/scheduler/scheduling/TaskSchedulerImplTest.java 7a4525a190a662e82b9ba98346fae0b25a8ea673 
>   src/test/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerTest.java 58f9de2731633664f4140d785c3a6df0cde063b4 
>   src/test/java/org/apache/aurora/scheduler/stats/AsyncStatsModuleTest.java f8e802342e753ee6a23ba7e1c2ab5151b85cadb3 
> 
> 
> Diff: https://reviews.apache.org/r/63973/diff/5/
> 
> 
> Testing
> -------
> 
> Tests coming soon, but they should be relatively close to what we have now on master since we don't really add/remove features but just move them around.
> 
> Ran some benchmarks as well to ensure performance parity:
> 
> ```
> MASTER
> Benchmark                                                                      Mode  Cnt       Score       Error  Units
> SchedulingBenchmarks.ClusterFullUtilizationBenchmark.runBenchmark             thrpt   10  113910.922 ± 26263.903  ops/s
> SchedulingBenchmarks.FillClusterBenchmark.runBenchmark                        thrpt   10     263.043 ±   299.686  ops/s
> SchedulingBenchmarks.InsufficientResourcesSchedulingBenchmark.runBenchmark    thrpt   10   12353.669 ±   433.182  ops/s
> SchedulingBenchmarks.LimitConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10     893.263 ±    54.882  ops/s
> SchedulingBenchmarks.ValueConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10   11478.420 ±  1068.819  ops/s
> ```
> and
> ```
> MY PATCH
> Benchmark                                                                      Mode  Cnt       Score       Error  Units
> SchedulingBenchmarks.ClusterFullUtilizationBenchmark.runBenchmark             thrpt   10  124041.966 ± 33331.424  ops/s
> SchedulingBenchmarks.FillClusterBenchmark.runBenchmark                        thrpt   10    1030.434 ±  1223.539  ops/s
> SchedulingBenchmarks.InsufficientResourcesSchedulingBenchmark.runBenchmark    thrpt   10   12305.154 ±   375.814  ops/s
> SchedulingBenchmarks.LimitConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10    1080.267 ±    74.635  ops/s
> SchedulingBenchmarks.ValueConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10   11604.642 ±   586.248  ops/s
> ```
> 
> Not exactly sure why `FillClusterBenchmark` increased so dramatically -- I will look into that while testing as well.
> 
> 
> Thanks,
> 
> Jordan Ly
> 
>


Re: Review Request 63973: Enable custom offer scoring modules for task assignment

Posted by Bill Farner <wf...@apache.org>.
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/63973/#review191918
-----------------------------------------------------------




src/main/java/org/apache/aurora/scheduler/scheduling/OfferRanker.java
Lines 39 (patched)
<https://reviews.apache.org/r/63973/#comment269851>

    Nit with potentially far-reaching implications for naming - this interface doesn't really have anything to do with ranking.  Something like `OfferSelector` seems more fitting.  The command line arg and release note entry will need to change as well if you agree and proceed.



src/main/java/org/apache/aurora/scheduler/scheduling/OfferRanker.java
Lines 40-42 (patched)
<https://reviews.apache.org/r/63973/#comment269853>

    These parameters are a bit curious, and seem to suggest intent not spelled out in docs or used in practice within this patch.
    
    Why does the implementer need more than `Iterable<HostOffer>` and `ResourceRequest`?


- Bill Farner


On Nov. 27, 2017, 10:04 a.m., Jordan Ly wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/63973/
> -----------------------------------------------------------
> 
> (Updated Nov. 27, 2017, 10:04 a.m.)
> 
> 
> Review request for Aurora, David McLaughlin, Santhosh Kumar Shanmugham, Stephan Erb, and Bill Farner.
> 
> 
> Repository: aurora
> 
> 
> Description
> -------
> 
> Major portions of the refactor:
> 
> * Refactor `OfferManager` to do filtering of offers (added `getMatching` and `getAllMatching` methods) as opposed to TaskAssigner
> * Refactor `TaskAssigner`, allow for injection of custom "scoring" class through `OfferRanker` interface
> 
> And some minor things as well:
> 
> * Moved `TaskAssignerImpl`, `TaskSchedulerImpl`, and `HostOffers` into their own upper-level classes
> * Moved `TaskAssigner` to the `scheduling` package and out of the `state` package
> * Renamed some methods in `OfferManager` to avoid code stutter
> * Renaming of some classes (e.g. `FirstFitTaskAssigner` -> `TaskAssignerImpl`)
> * And a slew of others
> 
> Overall, the goal of this refactor is to allow for the easy injection of custom offer "scoring" modules via the `OfferRanker` interface. Callers will not have to replace the entire `TaskAssigner` module, but instead just provide a function that chooses from a list of offers that should already fit the task.
> 
> Going through this review, I would start with the `maybeAssign`/`launchUsingOffer` methods in `TaskAssigner`. Then, I would look at `getMatching`/`getAllMatching` in `HostOffers`.
> 
> 
> Diffs
> -----
> 
>   RELEASE-NOTES.md e622a8d38425a99c2965d64147fa0e680e5de517 
>   docs/reference/scheduler-configuration.md 6c385b5be2b64117989c624ce93c78609cfea6c5 
>   src/jmh/java/org/apache/aurora/benchmark/Offers.java 2b463267af6e7ae7fa16736de3b1e3d7d5bd99a8 
>   src/jmh/java/org/apache/aurora/benchmark/SchedulingBenchmarks.java 1708a5063afd12de5d2138e763a19d1cf8dc9714 
>   src/jmh/java/org/apache/aurora/benchmark/fakes/FakeOfferManager.java 201aa81db7f607a70c7d44011857576f45b7e9da 
>   src/main/java/org/apache/aurora/scheduler/app/AppModule.java 3204cca5446d0f798ace622d334473bf6db13733 
>   src/main/java/org/apache/aurora/scheduler/config/CliOptions.java d4537e386af53ec9bff661ed23d61a5bd4893edf 
>   src/main/java/org/apache/aurora/scheduler/filter/AttributeAggregate.java 60f141d34d862f200ae1346a38a71bba57551059 
>   src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilter.java 36608a9f027c95723c31f9915852112beb367223 
>   src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilterImpl.java df51d4cf4893899613683603ab4aa9aefa88faa6 
>   src/main/java/org/apache/aurora/scheduler/http/Offers.java f22ca6e5402d8ec7241376de14a9051ab0cfbfc6 
>   src/main/java/org/apache/aurora/scheduler/mesos/MesosCallbackHandler.java fd5874d51cfbca1b98d15623a9c845d208d43b1f 
>   src/main/java/org/apache/aurora/scheduler/offers/HostOffers.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferManager.java 96b0f46e69255944fa0f00621db315e22d68515c 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferManagerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/offers/OfferSettings.java 57fc1a18f1b82decc780ba0069ab4dd0c125f77d 
>   src/main/java/org/apache/aurora/scheduler/offers/OffersModule.java 4a6ea8dac97ed2f5df47e4d16fa65a3b516988bd 
>   src/main/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessor.java 766d3b24fd64de96b82d3dd2a17f7a80331889d8 
>   src/main/java/org/apache/aurora/scheduler/preemptor/Preemptor.java 82a0ff67e9f70fed305f8f1bf38e3cf7955b9ce7 
>   src/main/java/org/apache/aurora/scheduler/scheduling/FirstFitOfferRanker.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/OfferRanker.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/SchedulingModule.java 0796712a00e3cba595ceb049833933b9a70c2f9a 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssigner.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssignerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskAssignerImplModule.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskScheduler.java 0002b0ceb429a404ac9dd0ae7e5ea9f6362fa100 
>   src/main/java/org/apache/aurora/scheduler/scheduling/TaskSchedulerImpl.java PRE-CREATION 
>   src/main/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerModule.java dc244eeaa0d292a06d8750cb340fb379701ad49f 
>   src/main/java/org/apache/aurora/scheduler/state/StateModule.java b7a3c0be592c13181edf2e8c241a2ad351962e06 
>   src/main/java/org/apache/aurora/scheduler/state/TaskAssigner.java cdd0d15872248b19d5eb52d25537f2f863fd5c77 
>   src/main/java/org/apache/aurora/scheduler/stats/AsyncStatsModule.java 6033c01477bec7a491128e3089ffc1b1c3f1c150 
>   src/test/java/org/apache/aurora/scheduler/config/CommandLineTest.java 0ec4de636e2fa0b671f8c1368e6d225747f215b6 
>   src/test/java/org/apache/aurora/scheduler/http/OffersTest.java 30699596a1c95199df7504f62c5c18cab1be1c6c 
>   src/test/java/org/apache/aurora/scheduler/mesos/MesosCallbackHandlerTest.java 45ae6bb5d12de66271a99aad0cda9632da22acea 
>   src/test/java/org/apache/aurora/scheduler/offers/OfferManagerImplTest.java 6b18296ffdd7e1a5e989236db967c5e752a8a55f 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PendingTaskProcessorTest.java c76b3e338298d63834b4265d769649d39b9ae219 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PreemptorImplTest.java f14cba144856b23531467a7b8a3fd695ad8beee8 
>   src/test/java/org/apache/aurora/scheduler/preemptor/PreemptorModuleTest.java 97c238ce30142a94a1fd9c6c7055fa95f2512cce 
>   src/test/java/org/apache/aurora/scheduler/scheduling/FirstFitOfferRankerTest.java PRE-CREATION 
>   src/test/java/org/apache/aurora/scheduler/scheduling/TaskSchedulerImplTest.java 7a4525a190a662e82b9ba98346fae0b25a8ea673 
>   src/test/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerTest.java 58f9de2731633664f4140d785c3a6df0cde063b4 
>   src/test/java/org/apache/aurora/scheduler/stats/AsyncStatsModuleTest.java f8e802342e753ee6a23ba7e1c2ab5151b85cadb3 
> 
> 
> Diff: https://reviews.apache.org/r/63973/diff/4/
> 
> 
> Testing
> -------
> 
> Tests coming soon, but they should be relatively close to what we have now on master since we don't really add/remove features but just move them around.
> 
> Ran some benchmarks as well to ensure performance parity:
> 
> ```
> MASTER
> Benchmark                                                                      Mode  Cnt       Score       Error  Units
> SchedulingBenchmarks.ClusterFullUtilizationBenchmark.runBenchmark             thrpt   10  113910.922 ± 26263.903  ops/s
> SchedulingBenchmarks.FillClusterBenchmark.runBenchmark                        thrpt   10     263.043 ±   299.686  ops/s
> SchedulingBenchmarks.InsufficientResourcesSchedulingBenchmark.runBenchmark    thrpt   10   12353.669 ±   433.182  ops/s
> SchedulingBenchmarks.LimitConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10     893.263 ±    54.882  ops/s
> SchedulingBenchmarks.ValueConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10   11478.420 ±  1068.819  ops/s
> ```
> and
> ```
> MY PATCH
> Benchmark                                                                      Mode  Cnt       Score       Error  Units
> SchedulingBenchmarks.ClusterFullUtilizationBenchmark.runBenchmark             thrpt   10  124041.966 ± 33331.424  ops/s
> SchedulingBenchmarks.FillClusterBenchmark.runBenchmark                        thrpt   10    1030.434 ±  1223.539  ops/s
> SchedulingBenchmarks.InsufficientResourcesSchedulingBenchmark.runBenchmark    thrpt   10   12305.154 ±   375.814  ops/s
> SchedulingBenchmarks.LimitConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10    1080.267 ±    74.635  ops/s
> SchedulingBenchmarks.ValueConstraintMismatchSchedulingBenchmark.runBenchmark  thrpt   10   11604.642 ±   586.248  ops/s
> ```
> 
> Not exactly sure why `FillClusterBenchmark` increased so dramatically -- I will look into that while testing as well.
> 
> 
> Thanks,
> 
> Jordan Ly
> 
>