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

Review request for Aurora, Joshua Cohen and Stephan Erb.


Bugs: AURORA-1847
    https://issues.apache.org/jira/browse/AURORA-1847


Repository: aurora


Description
-------

If scheduler is configured to run with the `MemTaskStore` every hit on 
scheduler landing page (`/scheduler`) causes a call to 
`MemTaskStore.getJobKeys()` through `ReadOnlyScheduler.getRoleSummary()`.

The implementation of `MemTaskStore.getJobKeys()` is currently very inefficient 
as it requires a sequential scan of the task store and mapping to their 
respective job keys. In Twitter clusters this method is currently taking half a 
second per call (`mem_storage_get_job_keys`). 

This patch eliminates the sequential scan and mapping to job key by simply 
returning an immutable copy of the key set of the existing secondary index 
`job`.


Diffs
-----

  src/jmh/java/org/apache/aurora/benchmark/TaskStoreBenchmarks.java 
f2f00b92bf901c438e40bbc177e9f5a112be1bbc 
  src/main/java/org/apache/aurora/scheduler/storage/mem/MemTaskStore.java 
fc272ddb45be8b2f55f01c3d54f7fa9058202c0b 

Diff: https://reviews.apache.org/r/55217/diff/


Testing
-------

Using the following modified version of existing 
`TaskStoreBenchmarks.MemFetchTasksBenchmark` which benchmarks 
`TaskStore.getJobKeys()`:
```java
public static class MemFetchTasksBenchmark extends AbstractFetchTasksBenchmark {
    @Setup(Level.Trial)
    @Override
    public void setUp() {
      storage = Guice.createInjector(
          Modules.combine(
              DbModule.testModuleWithWorkQueue(PLAIN, Optional.of(new 
InMemStoresModule(PLAIN))),
              new AbstractModule() {
                @Override
                protected void configure() {
                  bind(StatsProvider.class).toInstance(new FakeStatsProvider());
                  bind(Clock.class).toInstance(new FakeClock());
                }
              }))
          .getInstance(Storage.class);

    }

    @Setup(Level.Iteration)
    public void setUpIteration() {
      createTasks(numTasks);
    }

    @TearDown(Level.Iteration)
    public void tearDownIteration() {
      deleteTasks();
    }

    @Benchmark
    public Iterable<IJobKey> run() {
      return storage.read(store -> store.getTaskStore().getJobKeys());
    }
  }
```

Benchmark results BEFORE patch:
```
Benchmark                                       (numTasks)   Mode  Cnt    Score 
    Error  Units
TaskStoreBenchmarks.MemFetchTasksBenchmark.run       10000  thrpt    5  572.761 
± 168.865  ops/s
TaskStoreBenchmarks.MemFetchTasksBenchmark.run       50000  thrpt    5   80.697 
±   8.516  ops/s
TaskStoreBenchmarks.MemFetchTasksBenchmark.run      100000  thrpt    5   25.102 
±   3.244  ops/s
```

Benchmark results AFTER patch:
```
Benchmark                                       (numTasks)   Mode  Cnt       
Score       Error  Units
TaskStoreBenchmarks.MemFetchTasksBenchmark.run       10000  thrpt    5  
327336.998 ± 10207.402  ops/s
TaskStoreBenchmarks.MemFetchTasksBenchmark.run       50000  thrpt    5  
320506.958 ± 23430.527  ops/s
TaskStoreBenchmarks.MemFetchTasksBenchmark.run      100000  thrpt    5  
287962.695 ± 51917.245  ops/s
```


Thanks,

Mehrdad Nurolahzade

Reply via email to