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  }