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/21 03:40:44 UTC

Review Request 63973: Enable custom offer scoring modules for task assignment and injecting of custom OfferManagers

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

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


Repository: aurora


Description
-------

This is a rather large diff. Posting without tests first to get initial impressions/make the review more digestible, but tests are soon to come.

Major portions of the refactor:

* Allows injection of custom `OfferManager` via `OfferManagerModule`
* 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
-----

  docs/reference/scheduler-configuration.md d17541f9458650240983276b69f749a854057aa8 
  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/OfferManagerModule.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 c03fff11ea3a4086f9daaa8b07315006c1b481e4 
  src/main/java/org/apache/aurora/scheduler/state/TaskAssigner.java cdd0d15872248b19d5eb52d25537f2f863fd5c77 
  src/main/java/org/apache/aurora/scheduler/stats/AsyncStatsModule.java 6033c01477bec7a491128e3089ffc1b1c3f1c150 


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


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 and injecting of custom OfferManagers

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



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

 [182] ./~/react-dom/index.js 1.36 kB {0} [built]
 [183] ./~/bootstrap/dist/css/bootstrap.css 984 bytes {0} [built]
 [184] ./src/main/sass/app.scss 1.19 kB {0} [built]
 [185] ./src/main/resources/source-sans-pro.css 1.05 kB {0} [built]
 [217] ./src/main/js/index.js 3.15 kB {0} [built]
 [253] ./~/react-router-dom/es/Redirect.js 137 bytes {0} [built]
    + 262 hidden modules
:processResources
:classes
:jar
:startScripts
:distTar
:distZip
:assemble
:compileTestJavaNote: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

:processTestResources
:testClasses
:compileJmhJavaNote: /home/jenkins/jenkins-slave/workspace/AuroraBot/src/jmh/java/org/apache/aurora/benchmark/fakes/FakeSchedulerDriver.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

:processJmhResources NO-SOURCE
:jmhClasses
:checkstyleJmh[ant:checkstyle] [ERROR] /home/jenkins/jenkins-slave/workspace/AuroraBot/src/jmh/java/org/apache/aurora/benchmark/fakes/FakeOfferManager.java:21:8: Unused import - org.apache.aurora.scheduler.filter.SchedulingFilter. [UnusedImports]
 FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':checkstyleJmh'.
> Checkstyle rule violations were found. See the report at: file:///home/jenkins/jenkins-slave/workspace/AuroraBot/dist/reports/checkstyle/jmh.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 4m 4s
30 actionable tasks: 24 executed, 6 up-to-date


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

- Aurora ReviewBot


On Nov. 27, 2017, 6:44 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, 6:44 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/3/
> 
> 
> 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
> 
>


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, 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 and injecting of custom OfferManagers

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, 6:44 a.m.)


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


Changes
-------

Add tests, RELEASE-NOTES


Repository: aurora


Description
-------

This is a rather large diff. Posting without tests first to get initial impressions/make the review more digestible, but tests are soon to come.

Major portions of the refactor:

* Allows injection of custom `OfferManager` via `OfferManagerModule`
* 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/3/

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


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 and injecting of custom OfferManagers

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



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

  symbol:   variable OUTSTANDING_OFFERS
  location: class OfferManagerImplTest
/home/jenkins/jenkins-slave/workspace/AuroraBot/src/test/java/org/apache/aurora/scheduler/offers/OfferManagerImplTest.java:206: error: cannot find symbol
    offerManager.addOffer(OFFER_A);
                ^
  symbol:   method addOffer(HostOffer)
  location: variable offerManager of type OfferManagerImpl
/home/jenkins/jenkins-slave/workspace/AuroraBot/src/test/java/org/apache/aurora/scheduler/offers/OfferManagerImplTest.java:207: error: cannot find symbol
    assertEquals(0, statsProvider.getLongValue(OUTSTANDING_OFFERS));
                                               ^
  symbol:   variable OUTSTANDING_OFFERS
  location: class OfferManagerImplTest
/home/jenkins/jenkins-slave/workspace/AuroraBot/src/test/java/org/apache/aurora/scheduler/offers/OfferManagerImplTest.java:214: error: cannot find symbol
    offerManager.addOffer(OFFER_A);
                ^
  symbol:   method addOffer(HostOffer)
  location: variable offerManager of type OfferManagerImpl
