bttest: Skip deleted rows in ReadRows

Fixes #1240

Change-Id: I34b91c1440d81fcd7cb35c5eb438085213b8600a
Reviewed-on: https://code-review.googlesource.com/c/36111
Reviewed-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Jean de Klerk <deklerk@google.com>
diff --git a/bigtable/bigtable_test.go b/bigtable/bigtable_test.go
index 55bf17a..4aec698 100644
--- a/bigtable/bigtable_test.go
+++ b/bigtable/bigtable_test.go
@@ -806,7 +806,7 @@
 		},
 	}
 	if !testutil.Equal(r, wantRow) {
-		t.Errorf("Column family was deleted unexpectly.\n got %v\n want %v", r, wantRow)
+		t.Errorf("Column family was deleted unexpectedly.\n got %v\n want %v", r, wantRow)
 	}
 	checkpoint("tested family delete")
 
diff --git a/bigtable/bttest/inmem.go b/bigtable/bttest/inmem.go
index 81bcf4e..72ad1c1 100644
--- a/bigtable/bttest/inmem.go
+++ b/bigtable/bttest/inmem.go
@@ -380,7 +380,13 @@
 
 	rows := make([]*row, 0, len(rowSet))
 	for _, r := range rowSet {
-		rows = append(rows, r)
+		r.mu.Lock()
+		fams := len(r.families)
+		r.mu.Unlock()
+
+		if fams != 0 {
+			rows = append(rows, r)
+		}
 	}
 	sort.Sort(byRowKey(rows))
 
diff --git a/bigtable/bttest/inmem_test.go b/bigtable/bttest/inmem_test.go
index df36c3c..e487f0d 100644
--- a/bigtable/bttest/inmem_test.go
+++ b/bigtable/bttest/inmem_test.go
@@ -460,6 +460,46 @@
 	}
 }
 
+func TestReadRowsAfterDeletion(t *testing.T) {
+	ctx := context.Background()
+	s := &server{
+		tables: make(map[string]*table),
+	}
+	newTbl := btapb.Table{
+		ColumnFamilies: map[string]*btapb.ColumnFamily{
+			"cf0": {},
+		},
+	}
+	tblInfo, err := s.CreateTable(ctx, &btapb.CreateTableRequest{
+		Parent: "cluster", TableId: "t", Table: &newTbl,
+	})
+	if err != nil {
+		t.Fatalf("Creating table: %v", err)
+	}
+	populateTable(ctx, s)
+	dreq := &btpb.MutateRowRequest{
+		TableName: tblInfo.Name,
+		RowKey:    []byte("row"),
+		Mutations: []*btpb.Mutation{{
+			Mutation: &btpb.Mutation_DeleteFromRow_{
+				DeleteFromRow: &btpb.Mutation_DeleteFromRow{},
+			},
+		}},
+	}
+	if _, err := s.MutateRow(ctx, dreq); err != nil {
+		t.Fatalf("Deleting from table: %v", err)
+	}
+
+	mock := &MockReadRowsServer{}
+	req := &btpb.ReadRowsRequest{TableName: tblInfo.Name}
+	if err = s.ReadRows(req, mock); err != nil {
+		t.Fatalf("ReadRows error: %v", err)
+	}
+	if got, want := len(mock.responses), 0; got != want {
+		t.Errorf("response count: got %d, want %d", got, want)
+	}
+}
+
 func TestReadRowsOrder(t *testing.T) {
 	s := &server{
 		tables: make(map[string]*table),