cranberry

Форк
0
/
memory_pool.go 
55 строк · 1.2 Кб
1
package memorypool
2

3
import (
4
	"sync"
5
	"time"
6

7
	pbapi "gitverse.ru/IvanTimofeev/cranberry/pkg/grpc"
8
	utility "gitverse.ru/IvanTimofeev/cranberry/pkg/utility"
9
)
10

11
type memoryPoolEntry struct {
12
	txc       *pbapi.TxContainer
13
	timestamp time.Time
14
}
15

16
type MemoryPool struct {
17
	txStore sync.Map
18
}
19

20
func NewMemoryPool() *MemoryPool {
21
	return &MemoryPool{}
22
}
23

24
func (mp *MemoryPool) PutTx(txc *pbapi.TxContainer) {
25
	mp.txStore.Store(string(utility.TxToHash(txc.Tx)), memoryPoolEntry{txc: txc, timestamp: time.Now()})
26
}
27

28
func (mp *MemoryPool) GetTx(hash string) (*pbapi.TxContainer, bool) {
29
	if mpe, ok := mp.txStore.Load(string(hash)); ok {
30
		return mpe.(memoryPoolEntry).txc, true
31
	} else {
32
		return nil, false
33
	}
34
}
35

36
func (mp *MemoryPool) ExtractTx() (txc *pbapi.TxContainer, ok bool) {
37
	mp.txStore.Range(func(key, value any) bool {
38
		txc = value.(memoryPoolEntry).txc
39
		mp.txStore.Delete(key)
40
		ok = true
41
		return false
42
	})
43
	return txc, ok
44
}
45

46
func (mp *MemoryPool) ClearOldTxs() {
47
	mp.txStore.Range(func(key, value any) bool {
48
		if mpe, ok := value.(memoryPoolEntry); ok {
49
			if mpe.timestamp.Add(60 * time.Second).Before(time.Now()) {
50
				mp.txStore.Delete(key)
51
			}
52
		}
53
		return true
54
	})
55
}
56

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.