/home/jenkins/jenkins-slave/workspace/AuroraBot/src/test/java/org/apache/aurora/scheduler/offers/OfferManagerImplTest.java:215: error: cannot find symbol
    assertEquals(OFFER_A, Iterables.getOnlyElement(offerManager.getOffers()));
                                                               ^
  symbol:   method getOffers()
  location: variable offerManager of type OfferManagerImpl
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
100 errors
 FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileTestJava'.
> Compilation failed; see the compiler error output for details.

* 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 3m 44s
27 actionable tasks: 21 executed, 6 up-to-date


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

- Aurora ReviewBot


On Nov. 22, 2017, 8:38 a.m., Jordan Ly wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/63973/
> -----------------------------------------------------------
> 
> (Updated Nov. 22, 2017, 8:38 a.m.)
> 
> 
> Review request for Aurora, David McLaughlin, Santhosh Kumar Shanmugham, Stephan Erb, and Bill Farner.
> 
> 
> Repository: aurora
> 
> 
> Description
> -------
> 
> This is a rather large diff. Posting without tests first to get initial impressions/make the review more digestible, but tests are soon to come.
> 
> Major portions of the refactor:
> 
> * Allows injection of custom `OfferManager` via `OfferManagerModule`
> * 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
> -----
> 
>   docs/reference/scheduler-configuration.md d17541f9458650240983276b69f749a854057aa8 
>   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 c03fff11ea3a4086f9daaa8b07315006c1b481e4 
>   src/main/java/org/apache/aurora/scheduler/state/TaskAssigner.java cdd0d15872248b19d5eb52d25537f2f863fd5c77 
>   src/main/java/org/apache/aurora/scheduler/stats/AsyncStatsModule.java 6033c01477bec7a491128e3089ffc1b1c3f1c150 
> 
> 
> Diff: https://reviews.apache.org/r/63973/diff/2/
> 
> 
> 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 and injecting of custom OfferManagers

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. 22, 2017, 8:38 a.m.)


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


Changes
-------

Responded to comments, removed injectability of `OfferManager`


Repository: aurora


Description
-------

This is a rather large diff. Posting without tests first to get initial impressions/make the review more digestible, but tests are soon to come.

Major portions of the refactor:

* Allows injection of custom `OfferManager` via `OfferManagerModule`
* 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)
-----

  docs/reference/scheduler-configuration.md d17541f9458650240983276b69f749a854057aa8 
  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 c03fff11ea3a4086f9daaa8b07315006c1b481e4 
  src/main/java/org/apache/aurora/scheduler/state/TaskAssigner.java cdd0d15872248b19d5eb52d25537f2f863fd5c77 
  src/main/java/org/apache/aurora/scheduler/stats/AsyncStatsModule.java 6033c01477bec7a491128e3089ffc1b1c3f1c150 


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

Changes: https://reviews.apache.org/r/63973/diff/1-2/


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 and injecting of custom OfferManagers

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



Master (46b1112) is red with this patch.
  ./build-support/jenkins/build.sh

  symbol:   variable OUTSTANDING_OFFERS
  location: class OfferManagerImplTest
/home/jenkins/jenkins-slave/workspace/AuroraBot/src/test/java/org/apache/aurora/scheduler/offers/OfferManagerImplTest.java:206: error: cannot find symbol
    offerManager.addOffer(OFFER_A);
                ^
  symbol:   method addOffer(HostOffer)
  location: variable offerManager of type OfferManagerImpl
/home/jenkins/jenkins-slave/workspace/AuroraBot/src/test/java/org/apache/aurora/scheduler/offers/OfferManagerImplTest.java:207: error: cannot find symbol
    assertEquals(0, statsProvider.getLongValue(OUTSTANDING_OFFERS));
                                               ^
  symbol:   variable OUTSTANDING_OFFERS
  location: class OfferManagerImplTest
/home/jenkins/jenkins-slave/workspace/AuroraBot/src/test/java/org/apache/aurora/scheduler/offers/OfferManagerImplTest.java:214: error: cannot find symbol
    offerManager.addOffer(OFFER_A);
                ^
  symbol:   method addOffer(HostOffer)
  location: variable offerManager of type OfferManagerImpl
/home/jenkins/jenkins-slave/workspace/AuroraBot/src/test/java/org/apache/aurora/scheduler/offers/OfferManagerImplTest.java:215: error: cannot find symbol
    assertEquals(OFFER_A, Iterables.getOnlyElement(offerManager.getOffers()));
                                                               ^
  symbol:   method getOffers()
  location: variable offerManager of type OfferManagerImpl
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
100 errors
 FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileTestJava'.
