use of org.apache.zookeeper_voltpatches.KeeperException in project voltdb by VoltDB.
the class TopologyZKUtils method readTopologyFromZK.
public static AbstractTopology readTopologyFromZK(ZooKeeper zk) {
AbstractTopology topology = null;
try {
byte[] data = zk.getData(VoltZK.topology, false, null);
String jsonTopology = new String(data, Charsets.UTF_8);
topology = AbstractTopology.topologyFromJSON(jsonTopology);
} catch (KeeperException | InterruptedException | JSONException e) {
VoltDB.crashLocalVoltDB("Unable to read topology from ZK, dying", true, e);
}
return topology;
}
use of org.apache.zookeeper_voltpatches.KeeperException in project voltdb by VoltDB.
the class ZooKeeperServer method executeRequest.
private void executeRequest(Request request) {
if (LOG.isDebugEnabled()) {
LOG.debug("Processing request:: " + request);
}
// request.addRQRec(">final");
long traceMask = ZooTrace.CLIENT_REQUEST_TRACE_MASK;
if (request.type == OpCode.ping) {
traceMask = ZooTrace.SERVER_PING_TRACE_MASK;
}
if (LOG.isTraceEnabled()) {
ZooTrace.logRequest(LOG, traceMask, 'E', request, "");
}
ProcessTxnResult rc = null;
synchronized (outstandingChanges) {
while (!outstandingChanges.isEmpty() && outstandingChanges.get(0).zxid <= request.zxid) {
ChangeRecord cr = outstandingChanges.remove(0);
if (cr.zxid < request.zxid) {
LOG.warn("Zxid outstanding " + cr.zxid + " is less than current " + request.zxid);
}
if (outstandingChangesForPath.get(cr.path) == cr) {
outstandingChangesForPath.remove(cr.path);
}
}
if (request.hdr != null) {
rc = getZKDatabase().processTxn(request.hdr, request.txn);
}
}
if (request.hdr != null && request.hdr.getType() == OpCode.closeSession) {
Factory scxn = getServerCnxnFactory();
// we might just be playing diffs from the leader
if (scxn != null && request.cnxn == null) {
// calling this if we have the cnxn results in the client's
// close session response being lost - we've already closed
// the session/socket here before we can send the closeSession
// in the switch block below
scxn.closeSession(request.sessionId);
return;
}
}
if (request.cnxn == null) {
return;
}
ServerCnxn cnxn = request.cnxn;
String lastOp = "NA";
decInProcess();
Code err = Code.OK;
Record rsp = null;
boolean closeSession = false;
try {
if (request.hdr != null && request.hdr.getType() == OpCode.error) {
throw KeeperException.create(KeeperException.Code.get(((ErrorTxn) request.txn).getErr()));
}
KeeperException ke = request.getException();
if (ke != null) {
throw ke;
}
if (LOG.isDebugEnabled()) {
LOG.debug(request);
}
switch(request.type) {
case OpCode.ping:
{
serverStats().updateLatency(request.createTime);
lastOp = "PING";
((CnxnStats) cnxn.getStats()).updateForResponse(request.cxid, request.zxid, lastOp, request.createTime, System.currentTimeMillis());
cnxn.sendResponse(new ReplyHeader(-2, getZKDatabase().getDataTreeLastProcessedZxid(), 0), null, "response");
return;
}
case OpCode.createSession:
{
serverStats().updateLatency(request.createTime);
lastOp = "SESS";
((CnxnStats) cnxn.getStats()).updateForResponse(request.cxid, request.zxid, lastOp, request.createTime, System.currentTimeMillis());
cnxn.finishSessionInit(true);
return;
}
case OpCode.create:
{
lastOp = "CREA";
rsp = new CreateResponse(rc.path);
err = Code.get(rc.err);
break;
}
case OpCode.delete:
{
lastOp = "DELE";
err = Code.get(rc.err);
break;
}
case OpCode.setData:
{
lastOp = "SETD";
rsp = new SetDataResponse(rc.stat);
err = Code.get(rc.err);
break;
}
case OpCode.setACL:
{
lastOp = "SETA";
rsp = new SetACLResponse(rc.stat);
err = Code.get(rc.err);
break;
}
case OpCode.closeSession:
{
lastOp = "CLOS";
closeSession = true;
err = Code.get(rc.err);
break;
}
case OpCode.sync:
{
lastOp = "SYNC";
SyncRequest syncRequest = new SyncRequest();
ZooKeeperServer.byteBuffer2Record(request.request, syncRequest);
rsp = new SyncResponse(syncRequest.getPath());
break;
}
case OpCode.exists:
{
lastOp = "EXIS";
// TODO we need to figure out the security requirement for this!
ExistsRequest existsRequest = new ExistsRequest();
ZooKeeperServer.byteBuffer2Record(request.request, existsRequest);
String path = existsRequest.getPath();
if (path.indexOf('\0') != -1) {
throw new KeeperException.BadArgumentsException();
}
Stat stat = getZKDatabase().statNode(path, existsRequest.getWatch() ? cnxn : null);
rsp = new ExistsResponse(stat);
break;
}
case OpCode.getData:
{
lastOp = "GETD";
GetDataRequest getDataRequest = new GetDataRequest();
ZooKeeperServer.byteBuffer2Record(request.request, getDataRequest);
DataNode n = getZKDatabase().getNode(getDataRequest.getPath());
if (n == null) {
throw new KeeperException.NoNodeException();
}
Long aclL;
synchronized (n) {
aclL = n.acl;
}
checkACL(getZKDatabase().convertLong(aclL), ZooDefs.Perms.READ, request.authInfo);
Stat stat = new Stat();
byte[] b = getZKDatabase().getData(getDataRequest.getPath(), stat, getDataRequest.getWatch() ? cnxn : null);
rsp = new GetDataResponse(b, stat);
break;
}
case OpCode.setWatches:
{
lastOp = "SETW";
SetWatches setWatches = new SetWatches();
// XXX We really should NOT need this!!!!
request.request.rewind();
ZooKeeperServer.byteBuffer2Record(request.request, setWatches);
long relativeZxid = setWatches.getRelativeZxid();
getZKDatabase().setWatches(relativeZxid, setWatches.getDataWatches(), setWatches.getExistWatches(), setWatches.getChildWatches(), cnxn);
break;
}
case OpCode.getACL:
{
lastOp = "GETA";
GetACLRequest getACLRequest = new GetACLRequest();
ZooKeeperServer.byteBuffer2Record(request.request, getACLRequest);
Stat stat = new Stat();
List<ACL> acl = getZKDatabase().getACL(getACLRequest.getPath(), stat);
rsp = new GetACLResponse(acl, stat);
break;
}
case OpCode.getChildren:
{
lastOp = "GETC";
GetChildrenRequest getChildrenRequest = new GetChildrenRequest();
ZooKeeperServer.byteBuffer2Record(request.request, getChildrenRequest);
DataNode n = getZKDatabase().getNode(getChildrenRequest.getPath());
if (n == null) {
throw new KeeperException.NoNodeException();
}
Long aclG;
synchronized (n) {
aclG = n.acl;
}
checkACL(getZKDatabase().convertLong(aclG), ZooDefs.Perms.READ, request.authInfo);
List<String> children = getZKDatabase().getChildren(getChildrenRequest.getPath(), null, getChildrenRequest.getWatch() ? cnxn : null);
rsp = new GetChildrenResponse(children);
break;
}
case OpCode.getChildren2:
{
lastOp = "GETC";
GetChildren2Request getChildren2Request = new GetChildren2Request();
ZooKeeperServer.byteBuffer2Record(request.request, getChildren2Request);
Stat stat = new Stat();
DataNode n = getZKDatabase().getNode(getChildren2Request.getPath());
if (n == null) {
throw new KeeperException.NoNodeException();
}
Long aclG;
synchronized (n) {
aclG = n.acl;
}
checkACL(getZKDatabase().convertLong(aclG), ZooDefs.Perms.READ, request.authInfo);
List<String> children = getZKDatabase().getChildren(getChildren2Request.getPath(), stat, getChildren2Request.getWatch() ? cnxn : null);
rsp = new GetChildren2Response(children, stat);
break;
}
}
} catch (SessionMovedException e) {
// session moved is a connection level error, we need to tear
// down the connection otw ZOOKEEPER-710 might happen
// ie client on slow follower starts to renew session, fails
// before this completes, then tries the fast follower (leader)
// and is successful, however the initial renew is then
// successfully fwd/processed by the leader and as a result
// the client and leader disagree on where the client is most
// recently attached (and therefore invalid SESSION MOVED generated)
cnxn.sendCloseSession();
return;
} catch (KeeperException e) {
err = e.code();
} catch (Exception e) {
// log at error level as we are returning a marshalling
// error to the user
LOG.error("Failed to process " + request, e);
StringBuilder sb = new StringBuilder();
ByteBuffer bb = request.request;
bb.rewind();
while (bb.hasRemaining()) {
sb.append(Integer.toHexString(bb.get() & 0xff));
}
LOG.error("Dumping request buffer: 0x" + sb.toString());
err = Code.MARSHALLINGERROR;
}
ReplyHeader hdr = new ReplyHeader(request.cxid, request.zxid, err.intValue());
serverStats().updateLatency(request.createTime);
((CnxnStats) cnxn.getStats()).updateForResponse(request.cxid, request.zxid, lastOp, request.createTime, System.currentTimeMillis());
try {
cnxn.sendResponse(hdr, rsp, "response");
if (closeSession) {
cnxn.sendCloseSession();
}
} catch (IOException e) {
LOG.error("FIXMSG", e);
}
}
use of org.apache.zookeeper_voltpatches.KeeperException in project voltdb by VoltDB.
the class CatalogContext method getDebuggingInfoFromCatalog.
// Generate helpful status messages based on configuration present in the
// catalog. Used to generated these messages at startup and after an
// @UpdateApplicationCatalog
SortedMap<String, String> getDebuggingInfoFromCatalog(boolean verbose) {
SortedMap<String, String> logLines = new TreeMap<>();
// topology
Deployment deployment = cluster.getDeployment().iterator().next();
int hostCount = m_dbSettings.getCluster().hostcount();
if (verbose) {
Map<Integer, Integer> sphMap;
try {
sphMap = m_messenger.getSitesPerHostMapFromZK();
} catch (KeeperException | InterruptedException | JSONException e) {
hostLog.warn("Failed to get sitesperhost information from Zookeeper", e);
sphMap = null;
}
int kFactor = deployment.getKfactor();
if (sphMap == null) {
logLines.put("deployment1", String.format("Cluster has %d hosts with leader hostname: \"%s\". [unknown] local sites count. K = %d.", hostCount, VoltDB.instance().getConfig().m_leader, kFactor));
logLines.put("deployment2", "Unable to retrieve partition information from the cluster.");
} else {
int localSitesCount = sphMap.get(m_messenger.getHostId());
logLines.put("deployment1", String.format("Cluster has %d hosts with leader hostname: \"%s\". %d local sites count. K = %d.", hostCount, VoltDB.instance().getConfig().m_leader, localSitesCount, kFactor));
int totalSitesCount = 0;
for (Map.Entry<Integer, Integer> e : sphMap.entrySet()) {
totalSitesCount += e.getValue();
}
int replicas = kFactor + 1;
int partitionCount = totalSitesCount / replicas;
logLines.put("deployment2", String.format("The entire cluster has %d %s of%s %d logical partition%s.", replicas, replicas > 1 ? "copies" : "copy", partitionCount > 1 ? " each of the" : "", partitionCount, partitionCount > 1 ? "s" : ""));
}
}
// voltdb root
logLines.put("voltdbroot", "Using \"" + VoltDB.instance().getVoltDBRootPath() + "\" for voltdbroot directory.");
// partition detection
if (cluster.getNetworkpartition()) {
logLines.put("partition-detection", "Detection of network partitions in the cluster is enabled.");
} else {
logLines.put("partition-detection", "Detection of network partitions in the cluster is not enabled.");
}
// security info
if (cluster.getSecurityenabled()) {
logLines.put("sec-enabled", "Client authentication is enabled.");
} else {
logLines.put("sec-enabled", "Client authentication is not enabled. Anonymous clients accepted.");
}
// auto snapshot info
SnapshotSchedule ssched = database.getSnapshotschedule().get("default");
if (ssched == null || !ssched.getEnabled()) {
logLines.put("snapshot-schedule1", "No schedule set for automated snapshots.");
} else {
final String frequencyUnitString = ssched.getFrequencyunit().toLowerCase();
final char frequencyUnit = frequencyUnitString.charAt(0);
String msg = "[unknown frequency]";
switch(frequencyUnit) {
case 's':
msg = String.valueOf(ssched.getFrequencyvalue()) + " seconds";
break;
case 'm':
msg = String.valueOf(ssched.getFrequencyvalue()) + " minutes";
break;
case 'h':
msg = String.valueOf(ssched.getFrequencyvalue()) + " hours";
break;
}
logLines.put("snapshot-schedule1", "Automatic snapshots enabled, saved to " + VoltDB.instance().getSnapshotPath() + " and named with prefix '" + ssched.getPrefix() + "'.");
logLines.put("snapshot-schedule2", "Database will retain a history of " + ssched.getRetain() + " snapshots, generated every " + msg + ".");
}
return logLines;
}
use of org.apache.zookeeper_voltpatches.KeeperException in project voltdb by VoltDB.
the class ZKCountdownLatch method countDown.
public void countDown(boolean expectNonZeroCount) throws InterruptedException, KeeperException {
while (true) {
Stat stat = new Stat();
ByteBuffer buf = ByteBuffer.wrap(m_zk.getData(m_path, false, stat));
int count = buf.getInt();
if (count == 0) {
countedDown = true;
if (expectNonZeroCount) {
throw new RuntimeException("Count should be > 0");
}
return;
}
count--;
//Save a few milliseconds
if (count == 0)
countedDown = true;
buf.clear();
buf.putInt(count);
try {
m_zk.setData(m_path, buf.array(), stat.getVersion());
} catch (KeeperException.BadVersionException e) {
continue;
}
return;
}
}
use of org.apache.zookeeper_voltpatches.KeeperException in project voltdb by VoltDB.
the class ExportGeneration method cleanup.
private void cleanup(final HostMessenger messenger) {
shutdown = true;
//We need messenger NULL guard for tests.
if (m_mbox != null && messenger != null) {
for (Integer partition : m_dataSourcesByPartition.keySet()) {
final String partitionDN = m_mailboxesZKPath + "/" + partition;
String path = partitionDN + "/" + m_mbox.getHSId();
try {
messenger.getZK().delete(path, 0);
} catch (InterruptedException ex) {
;
} catch (KeeperException ex) {
;
}
}
messenger.removeMailbox(m_mbox);
}
m_onAllSourcesDrained = null;
}
Aggregations