mirror of https://github.com/status-im/go-waku.git
chore: adding some log messages to store
This commit is contained in:
parent
dfed1409ff
commit
b4697210b0
|
@ -0,0 +1,144 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"database/sql"
|
||||||
|
"fmt"
|
||||||
|
"math/rand"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
_ "github.com/mattn/go-sqlite3" // Blank import to register the sqlite3 driver
|
||||||
|
|
||||||
|
"github.com/status-im/go-waku/waku/v2/protocol"
|
||||||
|
"github.com/status-im/go-waku/waku/v2/protocol/pb"
|
||||||
|
)
|
||||||
|
|
||||||
|
func genRandomBytes(size int) (blk []byte, err error) {
|
||||||
|
blk = make([]byte, size)
|
||||||
|
_, err = rand.Read(blk)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func genRandomTimestamp(now int64, last30d int64) int64 {
|
||||||
|
return rand.Int63n(last30d) + now
|
||||||
|
}
|
||||||
|
|
||||||
|
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||||
|
|
||||||
|
func genRandomContentTopic(n int) string {
|
||||||
|
topics := []string{"topic1", "topic2", "topic3", "topic4", "topic5"}
|
||||||
|
i := n % 5
|
||||||
|
return protocol.NewContentTopic("test", 1, topics[i], "plaintext").String()
|
||||||
|
}
|
||||||
|
|
||||||
|
func newdb(path string) (*sql.DB, error) {
|
||||||
|
db, err := sql.Open("sqlite3", path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return db, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func createTable(db *sql.DB) error {
|
||||||
|
sqlStmt := `CREATE TABLE IF NOT EXISTS message (
|
||||||
|
id BLOB,
|
||||||
|
receiverTimestamp INTEGER NOT NULL,
|
||||||
|
senderTimestamp INTEGER NOT NULL,
|
||||||
|
contentTopic BLOB NOT NULL,
|
||||||
|
pubsubTopic BLOB NOT NULL,
|
||||||
|
payload BLOB,
|
||||||
|
version INTEGER NOT NULL DEFAULT 0,
|
||||||
|
CONSTRAINT messageIndex PRIMARY KEY (senderTimestamp, id, pubsubTopic)
|
||||||
|
) WITHOUT ROWID;
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS message_senderTimestamp ON message(senderTimestamp);
|
||||||
|
CREATE INDEX IF NOT EXISTS message_receiverTimestamp ON message(receiverTimestamp);
|
||||||
|
`
|
||||||
|
_, err := db.Exec(sqlStmt)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
Ns := []int{10_000, 100_000, 1_000_000}
|
||||||
|
|
||||||
|
for _, N := range Ns {
|
||||||
|
dbName := fmt.Sprintf("store%d.db", N)
|
||||||
|
fmt.Println("Inserting ", N, " records in ", dbName)
|
||||||
|
|
||||||
|
db, err := newdb(dbName)
|
||||||
|
query := "INSERT INTO message (id, receiverTimestamp, senderTimestamp, contentTopic, pubsubTopic, payload, version) VALUES (?, ?, ?, ?, ?, ?, ?)"
|
||||||
|
|
||||||
|
err = createTable(db)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
trx, err := db.BeginTx(context.Background(), nil)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
stmt, err := trx.Prepare(query)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
last30d := time.Now().UnixNano() - time.Now().Add(-30*time.Hour*24).UnixNano()
|
||||||
|
now := time.Now().Add(-1 * time.Minute).UnixNano()
|
||||||
|
pubsubTopic := protocol.DefaultPubsubTopic().String()
|
||||||
|
for i := 1; i <= N; i++ {
|
||||||
|
|
||||||
|
if i%1000 == 0 && i > 1 && i < N {
|
||||||
|
err := trx.Commit()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
trx, err = db.BeginTx(context.Background(), nil)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
stmt, err = trx.Prepare(query)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if i%(N/10) == 0 && i > 1 {
|
||||||
|
fmt.Println(i, "...")
|
||||||
|
}
|
||||||
|
|
||||||
|
randPayload, err := genRandomBytes(100)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
msg := pb.WakuMessage{
|
||||||
|
Version: 0,
|
||||||
|
ContentTopic: genRandomContentTopic(i),
|
||||||
|
Timestamp: genRandomTimestamp(now, last30d),
|
||||||
|
Payload: randPayload,
|
||||||
|
}
|
||||||
|
|
||||||
|
hash, err := msg.Hash()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = stmt.Exec(hash, msg.Timestamp, msg.Timestamp, msg.ContentTopic, pubsubTopic, msg.Payload, msg.Version)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = trx.Commit()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,6 +2,7 @@ package persistence
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/status-im/go-waku/waku/v2/protocol/pb"
|
"github.com/status-im/go-waku/waku/v2/protocol/pb"
|
||||||
|
@ -100,7 +101,10 @@ func (d *DBStore) createTable() error {
|
||||||
payload BLOB,
|
payload BLOB,
|
||||||
version INTEGER NOT NULL DEFAULT 0,
|
version INTEGER NOT NULL DEFAULT 0,
|
||||||
CONSTRAINT messageIndex PRIMARY KEY (senderTimestamp, id, pubsubTopic)
|
CONSTRAINT messageIndex PRIMARY KEY (senderTimestamp, id, pubsubTopic)
|
||||||
) WITHOUT ROWID;`
|
) WITHOUT ROWID;
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS message_senderTimestamp ON message(senderTimestamp);
|
||||||
|
CREATE INDEX IF NOT EXISTS message_receiverTimestamp ON message(receiverTimestamp);`
|
||||||
_, err := d.db.Exec(sqlStmt)
|
_, err := d.db.Exec(sqlStmt)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -120,7 +124,7 @@ func (d *DBStore) cleanOlderRecords() error {
|
||||||
|
|
||||||
// Limit number of records to a max N
|
// Limit number of records to a max N
|
||||||
if d.maxMessages > 0 {
|
if d.maxMessages > 0 {
|
||||||
sqlStmt := `DELETE FROM message WHERE id IN (SELECT id FROM message ORDER BY receiverTimestamp DESC LIMIT -1 OFFSET 5)`
|
sqlStmt := `DELETE FROM message WHERE id IN (SELECT id FROM message ORDER BY receiverTimestamp DESC LIMIT -1 OFFSET ?)`
|
||||||
_, err := d.db.Exec(sqlStmt, d.maxMessages)
|
_, err := d.db.Exec(sqlStmt, d.maxMessages)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -157,6 +161,12 @@ func (d *DBStore) Put(cursor *pb.Index, pubsubTopic string, message *pb.WakuMess
|
||||||
|
|
||||||
// Returns all the stored WakuMessages
|
// Returns all the stored WakuMessages
|
||||||
func (d *DBStore) GetAll() ([]StoredMessage, error) {
|
func (d *DBStore) GetAll() ([]StoredMessage, error) {
|
||||||
|
start := time.Now()
|
||||||
|
defer func() {
|
||||||
|
elapsed := time.Since(start)
|
||||||
|
d.log.Info(fmt.Sprintf("Loading records from the DB took %s", elapsed))
|
||||||
|
}()
|
||||||
|
|
||||||
rows, err := d.db.Query("SELECT id, receiverTimestamp, senderTimestamp, contentTopic, pubsubTopic, payload, version FROM message ORDER BY senderTimestamp ASC")
|
rows, err := d.db.Query("SELECT id, receiverTimestamp, senderTimestamp, contentTopic, pubsubTopic, payload, version FROM message ORDER BY senderTimestamp ASC")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -196,6 +206,8 @@ func (d *DBStore) GetAll() ([]StoredMessage, error) {
|
||||||
result = append(result, record)
|
result = append(result, record)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
d.log.Info(fmt.Sprintf("DB returned %d records", len(result)))
|
||||||
|
|
||||||
err = rows.Err()
|
err = rows.Err()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -305,6 +305,12 @@ func (store *WakuStore) fetchDBRecords(ctx context.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
start := time.Now()
|
||||||
|
defer func() {
|
||||||
|
elapsed := time.Since(start)
|
||||||
|
store.log.Info(fmt.Sprintf("Store initialization took %s", elapsed))
|
||||||
|
}()
|
||||||
|
|
||||||
storedMessages, err := (store.msgProvider).GetAll()
|
storedMessages, err := (store.msgProvider).GetAll()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
store.log.Error("could not load DBProvider messages", err)
|
store.log.Error("could not load DBProvider messages", err)
|
||||||
|
@ -319,9 +325,11 @@ func (store *WakuStore) fetchDBRecords(ctx context.Context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
_ = store.addToMessageQueue(storedMessage.PubsubTopic, idx, storedMessage.Message)
|
_ = store.addToMessageQueue(storedMessage.PubsubTopic, idx, storedMessage.Message)
|
||||||
|
|
||||||
metrics.RecordMessage(ctx, "stored", store.messageQueue.Length())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metrics.RecordMessage(ctx, "stored", store.messageQueue.Length())
|
||||||
|
|
||||||
|
store.log.Info(fmt.Sprintf("%d messages available in waku store", store.messageQueue.Length()))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (store *WakuStore) addToMessageQueue(pubsubTopic string, idx *pb.Index, msg *pb.WakuMessage) error {
|
func (store *WakuStore) addToMessageQueue(pubsubTopic string, idx *pb.Index, msg *pb.WakuMessage) error {
|
||||||
|
|
Loading…
Reference in New Issue