From 4e8a97cb6377c85c6886d07cacdfb38cb2475151 Mon Sep 17 00:00:00 2001
From: Vincent Rousseau <vincent.rousseau@irstea.fr>
Date: Tue, 9 Jan 2018 15:56:49 +0100
Subject: [PATCH] Add CPU boost when few bloc of the user in frame

---
 app/lib/computation/BlockchainContext.ts | 10 +++++++
 app/lib/indexer.ts                       |  2 ++
 app/modules/prover/lib/blockProver.ts    | 33 ++++++++++++++++++------
 app/modules/prover/lib/constants.ts      |  2 +-
 4 files changed, 38 insertions(+), 9 deletions(-)

diff --git a/app/lib/computation/BlockchainContext.ts b/app/lib/computation/BlockchainContext.ts
index 426ed2dc8..d8c1344c5 100644
--- a/app/lib/computation/BlockchainContext.ts
+++ b/app/lib/computation/BlockchainContext.ts
@@ -93,6 +93,16 @@ export class BlockchainContext {
     return local_vHEAD.issuerDiff;
   }
 
+  /**
+   * Utility method: gives the number of block in the current frame for a given issuer.
+   * @param issuer The issuer we want.
+   */
+  async getIssuerNbBlockInFrame(issuer: string): Promise<number> {
+    const local_vHEAD = await this.getvHeadCopy({ issuer })
+    let issuerNbBlockInFrame = await indexer.preparePersonalizedPoW(local_vHEAD, this.vHEAD_1, (n:number, m:number, p = "") => this.dal.range(n,m,p), this.conf)
+    return issuerNbBlockInFrame
+  }
+
   setConfDAL(newConf: any, newDAL: any, theBlockchain: DuniterBlockchain, theQuickSynchronizer: QuickSynchronizer): void {
     this.dal = newDAL;
     this.conf = newConf;
diff --git a/app/lib/indexer.ts b/app/lib/indexer.ts
index ddb1cfa99..ea2d70521 100644
--- a/app/lib/indexer.ts
+++ b/app/lib/indexer.ts
@@ -1092,6 +1092,8 @@ export class Indexer {
 
     HEAD.powRemainder = HEAD.issuerDiff  % 16;
     HEAD.powZeros = (HEAD.issuerDiff - HEAD.powRemainder) / 16;
+
+    return nbPersonalBlocksInFrame;
   }
 
   // BR_G19
diff --git a/app/modules/prover/lib/blockProver.ts b/app/modules/prover/lib/blockProver.ts
index f3e036770..ce45c9f68 100644
--- a/app/modules/prover/lib/blockProver.ts
+++ b/app/modules/prover/lib/blockProver.ts
@@ -192,6 +192,15 @@ export class BlockProver {
       });
       if (!result) {
         this.logger.info('GIVEN proof-of-work for block#%s with %s leading zeros followed by [0-' + highMark + ']! stop PoW for %s', block.number, nbZeros, this.pair && this.pair.pub.slice(0,6));
+        let selfNbBlockInFrame = await this.server.getBcContext().getIssuerNbBlockInFrame(this.server.PeeringService.selfPubkey)
+        if(this.conf.ecoMode === true) {
+          let selfNbBlockInFrame = await this.server.getBcContext().getIssuerNbBlockInFrame(this.server.PeeringService.selfPubkey)
+          if(selfNbBlockInFrame < 2) {
+            this.changeCPU(1)
+            this.conf.nbCores = this.server.conf.nbCores
+            this.logger.info("Boost number of CPU cores "+this.conf.nbCores+" with only "+selfNbBlockInFrame+" block member in frame")
+          }
+        }
         throw 'Proof-of-work computation canceled because block received';
       } else {
         const proof = result.block;
@@ -201,15 +210,23 @@ export class BlockProver {
         this.logger.info('Done: #%s, %s in %ss instead of %ss (%s tests, ~%s tests/s)', block.number, proof.hash, (duration / 1000).toFixed(2),
                                                                         this.conf.avgGenTime, testsCount, testsPerSecond.toFixed(2));
         this.logger.info('FOUND proof-of-work with %s leading zeros followed by [0-' + highMark + ']!', nbZeros);
-        if(this.conf.ecoMode === true && this.conf.nbCores*testsPerSecond > ProverConstants.ECO_MODE_MINIMAL_TESTS_PER_SECONDS) {
-          if(this.conf.nbCores > 1) {
-            this.logger.info("Reducing number of CPU cores "+this.conf.nbCores)
-            this.conf.nbCores = this.conf.nbCores -1
+        if(this.conf.ecoMode === true) {
+          let selfNbBlockInFrame = await this.server.getBcContext().getIssuerNbBlockInFrame(this.server.PeeringService.selfPubkey)
+          if(selfNbBlockInFrame < 2) {
+            this.changeCPU(1)
+            this.conf.nbCores = this.server.conf.nbCores
+            this.logger.info("Boost number of CPU cores "+this.conf.nbCores+" with only "+selfNbBlockInFrame+" block member in frame")
           }
-          else if(this.conf.cpu > ProverConstants.ECO_MODE_MINIMAL_CPU){
-            let cpu:number = this.conf.cpu - 0.1
-            this.logger.info("Slowing down the CPU to "+cpu)
-            this.changeCPU(cpu)
+          else if(this.conf.nbCores*testsPerSecond > ProverConstants.ECO_MODE_MINIMAL_TESTS_PER_SECONDS) {
+            if(this.conf.nbCores > 1) {
+              this.logger.info("Reducing number of CPU cores "+this.conf.nbCores)
+              this.conf.nbCores = this.conf.nbCores -1
+            }
+            else if(this.conf.cpu > ProverConstants.ECO_MODE_MINIMAL_CPU){
+              let cpu:number = this.conf.cpu - 0.1
+              this.logger.info("Slowing down the CPU to "+cpu)
+              this.changeCPU(cpu)
+            }
           }
         }
         return BlockDTO.fromJSONObject(proof)
diff --git a/app/modules/prover/lib/constants.ts b/app/modules/prover/lib/constants.ts
index 66dbe534b..3a8d77c70 100644
--- a/app/modules/prover/lib/constants.ts
+++ b/app/modules/prover/lib/constants.ts
@@ -5,7 +5,7 @@ export const ProverConstants = {
   MINIMAL_ZEROS_TO_SHOW_IN_LOGS: 3,
 
   POW_MINIMAL_TO_SHOW: 2,
-  DEFAULT_ECO_MODE: false,
+  DEFAULT_ECO_MODE: true,
   DEFAULT_CPU: 0.6,
   DEFAULT_PEER_ID: 1,
   MIN_PEER_ID: 1,
-- 
GitLab