binwiederhier vor 6 Monaten
Ursprung
Commit
fe5c844a21
2 geänderte Dateien mit 24 neuen und 2 gelöschten Zeilen
  1. 2 2
      server/message_cache.go
  2. 22 0
      server/message_cache_test.go

+ 2 - 2
server/message_cache.go

@@ -8,8 +8,8 @@ import (
 	"net/netip"
 	"net/netip"
 	"path/filepath"
 	"path/filepath"
 	"strings"
 	"strings"
-	"time"
 	"sync"
 	"sync"
+	"time"
 
 
 	_ "github.com/mattn/go-sqlite3" // SQLite driver
 	_ "github.com/mattn/go-sqlite3" // SQLite driver
 	"heckel.io/ntfy/v2/log"
 	"heckel.io/ntfy/v2/log"
@@ -283,8 +283,8 @@ var (
 type messageCache struct {
 type messageCache struct {
 	db    *sql.DB
 	db    *sql.DB
 	queue *util.BatchingQueue[*message]
 	queue *util.BatchingQueue[*message]
-	mu    sync.Mutex
 	nop   bool
 	nop   bool
+	mu    sync.Mutex
 }
 }
 
 
 // newSqliteCache creates a SQLite file-backed cache
 // newSqliteCache creates a SQLite file-backed cache

+ 22 - 0
server/message_cache_test.go

@@ -3,8 +3,10 @@ package server
 import (
 import (
 	"database/sql"
 	"database/sql"
 	"fmt"
 	"fmt"
+	"github.com/stretchr/testify/assert"
 	"net/netip"
 	"net/netip"
 	"path/filepath"
 	"path/filepath"
+	"sync"
 	"testing"
 	"testing"
 	"time"
 	"time"
 
 
@@ -90,6 +92,26 @@ func testCacheMessages(t *testing.T, c *messageCache) {
 	require.Empty(t, messages)
 	require.Empty(t, messages)
 }
 }
 
 
+func TestSqliteCache_MessagesLock(t *testing.T) {
+	testCacheMessagesLock(t, newSqliteTestCache(t))
+}
+
+func TestMemCache_MessagesLock(t *testing.T) {
+	testCacheMessagesLock(t, newMemTestCache(t))
+}
+
+func testCacheMessagesLock(t *testing.T, c *messageCache) {
+	var wg sync.WaitGroup
+	for i := 0; i < 5000; i++ {
+		wg.Add(1)
+		go func() {
+			assert.Nil(t, c.AddMessage(newDefaultMessage("mytopic", "test message")))
+			wg.Done()
+		}()
+	}
+	wg.Wait()
+}
+
 func TestSqliteCache_MessagesScheduled(t *testing.T) {
 func TestSqliteCache_MessagesScheduled(t *testing.T) {
 	testCacheMessagesScheduled(t, newSqliteTestCache(t))
 	testCacheMessagesScheduled(t, newSqliteTestCache(t))
 }
 }