> Compilation failed; see the compiler error output for details.

* 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 3m 57s
27 actionable tasks: 21 executed, 6 up-to-date


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

- Aurora ReviewBot


On Nov. 21, 2017, 11:40 a.m., Jordan Ly wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/63973/
> -----------------------------------------------------------
> 
> (Updated Nov. 21, 2017, 11:40 a.m.)
> 
> 
> Review request for Aurora, David McLaughlin, Santhosh Kumar Shanmugham, Stephan Erb, and Bill Farner.
> 
> 
> Repository: aurora
> 
> 
> Description
> -------
> 
> This is a rather large diff. Posting without tests first to get initial impressions/make the review more digestible, but tests are soon to come.
> 
> Major portions of the refactor:
> 
> * Allows injection of custom `OfferManager` via `OfferManagerModule`
> * 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
> -----
> 
>   docs/reference/scheduler-configuration.md d17541f9458650240983276b69f749a854057aa8 
>   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/OfferManagerModule.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 c03fff11ea3a4086f9daaa8b07315006c1b481e4 
>   src/main/java/org/apache/aurora/scheduler/state/TaskAssigner.java cdd0d15872248b19d5eb52d25537f2f863fd5c77 
>   src/main/java/org/apache/aurora/scheduler/stats/AsyncStatsModule.java 6033c01477bec7a491128e3089ffc1b1c3f1c150 
> 
> 
> Diff: https://reviews.apache.org/r/63973/diff/1/
> 
> 
> 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 and injecting of custom OfferManagers

Posted by Bill Farner <wf...@apache.org>.

> On Nov. 21, 2017, 1:27 p.m., Bill Farner wrote:
> > src/main/java/org/apache/aurora/scheduler/scheduling/TaskSchedulerImpl.java
> > Lines 140 (patched)
> > <https://reviews.apache.org/r/63973/diff/1/?file=1898164#file1898164line140>
> >
> >     Consider moving this up to :122 and replacing `ImmutableSet<IAssignedTask> assignedtasks`.
> 
> Jordan Ly wrote:
>     Mind if I do this in a subsequent patch? I copied `TaskSchedulerImpl` from master -- hoping to avoid too many hidden collateral changes.

Fine by me.


- Bill


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


On Nov. 22, 2017, 12:38 a.m., Jordan Ly wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/63973/
> -----------------------------------------------------------
> 
> (Updated Nov. 22, 2017, 12:38 a.m.)
> 
> 
> Review request for Aurora, David McLaughlin, Santhosh Kumar Shanmugham, Stephan Erb, and Bill Farner.
> 
> 
> Repository: aurora
> 
> 
> Description
> -------
> 
> This is a rather large diff. Posting without tests first to get initial impressions/make the review more digestible, but tests are soon to come.
> 
> Major portions of the refactor:
> 
> * Allows injection of custom `OfferManager` via `OfferManagerModule`
> * 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
> -----
> 
>   docs/reference/scheduler-configuration.md d17541f9458650240983276b69f749a854057aa8 
>   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 c03fff11ea3a4086f9daaa8b07315006c1b481e4 
>   src/main/java/org/apache/aurora/scheduler/state/TaskAssigner.java cdd0d15872248b19d5eb52d25537f2f863fd5c77 
>   src/main/java/org/apache/aurora/scheduler/stats/AsyncStatsModule.java 6033c01477bec7a491128e3089ffc1b1c3f1c150 
> 
> 
> Diff: https://reviews.apache.org/r/63973/diff/2/
> 
> 
> 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 and injecting of custom OfferManagers

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



This looks great to me overall.  The issue of custom modules is the only thing that causes me to hold back a 'Ship It'.


src/main/java/org/apache/aurora/scheduler/offers/HostOffers.java
Lines 58 (patched)
<https://reviews.apache.org/r/63973/#comment269492>

    Pre-dates this patch, but stands out now since it's green - it's odd to see a concurrent structure willfully used alongside `HashMap`.
    
    For consistency, consider using `Sets.newHashSet()` here and adding `synchronized` to `isGloballyBanned()`.



