1
0
Fork 0

use batches in arangodump

This commit is contained in:
Jan Steemann 2013-10-10 09:08:02 +02:00
parent 5b2820a3e8
commit 13b51eb849
2 changed files with 128 additions and 5 deletions

View File

@ -814,7 +814,7 @@ void RestReplicationHandler::handleCommandLoggerSetConfig () {
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief handle a dump batch command /// @brief handle a dump batch command
/// ///
/// @RESTHEADER{PUT /_api/replication/`id`,prolongs an existing dump batch} /// @RESTHEADER{PUT /_api/replication/batch/`id`,prolongs an existing dump batch}
/// ///
/// @RESTURLPARAM{id,string,required} /// @RESTURLPARAM{id,string,required}
/// The id of the batch. /// The id of the batch.
@ -844,7 +844,7 @@ void RestReplicationHandler::handleCommandLoggerSetConfig () {
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief handle a dump batch command /// @brief handle a dump batch command
/// ///
/// @RESTHEADER{DELETE /_api/replication/`id`,deletes an existing dump batch} /// @RESTHEADER{DELETE /_api/replication/batch/`id`,deletes an existing dump batch}
/// ///
/// @RESTURLPARAM{id,string,required} /// @RESTURLPARAM{id,string,required}
/// The id of the batch. /// The id of the batch.

View File

@ -143,6 +143,12 @@ uint64_t TickStart = 0;
uint64_t TickEnd = 0; uint64_t TickEnd = 0;
////////////////////////////////////////////////////////////////////////////////
/// @brief our batch id
////////////////////////////////////////////////////////////////////////////////
uint64_t BatchId = 0;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @} /// @}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -184,6 +190,10 @@ static void ParseProgramOptions (int argc, char* argv[]) {
ProgramOptions options; ProgramOptions options;
BaseClient.parse(options, description, argc, argv, "arangodump.conf"); BaseClient.parse(options, description, argc, argv, "arangodump.conf");
if (1 == arguments.size()) {
OutputDirectory = arguments[0];
}
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -323,7 +333,7 @@ static string GetVersion () {
// convert response body to json // convert response body to json
TRI_json_t* json = TRI_JsonString(TRI_UNKNOWN_MEM_ZONE, response->getBody().str().c_str()); TRI_json_t* json = TRI_JsonString(TRI_UNKNOWN_MEM_ZONE, response->getBody().str().c_str());
if (json) { if (json != 0) {
// look up "server" value // look up "server" value
const string server = JsonHelper::getStringValue(json, "server", ""); const string server = JsonHelper::getStringValue(json, "server", "");
@ -342,6 +352,108 @@ static string GetVersion () {
return version; return version;
} }
////////////////////////////////////////////////////////////////////////////////
/// @brief start a batch
////////////////////////////////////////////////////////////////////////////////
static int StartBatch (string& errorMsg) {
map<string, string> headers;
const string url = "/_api/replication/batch";
const string body = "{\"ttl\":300}";
SimpleHttpResult* response = Client->request(HttpRequest::HTTP_REQUEST_POST,
url,
body.c_str(),
body.size(),
headers);
if (response == 0 || ! response->isComplete()) {
errorMsg = "got invalid response from server: " + Client->getErrorMessage();
if (response != 0) {
delete response;
}
return TRI_ERROR_INTERNAL;
}
if (response->wasHttpError()) {
errorMsg = "got invalid response from server: HTTP " +
StringUtils::itoa(response->getHttpReturnCode()) + ": " +
response->getHttpReturnMessage();
delete response;
return TRI_ERROR_INTERNAL;
}
// convert response body to json
TRI_json_t* json = TRI_JsonString(TRI_UNKNOWN_MEM_ZONE, response->getBody().str().c_str());
delete response;
if (json == 0) {
errorMsg = "got malformed JSON";
return TRI_ERROR_INTERNAL;
}
// look up "id" value
const string id = JsonHelper::getStringValue(json, "id", "");
TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, json);
BatchId = StringUtils::uint64(id);
return TRI_ERROR_NO_ERROR;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief prolongs a batch
////////////////////////////////////////////////////////////////////////////////
static void ExtendBatch () {
assert(BatchId > 0);
map<string, string> headers;
const string url = "/_api/replication/batch/" + StringUtils::itoa(BatchId);
const string body = "{\"ttl\":300}";
SimpleHttpResult* response = Client->request(HttpRequest::HTTP_REQUEST_PUT,
url,
body.c_str(),
body.size(),
headers);
// ignore any return value
if (response != 0) {
delete response;
}
}
////////////////////////////////////////////////////////////////////////////////
/// @brief end a batch
////////////////////////////////////////////////////////////////////////////////
static void EndBatch () {
assert(BatchId > 0);
map<string, string> headers;
const string url = "/_api/replication/batch/" + StringUtils::itoa(BatchId);
BatchId = 0;
SimpleHttpResult* response = Client->request(HttpRequest::HTTP_REQUEST_DELETE,
url,
0,
0,
headers);
// ignore any return value
if (response != 0) {
delete response;
}
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief dump a single collection /// @brief dump a single collection
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -446,6 +558,7 @@ static int DumpCollection (ofstream& outFile,
return TRI_ERROR_INTERNAL; return TRI_ERROR_INTERNAL;
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief dump data from server /// @brief dump data from server
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -472,7 +585,7 @@ static int RunDump (string& errorMsg) {
return TRI_ERROR_INTERNAL; return TRI_ERROR_INTERNAL;
} }
if (! response->isComplete() || response->wasHttpError()) { if (response->wasHttpError()) {
errorMsg = "got invalid response from server: HTTP " + errorMsg = "got invalid response from server: HTTP " +
StringUtils::itoa(response->getHttpReturnCode()) + ": " + StringUtils::itoa(response->getHttpReturnCode()) + ": " +
response->getHttpReturnMessage(); response->getHttpReturnMessage();
@ -621,6 +734,7 @@ static int RunDump (string& errorMsg) {
return TRI_ERROR_INTERNAL; return TRI_ERROR_INTERNAL;
} }
ExtendBatch();
int res = DumpCollection(outFile, cid, name, parameters, maxTick, errorMsg); int res = DumpCollection(outFile, cid, name, parameters, maxTick, errorMsg);
outFile.close(); outFile.close();
@ -797,13 +911,22 @@ int main (int argc, char* argv[]) {
} }
string errorMsg = ""; string errorMsg = "";
int res = RunDump(errorMsg);
int res = StartBatch(errorMsg);
if (res == TRI_ERROR_NO_ERROR) {
res = RunDump(errorMsg);
}
if (res != TRI_ERROR_NO_ERROR) { if (res != TRI_ERROR_NO_ERROR) {
cerr << errorMsg << endl; cerr << errorMsg << endl;
ret = EXIT_FAILURE; ret = EXIT_FAILURE;
} }
if (BatchId > 0) {
EndBatch();
}
TRIAGENS_REST_SHUTDOWN; TRIAGENS_REST_SHUTDOWN;
arangodumpExitFunction(ret, NULL); arangodumpExitFunction(ret, NULL);