Skip to content
This repository was archived by the owner on Dec 5, 2024. It is now read-only.

Commit cb5f167

Browse files
authored
Merge pull request #1095 from ethereum/fix/ethash-listener
Added more events to EthashListener
2 parents 144b72b + d7a59dc commit cb5f167

File tree

3 files changed

+64
-16
lines changed

3 files changed

+64
-16
lines changed

ethereumj-core/src/main/java/org/ethereum/mine/Ethash.java

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,16 @@
3838
import java.util.concurrent.atomic.AtomicLong;
3939

4040
import static org.ethereum.crypto.HashUtil.sha3;
41-
import static org.ethereum.mine.EthashListener.DatasetStatus.DATASET_GENERATED;
41+
import static org.ethereum.mine.EthashListener.DatasetStatus.DATASET_READY;
42+
import static org.ethereum.mine.EthashListener.DatasetStatus.DATASET_PREPARE;
43+
import static org.ethereum.mine.EthashListener.DatasetStatus.FULL_DATASET_GENERATED;
4244
import static org.ethereum.mine.EthashListener.DatasetStatus.FULL_DATASET_GENERATE_START;
45+
import static org.ethereum.mine.EthashListener.DatasetStatus.FULL_DATASET_LOADED;
46+
import static org.ethereum.mine.EthashListener.DatasetStatus.FULL_DATASET_LOAD_START;
47+
import static org.ethereum.mine.EthashListener.DatasetStatus.LIGHT_DATASET_GENERATED;
4348
import static org.ethereum.mine.EthashListener.DatasetStatus.LIGHT_DATASET_GENERATE_START;
49+
import static org.ethereum.mine.EthashListener.DatasetStatus.LIGHT_DATASET_LOADED;
50+
import static org.ethereum.mine.EthashListener.DatasetStatus.LIGHT_DATASET_LOAD_START;
4451
import static org.ethereum.util.ByteUtil.longToBytes;
4552
import static org.ethereum.mine.MinerIfc.MiningResult;
4653

@@ -106,26 +113,28 @@ public Ethash(SystemProperties config, long blockNumber) {
106113
}
107114

108115
public int[] getCacheLight() {
109-
return getCacheLight(true);
116+
fireDatatasetStatusUpdate(DATASET_PREPARE);
117+
int[] res = getCacheLightImpl();
118+
fireDatatasetStatusUpdate(DATASET_READY);
119+
return res;
110120
}
111121

