Search in sources :

Example 1 with ServerContext

use of org.apache.accumulo.server.ServerContext in project accumulo by apache.

the class MetadataConstraints method check.

@Override
public List<Short> check(Environment env, Mutation mutation) {
    final ServerContext context = ((SystemEnvironment) env).getServerContext();
    ArrayList<Short> violations = null;
    Collection<ColumnUpdate> colUpdates = mutation.getUpdates();
    // check the row, it should contains at least one ; or end with <
    boolean containsSemiC = false;
    byte[] row = mutation.getRow();
    // always allow rows that fall within reserved areas
    if (row.length > 0 && row[0] == '~')
        return null;
    if (row.length > 2 && row[0] == '!' && row[1] == '!' && row[2] == '~')
        return null;
    for (byte b : row) {
        if (b == ';') {
            containsSemiC = true;
        }
        if (b == ';' || b == '<')
            break;
        if (!validTableNameChars[0xff & b]) {
            violations = addIfNotPresent(violations, 4);
        }
    }
    if (containsSemiC) {
        if (row.length == 0) {
            violations = addIfNotPresent(violations, 4);
        }
    } else {
        // see if last row char is <
        if (row.length == 0 || row[row.length - 1] != '<') {
            violations = addIfNotPresent(violations, 4);
        }
    }
    if (row.length > 0 && row[0] == '!') {
        if (row.length < 3 || row[1] != '0' || (row[2] != '<' && row[2] != ';')) {
            violations = addIfNotPresent(violations, 4);
        }
    }
    // ensure row is not less than Constants.METADATA_TABLE_ID
    if (new Text(row).compareTo(new Text(MetadataTable.ID.canonical())) < 0) {
        violations = addViolation(violations, 5);
    }
    boolean checkedBulk = false;
    for (ColumnUpdate columnUpdate : colUpdates) {
        Text columnFamily = new Text(columnUpdate.getColumnFamily());
        if (columnUpdate.isDeleted()) {
            if (!isValidColumn(columnUpdate)) {
                violations = addViolation(violations, 2);
            }
            continue;
        }
        if (columnUpdate.getValue().length == 0 && !columnFamily.equals(ScanFileColumnFamily.NAME)) {
            violations = addViolation(violations, 6);
        }
        if (columnFamily.equals(DataFileColumnFamily.NAME)) {
            try {
                DataFileValue dfv = new DataFileValue(columnUpdate.getValue());
                if (dfv.getSize() < 0 || dfv.getNumEntries() < 0) {
                    violations = addViolation(violations, 1);
                }
            } catch (NumberFormatException | ArrayIndexOutOfBoundsException nfe) {
                violations = addViolation(violations, 1);
            }
        } else if (columnFamily.equals(ScanFileColumnFamily.NAME)) {
        } else if (columnFamily.equals(BulkFileColumnFamily.NAME)) {
            if (!columnUpdate.isDeleted() && !checkedBulk) {
                // splits, which also write the time reference, are allowed to write this reference even
                // when
                // the transaction is not running because the other half of the tablet is holding a
                // reference
                // to the file.
                boolean isSplitMutation = false;
                // When a tablet is assigned, it re-writes the metadata. It should probably only update
                // the location information,
                // but it writes everything. We allow it to re-write the bulk information if it is setting
                // the location.
                // See ACCUMULO-1230.
                boolean isLocationMutation = false;
                HashSet<Text> dataFiles = new HashSet<>();
                HashSet<Text> loadedFiles = new HashSet<>();
                String tidString = new String(columnUpdate.getValue(), UTF_8);
                int otherTidCount = 0;
                for (ColumnUpdate update : mutation.getUpdates()) {
                    if (new ColumnFQ(update).equals(ServerColumnFamily.DIRECTORY_COLUMN)) {
                        isSplitMutation = true;
                    } else if (new Text(update.getColumnFamily()).equals(CurrentLocationColumnFamily.NAME)) {
                        isLocationMutation = true;
                    } else if (new Text(update.getColumnFamily()).equals(DataFileColumnFamily.NAME)) {
                        dataFiles.add(new Text(update.getColumnQualifier()));
                    } else if (new Text(update.getColumnFamily()).equals(BulkFileColumnFamily.NAME)) {
                        loadedFiles.add(new Text(update.getColumnQualifier()));
                        if (!new String(update.getValue(), UTF_8).equals(tidString)) {
                            otherTidCount++;
                        }
                    }
                }
                if (!isSplitMutation && !isLocationMutation) {
                    long tid = BulkFileColumnFamily.getBulkLoadTid(new Value(tidString));
                    try {
                        if (otherTidCount > 0 || !dataFiles.equals(loadedFiles) || !getArbitrator(context).transactionAlive(Constants.BULK_ARBITRATOR_TYPE, tid)) {
                            violations = addViolation(violations, 8);
                        }
                    } catch (Exception ex) {
                        violations = addViolation(violations, 8);
                    }
                }
                checkedBulk = true;
            }
        } else {
            if (!isValidColumn(columnUpdate)) {
                violations = addViolation(violations, 2);
            } else if (new ColumnFQ(columnUpdate).equals(TabletColumnFamily.PREV_ROW_COLUMN) && columnUpdate.getValue().length > 0 && (violations == null || !violations.contains((short) 4))) {
                KeyExtent ke = KeyExtent.fromMetaRow(new Text(mutation.getRow()));
                Text per = TabletColumnFamily.decodePrevEndRow(new Value(columnUpdate.getValue()));
                boolean prevEndRowLessThanEndRow = per == null || ke.endRow() == null || per.compareTo(ke.endRow()) < 0;
                if (!prevEndRowLessThanEndRow) {
                    violations = addViolation(violations, 3);
                }
            } else if (new ColumnFQ(columnUpdate).equals(ServerColumnFamily.LOCK_COLUMN)) {
                if (zooCache == null) {
                    zooCache = new ZooCache(context.getZooReaderWriter(), null);
                    CleanerUtil.zooCacheClearer(this, zooCache);
                }
                if (zooRoot == null) {
                    zooRoot = context.getZooKeeperRoot();
                }
                boolean lockHeld = false;
                String lockId = new String(columnUpdate.getValue(), UTF_8);
                try {
                    lockHeld = ServiceLock.isLockHeld(zooCache, new ZooUtil.LockID(zooRoot, lockId));
                } catch (Exception e) {
                    log.debug("Failed to verify lock was held {} {}", lockId, e.getMessage());
                }
                if (!lockHeld) {
                    violations = addViolation(violations, 7);
                }
            }
        }
    }
    if (violations != null) {
        log.debug("violating metadata mutation : {}", new String(mutation.getRow(), UTF_8));
        for (ColumnUpdate update : mutation.getUpdates()) {
            log.debug(" update: {}:{} value {}", new String(update.getColumnFamily(), UTF_8), new String(update.getColumnQualifier(), UTF_8), (update.isDeleted() ? "[delete]" : new String(update.getValue(), UTF_8)));
        }
    }
    return violations;
}
Also used : ColumnUpdate(org.apache.accumulo.core.data.ColumnUpdate) KeyExtent(org.apache.accumulo.core.dataImpl.KeyExtent) HashSet(java.util.HashSet) DataFileValue(org.apache.accumulo.core.metadata.schema.DataFileValue) Text(org.apache.hadoop.io.Text) ZooCache(org.apache.accumulo.fate.zookeeper.ZooCache) Constraint(org.apache.accumulo.core.data.constraints.Constraint) ColumnFQ(org.apache.accumulo.core.util.ColumnFQ) ServerContext(org.apache.accumulo.server.ServerContext) DataFileValue(org.apache.accumulo.core.metadata.schema.DataFileValue) Value(org.apache.accumulo.core.data.Value)

