From d3b4a0a8ae6d56259cc6db63efa05d716284f907 Mon Sep 17 00:00:00 2001 From: mincong Date: Sun, 17 Jul 2016 23:06:32 +0200 Subject: [PATCH] #106 update description, add workflow diagram --- README.md | 13 ++++++++++--- img/mass-index.png | Bin 0 -> 13829 bytes 2 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 img/mass-index.png diff --git a/README.md b/README.md index aaa6bb5878c..4dffb0434fe 100644 --- a/README.md +++ b/README.md @@ -21,10 +21,15 @@ This project redesigns the mass index job as a chunk-oriented, non-interactive, long-running, background execution process. Execution contains operational control (start/stop/restart), logging, checkpointing and parallelization. +![Workflow of the job "mass-index"][1] + * **Parallelization**. The core step execution _produceLuceneDoc_ runs in - parallel. It runs as multiple instance of the same step definition across - multiple threads, one partition per thread. The number of partitions equals - to the size of root entities selected before the job start. + parallel. It runs as multiple instances of the same step definition across + multiple threads, one partition per thread. The number of partitions depends + on 2 factors : the target entity's quantity and the partition capacity. For + example, if target entity `Company.class` has 5000 rows to index and the + partition capacity is 2500 entity / partition, then theses rows will run in 2 + partitions. ## Context data @@ -77,3 +82,5 @@ summarize all elementary count from each partition and compute the progress. If the given were partition-work-count, then the computed result will be a double-summarized progress, which is not desired. + +[1]: https://github.com/mincong-h/gsoc-hsearch/tree/master/img/mass-index.png \ No newline at end of file diff --git a/img/mass-index.png b/img/mass-index.png new file mode 100644 index 0000000000000000000000000000000000000000..8aa11a00bad3b3ea97019ffa730b0f1f1b995b2d GIT binary patch literal 13829 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 literal 0 HcmV?d00001