Threading and bug fixes

This commit is contained in:
Sai Raj 2024-08-03 15:59:03 -04:00
parent c8881c23de
commit fff6824b30
5 changed files with 36 additions and 32 deletions

View File

@ -21,7 +21,7 @@ BLOCKBOOK_NETURL = "https://blockbook.ranchimall.net/"
TOKENAPI_SSE_URL = "https://ranchimallflo.duckdns.org/" TOKENAPI_SSE_URL = "https://ranchimallflo.duckdns.org/"
MAINNET_BLOCKBOOK_SERVER_LIST = ["https://blockbook.ranchimall.net/"] MAINNET_BLOCKBOOK_SERVER_LIST = ["https://blockbook.ranchimall.net/"]
TESTNET_BLOCKBOOK_SERVER_LIST = ["https://blockbook-testnet.ranchimall.net/"] TESTNET_BLOCKBOOK_SERVER_LIST = ["https://blockbook-testnet.ranchimall.net/"]
IGNORE_BLOCK_LIST = 902446 IGNORE_BLOCK_LIST = [902446]
#IGNORE_TRANSACTION_LIST = "b4ac4ddb51188b28b39bcb3aa31357d5bfe562c21e8aaf8dde0ec560fc893174" #IGNORE_TRANSACTION_LIST = "b4ac4ddb51188b28b39bcb3aa31357d5bfe562c21e8aaf8dde0ec560fc893174"
"""?NOT USED? """?NOT USED?

13
main.py
View File

@ -1,5 +1,6 @@
import sys import sys
import time import time
import threading
from src.api.api_main import start_api_server from src.api.api_main import start_api_server
from src.backend.backend_main import start_backend_process from src.backend.backend_main import start_backend_process
import config as config import config as config
@ -20,12 +21,16 @@ if __name__ == "__main__":
# start the backend process (token scanner). pass reset=True if --reset is in command-line args # start the backend process (token scanner). pass reset=True if --reset is in command-line args
if "--reset" in sys.argv or "-r" in sys.argv: if "--reset" in sys.argv or "-r" in sys.argv:
start_backend_process(config=_config, reset=True) t1 = threading.Thread(target=lambda:start_backend_process(config=_config, reset=True))
else: else:
start_backend_process(config=_config) t1 = threading.Thread(target=lambda:start_backend_process(config=_config))
t1.start()
# sleep until backend is started, so that API server can function correctly (TODO: sleep until backend process returns some flag indicating its started) # sleep until backend is started, so that API server can function correctly (TODO: sleep until backend process returns some flag indicating its started)
time.sleep(DELAY_API_SERVER_START) time.sleep(DELAY_API_SERVER_START)
# start the API server # start the API server
start_api_server(config=_config) t2 = threading.Thread(target=lambda: start_api_server(config=_config))
t2.start()
t1.join()
t2.join()

View File

@ -10,7 +10,7 @@ from quart import jsonify, make_response, Quart, render_template, request, flash
from quart_cors import cors from quart_cors import cors
import asyncio import asyncio
from typing import Optional from typing import Optional
import parsing import src.api.parsing as parsing
import subprocess import subprocess
from apscheduler.schedulers.background import BackgroundScheduler from apscheduler.schedulers.background import BackgroundScheduler
import atexit import atexit
@ -29,12 +29,6 @@ INTERNAL_ERROR = "Unable to process request, try again later"
# Global values and configg # Global values and configg
internalTransactionTypes = [ 'tokenswapDepositSettlement', 'tokenswapParticipationSettlement', 'smartContractDepositReturn'] internalTransactionTypes = [ 'tokenswapDepositSettlement', 'tokenswapParticipationSettlement', 'smartContractDepositReturn']
if net == 'mainnet':
is_testnet = False
elif net == 'testnet':
is_testnet = True
# Validation functionss # Validation functionss
def check_flo_address(floaddress, is_testnet=False): def check_flo_address(floaddress, is_testnet=False):
return pyflo.is_address_valid(floaddress, testnet=is_testnet) return pyflo.is_address_valid(floaddress, testnet=is_testnet)
@ -2883,7 +2877,7 @@ def initialize_db():
updatePrices() updatePrices()
def set_configs(config): def set_configs(config):
global DATA_PATH, apiUrl, FLO_DATA_DIR, API_VERIFY, debug_status, HOST, PORT, APP_ADMIN global DATA_PATH, apiUrl, FLO_DATA_DIR, API_VERIFY, debug_status, HOST, PORT, APP_ADMIN, NET, is_testnet
DATA_PATH = config["DATA_PATH"] DATA_PATH = config["DATA_PATH"]
apiUrl = config["apiUrl"] apiUrl = config["apiUrl"]
FLO_DATA_DIR = config["FLO_DATA_DIR"] FLO_DATA_DIR = config["FLO_DATA_DIR"]
@ -2892,6 +2886,11 @@ def set_configs(config):
HOST = config["HOST"] HOST = config["HOST"]
PORT = config["PORT"] PORT = config["PORT"]
APP_ADMIN = config["APP_ADMIN"] APP_ADMIN = config["APP_ADMIN"]
NET = config["NET"]
if NET == 'mainnet':
is_testnet = False
elif NET == 'testnet':
is_testnet = True
def init_process(): def init_process():
initialize_db() initialize_db()
@ -2905,4 +2904,5 @@ def init_process():
def start_api_server(config): def start_api_server(config):
set_configs(config) set_configs(config)
init_process() init_process()
print("Starting API server at port=", PORT)
app.run(debug=debug_status, host=HOST, port=PORT) app.run(debug=debug_status, host=HOST, port=PORT)