Example 2 with ServerContext

use of org.apache.accumulo.server.ServerContext in project accumulo by apache.

the class Initialize method resetSecurity.

private boolean resetSecurity(InitialConfiguration initConfig, Opts opts, VolumeManager fs) {
    log.info("Resetting security on accumulo.");
    try (ServerContext context = new ServerContext(initConfig.getSiteConf())) {
        if (!isInitialized(fs, initConfig)) {
            throw new IllegalStateException("FATAL: Attempted to reset security on accumulo before it was initialized");
        }
        if (!opts.forceResetSecurity) {
            String userEnteredName = System.console().readLine("WARNING: This will remove all" + " users from Accumulo! If you wish to proceed enter the instance name: ");
            if (userEnteredName != null && !context.getInstanceName().equals(userEnteredName)) {
                throw new IllegalStateException("Aborted reset security: Instance name did not match current instance.");
            }
        }
        final String rootUser = getRootUserName(initConfig, opts);
        opts.rootpass = getRootPassword(initConfig, opts, rootUser);
        initSecurity(context, opts, rootUser);
        return true;
    } catch (Exception e) {
        log.error("Problem calling reset security", e);
        return false;
    }
}
Also used : ServerContext(org.apache.accumulo.server.ServerContext) AccumuloSecurityException(org.apache.accumulo.core.client.AccumuloSecurityException) KeeperException(org.apache.zookeeper.KeeperException) IOException(java.io.IOException)

Example 3 with ServerContext

use of org.apache.accumulo.server.ServerContext in project accumulo by apache.

the class Manager method getMergeInfo.

