1
1
/* jshint globalstrict:false, strict:false, maxlen: 200 */
2
- /* global fail, assertEqual, assertNotEqual */
2
+ /* global fail, assertEqual, assertNotEqual, assertTrue */
3
3
4
4
// //////////////////////////////////////////////////////////////////////////////
5
5
// / DISCLAIMER
@@ -31,6 +31,24 @@ const db = arangodb.db;
31
31
const { getEndpointById, getEndpointsByType, getMetric } = require ( '@arangodb/test-helper' ) ;
32
32
const request = require ( '@arangodb/request' ) ;
33
33
34
+ function getDroppedFollowers ( servers ) {
35
+ let droppedFollowers = { } ;
36
+ servers . forEach ( ( serverId ) => {
37
+ let endpoint = getEndpointById ( serverId ) ;
38
+ droppedFollowers [ serverId ] = getMetric ( endpoint , "arangodb_dropped_followers_total" ) ;
39
+ } ) ;
40
+ return droppedFollowers ;
41
+ }
42
+
43
+ function getIntermediateCommits ( servers ) {
44
+ let intermediateCommits = { } ;
45
+ servers . forEach ( ( serverId ) => {
46
+ let endpoint = getEndpointById ( serverId ) ;
47
+ intermediateCommits [ serverId ] = getMetric ( endpoint , "arangodb_intermediate_commits_total" ) ;
48
+ } ) ;
49
+ return intermediateCommits ;
50
+ }
51
+
34
52
function transactionDroppedFollowersSuite ( ) {
35
53
'use strict' ;
36
54
const cn = 'UnitTestsTransaction' ;
@@ -44,6 +62,48 @@ function transactionDroppedFollowersSuite() {
44
62
tearDown : function ( ) {
45
63
db . _drop ( cn ) ;
46
64
} ,
65
+
66
+ testInsertSameFollower : function ( ) {
67
+ let c = db . _create ( cn , { numberOfShards : 40 , replicationFactor : 3 } ) ;
68
+ let docs = [ ] ;
69
+ for ( let i = 0 ; i < 1000 ; ++ i ) {
70
+ docs . push ( { } ) ;
71
+ }
72
+
73
+ let shards = db . _collection ( cn ) . shards ( true ) ;
74
+ let servers = shards [ Object . keys ( shards ) [ 0 ] ] ;
75
+
76
+ let droppedFollowersBefore = getDroppedFollowers ( servers ) ;
77
+
78
+ for ( let i = 0 ; i < 50 ; ++ i ) {
79
+ c . insert ( docs ) ;
80
+ }
81
+
82
+ assertEqual ( 1000 * 50 , c . count ( ) ) ;
83
+
84
+ // follower must not have been dropped
85
+ let droppedFollowersAfter = getDroppedFollowers ( servers ) ;
86
+ assertEqual ( droppedFollowersBefore , droppedFollowersAfter ) ;
87
+ } ,
88
+
89
+ testInsertAQLSameFollower : function ( ) {
90
+ let c = db . _create ( cn , { numberOfShards : 40 , replicationFactor : 3 } ) ;
91
+
92
+ let shards = db . _collection ( cn ) . shards ( true ) ;
93
+ let servers = shards [ Object . keys ( shards ) [ 0 ] ] ;
94
+
95
+ let droppedFollowersBefore = getDroppedFollowers ( servers ) ;
96
+
97
+ for ( let i = 0 ; i < 50 ; ++ i ) {
98
+ db . _query ( "FOR i IN 1..1000 INSERT {} INTO " + cn ) ;
99
+ }
100
+
101
+ assertEqual ( 1000 * 50 , c . count ( ) ) ;
102
+
103
+ // follower must not have been dropped
104
+ let droppedFollowersAfter = getDroppedFollowers ( servers ) ;
105
+ assertEqual ( droppedFollowersBefore , droppedFollowersAfter ) ;
106
+ } ,
47
107
48
108
testTransactionWritesSameFollower : function ( ) {
49
109
let c = db . _create ( cn , { numberOfShards : 40 , replicationFactor : 3 } ) ;
@@ -60,11 +120,7 @@ function transactionDroppedFollowersSuite() {
60
120
let shards = db . _collection ( cn ) . shards ( true ) ;
61
121
let servers = shards [ Object . keys ( shards ) [ 0 ] ] ;
62
122
63
- let droppedFollowers = { } ;
64
- servers . forEach ( ( serverId ) => {
65
- let endpoint = getEndpointById ( serverId ) ;
66
- droppedFollowers [ serverId ] = getMetric ( endpoint , "arangodb_dropped_followers_total" ) ;
67
- } ) ;
123
+ let droppedFollowersBefore = getDroppedFollowers ( servers ) ;
68
124
69
125
for ( let i = 0 ; i < 50 ; ++ i ) {
70
126
const trx = db . _createTransaction ( opts ) ;
@@ -74,13 +130,11 @@ function transactionDroppedFollowersSuite() {
74
130
assertEqual ( "committed" , result . status ) ;
75
131
}
76
132
77
- // follower must not have been dropped
78
- servers . forEach ( ( serverId ) => {
79
- let endpoint = getEndpointById ( serverId ) ;
80
- assertEqual ( droppedFollowers [ serverId ] , getMetric ( endpoint , "arangodb_dropped_followers_total" ) ) ;
81
- } ) ;
82
-
83
133
assertEqual ( 1000 * 50 , c . count ( ) ) ;
134
+
135
+ // follower must not have been dropped
136
+ let droppedFollowersAfter = getDroppedFollowers ( servers ) ;
137
+ assertEqual ( droppedFollowersBefore , droppedFollowersAfter ) ;
84
138
} ,
85
139
86
140
testTransactionExclusiveSameFollower : function ( ) {
@@ -98,11 +152,7 @@ function transactionDroppedFollowersSuite() {
98
152
let shards = db . _collection ( cn ) . shards ( true ) ;
99
153
let servers = shards [ Object . keys ( shards ) [ 0 ] ] ;
100
154
101
- let droppedFollowers = { } ;
102
- servers . forEach ( ( serverId ) => {
103
- let endpoint = getEndpointById ( serverId ) ;
104
- droppedFollowers [ serverId ] = getMetric ( endpoint , "arangodb_dropped_followers_total" ) ;
105
- } ) ;
155
+ let droppedFollowersBefore = getDroppedFollowers ( servers ) ;
106
156
107
157
for ( let i = 0 ; i < 50 ; ++ i ) {
108
158
const trx = db . _createTransaction ( opts ) ;
@@ -112,15 +162,84 @@ function transactionDroppedFollowersSuite() {
112
162
assertEqual ( "committed" , result . status ) ;
113
163
}
114
164
165
+ assertEqual ( 1000 * 50 , c . count ( ) ) ;
166
+
115
167
// follower must not have been dropped
116
- servers . forEach ( ( serverId ) => {
117
- let endpoint = getEndpointById ( serverId ) ;
118
- assertEqual ( droppedFollowers [ serverId ] , getMetric ( endpoint , "arangodb_dropped_followers_total" ) ) ;
119
- } ) ;
168
+ let droppedFollowersAfter = getDroppedFollowers ( servers ) ;
169
+ assertEqual ( droppedFollowersBefore , droppedFollowersAfter ) ;
170
+ } ,
171
+
172
+ testTransactionAbortsSameFollower : function ( ) {
173
+ let c = db . _create ( cn , { numberOfShards : 40 , replicationFactor : 3 } ) ;
174
+ let docs = [ ] ;
175
+ for ( let i = 0 ; i < 1000 ; ++ i ) {
176
+ docs . push ( { } ) ;
177
+ }
178
+ const opts = {
179
+ collections : {
180
+ write : [ cn ]
181
+ }
182
+ } ;
183
+
184
+ let shards = db . _collection ( cn ) . shards ( true ) ;
185
+ let servers = shards [ Object . keys ( shards ) [ 0 ] ] ;
186
+
187
+ let droppedFollowersBefore = getDroppedFollowers ( servers ) ;
188
+
189
+ for ( let i = 0 ; i < 50 ; ++ i ) {
190
+ const trx = db . _createTransaction ( opts ) ;
191
+ const tc = trx . collection ( cn ) ;
192
+ tc . insert ( docs ) ;
193
+ let result = trx . abort ( ) ;
194
+ assertEqual ( "aborted" , result . status ) ;
195
+ }
196
+
197
+ assertEqual ( 0 , c . count ( ) ) ;
120
198
121
- assertEqual ( 1000 * 50 , c . count ( ) ) ;
199
+ // follower must not have been dropped
200
+ let droppedFollowersAfter = getDroppedFollowers ( servers ) ;
201
+ assertEqual ( droppedFollowersBefore , droppedFollowersAfter ) ;
122
202
} ,
123
203
204
+ testTransactionWritesSameFollowerIntermediateCommit : function ( ) {
205
+ let c = db . _create ( cn , { numberOfShards : 40 , replicationFactor : 3 } ) ;
206
+ let docs = [ ] ;
207
+ for ( let i = 0 ; i < 2000 ; ++ i ) {
208
+ docs . push ( { } ) ;
209
+ }
210
+ const opts = {
211
+ collections : {
212
+ write : [ cn ]
213
+ } ,
214
+ intermediateCommitCount : 50
215
+ } ;
216
+
217
+ let shards = db . _collection ( cn ) . shards ( true ) ;
218
+ let servers = shards [ Object . keys ( shards ) [ 0 ] ] ;
219
+
220
+ let droppedFollowersBefore = getDroppedFollowers ( servers ) ;
221
+ let intermediateCommitsBefore = getIntermediateCommits ( servers ) ;
222
+
223
+ for ( let i = 0 ; i < 10 ; ++ i ) {
224
+ const trx = db . _createTransaction ( opts ) ;
225
+ const tc = trx . collection ( cn ) ;
226
+ tc . insert ( docs ) ;
227
+ let result = trx . commit ( ) ;
228
+ assertEqual ( "committed" , result . status ) ;
229
+ }
230
+
231
+ assertEqual ( 2000 * 10 , c . count ( ) ) ;
232
+
233
+ // follower must not have been dropped
234
+ let droppedFollowersAfter = getDroppedFollowers ( servers ) ;
235
+ assertEqual ( droppedFollowersBefore , droppedFollowersAfter ) ;
236
+
237
+ let intermediateCommitsAfter = getIntermediateCommits ( servers ) ;
238
+
239
+ Object . keys ( intermediateCommitsBefore ) . forEach ( ( s ) => {
240
+ assertTrue ( intermediateCommitsBefore [ s ] + 5 < intermediateCommitsAfter [ s ] ) ;
241
+ } ) ;
242
+ } ,
124
243
} ;
125
244
}
126
245
0 commit comments