src/main/java/org/apache/aurora/scheduler/offers/HostOffers.java
Lines 190 (patched)
<https://reviews.apache.org/r/63973/#comment269493>

    Must be `synchronized` since it's lazily accessed via `getAllMatching`.



src/main/java/org/apache/aurora/scheduler/offers/HostOffers.java
Lines 199 (patched)
<https://reviews.apache.org/r/63973/#comment269494>

    Consider making this `static` and passing `SchedulingFilter`.  This makes it clear that it is not accessing member fields that require synchronization.



src/main/java/org/apache/aurora/scheduler/offers/OfferManagerModule.java
Lines 46 (patched)
<https://reviews.apache.org/r/63973/#comment269495>

    This doesn't seem like a reasonable customization to provide or implement; it is complex and has strong ties to the overall behavior of the scheduler (e.g. interacting with `Driver`).
    
    What are you hoping to accomplish with this?



src/main/java/org/apache/aurora/scheduler/scheduling/TaskSchedulerImpl.java
Lines 140 (patched)
<https://reviews.apache.org/r/63973/#comment269499>

    Consider moving this up to :122 and replacing `ImmutableSet<IAssignedTask> assignedtasks`.



src/main/java/org/apache/aurora/scheduler/state/StateModule.java
Line 45 (original), 46 (patched)
<https://reviews.apache.org/r/63973/#comment269498>

    I suggest removing this customization.  `OfferRanker` seems like a much more reasonable level of abstraction.


- Bill Farner


On Nov. 20, 2017, 7:40 p.m., Jordan Ly wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/63973/
> -----------------------------------------------------------
> 
> (Updated Nov. 20, 2017, 7:40 p.m.)
> 
> 
> Review request for Aurora, David McLaughlin, Santhosh Kumar Shanmugham, Stephan Erb, and Bill Farner.
> 
> 
> Repository: aurora
> 
> 
> Description
> -------
> 
> This is a rather large diff. Posting without tests first to get initial impressions/make the review more digestible, but tests are soon to come.
> 
> Major portions of the refactor:
> 
> * Allows injection of custom `OfferManager` via `OfferManagerModule`
> * 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
> -----
> 
>   docs/reference/scheduler-configuration.md d17541f9458650240983276b69f749a854057aa8 
>   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/OfferManagerModule.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 c03fff11ea3a4086f9daaa8b07315006c1b481e4 
>   src/main/java/org/apache/aurora/scheduler/state/TaskAssigner.java cdd0d15872248b19d5eb52d25537f2f863fd5c77 
>   src/main/java/org/apache/aurora/scheduler/stats/AsyncStatsModule.java 6033c01477bec7a491128e3089ffc1b1c3f1c150 
> 
> 
> Diff: https://reviews.apache.org/r/63973/diff/1/
> 
> 
> 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>.

> On Nov. 20, 2017, 7:55 p.m., Jordan Ly wrote:
> > src/main/java/org/apache/aurora/scheduler/filter/AttributeAggregate.java
> > Line 52 (original)
> > <https://reviews.apache.org/r/63973/diff/1/?file=1898144#file1898144line52>
> >
> >     Note for reviewers: this was causing some tests to fail due to my refactors not calling the initialization.
> >     
> >     I removed this optimization since it seemed to be geared toward the internal DB implementation we just removed. The benchmarks look alright, but I may be overlooking something from the original issue.
> >     
> >     I was looking at this patch as context: https://reviews.apache.org/r/53918/
> 
> Bill Farner wrote:
>     Unfortunate if not covered in tests, but this appears to be necessary for correctness when multiple tasks are scheduled per scheduling round.  This seems to be the review for meaningful context: https://reviews.apache.org/r/51929/
>     
>     When a task is successfully scheduled in a scheduling round, the AttributeAggregate is updated so that it remains correct in a subsequent attempt within the same round.
> 
> Jordan Ly wrote:
>     I believe that this change should not impact correctness. From what I understand, `isInitialized` just avoids redundant calls and removing it should be fine. However, I am not certain -- reading the commit message of the review I linked makes me a bit wary ('broken on master since the introduction of scheduling attempts with multiple tasks'). Maybe Stephan can provide more information?

> From what I understand, isInitialized just avoids redundant calls

Upon closer inspection, i agree that your change will not affect correctness.  LGTM!


- Bill


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


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 and injecting of custom OfferManagers

Posted by Bill Farner <wf...@apache.org>.

