github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/pingcap/go-hbase/admin_test.go (about) 1 package hbase 2 3 import ( 4 "flag" 5 "fmt" 6 "strings" 7 "sync" 8 "time" 9 10 "github.com/insionng/yougam/libraries/ngaut/log" 11 . "github.com/insionng/yougam/libraries/pingcap/check" 12 ) 13 14 type AdminTestSuit struct { 15 cli HBaseClient 16 tableName string 17 invalidTableName string 18 } 19 20 var ( 21 testZks = flag.String("zk", "localhost", "hbase zookeeper info") 22 ) 23 24 func getTestZkHosts() []string { 25 zks := strings.Split(*testZks, ",") 26 if len(zks) == 0 { 27 log.Fatal("invalid zk path") 28 } 29 return zks 30 } 31 32 var _ = Suite(&AdminTestSuit{}) 33 34 func (s *AdminTestSuit) SetUpTest(c *C) { 35 var err error 36 s.cli, err = NewClient(getTestZkHosts(), "/hbase") 37 c.Assert(err, IsNil) 38 39 s.tableName = "test_admin" 40 s.invalidTableName = "test_admin_xxx" 41 tblDesc := NewTableDesciptor(s.tableName) 42 cf := NewColumnFamilyDescriptor("cf") 43 tblDesc.AddColumnDesc(cf) 44 err = s.cli.CreateTable(tblDesc, [][]byte{[]byte("f"), []byte("e"), []byte("c")}) 45 c.Assert(err, IsNil) 46 } 47 48 func (s *AdminTestSuit) TearDownTest(c *C) { 49 err := s.cli.DisableTable(s.tableName) 50 c.Assert(err, IsNil) 51 err = s.cli.DropTable(s.tableName) 52 c.Assert(err, IsNil) 53 } 54 55 func (s *AdminTestSuit) TestTable(c *C) { 56 b, err := s.cli.TableExists(s.tableName) 57 c.Assert(err, IsNil) 58 c.Assert(b, IsTrue) 59 60 err = s.cli.DisableTable(s.tableName) 61 c.Assert(err, IsNil) 62 63 // Wait for table disabled. 64 time.Sleep(3 * time.Second) 65 66 p := NewPut([]byte("key")) 67 p.AddValue([]byte("cf"), []byte("f"), []byte("value")) 68 ok, err := s.cli.Put(s.tableName, p) 69 c.Assert(err, NotNil) 70 c.Assert(ok, IsFalse) 71 72 // Wait for table enabled. 73 time.Sleep(3 * time.Second) 74 75 err = s.cli.EnableTable(s.tableName) 76 c.Assert(err, IsNil) 77 78 ok, err = s.cli.Put(s.tableName, p) 79 c.Assert(err, IsNil) 80 c.Assert(ok, IsTrue) 81 82 g := NewGet([]byte("key")) 83 g.AddColumn([]byte("cf"), []byte("f")) 84 r, err := s.cli.Get(s.tableName, g) 85 c.Assert(err, IsNil) 86 c.Assert(r.Columns["cf:f"].Values, HasLen, 1) 87 c.Assert(string(r.SortedColumns[0].Value), Equals, "value") 88 89 // Test check unexisted table. 90 b, err = s.cli.TableExists(s.invalidTableName) 91 c.Assert(err, IsNil) 92 c.Assert(b, IsFalse) 93 94 // Test disable unexisted table. 95 err = s.cli.DisableTable(s.invalidTableName) 96 c.Assert(err, NotNil) 97 98 // Test enable unexisted table. 99 err = s.cli.EnableTable(s.invalidTableName) 100 c.Assert(err, NotNil) 101 102 // Test drop unexisted table. 103 err = s.cli.DropTable(s.invalidTableName) 104 c.Assert(err, NotNil) 105 } 106 107 func (s *AdminTestSuit) TestCreateTableAsync(c *C) { 108 wg := sync.WaitGroup{} 109 wg.Add(10) 110 for i := 0; i < 10; i++ { 111 go func(i int) { 112 defer wg.Done() 113 tblName := fmt.Sprintf("f_%d", i) 114 tblDesc := NewTableDesciptor(tblName) 115 cf := NewColumnFamilyDescriptor("cf") 116 tblDesc.AddColumnDesc(cf) 117 tblDesc.AddColumnDesc(cf) 118 b, err := s.cli.TableExists(tblName) 119 c.Assert(err, IsNil) 120 if b { 121 // Maybe some table is in disabled state, so we must ignore this error. 122 s.cli.DisableTable(tblName) 123 err = s.cli.DropTable(tblName) 124 c.Assert(err, IsNil) 125 } 126 err = s.cli.CreateTable(tblDesc, nil) 127 c.Assert(err, IsNil) 128 }(i) 129 } 130 wg.Wait() 131 132 for i := 0; i < 10; i++ { 133 tblName := fmt.Sprintf("f_%d", i) 134 b, err := s.cli.TableExists(tblName) 135 c.Assert(err, IsNil) 136 c.Assert(b, IsTrue) 137 138 err = s.cli.DisableTable(tblName) 139 c.Assert(err, IsNil) 140 141 err = s.cli.DropTable(tblName) 142 c.Assert(err, IsNil) 143 } 144 } 145 146 func (s *AdminTestSuit) TestGetPauseTime(c *C) { 147 invalidRetry := -1 148 c.Assert(getPauseTime(invalidRetry), Equals, retryPauseTime[0]*defaultRetryWaitMs) 149 invalidRetry = len(retryPauseTime) 150 c.Assert(getPauseTime(invalidRetry), Equals, retryPauseTime[len(retryPauseTime)-1]*defaultRetryWaitMs) 151 } 152 153 func (s *AdminTestSuit) TestGetRegions(c *C) { 154 regions, err := s.cli.GetRegions([]byte(s.tableName), false) 155 c.Assert(err, IsNil) 156 c.Assert(regions, HasLen, 4) 157 } 158 159 func (s *AdminTestSuit) TestTableAutoSplit(c *C) { 160 regions, err := s.cli.GetRegions([]byte(s.tableName), false) 161 c.Assert(err, IsNil) 162 c.Assert(regions, HasLen, 4) 163 origData := map[string]map[string]string{} 164 prefixLower := 'b' 165 prefixUpper := 'f' 166 for prefix := prefixLower; prefix < prefixUpper; prefix++ { 167 // b_0, b_1, ... 168 // If insert few row, it may not be splited even invoke Split explicitly. 169 for i := 0; i < 10000; i++ { 170 p := NewPut([]byte(fmt.Sprintf("%c_%d", prefix, i))) 171 p.AddStringValue("cf", "c", fmt.Sprintf("%c%c_%d", prefix, prefix, i)) 172 rowKey := string(p.Row) 173 origData[rowKey] = map[string]string{} 174 origData[rowKey]["cf:c"] = string(p.Values[0][0]) 175 b, err := s.cli.Put(s.tableName, p) 176 c.Assert(err, IsNil) 177 c.Assert(b, IsTrue) 178 } 179 } 180 err = s.cli.Split(s.tableName, "") 181 c.Assert(err, IsNil) 182 // Sleep wait Split finish. 183 time.Sleep(5 * time.Second) 184 185 regions, err = s.cli.GetRegions([]byte(s.tableName), false) 186 c.Assert(err, IsNil) 187 // After insert 10K data, 188 // with Themis coprocessor, it will be split to 7 regions, 189 // without themis, that number will be 6. 190 // Split depends on coprocessor behavior and hbase conf, 191 // so we just know it will split at least one region. 192 c.Assert(len(regions), Greater, 4) 193 194 // Check all data are still. 195 scan := NewScan([]byte(s.tableName), 1000, s.cli) 196 cnt := 0 197 for prefix := prefixLower; prefix < prefixUpper; prefix++ { 198 for i := 0; i < 10000; i++ { 199 r := scan.Next() 200 c.Assert(r, NotNil) 201 rowKey := string(r.Row) 202 origRow, ok := origData[rowKey] 203 c.Assert(ok, IsTrue) 204 c.Assert(origRow, NotNil) 205 for column := range r.Columns { 206 origValue, ok := origRow[column] 207 c.Assert(ok, IsTrue) 208 value := string(r.Columns[column].Value) 209 c.Assert(origValue, Equals, value) 210 } 211 delete(origData, rowKey) 212 cnt++ 213 } 214 } 215 c.Assert(cnt, Equals, int(prefixUpper-prefixLower)*10000) 216 } 217 218 func (s *AdminTestSuit) TestTableSplit(c *C) { 219 regions, err := s.cli.GetRegions([]byte(s.tableName), false) 220 c.Assert(err, IsNil) 221 c.Assert(regions, HasLen, 4) 222 for i := 0; i < 100; i++ { 223 p := NewPut([]byte(fmt.Sprintf("b_%d", i))) 224 p.AddStringValue("cf", "c", fmt.Sprintf("bb_%d", i)) 225 b, err := s.cli.Put(s.tableName, p) 226 c.Assert(err, IsNil) 227 c.Assert(b, IsTrue) 228 } 229 err = s.cli.Split(s.tableName, "b_2") 230 c.Assert(err, IsNil) 231 232 // Sleep wait Split finish. 233 time.Sleep(500 * time.Millisecond) 234 235 regions, err = s.cli.GetRegions([]byte(s.tableName), false) 236 c.Assert(err, IsNil) 237 c.Assert(regions, HasLen, 5) 238 239 // Test directly split region. 240 err = s.cli.Split(regions[1].Name, "b_50") 241 c.Assert(err, IsNil) 242 243 // Sleep wait Split finish. 244 time.Sleep(500 * time.Millisecond) 245 246 regions, err = s.cli.GetRegions([]byte(s.tableName), false) 247 c.Assert(err, IsNil) 248 c.Assert(regions, HasLen, 6) 249 250 }