@@ -8,6 +8,7 @@ const uuidV4 = require('uuid/v4');
8
8
const support = require ( './lib/support.js' ) ( ) ;
9
9
global . config = require ( './config.json' ) ;
10
10
11
+
11
12
/*
12
13
General file design/where to find things.
13
14
@@ -588,14 +589,18 @@ function enumerateWorkerStats(){
588
589
for ( let workerID in activeWorkers [ poolID ] ) {
589
590
if ( activeWorkers [ poolID ] . hasOwnProperty ( workerID ) ) {
590
591
let workerData = activeWorkers [ poolID ] [ workerID ] ;
591
- if ( workerData . lastContact < ( ( Math . floor ( ( Date . now ( ) ) / 1000 ) - 120 ) ) ) {
592
+ if ( typeof workerData !== 'undefined' ) {
593
+ if ( workerData . lastContact < ( ( Math . floor ( ( Date . now ( ) ) / 1000 ) - 120 ) ) ) {
594
+ delete activeWorkers [ poolID ] [ workerID ] ;
595
+ continue ;
596
+ }
597
+ stats . miners += 1 ;
598
+ stats . hashes += workerData . hashes ;
599
+ stats . hashRate += workerData . avgSpeed ;
600
+ stats . diff += workerData . diff ;
601
+ } else {
592
602
delete activeWorkers [ poolID ] [ workerID ] ;
593
- continue ;
594
603
}
595
- stats . miners += 1 ;
596
- stats . hashes += workerData . hashes ;
597
- stats . hashRate += workerData . avgSpeed ;
598
- stats . diff += workerData . diff ;
599
604
}
600
605
}
601
606
global_stats . miners += stats . miners ;
@@ -716,7 +721,7 @@ function handleNewBlockTemplate(blockTemplate, hostname){
716
721
}
717
722
718
723
// Miner Definition
719
- function Miner ( id , params , ip , pushMessage , portData ) {
724
+ function Miner ( id , params , ip , pushMessage , portData , minerSocket ) {
720
725
// Arguments
721
726
// minerId, params, ip, pushMessage, portData
722
727
// Username Layout - <address in BTC or XMR>.<Difficulty>
@@ -733,6 +738,7 @@ function Miner(id, params, ip, pushMessage, portData) {
733
738
this . password = params . pass ; // Documentation purposes only.
734
739
this . agent = params . agent ; // Documentation purposes only.
735
740
this . ip = ip ; // Documentation purposes only.
741
+ this . socket = minerSocket ;
736
742
this . messageSender = pushMessage ;
737
743
this . error = "" ;
738
744
this . valid_miner = true ;
@@ -777,6 +783,10 @@ function Miner(id, params, ip, pushMessage, portData) {
777
783
this . cachedJob = null ;
778
784
779
785
this . minerStats = function ( ) {
786
+ if ( this . socket . destroyed ) {
787
+ delete activeMiners [ this . id ] ;
788
+ return ;
789
+ }
780
790
return {
781
791
shares : this . shares ,
782
792
blocks : this . blocks ,
@@ -823,7 +833,7 @@ function Miner(id, params, ip, pushMessage, portData) {
823
833
}
824
834
825
835
// Slave Functions
826
- function handleMinerData ( method , params , ip , portData , sendReply , pushMessage ) {
836
+ function handleMinerData ( method , params , ip , portData , sendReply , pushMessage , minerSocket ) {
827
837
/*
828
838
Deals with handling the data from miners in a sane-ish fashion.
829
839
*/
@@ -838,7 +848,7 @@ function handleMinerData(method, params, ip, portData, sendReply, pushMessage) {
838
848
case 'login' :
839
849
let difficulty = portData . difficulty ;
840
850
let minerId = uuidV4 ( ) ;
841
- miner = new Miner ( minerId , params , ip , pushMessage , portData ) ;
851
+ miner = new Miner ( minerId , params , ip , pushMessage , portData , minerSocket ) ;
842
852
if ( ! miner . valid_miner ) {
843
853
console . log ( "Invalid miner, disconnecting due to: " + miner . error ) ;
844
854
sendReply ( miner . error ) ;
@@ -851,7 +861,7 @@ function handleMinerData(method, params, ip, portData, sendReply, pushMessage) {
851
861
job : miner . getJob ( miner , activePools [ miner . pool ] . activeBlocktemplate ) ,
852
862
status : 'OK'
853
863
} ) ;
854
- break ;
864
+ return minerId ;
855
865
case 'getjob' :
856
866
if ( ! miner ) {
857
867
sendReply ( 'Unauthenticated' ) ;
@@ -946,7 +956,7 @@ function activatePorts() {
946
956
if ( activePorts . indexOf ( portData . port ) !== - 1 ) {
947
957
return ;
948
958
}
949
- let handleMessage = function ( socket , jsonData , pushMessage ) {
959
+ let handleMessage = function ( socket , jsonData , pushMessage , minerSocket ) {
950
960
if ( ! jsonData . id ) {
951
961
console . warn ( 'Miner RPC request missing RPC id' ) ;
952
962
return ;
@@ -973,8 +983,8 @@ function activatePorts() {
973
983
debug . miners ( `Data sent to miner (sendReply): ${ sendData } ` ) ;
974
984
socket . write ( sendData ) ;
975
985
} ;
976
- handleMinerData ( jsonData . method , jsonData . params , socket . remoteAddress , portData , sendReply , pushMessage ) ;
977
- } ;
986
+ handleMinerData ( jsonData . method , jsonData . params , socket . remoteAddress , portData , sendReply , pushMessage , minerSocket ) ;
987
+ } ;
978
988
979
989
function socketConn ( socket ) {
980
990
socket . setKeepAlive ( true ) ;
@@ -1031,18 +1041,22 @@ function activatePorts() {
1031
1041
socket . destroy ( ) ;
1032
1042
break ;
1033
1043
}
1034
- handleMessage ( socket , jsonData , pushMessage ) ;
1044
+ handleMessage ( socket , jsonData , pushMessage , socket ) ;
1035
1045
}
1036
1046
dataBuffer = incomplete ;
1037
1047
}
1038
1048
} ) . on ( 'error' , function ( err ) {
1039
1049
if ( err . code !== 'ECONNRESET' ) {
1040
1050
console . warn ( global . threadName + "Socket Error from " + socket . remoteAddress + " " + err ) ;
1041
1051
}
1052
+ socket . end ( ) ;
1053
+ socket . destroy ( ) ;
1042
1054
} ) . on ( 'close' , function ( ) {
1043
1055
pushMessage = function ( ) {
1044
1056
} ;
1045
1057
debug . miners ( 'Miner disconnected via standard close' ) ;
1058
+ socket . end ( ) ;
1059
+ socket . destroy ( ) ;
1046
1060
} ) ;
1047
1061
}
1048
1062
@@ -1097,7 +1111,18 @@ function checkActivePools() {
1097
1111
// System Init
1098
1112
1099
1113
if ( cluster . isMaster ) {
1100
- let numWorkers = require ( 'os' ) . cpus ( ) . length ;
1114
+ let numWorkers ;
1115
+ try {
1116
+ let argv = require ( 'minimist' ) ( process . argv . slice ( 2 ) ) ;
1117
+ if ( typeof argv . workers !== 'undefined' ) {
1118
+ numWorkers = Number ( argv . workers ) ;
1119
+ } else {
1120
+ numWorkers = require ( 'os' ) . cpus ( ) . length ;
1121
+ }
1122
+ } catch ( err ) {
1123
+ console . error ( `Unable to set the number of workers via arguments. Make sure to run npm install!` ) ;
1124
+ numWorkers = require ( 'os' ) . cpus ( ) . length ;
1125
+ }
1101
1126
global . threadName = 'Master ' ;
1102
1127
console . log ( 'Cluster master setting up ' + numWorkers + ' workers...' ) ;
1103
1128
cluster . on ( 'message' , masterMessageHandler ) ;
0 commit comments