mirror of
https://github.com/bigchaindb/bigchaindb.git
synced 2024-10-13 13:34:05 +00:00
Insert election records in bulk.
Otherwise, one can significantly slow nodes down by posting a whole bunch of unique elections.
This commit is contained in:
parent
0576f3ef73
commit
b8113f3e7a
@ -295,6 +295,13 @@ def store_election(conn, election_id, height, is_concluded):
|
||||
)
|
||||
|
||||
|
||||
@register_query(LocalMongoDBConnection)
|
||||
def store_elections(conn, elections):
|
||||
return conn.run(
|
||||
conn.collection('elections').insert_many(elections)
|
||||
)
|
||||
|
||||
|
||||
@register_query(LocalMongoDBConnection)
|
||||
def get_validator_set(conn, height=None):
|
||||
query = {}
|
||||
|
||||
@ -358,6 +358,13 @@ def store_election(conn, election_id, height, is_concluded):
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
@singledispatch
|
||||
def store_elections(conn, elections):
|
||||
"""Store election records in bulk"""
|
||||
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
@singledispatch
|
||||
def get_validator_set(conn, height):
|
||||
"""Get validator set for a given `height`, if `height` is not specified
|
||||
|
||||
@ -277,11 +277,15 @@ class Election(Transaction):
|
||||
for other concluded elections, if it requires so, the method should
|
||||
rely on the database state.
|
||||
"""
|
||||
# elections placed in this block
|
||||
initiated_elections = []
|
||||
# elections voted for in this block and their votes
|
||||
elections = OrderedDict()
|
||||
for tx in txns:
|
||||
if isinstance(tx, Election):
|
||||
tx.store(bigchain, new_height, is_concluded=False)
|
||||
|
||||
initiated_elections.append({'election_id': tx.id,
|
||||
'height': new_height,
|
||||
'is_concluded': False})
|
||||
if not isinstance(tx, Vote):
|
||||
continue
|
||||
election_id = tx.asset['id']
|
||||
@ -289,6 +293,9 @@ class Election(Transaction):
|
||||
elections[election_id] = []
|
||||
elections[election_id].append(tx)
|
||||
|
||||
if initiated_elections:
|
||||
bigchain.store_elections(initiated_elections)
|
||||
|
||||
validator_update = None
|
||||
for election_id, votes in elections.items():
|
||||
election = bigchain.get_transaction(election_id)
|
||||
|
||||
@ -484,6 +484,9 @@ class BigchainDB(object):
|
||||
return backend.query.store_election(self.connection, election_id,
|
||||
height, is_concluded)
|
||||
|
||||
def store_elections(self, elections):
|
||||
return backend.query.store_elections(self.connection, elections)
|
||||
|
||||
|
||||
Block = namedtuple('Block', ('app_hash', 'height', 'transactions'))
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user