public MergeInfo getMergeInfo(TableId tableId) {
    ServerContext context = getContext();
    synchronized (mergeLock) {
        try {
            String path = getZooKeeperRoot() + Constants.ZTABLES + "/" + tableId + "/merge";
            if (!context.getZooReaderWriter().exists(path)) {
                return new MergeInfo();
            }
            byte[] data = context.getZooReaderWriter().getData(path);
            DataInputBuffer in = new DataInputBuffer();
            in.reset(data, data.length);
            MergeInfo info = new MergeInfo();
            info.readFields(in);
            return info;
        } catch (KeeperException.NoNodeException ex) {
            log.info("Error reading merge state, it probably just finished");
            return new MergeInfo();
        } catch (Exception ex) {
            log.warn("Unexpected error reading merge state", ex);
            return new MergeInfo();
        }
    }
}
Also used : MergeInfo(org.apache.accumulo.server.manager.state.MergeInfo) DataInputBuffer(org.apache.hadoop.io.DataInputBuffer) ServerContext(org.apache.accumulo.server.ServerContext) KeeperException(org.apache.zookeeper.KeeperException) TableNotFoundException(org.apache.accumulo.core.client.TableNotFoundException) NoAuthException(org.apache.zookeeper.KeeperException.NoAuthException) TException(org.apache.thrift.TException) IOException(java.io.IOException) UnknownHostException(java.net.UnknownHostException) ExecutionException(java.util.concurrent.ExecutionException) TTransportException(org.apache.thrift.transport.TTransportException) KeeperException(org.apache.zookeeper.KeeperException) ThriftTableOperationException(org.apache.accumulo.core.clientImpl.thrift.ThriftTableOperationException)

Example 4 with ServerContext

use of org.apache.accumulo.server.ServerContext in project accumulo by apache.

the class Manager method setMergeState.

public void setMergeState(MergeInfo info, MergeState state) throws KeeperException, InterruptedException {
    ServerContext context = getContext();
    synchronized (mergeLock) {
        String path = getZooKeeperRoot() + Constants.ZTABLES + "/" + info.getExtent().tableId() + "/merge";
        info.setState(state);
        if (state.equals(MergeState.NONE)) {
            context.getZooReaderWriter().recursiveDelete(path, NodeMissingPolicy.SKIP);
        } else {
            DataOutputBuffer out = new DataOutputBuffer();
            try {
                info.write(out);
            } catch (IOException ex) {
                throw new AssertionError("Unlikely", ex);
            }
            context.getZooReaderWriter().putPersistentData(path, out.getData(), state.equals(MergeState.STARTED) ? ZooUtil.NodeExistsPolicy.FAIL : ZooUtil.NodeExistsPolicy.OVERWRITE);
        }
        mergeLock.notifyAll();
    }
    nextEvent.event("Merge state of %s set to %s", info.getExtent(), state);
}
Also used : ServerContext(org.apache.accumulo.server.ServerContext) DataOutputBuffer(org.apache.hadoop.io.DataOutputBuffer) IOException(java.io.IOException)

Example 5 with ServerContext

use of org.apache.accumulo.server.ServerContext in project accumulo by apache.

the class Manager method mustBeOnline.

public void mustBeOnline(final TableId tableId) throws ThriftTableOperationException {
    ServerContext context = getContext();
    context.clearTableListCache();
    if (context.getTableState(tableId) != TableState.ONLINE) {
        throw new ThriftTableOperationException(tableId.canonical(), null, TableOperation.MERGE, TableOperationExceptionType.OFFLINE, "table is not online");
    }
}
Also used : ServerContext(org.apache.accumulo.server.ServerContext) ThriftTableOperationException(org.apache.accumulo.core.clientImpl.thrift.ThriftTableOperationException)

Aggregations

ServerContext (org.apache.accumulo.server.ServerContext)87 Test (org.junit.Test)41 ZooReaderWriter (org.apache.accumulo.fate.zookeeper.ZooReaderWriter)18 AccumuloClient (org.apache.accumulo.core.client.AccumuloClient)15 AccumuloConfiguration (org.apache.accumulo.core.conf.AccumuloConfiguration)15 TServerInstance (org.apache.accumulo.core.metadata.TServerInstance)15 HostAndPort (org.apache.accumulo.core.util.HostAndPort)15 Path (org.apache.hadoop.fs.Path)15 ArrayList (java.util.ArrayList)14 KeyExtent (org.apache.accumulo.core.dataImpl.KeyExtent)14 VolumeManager (org.apache.accumulo.server.fs.VolumeManager)13 KeeperException (org.apache.zookeeper.KeeperException)13 ServerAddress (org.apache.accumulo.server.rpc.ServerAddress)12 TableId (org.apache.accumulo.core.data.TableId)11 LiveTServerSet (org.apache.accumulo.server.manager.LiveTServerSet)11 Value (org.apache.accumulo.core.data.Value)10 IOException (java.io.IOException)9 UUID (java.util.UUID)9 ConfigurationCopy (org.apache.accumulo.core.conf.ConfigurationCopy)9 Client (org.apache.accumulo.core.tabletserver.thrift.TabletClientService.Client)9