blob: ce7206d80d2b47a28bce479097073e1278e94ea9 [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*
*/
/**
* \file data_tok.cpp
*
* Qpid asynchronous store plugin library
*
* File containing code for class mrg::journal::data_tok (data block token).
* See comments in file data_tok.h for details.
*
* \author Kim van der Riet
*/
#include "qpid/legacystore/jrnl/data_tok.h"
#include <iomanip>
#include "qpid/legacystore/jrnl/jerrno.h"
#include "qpid/legacystore/jrnl/jexception.h"
#include "qpid/legacystore/jrnl/slock.h"
#include <sstream>
namespace mrg
{
namespace journal
{
// Static members
u_int64_t data_tok::_cnt = 0;
smutex data_tok::_mutex;
data_tok::data_tok():
_wstate(NONE),
_rstate(UNREAD),
_dsize(0),
_dblks_written(0),
_dblks_read(0),
_pg_cnt(0),
_fid(0),
_rid(0),
_xid(),
_dequeue_rid(0),
_external_rid(false)
{
slock s(_mutex);
_icnt = _cnt++;
}
data_tok::~data_tok() {}
const char*
data_tok::wstate_str() const
{
return wstate_str(_wstate);
}
const char*
data_tok::wstate_str(write_state wstate)
{
switch (wstate)
{
case NONE:
return "NONE";
case ENQ_CACHED:
return "ENQ_CACHED";
case ENQ_PART:
return "ENQ_PART";
case ENQ_SUBM:
return "ENQ_SUBM";
case ENQ:
return "ENQ";
case DEQ_CACHED:
return "DEQ_CACHED";
case DEQ_PART:
return "DEQ_PART";
case DEQ_SUBM:
return "DEQ_SUBM";
case DEQ:
return "DEQ";
case ABORT_CACHED:
return "ABORT_CACHED";
case ABORT_PART:
return "ABORT_PART";
case ABORT_SUBM:
return "ABORT_SUBM";
case ABORTED:
return "ABORTED";
case COMMIT_CACHED:
return "COMMIT_CACHED";
case COMMIT_PART:
return "COMMIT_PART";
case COMMIT_SUBM:
return "COMMIT_SUBM";
case COMMITTED:
return "COMMITTED";
}
// Not using default: forces compiler to ensure all cases are covered.
return "<wstate unknown>";
}
const char*
data_tok::rstate_str() const
{
return rstate_str(_rstate);
}
const char*
data_tok::rstate_str(read_state rstate)
{
switch (rstate)
{
case NONE:
return "NONE";
case READ_PART:
return "READ_PART";
case SKIP_PART:
return "SKIP_PART";
case READ:
return "READ";
// Not using default: forces compiler to ensure all cases are covered.
}
return "<rstate unknown>";
}
void
data_tok::set_rstate(const read_state rstate)
{
if (_wstate != ENQ && rstate != UNREAD)
{
std::ostringstream oss;
oss << "Attempted to change read state to " << rstate_str(rstate);
oss << " while write state is not enqueued (wstate ENQ); wstate=" << wstate_str() << ".";
throw jexception(jerrno::JERR_DTOK_ILLEGALSTATE, oss.str(), "data_tok",
"set_rstate");
}
_rstate = rstate;
}
void
data_tok::reset()
{
_wstate = NONE;
_rstate = UNREAD;
_dsize = 0;
_dblks_written = 0;
_dblks_read = 0;
_pg_cnt = 0;
_fid = 0;
_rid = 0;
_xid.clear();
}
// debug aid
std::string
data_tok::status_str() const
{
std::ostringstream oss;
oss << std::hex << std::setfill('0');
oss << "dtok id=0x" << _icnt << "; ws=" << wstate_str() << "; rs=" << rstate_str();
oss << "; fid=0x" << _fid << "; rid=0x" << _rid << "; xid=";
for (unsigned i=0; i<_xid.size(); i++)
{
if (isprint(_xid[i]))
oss << _xid[i];
else
oss << "/" << std::setw(2) << (int)((char)_xid[i]);
}
oss << "; drid=0x" << _dequeue_rid << " extrid=" << (_external_rid?"T":"F");
oss << "; ds=0x" << _dsize << "; dw=0x" << _dblks_written << "; dr=0x" << _dblks_read;
oss << " pc=0x" << _pg_cnt;
return oss.str();
}
} // namespace journal
} // namespace mrg