@@ -4,18 +4,14 @@ import (
4
4
"context"
5
5
"fmt"
6
6
"io"
7
- "reflect"
8
7
"strings"
9
8
"time"
10
- "unsafe"
11
-
12
- "github.com/percona/percona-backup-mongodb/pbm/compress"
13
9
14
10
"go.mongodb.org/mongo-driver/bson"
15
11
"go.mongodb.org/mongo-driver/mongo"
16
12
13
+ "github.com/percona/percona-backup-mongodb/pbm/compress"
17
14
"github.com/percona/percona-backup-mongodb/pbm/errors"
18
-
19
15
"github.com/percona/percona-backup-mongodb/pbm/storage"
20
16
)
21
17
@@ -54,20 +50,25 @@ func (b Byte) String() string {
54
50
}
55
51
56
52
type Rand struct {
57
- size Byte
53
+ size Byte
54
+ dataset [][]byte
58
55
}
59
56
60
57
func NewRand (size Byte ) * Rand {
61
58
r := & Rand {
62
- size : size ,
59
+ size : size ,
60
+ dataset : make ([][]byte , len (dataset )),
61
+ }
62
+ for i , s := range dataset {
63
+ r .dataset [i ] = []byte (s )
63
64
}
64
65
return r
65
66
}
66
67
67
68
func (r * Rand ) WriteTo (w io.Writer ) (int64 , error ) {
68
69
var written int64
69
70
for i := 0 ; written < int64 (r .size ); i ++ {
70
- n , err := w .Write (StringToBytes ( dataset [i % len (dataset )]) )
71
+ n , err := w .Write (r . dataset [i % len (dataset )])
71
72
if err != nil {
72
73
return written , err
73
74
}
@@ -79,6 +80,8 @@ func (r *Rand) WriteTo(w io.Writer) (int64, error) {
79
80
type Collection struct {
80
81
size Byte
81
82
c * mongo.Collection
83
+
84
+ dataset [][]byte
82
85
}
83
86
84
87
func NewCollection (size Byte , cn * mongo.Client , namespace string ) (* Collection , error ) {
@@ -87,10 +90,16 @@ func NewCollection(size Byte, cn *mongo.Client, namespace string) (*Collection,
87
90
return nil , errors .New ("namespace should be in format `database.collection`" )
88
91
}
89
92
90
- return & Collection {
93
+ r := & Collection {
91
94
size : size ,
92
95
c : cn .Database (ns [0 ]).Collection (ns [1 ]),
93
- }, nil
96
+
97
+ dataset : make ([][]byte , len (dataset )),
98
+ }
99
+ for i , s := range dataset {
100
+ r .dataset [i ] = []byte (s )
101
+ }
102
+ return r , nil
94
103
}
95
104
96
105
func (c * Collection ) WriteTo (w io.Writer ) (int64 , error ) {
@@ -104,7 +113,7 @@ func (c *Collection) WriteTo(w io.Writer) (int64, error) {
104
113
105
114
var written int64
106
115
for cur .Next (ctx ) {
107
- n , err := w .Write ([] byte ( cur .Current ) )
116
+ n , err := w .Write (cur .Current )
108
117
if err != nil {
109
118
return written , errors .Wrap (err , "write" )
110
119
}
@@ -149,11 +158,3 @@ func doTest(
149
158
150
159
return r , nil
151
160
}
152
-
153
- // StringToBytes converts given string to the slice of bytes
154
- // without allocations
155
- func StringToBytes (s string ) []byte {
156
- sh := (* reflect .StringHeader )(unsafe .Pointer (& s ))
157
- bh := reflect.SliceHeader {sh .Data , sh .Len , sh .Len }
158
- return * (* []byte )(unsafe .Pointer (& bh )) //nolint:govet
159
- }
0 commit comments