View File

@ -11,25 +11,24 @@ from sqlalchemy import create_engine, func, and_
from sqlalchemy.orm import sessionmaker from sqlalchemy.orm import sessionmaker
import time import time
import arrow import arrow
import parsing import src.backend.parsing as parsing
from parsing import perform_decimal_operation from src.backend.parsing import perform_decimal_operation
import re import re
from datetime import datetime from datetime import datetime
from ast import literal_eval from ast import literal_eval
from models import SystemData, TokenBase, ActiveTable, ConsumedTable, TransferLogs, TransactionHistory, TokenContractAssociation, ContractBase, ContractStructure, ContractParticipants, ContractTransactionHistory, ContractDeposits, ConsumedInfo, ContractWinners, ContinuosContractBase, ContractStructure2, ContractParticipants2, ContractDeposits2, ContractTransactionHistory2, SystemBase, ActiveContracts, SystemData, ContractAddressMapping, TokenAddressMapping, DatabaseTypeMapping, TimeActions, RejectedContractTransactionHistory, RejectedTransactionHistory, LatestCacheBase, LatestTransactions, LatestBlocks from src.backend.models import SystemData, TokenBase, ActiveTable, ConsumedTable, TransferLogs, TransactionHistory, TokenContractAssociation, ContractBase, ContractStructure, ContractParticipants, ContractTransactionHistory, ContractDeposits, ConsumedInfo, ContractWinners, ContinuosContractBase, ContractStructure2, ContractParticipants2, ContractDeposits2, ContractTransactionHistory2, SystemBase, ActiveContracts, SystemData, ContractAddressMapping, TokenAddressMapping, DatabaseTypeMapping, TimeActions, RejectedContractTransactionHistory, RejectedTransactionHistory, LatestCacheBase, LatestTransactions, LatestBlocks
from statef_processing import process_stateF from src.backend.statef_processing import process_stateF
import asyncio import asyncio
import websockets import websockets
from decimal import Decimal from decimal import Decimal
import pdb import pdb
from util_rollback import rollback_to_block from src.backend.util_rollback import rollback_to_block
RETRY_TIMEOUT_LONG = 30 * 60 # 30 mins RETRY_TIMEOUT_LONG = 30 * 60 # 30 mins
RETRY_TIMEOUT_SHORT = 60 # 1 min RETRY_TIMEOUT_SHORT = 60 # 1 min
DB_RETRY_TIMEOUT = 60 # 60 seconds DB_RETRY_TIMEOUT = 60 # 60 seconds
def newMultiRequest(apicall): def newMultiRequest(apicall):
current_server = serverlist[0] current_server = serverlist[0]
while True: while True:
@ -2639,8 +2638,7 @@ def initiate_process():
serverlist = _config['TESTNET_BLOCKBOOK_SERVER_LIST'] serverlist = _config['TESTNET_BLOCKBOOK_SERVER_LIST']
APP_ADMIN = 'oWooGLbBELNnwq8Z5YmjoVjw8GhBGH3qSP' APP_ADMIN = 'oWooGLbBELNnwq8Z5YmjoVjw8GhBGH3qSP'
websocket_uri = get_websocket_uri(testnet=True) websocket_uri = get_websocket_uri(testnet=True)
serverlist = serverlist.split(',') #serverlist = serverlist.split(',')
global neturl global neturl
neturl = _config['BLOCKBOOK_NETURL'] neturl = _config['BLOCKBOOK_NETURL']
global api_url global api_url
@ -2648,19 +2646,20 @@ def initiate_process():
global tokenapi_sse_url global tokenapi_sse_url
tokenapi_sse_url = _config['TOKENAPI_SSE_URL'] tokenapi_sse_url = _config['TOKENAPI_SSE_URL']
global API_VERIFY global API_VERIFY
API_VERIFY = _config['API_VERIFY'] if 'API_VERIFY' in _config:
if API_VERIFY == 'False': if isinstance(_config['API_VERIFY'], bool):
API_VERIFY = False API_VERIFY = _config['API_VERIFY']
elif API_VERIFY == 'True': elif isinstance(_config['API_VERIFY'], str):
API_VERIFY = True API_VERIFY = False if _config['API_VERIFY'] == 'False' else True
else:
API_VERIFY = bool(_config['API_VERIFY'])
else: else:
API_VERIFY = True API_VERIFY = True
global IGNORE_BLOCK_LIST #, IGNORE_TRANSACTION_LIST global IGNORE_BLOCK_LIST #, IGNORE_TRANSACTION_LIST
IGNORE_BLOCK_LIST = _config['IGNORE_BLOCK_LIST'].split(',') IGNORE_BLOCK_LIST = _config['IGNORE_BLOCK_LIST']
IGNORE_BLOCK_LIST = [int(s) for s in IGNORE_BLOCK_LIST] #IGNORE_BLOCK_LIST = [int(s) for s in IGNORE_BLOCK_LIST]
#IGNORE_TRANSACTION_LIST = _config['IGNORE_TRANSACTION_LIST'].split(',') #IGNORE_TRANSACTION_LIST = _config['IGNORE_TRANSACTION_LIST']
def start_backend_process(config, reset = False): def start_backend_process(config, reset = False):
global _config global _config

View File

@ -1,13 +1,13 @@
import argparse import argparse
from sqlalchemy import create_engine, func from sqlalchemy import create_engine, func
from sqlalchemy.orm import sessionmaker from sqlalchemy.orm import sessionmaker
from models import SystemData, TokenBase, ActiveTable, ConsumedTable, TransferLogs, TransactionHistory, TokenContractAssociation, RejectedTransactionHistory, ContractBase, ContractStructure, ContractParticipants, ContractTransactionHistory, ContractDeposits, ConsumedInfo, ContractWinners, ContinuosContractBase, ContractStructure2, ContractParticipants2, ContractDeposits2, ContractTransactionHistory2, SystemBase, ActiveContracts, SystemData, ContractAddressMapping, TokenAddressMapping, DatabaseTypeMapping, TimeActions, RejectedContractTransactionHistory, RejectedTransactionHistory, LatestCacheBase, LatestTransactions, LatestBlocks from src.backend.models import SystemData, TokenBase, ActiveTable, ConsumedTable, TransferLogs, TransactionHistory, TokenContractAssociation, RejectedTransactionHistory, ContractBase, ContractStructure, ContractParticipants, ContractTransactionHistory, ContractDeposits, ConsumedInfo, ContractWinners, ContinuosContractBase, ContractStructure2, ContractParticipants2, ContractDeposits2, ContractTransactionHistory2, SystemBase, ActiveContracts, SystemData, ContractAddressMapping, TokenAddressMapping, DatabaseTypeMapping, TimeActions, RejectedContractTransactionHistory, RejectedTransactionHistory, LatestCacheBase, LatestTransactions, LatestBlocks
from ast import literal_eval from ast import literal_eval
import os import os
import json import json
import logging import logging
import sys import sys
from parsing import perform_decimal_operation from src.backend.parsing import perform_decimal_operation
apppath = os.path.dirname(os.path.realpath(__file__)) apppath = os.path.dirname(os.path.realpath(__file__))