Remove tx send/recv write order synchronization.
This was only necessary for a very old version of the transaction store. The current implementation stores both sent (debit) and received (credit) records for individual transactions.
This commit is contained in:
parent
afee3e2ca7
commit
f418fe3772
3 changed files with 0 additions and 86 deletions
4
cmd.go
4
cmd.go
|
@ -182,10 +182,6 @@ func main() {
|
||||||
server.Start()
|
server.Start()
|
||||||
|
|
||||||
// Begin maintanence goroutines.
|
// Begin maintanence goroutines.
|
||||||
go SendBeforeReceiveHistorySync(SendTxHistSyncChans.add,
|
|
||||||
SendTxHistSyncChans.done,
|
|
||||||
SendTxHistSyncChans.remove,
|
|
||||||
SendTxHistSyncChans.access)
|
|
||||||
go StoreNotifiedMempoolRecvTxs(NotifiedRecvTxChans.add,
|
go StoreNotifiedMempoolRecvTxs(NotifiedRecvTxChans.add,
|
||||||
NotifiedRecvTxChans.remove,
|
NotifiedRecvTxChans.remove,
|
||||||
NotifiedRecvTxChans.access)
|
NotifiedRecvTxChans.access)
|
||||||
|
|
18
rpcclient.go
18
rpcclient.go
|
@ -227,24 +227,6 @@ func (n recvTx) handleNotification() error {
|
||||||
return fmt.Errorf("cannot get current block: %v", err)
|
return fmt.Errorf("cannot get current block: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// For transactions originating from this wallet, the sent tx history should
|
|
||||||
// be recorded before the received history. If wallet created this tx, wait
|
|
||||||
// for the sent history to finish being recorded before continuing.
|
|
||||||
//
|
|
||||||
// TODO(jrick) this is wrong due to tx malleability. Cannot safely use the
|
|
||||||
// txsha as an identifier.
|
|
||||||
req := SendTxHistSyncRequest{
|
|
||||||
txsha: *n.tx.Sha(),
|
|
||||||
response: make(chan SendTxHistSyncResponse),
|
|
||||||
}
|
|
||||||
SendTxHistSyncChans.access <- req
|
|
||||||
resp := <-req.response
|
|
||||||
if resp.ok {
|
|
||||||
// Wait until send history has been recorded.
|
|
||||||
<-resp.c
|
|
||||||
SendTxHistSyncChans.remove <- *n.tx.Sha()
|
|
||||||
}
|
|
||||||
|
|
||||||
AcctMgr.Grab()
|
AcctMgr.Grab()
|
||||||
defer AcctMgr.Release()
|
defer AcctMgr.Release()
|
||||||
|
|
||||||
|
|
64
rpcserver.go
64
rpcserver.go
|
@ -1884,10 +1884,6 @@ func sendPairs(icmd btcjson.Cmd, account string, amounts map[string]btcutil.Amou
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mark txid as having send history so handlers adding receive history
|
|
||||||
// wait until all send history has been written.
|
|
||||||
SendTxHistSyncChans.add <- *createdTx.tx.Sha()
|
|
||||||
|
|
||||||
// If a change address was added, sync wallet to disk and request
|
// If a change address was added, sync wallet to disk and request
|
||||||
// transaction notifications to the change address.
|
// transaction notifications to the change address.
|
||||||
if createdTx.changeAddr != nil {
|
if createdTx.changeAddr != nil {
|
||||||
|
@ -1903,10 +1899,8 @@ func sendPairs(icmd btcjson.Cmd, account string, amounts map[string]btcutil.Amou
|
||||||
|
|
||||||
txSha, err := client.SendRawTransaction(createdTx.tx.MsgTx(), false)
|
txSha, err := client.SendRawTransaction(createdTx.tx.MsgTx(), false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
SendTxHistSyncChans.remove <- *createdTx.tx.Sha()
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := handleSendRawTxReply(icmd, txSha, a, createdTx); err != nil {
|
if err := handleSendRawTxReply(icmd, txSha, a, createdTx); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -1991,61 +1985,6 @@ func SendToAddress(icmd btcjson.Cmd) (interface{}, error) {
|
||||||
return sendPairs(cmd, "", pairs, 1)
|
return sendPairs(cmd, "", pairs, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Channels to manage SendBeforeReceiveHistorySync.
|
|
||||||
var SendTxHistSyncChans = struct {
|
|
||||||
add, done, remove chan btcwire.ShaHash
|
|
||||||
access chan SendTxHistSyncRequest
|
|
||||||
}{
|
|
||||||
add: make(chan btcwire.ShaHash),
|
|
||||||
remove: make(chan btcwire.ShaHash),
|
|
||||||
done: make(chan btcwire.ShaHash),
|
|
||||||
access: make(chan SendTxHistSyncRequest),
|
|
||||||
}
|
|
||||||
|
|
||||||
// SendTxHistSyncRequest requests a SendTxHistSyncResponse from
|
|
||||||
// SendBeforeReceiveHistorySync.
|
|
||||||
type SendTxHistSyncRequest struct {
|
|
||||||
txsha btcwire.ShaHash
|
|
||||||
response chan SendTxHistSyncResponse
|
|
||||||
}
|
|
||||||
|
|
||||||
// SendTxHistSyncResponse is the response
|
|
||||||
type SendTxHistSyncResponse struct {
|
|
||||||
c chan struct{}
|
|
||||||
ok bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// SendBeforeReceiveHistorySync manages a set of transaction hashes
|
|
||||||
// created by this wallet. For each newly added txsha, a channel is
|
|
||||||
// created. Once the send history has been recorded, the txsha should
|
|
||||||
// be messaged across done, causing the internal channel to be closed.
|
|
||||||
// Before receive history is recorded, access should be used to check
|
|
||||||
// if there are or were any goroutines writing send history, and if
|
|
||||||
// so, wait until the channel is closed after a done message.
|
|
||||||
func SendBeforeReceiveHistorySync(add, done, remove chan btcwire.ShaHash,
|
|
||||||
access chan SendTxHistSyncRequest) {
|
|
||||||
|
|
||||||
m := make(map[btcwire.ShaHash]chan struct{})
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case txsha := <-add:
|
|
||||||
m[txsha] = make(chan struct{})
|
|
||||||
|
|
||||||
case txsha := <-remove:
|
|
||||||
delete(m, txsha)
|
|
||||||
|
|
||||||
case txsha := <-done:
|
|
||||||
if c, ok := m[txsha]; ok {
|
|
||||||
close(c)
|
|
||||||
}
|
|
||||||
|
|
||||||
case req := <-access:
|
|
||||||
c, ok := m[req.txsha]
|
|
||||||
req.response <- SendTxHistSyncResponse{c: c, ok: ok}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func handleSendRawTxReply(icmd btcjson.Cmd, txSha *btcwire.ShaHash, a *Account, txInfo *CreatedTx) error {
|
func handleSendRawTxReply(icmd btcjson.Cmd, txSha *btcwire.ShaHash, a *Account, txInfo *CreatedTx) error {
|
||||||
// Add to transaction store.
|
// Add to transaction store.
|
||||||
txr, err := a.TxStore.InsertTx(txInfo.tx, nil)
|
txr, err := a.TxStore.InsertTx(txInfo.tx, nil)
|
||||||
|
@ -2073,9 +2012,6 @@ func handleSendRawTxReply(icmd btcjson.Cmd, txSha *btcwire.ShaHash, a *Account,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Signal that received notifiations are ok to add now.
|
|
||||||
SendTxHistSyncChans.done <- *txInfo.tx.Sha()
|
|
||||||
|
|
||||||
// Disk sync tx and utxo stores.
|
// Disk sync tx and utxo stores.
|
||||||
if err := AcctMgr.ds.FlushAccount(a); err != nil {
|
if err := AcctMgr.ds.FlushAccount(a); err != nil {
|
||||||
log.Errorf("Cannot write account: %v", err)
|
log.Errorf("Cannot write account: %v", err)
|
||||||
|
|
Loading…
Reference in a new issue