|
|
@@ -15,44 +15,62 @@
|
|
|
package e2e
|
|
|
|
|
|
import (
|
|
|
+ "os"
|
|
|
"strings"
|
|
|
"testing"
|
|
|
)
|
|
|
|
|
|
-func TestCtlV3Alarm(t *testing.T) { testCtl(t, alarmTest, withQuota(64*1024)) }
|
|
|
+func TestCtlV3Alarm(t *testing.T) {
|
|
|
+ // The boltdb minimum working set is six pages.
|
|
|
+ testCtl(t, alarmTest, withQuota(int64(13*os.Getpagesize())))
|
|
|
+}
|
|
|
|
|
|
func alarmTest(cx ctlCtx) {
|
|
|
// test small put still works
|
|
|
smallbuf := strings.Repeat("a", 64)
|
|
|
- if err := ctlV3Put(cx, "abc", smallbuf, ""); err != nil {
|
|
|
+ if err := ctlV3Put(cx, "1st_test", smallbuf, ""); err != nil {
|
|
|
cx.t.Fatal(err)
|
|
|
}
|
|
|
|
|
|
- // test big put (to be rejected, and trigger quota alarm)
|
|
|
- bigbuf := strings.Repeat("a", int(cx.quotaBackendBytes))
|
|
|
- if err := ctlV3Put(cx, "abc", bigbuf, ""); err != nil {
|
|
|
- if !strings.Contains(err.Error(), "etcdserver: mvcc: database space exceeded") {
|
|
|
- cx.t.Fatal(err)
|
|
|
+ // write some chunks to fill up the database
|
|
|
+ buf := strings.Repeat("b", int(os.Getpagesize()))
|
|
|
+ var rev int64
|
|
|
+ for ; ; rev++ {
|
|
|
+ if err := ctlV3Put(cx, "2nd_test", buf, ""); err != nil {
|
|
|
+ if !strings.Contains(err.Error(), "etcdserver: mvcc: database space exceeded") {
|
|
|
+ cx.t.Fatal(err)
|
|
|
+ }
|
|
|
+ break
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ // quota alarm should now be on
|
|
|
if err := ctlV3Alarm(cx, "list", "alarm:NOSPACE"); err != nil {
|
|
|
cx.t.Fatal(err)
|
|
|
}
|
|
|
|
|
|
- // alarm is on rejecting Puts and Txns
|
|
|
- if err := ctlV3Put(cx, "def", smallbuf, ""); err != nil {
|
|
|
+ // check that Put is rejected when alarm is on
|
|
|
+ if err := ctlV3Put(cx, "3rd_test", smallbuf, ""); err != nil {
|
|
|
if !strings.Contains(err.Error(), "etcdserver: mvcc: database space exceeded") {
|
|
|
cx.t.Fatal(err)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // make some space
|
|
|
+ if err := ctlV3Compact(cx, rev, true); err != nil {
|
|
|
+ cx.t.Fatal(err)
|
|
|
+ }
|
|
|
+ if err := ctlV3Defrag(cx); err != nil {
|
|
|
+ cx.t.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
// turn off alarm
|
|
|
if err := ctlV3Alarm(cx, "disarm", "alarm:NOSPACE"); err != nil {
|
|
|
cx.t.Fatal(err)
|
|
|
}
|
|
|
|
|
|
// put one more key below quota
|
|
|
- if err := ctlV3Put(cx, "ghi", smallbuf, ""); err != nil {
|
|
|
+ if err := ctlV3Put(cx, "4th_test", smallbuf, ""); err != nil {
|
|
|
cx.t.Fatal(err)
|
|
|
}
|
|
|
}
|