mirror of https://gitee.com/bigwinds/arangodb
186 lines
5.8 KiB
JavaScript
186 lines
5.8 KiB
JavaScript
/* jshint globalstrict:true, strict:true, maxlen: 5000 */
|
|
/* global assertTrue, assertFalse, arango, require*/
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// DISCLAIMER
|
|
///
|
|
/// Copyright 2018 ArangoDB GmbH, Cologne, Germany
|
|
///
|
|
/// Licensed under the Apache License, Version 2.0 (the "License");
|
|
/// you may not use this file except in compliance with the License.
|
|
/// You may obtain a copy of the License at
|
|
///
|
|
/// http://www.apache.org/licenses/LICENSE-2.0
|
|
///
|
|
/// Unless required by applicable law or agreed to in writing, software
|
|
/// distributed under the License is distributed on an "AS IS" BASIS,
|
|
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
/// See the License for the specific language governing permissions and
|
|
/// limitations under the License.
|
|
///
|
|
/// Copyright holder is ArangoDB GmbH, Cologne, Germany
|
|
///
|
|
/// @author Jan Steemann
|
|
/// @author Copyright 2018, ArangoDB GmbH, Cologne, Germany
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
'use strict';
|
|
|
|
const jsunity = require("jsunity");
|
|
|
|
const db = require("internal").db;
|
|
const url = require('url');
|
|
const _ = require("lodash");
|
|
|
|
function getServers(role) {
|
|
const matchesRole = (d) => (_.toLower(d.role) === role);
|
|
const instanceInfo = JSON.parse(require('internal').env.INSTANCEINFO);
|
|
return instanceInfo.arangods.filter(matchesRole);
|
|
}
|
|
|
|
const cn = "UnitTestsWalCleanup";
|
|
const originalEndpoint = arango.getEndpoint();
|
|
|
|
function WalCleanupSuite () {
|
|
'use strict';
|
|
|
|
let run = function(insertData, getRanges) {
|
|
let seenInitialDeletion = false;
|
|
let seenNewFileDeletion = false;
|
|
let seenNewFile = false;
|
|
let minArchivedLogNumber = null;
|
|
let maxArchivedLogNumber = null;
|
|
|
|
let time = require("internal").time;
|
|
const start = time();
|
|
|
|
while (true) {
|
|
insertData();
|
|
|
|
let ranges = getRanges();
|
|
if (ranges.length) {
|
|
if (minArchivedLogNumber === null) {
|
|
minArchivedLogNumber = ranges[0];
|
|
maxArchivedLogNumber = ranges[ranges.length - 1];
|
|
require("console").warn("minimum logfile number found:", minArchivedLogNumber, "maximum logfile number found:", maxArchivedLogNumber);
|
|
}
|
|
if (!seenNewFile && ranges[ranges.length - 1] > maxArchivedLogNumber) {
|
|
// we have seen a new logfile in the archive
|
|
seenNewFile = true;
|
|
maxArchivedLogNumber = ranges[ranges.length - 1];
|
|
} else if (seenNewFile && ranges[0] > maxArchivedLogNumber) {
|
|
seenNewFileDeletion = true;
|
|
}
|
|
if (ranges[0] > minArchivedLogNumber) {
|
|
// we have seen the deletion of at least one logfile
|
|
seenInitialDeletion = true;
|
|
}
|
|
}
|
|
|
|
if (seenInitialDeletion && seenNewFileDeletion) {
|
|
break;
|
|
}
|
|
|
|
assertFalse(time() - start > 600, "time's up for this test!");
|
|
}
|
|
};
|
|
|
|
return {
|
|
setUp: function() {
|
|
arango.reconnect(originalEndpoint, "_system", "root", "");
|
|
},
|
|
|
|
tearDown: function() {
|
|
arango.reconnect(originalEndpoint, "_system", "root", "");
|
|
},
|
|
|
|
testAgent: function() {
|
|
const huge = Array(128).join("XYZ");
|
|
let docs = [];
|
|
for (let i = 0; i < 100; ++i) {
|
|
docs.push({ huge });
|
|
}
|
|
|
|
let getRanges = function() {
|
|
return require("@arangodb/replication").logger.tickRanges().filter(function(r) {
|
|
return r.status === 'collected';
|
|
}).map(function(r) {
|
|
return parseInt(r.datafile.replace(/^.*?(\d+)\.log$/, "$1"));
|
|
});
|
|
};
|
|
|
|
let insertData = function() {
|
|
let c = db._collection(cn);
|
|
// require("console").warn("inserting more data");
|
|
for (let i = 0; i < 200; ++i) {
|
|
c.insert(docs);
|
|
}
|
|
};
|
|
|
|
const agents = getServers('agent');
|
|
assertTrue(agents.length > 0, "no agents found");
|
|
const agent = agents[0].endpoint;
|
|
require("console").warn("connecting to agent", agent);
|
|
arango.reconnect(agent, "_system", "root", "");
|
|
try {
|
|
db._drop(cn);
|
|
db._create(cn);
|
|
run(insertData, getRanges);
|
|
} finally {
|
|
db._drop(cn);
|
|
}
|
|
},
|
|
|
|
testDBServer: function() {
|
|
const huge = Array(128).join("XYZ");
|
|
let docs = [];
|
|
for (let i = 0; i < 100; ++i) {
|
|
docs.push({ huge });
|
|
}
|
|
|
|
const coordinators = getServers("coordinator");
|
|
assertTrue(coordinators.length > 0, "no coordinators found");
|
|
const coordinator = coordinators[0].endpoint;
|
|
|
|
const dbservers = getServers("dbserver");
|
|
assertTrue(dbservers.length > 0, "no dbservers found");
|
|
const dbserver = dbservers[0].endpoint;
|
|
|
|
require("console").warn("connecting to dbserver", dbserver);
|
|
|
|
let insertData = function() {
|
|
arango.reconnect(coordinator, "_system", "root", "");
|
|
let c = db._collection(cn);
|
|
// require("console").warn("inserting more data");
|
|
for (let i = 0; i < 250; ++i) {
|
|
c.insert(docs);
|
|
}
|
|
};
|
|
|
|
let getRanges = function() {
|
|
arango.reconnect(dbserver, "_system", "root", "");
|
|
return require("@arangodb/replication").logger.tickRanges().filter(function(r) {
|
|
return r.status === 'collected';
|
|
}).map(function(r) {
|
|
return parseInt(r.datafile.replace(/^.*?(\d+)\.log$/, "$1"));
|
|
});
|
|
};
|
|
|
|
try {
|
|
arango.reconnect(coordinator, "_system", "root", "");
|
|
db._drop(cn);
|
|
db._create(cn, { numberOfShards: dbservers.length }); // we must make sure that we insert data to each db server
|
|
run(insertData, getRanges);
|
|
} finally {
|
|
arango.reconnect(coordinator, "_system", "root", "");
|
|
db._drop(cn);
|
|
}
|
|
},
|
|
|
|
};
|
|
}
|
|
|
|
jsunity.run(WalCleanupSuite);
|
|
|
|
return jsunity.done();
|