mirror of
https://github.com/LBRYFoundation/pool.git
synced 2025-09-25 04:40:34 +00:00
yiimp graphes command to fill graphes holes (console)
implement 2 manual jobs for outage maintenance, to reduce user confusion could happen when the cron job contains php errors or mysql is down... mmf
This commit is contained in:
parent
2cb4161c3e
commit
69f11b6aba
1 changed files with 128 additions and 0 deletions
128
web/yaamp/commands/GraphesCommand.php
Normal file
128
web/yaamp/commands/GraphesCommand.php
Normal file
|
@ -0,0 +1,128 @@
|
|||
<?php
|
||||
/**
|
||||
* GraphesCommand is a console command, to check for holes in stats history
|
||||
*/
|
||||
class GraphesCommand extends CConsoleCommand
|
||||
{
|
||||
protected $basePath;
|
||||
|
||||
/**
|
||||
* Execute the action.
|
||||
* @param array $args command line parameters specific for this command
|
||||
* @return integer non zero application exit code after printing help
|
||||
*/
|
||||
public function run($args)
|
||||
{
|
||||
$runner=$this->getCommandRunner();
|
||||
$commands=$runner->commands;
|
||||
|
||||
$root = realpath(Yii::app()->getBasePath().DIRECTORY_SEPARATOR.'..');
|
||||
$this->basePath = str_replace(DIRECTORY_SEPARATOR, '/', $root);
|
||||
|
||||
$symbol = arraySafeVal($args, 0);
|
||||
|
||||
if (!isset($args[0]) || $args[0] == 'help') {
|
||||
|
||||
echo "Yiimp graphes command\n";
|
||||
echo "Usage: yiimp graphes hashrate [algo] - find holes in hashrate graphes\n";
|
||||
echo " yiimp graphes balances [coin] - find holes in user balances graphes\n";
|
||||
|
||||
} else if ($args[0] == 'hashrate') {
|
||||
$algos = yaamp_get_algos();
|
||||
foreach ($algos as $algo) {
|
||||
$algo = arraySafeVal($args,1,$algo);
|
||||
$added = $this->checkAndFillPoolHashrateHoles($algo);
|
||||
while ($added > 0) $added = $this->checkAndFillPoolHashrateHoles($algo);
|
||||
}
|
||||
} else if ($args[0] == 'balances') {
|
||||
$symbol = arraySafeVal($args,1,'DCR');
|
||||
$added = $this->checkAndFillUserBalanceHoles($symbol);
|
||||
while ($added > 0) $added = $this->checkAndFillUserBalanceHoles($symbol);
|
||||
}
|
||||
}
|
||||
|
||||
public function getHelp()
|
||||
{
|
||||
return $this->run(array('help'));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/**
|
||||
* Fill empty data in db_hashrate
|
||||
*/
|
||||
public function checkAndFillPoolHashrateHoles($algo)
|
||||
{
|
||||
$stats = new db_hashrate;
|
||||
|
||||
if (!$stats instanceof CActiveRecord)
|
||||
return;
|
||||
|
||||
$t2 = 0; $added = 0;
|
||||
$since = time() - 24 * 3600;
|
||||
|
||||
$data = $stats->findAll(array('condition'=>"time>=$since AND algo=:algo", 'order'=>'time ASC', 'params'=>array(':algo'=>$algo)));
|
||||
foreach ($data as $row) {
|
||||
$t = (int) $row['time'];
|
||||
$d = $t - $t2;
|
||||
if (!$t2) $d = 0;
|
||||
$h = strftime('%H:%M', $t);
|
||||
if ($d && $d != 900) {
|
||||
$h0 = strftime('%H:%M', $t2);
|
||||
echo "hole detected between $h0 and $h ($t)\n";
|
||||
$fill = new db_hashrate;
|
||||
$fill->isNewRecord = true;
|
||||
$fill->time = $t2 + 900;
|
||||
$fill->hashrate = ($last_row->hashrate + $row->hashrate) / 2;
|
||||
$fill->price = ($last_row->price + $row->price) / 2;
|
||||
$fill->rent = ($last_row->rent + $row->rent) / 2;
|
||||
$fill->difficulty = ($last_row->difficulty + $row->difficulty) / 2;
|
||||
$fill->algo = $algo;
|
||||
//$fill->earnings = ...;
|
||||
$added += $fill->save();
|
||||
}
|
||||
$t2 = $t;
|
||||
$last_row = clone($row);
|
||||
}
|
||||
echo count($data)." records for $algo ($added added)\n";
|
||||
return $added;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fill empty data in db_balanceuser
|
||||
*/
|
||||
public function checkAndFillUserBalanceHoles($symbol)
|
||||
{
|
||||
$t2 = 0; $added = 0; $last_row = array();
|
||||
$since = time() - 24 * 3600;
|
||||
|
||||
$coin = getdbosql('db_coins', "symbol=:symbol", array(':symbol'=>$symbol));
|
||||
if (!$coin) return 0;
|
||||
|
||||
$data = dbolist('SELECT B.userid, B.time, B.balance, B.pending, A.username'.
|
||||
' FROM balanceuser B INNER JOIN accounts A on A.id = B.userid'.
|
||||
' WHERE A.coinid=:coinid AND A.last_earning>:since ORDER BY B.userid, B.time',
|
||||
array(':coinid'=>$coin->id,':since'=>$since));
|
||||
foreach ($data as $row) {
|
||||
$t = (int) $row['time'];
|
||||
$d = $t - $t2;
|
||||
if (!$t2 || $last_row['userid'] != $row['userid']) $d = 0;
|
||||
$h = strftime('%H:%M', $t);
|
||||
if ($d && $d != 900 && ($row['pending'] + $row['balance']) > 0) {
|
||||
$h0 = strftime('%H:%M', $t2);
|
||||
echo $row['username'].": hole detected between $h0 and $h ($t)\n";
|
||||
$fill = new db_balanceuser;
|
||||
$fill->isNewRecord = true;
|
||||
$fill->time = $t2 + 900;
|
||||
$fill->userid = $row['userid'];
|
||||
$fill->balance = $last_row['balance'];
|
||||
$fill->pending = $last_row['pending'];
|
||||
$added += $fill->save();
|
||||
}
|
||||
$t2 = $t;
|
||||
$last_row = array_merge($row);
|
||||
}
|
||||
echo count($data)." records for {$coin->symbol} ($added added)\n";
|
||||
return $added;
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue