patch channel_tx_hash and repost_tx_hash not being updated in ES
-this is a patch pending a real fix
This commit is contained in:
parent
bd68613b74
commit
9618c9e702
2 changed files with 41 additions and 17 deletions
|
@ -2,11 +2,11 @@ import logging
|
||||||
import time
|
import time
|
||||||
import asyncio
|
import asyncio
|
||||||
import struct
|
import struct
|
||||||
from binascii import unhexlify
|
from bisect import bisect_right
|
||||||
from collections import Counter, deque
|
from collections import Counter, deque
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
from operator import itemgetter
|
from operator import itemgetter
|
||||||
from typing import Optional, List, Iterable
|
from typing import Optional, List, Iterable, TYPE_CHECKING
|
||||||
|
|
||||||
from elasticsearch import AsyncElasticsearch, NotFoundError, ConnectionError
|
from elasticsearch import AsyncElasticsearch, NotFoundError, ConnectionError
|
||||||
from elasticsearch.helpers import async_streaming_bulk
|
from elasticsearch.helpers import async_streaming_bulk
|
||||||
|
@ -19,6 +19,8 @@ from scribe.db.common import CLAIM_TYPES, STREAM_TYPES
|
||||||
from scribe.elasticsearch.constants import INDEX_DEFAULT_SETTINGS, REPLACEMENTS, FIELDS, TEXT_FIELDS, \
|
from scribe.elasticsearch.constants import INDEX_DEFAULT_SETTINGS, REPLACEMENTS, FIELDS, TEXT_FIELDS, \
|
||||||
RANGE_FIELDS, ALL_FIELDS
|
RANGE_FIELDS, ALL_FIELDS
|
||||||
from scribe.db.common import ResolveResult
|
from scribe.db.common import ResolveResult
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from scribe.db import HubDB
|
||||||
|
|
||||||
|
|
||||||
def expand_query(**kwargs):
|
def expand_query(**kwargs):
|
||||||
|
@ -185,7 +187,9 @@ class IndexVersionMismatch(Exception):
|
||||||
class SearchIndex:
|
class SearchIndex:
|
||||||
VERSION = 1
|
VERSION = 1
|
||||||
|
|
||||||
def __init__(self, index_prefix: str, search_timeout=3.0, elastic_host='localhost', elastic_port=9200):
|
def __init__(self, hub_db: 'HubDB', index_prefix: str, search_timeout=3.0, elastic_host='localhost',
|
||||||
|
elastic_port=9200):
|
||||||
|
self.hub_db = hub_db
|
||||||
self.search_timeout = search_timeout
|
self.search_timeout = search_timeout
|
||||||
self.sync_timeout = 600 # wont hit that 99% of the time, but can hit on a fresh import
|
self.sync_timeout = 600 # wont hit that 99% of the time, but can hit on a fresh import
|
||||||
self.search_client: Optional[AsyncElasticsearch] = None
|
self.search_client: Optional[AsyncElasticsearch] = None
|
||||||
|
@ -246,6 +250,26 @@ class SearchIndex:
|
||||||
self.claim_cache.clear()
|
self.claim_cache.clear()
|
||||||
|
|
||||||
def _make_resolve_result(self, es_result):
|
def _make_resolve_result(self, es_result):
|
||||||
|
channel_hash = es_result['channel_hash']
|
||||||
|
reposted_claim_hash = es_result['reposted_claim_hash']
|
||||||
|
channel_tx_hash = None
|
||||||
|
channel_tx_position = None
|
||||||
|
channel_height = None
|
||||||
|
reposted_tx_hash = None
|
||||||
|
reposted_tx_position = None
|
||||||
|
reposted_height = None
|
||||||
|
if channel_hash: # FIXME: do this inside ES in a script
|
||||||
|
channel_txo = self.hub_db.get_cached_claim_txo(channel_hash[::-1])
|
||||||
|
if channel_txo:
|
||||||
|
channel_tx_hash = self.hub_db.get_tx_hash(channel_txo.tx_num)
|
||||||
|
channel_tx_position = channel_txo.position
|
||||||
|
channel_height = bisect_right(self.hub_db.tx_counts, channel_txo.tx_num)
|
||||||
|
if reposted_claim_hash:
|
||||||
|
repost_txo = self.hub_db.get_cached_claim_txo(reposted_claim_hash[::-1])
|
||||||
|
if repost_txo:
|
||||||
|
reposted_tx_hash = self.hub_db.get_tx_hash(repost_txo.tx_num)
|
||||||
|
reposted_tx_position = repost_txo.position
|
||||||
|
reposted_height = bisect_right(self.hub_db.tx_counts, repost_txo.tx_num)
|
||||||
return ResolveResult(
|
return ResolveResult(
|
||||||
name=es_result['claim_name'],
|
name=es_result['claim_name'],
|
||||||
normalized_name=es_result['normalized_name'],
|
normalized_name=es_result['normalized_name'],
|
||||||
|
@ -265,16 +289,16 @@ class SearchIndex:
|
||||||
support_amount=es_result['support_amount'],
|
support_amount=es_result['support_amount'],
|
||||||
last_takeover_height=es_result['last_take_over_height'],
|
last_takeover_height=es_result['last_take_over_height'],
|
||||||
claims_in_channel=es_result['claims_in_channel'],
|
claims_in_channel=es_result['claims_in_channel'],
|
||||||
channel_hash=es_result['channel_hash'],
|
channel_hash=channel_hash,
|
||||||
reposted_claim_hash=es_result['reposted_claim_hash'],
|
reposted_claim_hash=reposted_claim_hash,
|
||||||
reposted=es_result['reposted'],
|
reposted=es_result['reposted'],
|
||||||
signature_valid=es_result['signature_valid'],
|
signature_valid=es_result['signature_valid'],
|
||||||
reposted_tx_hash=bytes.fromhex(es_result['reposted_tx_id'] or '')[::-1] or None,
|
reposted_tx_hash=reposted_tx_hash,
|
||||||
reposted_tx_position=es_result['reposted_tx_position'],
|
reposted_tx_position=reposted_tx_position,
|
||||||
reposted_height=es_result['reposted_height'],
|
reposted_height=reposted_height,
|
||||||
channel_tx_hash=bytes.fromhex(es_result['channel_tx_id'] or '')[::-1] or None,
|
channel_tx_hash=channel_tx_hash,
|
||||||
channel_tx_position=es_result['channel_tx_position'],
|
channel_tx_position=channel_tx_position,
|
||||||
channel_height=es_result['channel_height'],
|
channel_height=channel_height,
|
||||||
)
|
)
|
||||||
|
|
||||||
async def cached_search(self, kwargs):
|
async def cached_search(self, kwargs):
|
||||||
|
@ -579,14 +603,14 @@ def expand_result(results):
|
||||||
inner_hits.extend(inner_hit["hits"]["hits"])
|
inner_hits.extend(inner_hit["hits"]["hits"])
|
||||||
continue
|
continue
|
||||||
result = result['_source']
|
result = result['_source']
|
||||||
result['claim_hash'] = unhexlify(result['claim_id'])[::-1]
|
result['claim_hash'] = bytes.fromhex(result['claim_id'])[::-1]
|
||||||
if result['reposted_claim_id']:
|
if result['reposted_claim_id']:
|
||||||
result['reposted_claim_hash'] = unhexlify(result['reposted_claim_id'])[::-1]
|
result['reposted_claim_hash'] = bytes.fromhex(result['reposted_claim_id'])[::-1]
|
||||||
else:
|
else:
|
||||||
result['reposted_claim_hash'] = None
|
result['reposted_claim_hash'] = None
|
||||||
result['channel_hash'] = unhexlify(result['channel_id'])[::-1] if result['channel_id'] else None
|
result['channel_hash'] = bytes.fromhex(result['channel_id'])[::-1] if result['channel_id'] else None
|
||||||
result['txo_hash'] = unhexlify(result['tx_id'])[::-1] + struct.pack('<I', result['tx_nout'])
|
result['txo_hash'] = bytes.fromhex(result['tx_id'])[::-1] + struct.pack('<I', result['tx_nout'])
|
||||||
result['tx_hash'] = unhexlify(result['tx_id'])[::-1]
|
result['tx_hash'] = bytes.fromhex(result['tx_id'])[::-1]
|
||||||
result['reposted'] = result.pop('repost_count')
|
result['reposted'] = result.pop('repost_count')
|
||||||
result['signature_valid'] = result.pop('is_signature_valid')
|
result['signature_valid'] = result.pop('is_signature_valid')
|
||||||
# result['normalized'] = result.pop('normalized_name')
|
# result['normalized'] = result.pop('normalized_name')
|
||||||
|
|
|
@ -198,7 +198,7 @@ class SessionManager:
|
||||||
|
|
||||||
# Search index
|
# Search index
|
||||||
self.search_index = SearchIndex(
|
self.search_index = SearchIndex(
|
||||||
self.env.es_index_prefix, self.env.database_query_timeout,
|
self.db, self.env.es_index_prefix, self.env.database_query_timeout,
|
||||||
elastic_host=env.elastic_host, elastic_port=env.elastic_port
|
elastic_host=env.elastic_host, elastic_port=env.elastic_port
|
||||||
)
|
)
|
||||||
self.running = False
|
self.running = False
|
||||||
|
|
Loading…
Reference in a new issue