112122
/**
113123
* Checks whether light DAG is already generated and loads it
114124
* from cache, otherwise generates it
115-
*
116-
* @param fireFinished whether to fire {@link EthashListener.DatasetStatus#DATASET_GENERATED}
117-
* after light DAG generation is finished
118125
* @return Light DAG
119126
*/
120-
private synchronized int[] getCacheLight(boolean fireFinished) {
127+
private synchronized int[] getCacheLightImpl() {
121128
if (cacheLight == null) {
122129
File file = new File(config.ethashDir(), "mine-dag-light.dat");
123130
if (fileCacheEnabled && file.canRead()) {
131+
fireDatatasetStatusUpdate(LIGHT_DATASET_LOAD_START);
124132
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) {
125133
logger.info("Loading light dataset from " + file.getAbsolutePath());
126134
long bNum = ois.readLong();
127135
if (bNum == blockNumber) {
128136
cacheLight = (int[]) ois.readObject();
137+
fireDatatasetStatusUpdate(LIGHT_DATASET_LOADED);
129138
logger.info("Dataset loaded.");
130139
} else {
131140
logger.info("Dataset block number miss: " + bNum + " != " + blockNumber);
@@ -152,24 +161,25 @@ private synchronized int[] getCacheLight(boolean fireFinished) {
152161
throw new RuntimeException(e);
153162
}
154163
}
155-
if (fireFinished) {
156-
fireDatatasetStatusUpdate(DATASET_GENERATED);
157-
}
164+
fireDatatasetStatusUpdate(LIGHT_DATASET_GENERATED);
158165
}
159166
}
160167
return cacheLight;
161168
}
162169

163170
public synchronized int[] getFullDataset() {
171+
fireDatatasetStatusUpdate(DATASET_PREPARE);
164172
if (fullData == null) {
165173
File file = new File(config.ethashDir(), "mine-dag.dat");
166174
if (fileCacheEnabled && file.canRead()) {
175+
fireDatatasetStatusUpdate(FULL_DATASET_LOAD_START);
167176
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) {
168177
logger.info("Loading dataset from " + file.getAbsolutePath());
169178
long bNum = ois.readLong();
170179
if (bNum == blockNumber) {
171180
fullData = (int[]) ois.readObject();
172181
logger.info("Dataset loaded.");
182+
fireDatatasetStatusUpdate(FULL_DATASET_LOADED);
173183
} else {
174184
logger.info("Dataset block number miss: " + bNum + " != " + blockNumber);
175185
}
@@ -181,8 +191,8 @@ public synchronized int[] getFullDataset() {
181191
if (fullData == null){
182192

183193
logger.info("Calculating full dataset...");
184-
int[] cacheLight = getCacheLight(false);
185194
fireDatatasetStatusUpdate(FULL_DATASET_GENERATE_START);
195+
int[] cacheLight = getCacheLightImpl();
186196
fullData = getEthashAlgo().calcDataset(getFullSize(), cacheLight);
187197
logger.info("Full dataset calculated.");
188198

@@ -196,9 +206,10 @@ public synchronized int[] getFullDataset() {
196206
throw new RuntimeException(e);
197207
}
198208
}
199-
fireDatatasetStatusUpdate(DATASET_GENERATED);
209+
fireDatatasetStatusUpdate(FULL_DATASET_GENERATED);
200210
}
201211
}
212+
fireDatatasetStatusUpdate(DATASET_READY);
202213
return fullData;
203214
}
204215

ethereumj-core/src/main/java/org/ethereum/mine/EthashListener.java

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,57 @@
2323
public interface EthashListener extends MinerListener {
2424

2525
enum DatasetStatus {
26+
/**
27+
* Dataset requested and will be prepared
28+
*/
29+
DATASET_PREPARE,
2630
/**
2731
* Indicates start of light DAG generation
32+
* If full dataset is requested, its event
33+
* {@link #FULL_DATASET_GENERATE_START} fires before this one
2834
*/
2935
LIGHT_DATASET_GENERATE_START,
36+
/**
37+
* Indicates that light dataset is already generated
38+
* and will be loaded from disk though it could be outdated
39+
* and therefore {@link #LIGHT_DATASET_LOADED} will not be fired
40+
*/
41+
LIGHT_DATASET_LOAD_START,
42+
/**
43+
* Indicates end of loading light dataset from disk
44+
*/
45+
LIGHT_DATASET_LOADED,
46+
/**
47+
* Indicates finish of light dataset generation
48+
*/
49+
LIGHT_DATASET_GENERATED,
3050
/**
3151
* Indicates start of full DAG generation
3252
* Full DAG generation is a heavy procedure
33-
* which could take a lot of time
53+
* which could take a lot of time.
54+
* Also full dataset requires light dataset
55+
* so it will be either generated or loaded from
56+
* disk as part of this job
3457
*/
3558
FULL_DATASET_GENERATE_START,
3659
/**
37-
* Indicates end of DAG generation stage
60+
* Indicates that full dataset is already generated
61+
* and will be loaded from disk though it could be outdated
62+
* and therefore {@link #FULL_DATASET_LOADED} will not be fired
63+
*/
64+
FULL_DATASET_LOAD_START,
65+
/**
66+
* Indicates end of full dataset loading from disk
67+
*/
68+
FULL_DATASET_LOADED,
69+
/**
70+
* Indicates finish of full dataset generation
71+
*/
72+
FULL_DATASET_GENERATED,
73+
/**
74+
* Requested dataset is complete and ready for use
3875
*/
39-
DATASET_GENERATED,
76+
DATASET_READY,
4077
}
4178

4279
void onDatasetUpdate(DatasetStatus datasetStatus);

ethereumj-core/src/main/java/org/ethereum/samples/PrivateMinerSample.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,8 @@ public void onDatasetUpdate(EthashListener.DatasetStatus minerStatus) {
106106
if (minerStatus.equals(EthashListener.DatasetStatus.FULL_DATASET_GENERATE_START)) {
107107
logger.info("Generating Full Dataset (may take up to 10 min if not cached)...");
108108
}
109-
if (minerStatus.equals(EthashListener.DatasetStatus.DATASET_GENERATED)) {
110-
logger.info("Full dataset generated (loaded).");
109+
if (minerStatus.equals(DatasetStatus.FULL_DATASET_GENERATED)) {
110+
logger.info("Full dataset generated.");
111111
}
112112
}
113113

0 commit comments

Comments
 (0)