From 47e7eeb4fe80aaf5d911c7db02f948e7d6a41b94 Mon Sep 17 00:00:00 2001 From: Lorenz Herzberger Date: Thu, 13 Apr 2023 15:19:56 +0200 Subject: [PATCH] added migration script for utxo space Signed-off-by: Lorenz Herzberger --- docker-compose.yml | 4 +- .../backend/tarantool/opt/functions.lua | 20 +++++ .../backend/tarantool/{ => opt}/init.lua | 12 +++ .../backend/tarantool/opt/migrations.lua | 79 +++++++++++++++++++ 4 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 planetmint/backend/tarantool/opt/functions.lua rename planetmint/backend/tarantool/{ => opt}/init.lua (97%) create mode 100644 planetmint/backend/tarantool/opt/migrations.lua diff --git a/docker-compose.yml b/docker-compose.yml index f3daf35..6bfa5ff 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -22,7 +22,9 @@ services: - "3303:3303" - "8081:8081" volumes: - - ./planetmint/backend/tarantool/init.lua:/opt/tarantool/init.lua + - ./planetmint/backend/tarantool/opt/init.lua:/opt/tarantool/init.lua + - ./planetmint/backend/tarantool/opt/functions.lua:/opt/tarantool/functions.lua + - ./planetmint/backend/tarantool/opt/migrations.lua:/opt/tarantool/migrations.lua entrypoint: tarantool /opt/tarantool/init.lua restart: always planetmint: diff --git a/planetmint/backend/tarantool/opt/functions.lua b/planetmint/backend/tarantool/opt/functions.lua new file mode 100644 index 0000000..24a2d5c --- /dev/null +++ b/planetmint/backend/tarantool/opt/functions.lua @@ -0,0 +1,20 @@ +local fiber = require('fiber') + +local export = {} + +function export.atomic(batch_size, iter, fn) + box.atomic(function() + local i = 0 + for _, x in iter:unwrap() do + fn(x) + i = i + 1 + if i % batch_size == 0 then + box.commit() + fiber.yield() -- for read-only operations when `commit` doesn't yield + box.begin() + end + end + end) +end + +return export \ No newline at end of file diff --git a/planetmint/backend/tarantool/init.lua b/planetmint/backend/tarantool/opt/init.lua similarity index 97% rename from planetmint/backend/tarantool/init.lua rename to planetmint/backend/tarantool/opt/init.lua index 83832cc..7dac85d 100644 --- a/planetmint/backend/tarantool/init.lua +++ b/planetmint/backend/tarantool/opt/init.lua @@ -1,3 +1,5 @@ +local migrations = require('migrations') + box.cfg{listen = 3303} box.once("bootstrap", function() @@ -331,3 +333,13 @@ end function delete_output( id ) box.space.outputs:delete(id) end + +function migrate_up() + migrations.update_utxo_13042023.up() + -- add newer migrations below +end + +function migrate_down() + -- add newer migrations above + migrations.update_utxo_13042023.down() +end diff --git a/planetmint/backend/tarantool/opt/migrations.lua b/planetmint/backend/tarantool/opt/migrations.lua new file mode 100644 index 0000000..ca99736 --- /dev/null +++ b/planetmint/backend/tarantool/opt/migrations.lua @@ -0,0 +1,79 @@ +local functions = require('functions') +local migrations = {} + +migrations.update_utxo_13042023 = {} + +migrations.update_utxo_13042023.up = function() + if utxos.index.public_keys == nil then + box.space.utxos:drop() + utxos = box.schema.create_space('utxos', { if_not_exists = true }) + utxos:format({ + { name = 'id', type = 'string' }, + { name = 'amount' , type = 'unsigned' }, + { name = 'public_keys', type = 'array' }, + { name = 'condition', type = 'map' }, + { name = 'output_index', type = 'number' }, + { name = 'transaction_id' , type = 'string' } + }) + utxos:create_index('id', { + if_not_exists = true, + parts = {{ field = 'id', type = 'string' }} + }) + utxos:create_index('utxos_by_transaction_id', { + if_not_exists = true, + unique = false, + parts = {{ field = 'transaction_id', type = 'string' }} + }) + utxos:create_index('utxo_by_transaction_id_and_output_index', { + if_not_exists = true, + parts = { + { field = 'transaction_id', type = 'string' }, + { field = 'output_index', type = 'unsigned' } + } + }) + utxos:create_index('public_keys', { + if_not_exists = true, + unique = false, + parts = {{field = 'public_keys[*]', type = 'string' }} + }) + end + + outputs = box.space.outputs + functions.atomic(1000, outputs:pairs(), function(output) + utxos:insert{output[0], output[1], output[2], output[3], output[4], output[5]} + end) + functions.atomic(1000, utxos:pairs(), function(utxo) + spending_transaction = transactions.index.spending_transaction_by_id_and_output_index:select{utxo[5], utxo[4]} + if table.getn(spending_transaction) > 0 then + utxos:delete(utxo[0]) + end + end) +end + +migrations.update_utxo_13042023.down = function() + box.space.utxos:drop() + utxos = box.schema.create_space('utxos', { if_not_exists = true }) + utxos:format({ + { name = 'id', type = 'string' }, + { name = 'transaction_id', type = 'string' }, + { name = 'output_index', type = 'unsigned' }, + { name = 'utxo', type = 'map' } + }) + utxos:create_index('id', { + if_not_exists = true, + parts = {{ field = 'id', type = 'string' }} + }) + utxos:create_index('utxos_by_transaction_id', { + if_not_exists = true, + unique = false, + parts = {{ field = 'transaction_id', type = 'string' }} + }) + utxos:create_index('utxo_by_transaction_id_and_output_index', { + if_not_exists = true, + parts = { + { field = 'transaction_id', type = 'string' }, + { field = 'output_index', type = 'unsigned' } + }}) +end + +return migrations \ No newline at end of file