> On Nov. 20, 2017, 7:55 p.m., Jordan Ly wrote:
> > src/main/java/org/apache/aurora/scheduler/filter/AttributeAggregate.java
> > Line 52 (original)
> > <https://reviews.apache.org/r/63973/diff/1/?file=1898144#file1898144line52>
> >
> >     Note for reviewers: this was causing some tests to fail due to my refactors not calling the initialization.
> >     
> >     I removed this optimization since it seemed to be geared toward the internal DB implementation we just removed. The benchmarks look alright, but I may be overlooking something from the original issue.
> >     
> >     I was looking at this patch as context: https://reviews.apache.org/r/53918/

Unfortunate if not covered in tests, but this appears to be necessary for correctness when multiple tasks are scheduled per scheduling round.  This seems to be the review for meaningful context: https://reviews.apache.org/r/51929/

When a task is successfully scheduled in a scheduling round, the AttributeAggregate is updated so that it remains correct in a subsequent attempt within the same round.


- Bill


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


On Nov. 20, 2017, 7:40 p.m., Jordan Ly wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/63973/
> -----------------------------------------------------------
> 
> (Updated Nov. 20, 2017, 7:40 p.m.)
> 
> 
> Review request for Aurora, David McLaughlin, Santhosh Kumar Shanmugham, Stephan Erb, and Bill Farner.
> 
> 
> Repository: aurora
> 
> 
> Description
> -------
> 
> This is a rather large diff. Posting without tests first to get initial impressions/make the review more digestible, but tests are soon to come.
> 
> Major portions of the refactor:
> 
> * Allows injection of custom `OfferManager` via `OfferManagerModule`
> * 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
> -----
> 
>   docs/reference/scheduler-configuration.md d17541f9458650240983276b69f749a854057aa8 
>   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/OfferManagerModule.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 c03fff11ea3a4086f9daaa8b07315006c1b481e4 
>   src/main/java/org/apache/aurora/scheduler/state/TaskAssigner.java cdd0d15872248b19d5eb52d25537f2f863fd5c77 
>   src/main/java/org/apache/aurora/scheduler/stats/AsyncStatsModule.java 6033c01477bec7a491128e3089ffc1b1c3f1c150 
> 
> 
> Diff: https://reviews.apache.org/r/63973/diff/1/
> 
> 
> 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 and injecting of custom OfferManagers

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




docs/reference/scheduler-configuration.md
Line 223 (original), 223 (patched)
<https://reviews.apache.org/r/63973/#comment269400>

    Note to myself to add CHANGELOG entries for all of these changes and new options.



src/main/java/org/apache/aurora/scheduler/filter/AttributeAggregate.java
Line 52 (original)
<https://reviews.apache.org/r/63973/#comment269401>

    Note for reviewers: this was causing some tests to fail due to my refactors not calling the initialization.
    
    I removed this optimization since it seemed to be geared toward the internal DB implementation we just removed. The benchmarks look alright, but I may be overlooking something from the original issue.
    
    I was looking at this patch as context: https://reviews.apache.org/r/53918/


- Jordan Ly


On Nov. 21, 2017, 3:40 a.m., Jordan Ly wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/63973/
> -----------------------------------------------------------
> 
> (Updated Nov. 21, 2017, 3:40 a.m.)
> 
> 
> Review request for Aurora, David McLaughlin, Santhosh Kumar Shanmugham, Stephan Erb, and Bill Farner.
> 
> 
> Repository: aurora
> 
> 
> Description
> -------
> 
> This is a rather large diff. Posting without tests first to get initial impressions/make the review more digestible, but tests are soon to come.
> 
> Major portions of the refactor:
> 
> * Allows injection of custom `OfferManager` via `OfferManagerModule`
> * 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
> -----
> 
>   docs/reference/scheduler-configuration.md d17541f9458650240983276b69f749a854057aa8 
>   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/OfferManagerModule.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 c03fff11ea3a4086f9daaa8b07315006c1b481e4 
>   src/main/java/org/apache/aurora/scheduler/state/TaskAssigner.java cdd0d15872248b19d5eb52d25537f2f863fd5c77 
>   src/main/java/org/apache/aurora/scheduler/stats/AsyncStatsModule.java 6033c01477bec7a491128e3089ffc1b1c3f1c150 
> 
> 
> Diff: https://reviews.apache.org/r/63973/diff/1/
> 
> 
> 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
> 
>