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
[1m[31m 1 failed, 795 passed, 6 skipped, 1 warnings in 339.44 seconds [0m
FAILURE
21:25:48 06:26 [complete][31m
FAILURE[0m
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
>
>