github.com/lfch/etcd-io/tests/v3@v3.0.0-20221004140520-eac99acd3e9d/common/alarm_test.go (about) 1 // Copyright 2022 The etcd Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package common 16 17 import ( 18 "context" 19 "os" 20 "strings" 21 "testing" 22 "time" 23 24 clientv3 "github.com/lfch/etcd-io/client/v3" 25 "github.com/lfch/etcd-io/tests/v3/framework" 26 "github.com/lfch/etcd-io/tests/v3/framework/config" 27 "github.com/lfch/etcd-io/tests/v3/framework/testutils" 28 ) 29 30 func TestAlarm(t *testing.T) { 31 testRunner.BeforeTest(t) 32 ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) 33 defer cancel() 34 clus := testRunner.NewCluster(ctx, t, config.ClusterConfig{ClusterSize: 1, QuotaBackendBytes: int64(13 * os.Getpagesize())}) 35 defer clus.Close() 36 cc := framework.MustClient(clus.Client(clientv3.AuthConfig{})) 37 testutils.ExecuteUntil(ctx, t, func() { 38 // test small put still works 39 smallbuf := strings.Repeat("a", 64) 40 if err := cc.Put(ctx, "1st_test", smallbuf, config.PutOptions{}); err != nil { 41 t.Fatalf("alarmTest: put kv error (%v)", err) 42 } 43 44 // write some chunks to fill up the database 45 buf := strings.Repeat("b", os.Getpagesize()) 46 for { 47 if err := cc.Put(ctx, "2nd_test", buf, config.PutOptions{}); err != nil { 48 if !strings.Contains(err.Error(), "etcdserver: mvcc: database space exceeded") { 49 t.Fatal(err) 50 } 51 break 52 } 53 } 54 55 // quota alarm should now be on 56 alarmResp, err := cc.AlarmList(ctx) 57 if err != nil { 58 t.Fatalf("alarmTest: Alarm error (%v)", err) 59 } 60 61 // check that Put is rejected when alarm is on 62 if err := cc.Put(ctx, "3rd_test", smallbuf, config.PutOptions{}); err != nil { 63 if !strings.Contains(err.Error(), "etcdserver: mvcc: database space exceeded") { 64 t.Fatal(err) 65 } 66 } 67 68 // get latest revision to compact 69 sresp, err := cc.Status(ctx) 70 if err != nil { 71 t.Fatalf("get endpoint status error: %v", err) 72 } 73 var rvs int64 74 for _, resp := range sresp { 75 if resp != nil && resp.Header != nil { 76 rvs = resp.Header.Revision 77 break 78 } 79 } 80 81 // make some space 82 _, err = cc.Compact(ctx, rvs, config.CompactOption{Physical: true, Timeout: 10 * time.Second}) 83 if err != nil { 84 t.Fatalf("alarmTest: Compact error (%v)", err) 85 } 86 87 if err = cc.Defragment(ctx, config.DefragOption{Timeout: 10 * time.Second}); err != nil { 88 t.Fatalf("alarmTest: defrag error (%v)", err) 89 } 90 91 // turn off alarm 92 for _, alarm := range alarmResp.Alarms { 93 alarmMember := &clientv3.AlarmMember{ 94 MemberID: alarm.MemberID, 95 Alarm: alarm.Alarm, 96 } 97 _, err = cc.AlarmDisarm(ctx, alarmMember) 98 if err != nil { 99 t.Fatalf("alarmTest: Alarm error (%v)", err) 100 } 101 } 102 103 // put one more key below quota 104 if err := cc.Put(ctx, "4th_test", smallbuf, config.PutOptions{}); err != nil { 105 t.Fatal(err) 106 } 107 }) 108 } 109 110 func TestAlarmlistOnMemberRestart(t *testing.T) { 111 testRunner.BeforeTest(t) 112 ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) 113 defer cancel() 114 clus := testRunner.NewCluster(ctx, t, config.ClusterConfig{ 115 ClusterSize: 1, 116 QuotaBackendBytes: int64(13 * os.Getpagesize()), 117 SnapshotCount: 5, 118 }) 119 defer clus.Close() 120 cc := framework.MustClient(clus.Client(clientv3.AuthConfig{})) 121 122 testutils.ExecuteUntil(ctx, t, func() { 123 for i := 0; i < 6; i++ { 124 if _, err := cc.AlarmList(ctx); err != nil { 125 t.Fatalf("Unexpected error: %v", err) 126 } 127 } 128 129 clus.Members()[0].Stop() 130 if err := clus.Members()[0].Start(ctx); err != nil { 131 t.Fatalf("failed to start etcdserver: %v", err) 132 } 133 }) 134 }