Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions apps/solana/rpc.go
Original file line number Diff line number Diff line change
Expand Up @@ -159,9 +159,13 @@ func (c *Client) RPCGetBalance(ctx context.Context, account solana.PublicKey) (u
}

func (c *Client) RPCGetAccount(ctx context.Context, account solana.PublicKey) (*rpc.GetAccountInfoResult, error) {
return c.rpcGetAccount(ctx, account, rpc.CommitmentProcessed)
}

func (c *Client) rpcGetAccount(ctx context.Context, account solana.PublicKey, commitment rpc.CommitmentType) (*rpc.GetAccountInfoResult, error) {
for {
result, err := c.rpcClient.GetAccountInfoWithOpts(ctx, account, &rpc.GetAccountInfoOpts{
Commitment: rpc.CommitmentProcessed,
Commitment: commitment,
})
if mtg.CheckRetryableError(err) {
time.Sleep(time.Millisecond * 300)
Expand Down Expand Up @@ -262,7 +266,7 @@ func (c *Client) RPCGetTokenAccountsByOwner(ctx context.Context, owner solana.Pu
}

func (c *Client) GetNonceAccountHash(ctx context.Context, nonce solana.PublicKey) (*solana.Hash, error) {
account, err := c.RPCGetAccount(ctx, nonce)
account, err := c.rpcGetAccount(ctx, nonce, rpc.CommitmentFinalized)
if err != nil {
return nil, fmt.Errorf("solana.GetAccountInfo() => %v", err)
}
Expand Down
1 change: 1 addition & 0 deletions solana/observer.go
Original file line number Diff line number Diff line change
Expand Up @@ -488,6 +488,7 @@ func (node *Node) releaseNonceAccounts(ctx context.Context) error {
continue
}
err = node.store.UpdateNonceAccount(ctx, nonce.Address, newNonceHash.String(), call.RequestId)
logger.Printf("store.UpdateNonceAccount(%s %s %s) => %v", nonce.Address, newNonceHash.String(), call.RequestId, err)
if err != nil {
panic(err)
}
Expand Down
52 changes: 21 additions & 31 deletions store/migrate.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,17 @@ package store
import (
"context"
"database/sql"
"errors"
"fmt"
"strings"
"time"

solanaApp "github.com/MixinNetwork/computer/apps/solana"
"github.com/MixinNetwork/mixin/logger"
"github.com/MixinNetwork/safe/common"
"github.com/gagliardetto/solana-go"
)

const (
oversizedDepositMigrationKey = "SCHEMA:VERSION:OVERSIZED_DEPOSIT_7E823E4C"
oversizedDepositSystemCallID = "7e823e4c-b389-320a-b241-ff96c30d730b"
stalePostProcessNonceMigrationKey = "SCHEMA:VERSION:STALE_POST_PROCESS_NONCE_E3AAD597"
stalePostProcessSystemCallID = "e3aad597-2f6a-334d-b4fb-de634cfd6d81"
stalePostProcessNonceHash = "9nFUY4moFN6mEc6MhstcEeHhevziLx4kGk32sny9TitE"
)

func (s *SQLite3Store) Migrate(ctx context.Context) error {
Expand All @@ -28,49 +26,41 @@ func (s *SQLite3Store) Migrate(ctx context.Context) error {
}
defer common.Rollback(tx)

err = s.migrateOversizedDepositSystemCall(ctx, tx)
err = s.migrateStalePostProcessNonce(ctx, tx)
if err != nil {
return err
}

return tx.Commit()
}

func (s *SQLite3Store) migrateOversizedDepositSystemCall(ctx context.Context, tx *sql.Tx) error {
applied, err := s.checkExistence(ctx, tx, "SELECT value FROM properties WHERE key=?", oversizedDepositMigrationKey)
func (s *SQLite3Store) migrateStalePostProcessNonce(ctx context.Context, tx *sql.Tx) error {
applied, err := s.checkExistence(ctx, tx, "SELECT value FROM properties WHERE key=?", stalePostProcessNonceMigrationKey)
if err != nil || applied {
return err
}

call, err := s.ReadSystemCallByRequestId(ctx, oversizedDepositSystemCallID, common.RequestStatePending)
if err != nil {
return fmt.Errorf("store.ReadSystemCallByRequestId(%s) => %v", oversizedDepositSystemCallID, err)
}
if call == nil {
return s.writeProperty(ctx, tx, oversizedDepositMigrationKey, "system call not found")
query := fmt.Sprintf("SELECT %s FROM system_calls WHERE id=?", strings.Join(systemCallCols, ","))
call, err := systemCallFromRow(tx.QueryRowContext(ctx, query, stalePostProcessSystemCallID))
if err != nil || call == nil {
return fmt.Errorf("SELECT stale post-process system call %v %v", call, err)
}
if call.Type != CallTypeDeposit {
return fmt.Errorf("invalid system call type for oversized deposit migration: %s", call.Type)
if call.Type != CallTypePostProcess || call.State != common.RequestStatePending {
return fmt.Errorf("invalid system call type for stale post-process nonce migration: %s %d", call.Type, call.State)
}

solanaTx, err := solana.TransactionFromBase64(call.Raw)
now := time.Now().UTC()
query = "UPDATE system_calls SET state=?, updated_at=? WHERE id=? AND call_type=? AND state=?"
err = s.execOne(ctx, tx, query, common.RequestStateFailed, now, stalePostProcessSystemCallID, CallTypePostProcess, common.RequestStatePending)
if err != nil {
return fmt.Errorf("solana.TransactionFromBase64(%s) => %v", oversizedDepositSystemCallID, err)
}
sizeErr := solanaApp.ValidateTransactionSize(solanaTx)
if sizeErr == nil {
return s.writeProperty(ctx, tx, oversizedDepositMigrationKey, "transaction within size limit")
}
if !errors.Is(sizeErr, solanaApp.ErrTransactionTooLarge) {
return fmt.Errorf("solana.ValidateTransactionSize(%s) => %v", oversizedDepositSystemCallID, sizeErr)
return fmt.Errorf("UPDATE stale post-process system_calls %v", err)
}
logger.Printf("store.migrateOversizedDepositSystemCall(%s) => %v", oversizedDepositSystemCallID, sizeErr)

query := "UPDATE system_calls SET state=?, updated_at=? WHERE id=? AND call_type=? AND state=?"
err = s.execOne(ctx, tx, query, common.RequestStateFailed, time.Now().UTC(), oversizedDepositSystemCallID, CallTypeDeposit, common.RequestStatePending)
query = "UPDATE nonce_accounts SET hash=?, mix=NULL, call_id=NULL, updated_at=? WHERE address=?"
err = s.execOne(ctx, tx, query, stalePostProcessNonceHash, now, call.NonceAccount)
if err != nil {
return fmt.Errorf("SQLite3Store UPDATE oversized deposit system_calls %v", err)
return fmt.Errorf("UPDATE stale post-process nonce_accounts %v", err)
}

return s.writeProperty(ctx, tx, oversizedDepositMigrationKey, sizeErr.Error())
return s.writeProperty(ctx, tx, stalePostProcessNonceMigrationKey, "done")
}
Loading