From 1fab40d070dc8b7e426180d743655f0ea69cce5e Mon Sep 17 00:00:00 2001 From: Thibault Deutsch Date: Fri, 5 Jul 2024 14:36:58 +0100 Subject: [PATCH] scanner: don't send scanner close request when region was exhausted HBase server already close the region scanner[1] when there is no more results to be send from that region. Therefore, it is useless to send one more request to close the scanner. [1] https://github.com/apache/hbase/blob/master/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java#L3698 --- scanner.go | 2 +- scanner_test.go | 37 +------------------------------------ 2 files changed, 2 insertions(+), 37 deletions(-) diff --git a/scanner.go b/scanner.go index 83f0b3f..a5aaa69 100644 --- a/scanner.go +++ b/scanner.go @@ -240,7 +240,7 @@ func (s *scanner) update(resp *pb.ScanResponse, region hrpc.RegionInfo) { } if !resp.GetMoreResultsInRegion() { // we are done with this region, prepare scan for next region - s.closeRegionScanner() + s.curRegionScannerID = noScannerID // Normal Scan if !s.rpc.Reversed() { diff --git a/scanner_test.go b/scanner_test.go index e5f8f98..11b0975 100644 --- a/scanner_test.go +++ b/scanner_test.go @@ -108,15 +108,12 @@ func testCallClose(scan *hrpc.Scan, c *mock.MockRPCClient, scannerID uint64, group.Done() }).Return(&pb.ScanResponse{}, nil).Times(1) } + func TestScanner(t *testing.T) { ctrl := test.NewController(t) defer ctrl.Finish() c := mock.NewMockRPCClient(ctrl) - var wg sync.WaitGroup - wg.Add(3) - defer wg.Wait() - scan, err := hrpc.NewScan(context.Background(), table, hrpc.NumberOfRows(2)) if err != nil { t.Fatal(err) @@ -152,8 +149,6 @@ func TestScanner(t *testing.T) { Results: dup(resultsPB[1:2]), }, nil).Times(1) - // added call to close scanner - testCallClose(scan, c, scannerID, &wg, t) scannerID++ s, err = hrpc.NewScanRange(scan.Context(), table, @@ -168,11 +163,6 @@ func TestScanner(t *testing.T) { Results: dup(resultsPB[2:3]), }, nil).Times(1) - // added call to close scanner - testCallClose(scan, c, scannerID, &wg, t) - if err != nil { - t.Fatal(err) - } scannerID++ s, err = hrpc.NewScanRange(scan.Context(), table, []byte("foo"), nil, @@ -188,9 +178,6 @@ func TestScanner(t *testing.T) { MoreResults: proto.Bool(false), }, nil).Times(1) - // added call to close scanner - testCallClose(scan, c, scannerID, &wg, t) - var rs []*hrpc.Result for { r, err := scanner.Next() @@ -600,10 +587,6 @@ func testPartialResults(t *testing.T, scan *hrpc.Scan, expected []*hrpc.Result) defer ctrl.Finish() c := mock.NewMockRPCClient(ctrl) - var wg sync.WaitGroup - wg.Add(3) - defer wg.Wait() - tcase := []struct { region hrpc.RegionInfo results []*pb.Result @@ -680,11 +663,6 @@ func testPartialResults(t *testing.T, scan *hrpc.Scan, expected []*hrpc.Result) MoreResultsInRegion: &partial.moreResultsInRegion, Results: partial.results, }, nil).Times(1) - - if partial.scanFromID { - // added call to close scanner - testCallClose(scan, c, scannerID, &wg, t) - } } var rs []*hrpc.Result @@ -709,10 +687,6 @@ func TestReversedScanner(t *testing.T) { defer ctrl.Finish() c := mock.NewMockRPCClient(ctrl) - var wg sync.WaitGroup - wg.Add(3) - defer wg.Wait() - ctx := context.Background() scan, err := hrpc.NewScan(ctx, table, hrpc.Reversed()) if err != nil { @@ -734,9 +708,6 @@ func TestReversedScanner(t *testing.T) { Results: dup(resultsPB[3:4]), }, nil).Times(1) - // added call to close scanner - testCallClose(scan, c, scannerID, &wg, t) - s, err = hrpc.NewScanRange(ctx, table, append([]byte("fon"), rowPadding...), nil, hrpc.Reversed()) if err != nil { @@ -749,9 +720,6 @@ func TestReversedScanner(t *testing.T) { Results: dup(resultsPB[2:3]), }, nil).Times(1) - // added call to close scanner - testCallClose(scan, c, scannerID, &wg, t) - s, err = hrpc.NewScanRange(ctx, table, append([]byte("baq"), rowPadding...), nil, hrpc.Reversed()) if err != nil { @@ -777,9 +745,6 @@ func TestReversedScanner(t *testing.T) { Results: dup(resultsPB[:1]), }, nil).Times(1) - // added call to close scanner - testCallClose(scan, c, scannerID, &wg, t) - var rs []*hrpc.Result for { r, err := scanner.Next()