Package voldemort.store.slop

Examples of voldemort.store.slop.SlopStorageEngine


    @Override
    protected void setUp() throws Exception {
        Cluster cluster = makeCluster(3);
        repo = new StoreRepository();
        repo.setSlopStore(new SlopStorageEngine(new InMemoryStorageEngine<ByteArray, byte[], byte[]>("slop"),
                                                cluster));
        repo.addNodeStore(0, new InMemoryStorageEngine<ByteArray, byte[], byte[]>(STORE_NAME));
        repo.addNodeStore(1, new InMemoryStorageEngine<ByteArray, byte[], byte[]>(STORE_NAME));
        repo.addNodeStore(2, new FailingStore<ByteArray, byte[], byte[]>(STORE_NAME));
View Full Code Here


            for(int i = 0; i < NUM_NODES_TOTAL; i++) {
                storeRepo.addNodeStore(i, subStores.get(i));
            }

            SlopStorageEngine slopStorageEngine = new SlopStorageEngine(new InMemoryStorageEngine<ByteArray, byte[], byte[]>(SLOP_STORE_NAME),
                                                                        cluster);
            StorageEngine<ByteArray, Slop, byte[]> storageEngine = slopStorageEngine.asSlopStore();
            storeRepo.setSlopStore(slopStorageEngine);
            nonblockingSlopStores.put(nodeId,
                                      routedStoreFactory.toNonblockingStore(slopStorageEngine));
            slopStores.put(nodeId, storageEngine);
View Full Code Here

            assertNotSame("slop should be there", 0, slopStoreNode0.get(nextSlop.makeKey(), null)
                                                                   .size());
        }

        // Check counts
        SlopStorageEngine slopEngine = getVoldemortServer(0).getStoreRepository().getSlopStore();
        assertEquals(slopEngine.getOutstandingTotal(), 50);
        assertEquals(slopEngine.getOutstandingByNode().get(1), new Long(50));
        assertEquals(slopEngine.getOutstandingByNode().get(2), new Long(0));

        stopServers(0, 2);
    }
View Full Code Here

            assertEquals("slop should have gone", 0, slopStoreNode0.get(nextSlop.makeKey(), null)
                                                                   .size());
        }

        // Check counts
        SlopStorageEngine slopEngine = getVoldemortServer(0).getStoreRepository().getSlopStore();
        assertEquals(slopEngine.getOutstandingTotal(), 0);
        assertEquals(slopEngine.getOutstandingByNode().get(1), new Long(0));
        assertEquals(slopEngine.getOutstandingByNode().get(2), new Long(0));

        stopServers(0, 1);
    }
View Full Code Here

            assertEquals("slop should have gone", 0, slopStoreNode1.get(nextSlop.makeKey(), null)
                                                                   .size());
        }

        // Check counts
        SlopStorageEngine slopEngine = getVoldemortServer(0).getStoreRepository().getSlopStore();
        assertEquals(slopEngine.getOutstandingTotal(), 0);
        assertEquals(slopEngine.getOutstandingByNode().get(1), new Long(0));

        slopEngine = getVoldemortServer(1).getStoreRepository().getSlopStore();
        assertEquals(slopEngine.getOutstandingTotal(), 0);
        assertEquals(slopEngine.getOutstandingByNode().get(0), new Long(0));

        stopServers(0, 1);
    }
View Full Code Here

            assertNotSame("slop should be there", 0, slopStoreNode0.get(nextSlop.makeKey(), null)
                                                                   .size());
        }

        // Check counts
        SlopStorageEngine slopEngine = getVoldemortServer(0).getStoreRepository().getSlopStore();
        assertEquals(slopEngine.getOutstandingTotal(), 50);
        assertEquals(slopEngine.getOutstandingByNode().get(1), new Long(50));
        assertEquals(slopEngine.getOutstandingByNode().get(2), new Long(0));

        // now replace server 1 with a new host and start it
        cluster = ServerTestUtils.updateClusterWithNewHost(cluster, 1);
        startServers(1);
View Full Code Here

                                                                      null,
                                                                      null,
                                                                      null,
                                                                      null,
                                                                      0);
            SlopStorageEngine slopEngine = new SlopStorageEngine(config.getStore(slopStoreDefinition,
                                                                                 new RoutingStrategyFactory().updateRoutingStrategy(slopStoreDefinition,
                                                                                                                                    metadata.getCluster())),
                                                                 metadata.getCluster());
            registerInternalEngine(slopEngine, false, "slop");
            storeRepository.setSlopStore(slopEngine);
View Full Code Here

    @Override
    public void operate() throws Exception {
        logger.info("Purging slops that match any of the following. {Nodes:" + nodesToPurge
                    + "} {Zone:" + zoneToPurge + "} {Stores:" + storesToPurge + "}");

        SlopStorageEngine slopStorageEngine = storeRepo.getSlopStore();
        StorageEngine<ByteArray, Slop, byte[]> slopStore = slopStorageEngine.asSlopStore();
        ClosableIterator<Pair<ByteArray, Versioned<Slop>>> slopIterator = slopStore.entries();
        Set<Integer> nodesInPurgeZone = null;
        if(zoneToPurge != Zone.UNSET_ZONE_ID) {
            nodesInPurgeZone = metadataStore.getCluster().getNodeIdsInZone(zoneToPurge);
        }

        try {
            while(slopIterator.hasNext()) {

                Pair<ByteArray, Versioned<Slop>> keyAndVal = slopIterator.next();
                Versioned<Slop> versioned = keyAndVal.getSecond();
                Slop slop = versioned.getValue();

                // Determine if the slop qualifies for purging..
                boolean purge = false;
                if(nodesToPurge.contains(slop.getNodeId())) {
                    purge = true;
                } else if(nodesInPurgeZone != null && nodesInPurgeZone.contains(slop.getNodeId())) {
                    purge = true;
                } else if(storesToPurge.contains(slop.getStoreName())) {
                    purge = true;
                }

                // if any one of the filters were met, delete
                if(purge) {
                    numKeysUpdatedThisRun.incrementAndGet();
                    slopStorageEngine.delete(keyAndVal.getFirst(), versioned.getVersion());
                }
                numKeysScannedThisRun.incrementAndGet();
                throttler.maybeThrottle(1);

                if(numKeysScannedThisRun.get() % STAT_RECORDS_INTERVAL == 0) {
View Full Code Here

        boolean terminatedEarly = false;
        Date startTime = new Date();
        logger.info("Started streaming slop pusher job at " + startTime);

        SlopStorageEngine slopStorageEngine = storeRepo.getSlopStore();
        ClosableIterator<Pair<ByteArray, Versioned<Slop>>> iterator = null;

        if(adminClient == null) {
            adminClient = new AdminClient(cluster,
                                          new AdminClientConfig().setMaxConnectionsPerNode(1),
                                          new ClientConfig());
        }

        if(voldemortConfig.getSlopZonesDownToTerminate() > 0) {
            // Populating the zone mapping for early termination
            zoneMapping.clear();
            for(Node n: cluster.getNodes()) {
                if(failureDetector.isAvailable(n)) {
                    Set<Integer> nodes = zoneMapping.get(n.getZoneId());
                    if(nodes == null) {
                        nodes = Sets.newHashSet();
                        zoneMapping.put(n.getZoneId(), nodes);
                    }
                    nodes.add(n.getId());
                }
            }

            // Check how many zones are down
            int zonesDown = 0;
            for(Zone zone: cluster.getZones()) {
                if(zoneMapping.get(zone.getId()) == null
                   || zoneMapping.get(zone.getId()).size() == 0)
                    zonesDown++;
            }

            // Terminate early
            if(voldemortConfig.getSlopZonesDownToTerminate() <= zoneMapping.size()
               && zonesDown >= voldemortConfig.getSlopZonesDownToTerminate()) {
                logger.info("Completed streaming slop pusher job at " + startTime
                            + " early because " + zonesDown + " zones are down");
                stopAdminClient();
                return;
            }
        }

        // Clearing the statistics
        AtomicLong attemptedPushes = new AtomicLong(0);
        for(Node node: cluster.getNodes()) {
            attemptedByNode.put(node.getId(), 0L);
            succeededByNode.put(node.getId(), 0L);
        }
        Set<String> storeNames = StoreDefinitionUtils.getStoreNamesSet(metadataStore.getStoreDefList());

        acquireRepairPermit();
        try {
            StorageEngine<ByteArray, Slop, byte[]> slopStore = slopStorageEngine.asSlopStore();
            iterator = slopStore.entries();

            while(iterator.hasNext()) {
                Pair<ByteArray, Versioned<Slop>> keyAndVal;
                try {
                    keyAndVal = iterator.next();
                    Versioned<Slop> versioned = keyAndVal.getSecond();

                    // Track the scan progress
                    if(this.streamStats != null) {
                        this.streamStats.reportStreamingSlopScan();
                    }

                    // Retrieve the node
                    int nodeId = versioned.getValue().getNodeId();

                    // check for dead slops
                    if(isSlopDead(cluster, storeNames, versioned.getValue())) {
                        handleDeadSlop(slopStorageEngine, keyAndVal);
                        // Move on to the next slop. we either delete it or
                        // ignore it.
                        continue;
                    }

                    Node node = cluster.getNodeById(nodeId);

                    attemptedPushes.incrementAndGet();
                    Long attempted = attemptedByNode.get(nodeId);
                    attemptedByNode.put(nodeId, attempted + 1L);
                    if(attemptedPushes.get() % 10000 == 0)
                        logger.info("Attempted pushing " + attemptedPushes + " slops");

                    if(logger.isTraceEnabled())
                        logger.trace("Pushing slop for " + versioned.getValue().getNodeId()
                                     + " and store  " + versioned.getValue().getStoreName()
                                     + " of key: " + versioned.getValue().getKey());

                    if(failureDetector.isAvailable(node)) {
                        SynchronousQueue<Versioned<Slop>> slopQueue = slopQueues.get(nodeId);
                        if(slopQueue == null) {
                            // No previous slop queue, add one
                            slopQueue = new SynchronousQueue<Versioned<Slop>>();
                            slopQueues.put(nodeId, slopQueue);
                            consumerResults.add(consumerExecutor.submit(new SlopConsumer(nodeId,
                                                                                         slopQueue,
                                                                                         slopStorageEngine)));
                        }
                        boolean offered = slopQueue.offer(versioned,
                                                          voldemortConfig.getClientRoutingTimeoutMs(),
                                                          TimeUnit.MILLISECONDS);
                        if(!offered) {
                            if(logger.isDebugEnabled())
                                logger.debug("No consumer appeared for slop in "
                                             + voldemortConfig.getClientConnectionTimeoutMs()
                                             + " ms");
                        }
                        readThrottler.maybeThrottle(nBytesRead(keyAndVal));
                    } else {
                        logger.trace(node + " declared down, won't push slop");
                    }
                } catch(RejectedExecutionException e) {
                    throw new VoldemortException("Ran out of threads in executor", e);
                }
            }

        } catch(InterruptedException e) {
            logger.warn("Interrupted exception", e);
            terminatedEarly = true;
        } catch(Exception e) {
            logger.error(e, e);
            terminatedEarly = true;
        } finally {
            try {
                if(iterator != null)
                    iterator.close();
            } catch(Exception e) {
                logger.warn("Failed to close iterator cleanly as database might be closed", e);
            }

            // Adding the poison pill
            for(SynchronousQueue<Versioned<Slop>> slopQueue: slopQueues.values()) {
                try {
                    slopQueue.put(END);
                } catch(InterruptedException e) {
                    logger.warn("Error putting poison pill", e);
                }
            }

            for(Future result: consumerResults) {
                try {
                    result.get();
                } catch(Exception e) {
                    logger.warn("Exception in consumer", e);
                }
            }

            // Only if exception didn't take place do we update the counts
            if(!terminatedEarly) {
                Map<Integer, Long> outstanding = Maps.newHashMapWithExpectedSize(cluster.getNumberOfNodes());
                for(int nodeId: succeededByNode.keySet()) {
                    logger.info("Slops to node " + nodeId + " - Succeeded - "
                                + succeededByNode.get(nodeId) + " - Attempted - "
                                + attemptedByNode.get(nodeId));
                    outstanding.put(nodeId,
                                    attemptedByNode.get(nodeId) - succeededByNode.get(nodeId));
                }
                slopStorageEngine.resetStats(outstanding);
                logger.info("Completed streaming slop pusher job which started at " + startTime);
            } else {
                for(int nodeId: succeededByNode.keySet()) {
                    logger.info("Slops to node " + nodeId + " - Succeeded - "
                                + succeededByNode.get(nodeId) + " - Attempted - "
View Full Code Here

            succeededByNode.put(node.getId(), 0L);
        }

        acquireRepairPermit();
        try {
            SlopStorageEngine slopStorageEngine = storeRepo.getSlopStore();
            StorageEngine<ByteArray, Slop, byte[]> slopStore = slopStorageEngine.asSlopStore();
            EventThrottler throttler = new EventThrottler(maxWriteBytesPerSec);

            iterator = slopStore.entries();

            while(iterator.hasNext()) {
                if(Thread.interrupted())
                    throw new InterruptedException("Slop pusher job cancelled");

                try {
                    Pair<ByteArray, Versioned<Slop>> keyAndVal;
                    try {
                        keyAndVal = iterator.next();
                    } catch(Exception e) {
                        logger.error("Exception in iterator, escaping the loop ", e);
                        break;
                    }

                    Versioned<Slop> versioned = keyAndVal.getSecond();
                    Slop slop = versioned.getValue();
                    int nodeId = slop.getNodeId();

                    // check for dead slops
                    if(isSlopDead(cluster, storeNames, versioned.getValue())) {
                        handleDeadSlop(slopStorageEngine, keyAndVal);
                        // No matter we deleted it or not, we need to move onto
                        // the next slop.
                        continue;
                    }

                    Node node = cluster.getNodeById(nodeId);

                    attemptedPushes++;
                    if(attemptedPushes % 10000 == 0) {
                        logger.info("Attempted pushing " + attemptedPushes + " slops");
                    }
                    Long attempted = attemptedByNode.get(nodeId);
                    attemptedByNode.put(nodeId, attempted + 1L);

                    if(failureDetector.isAvailable(node)) {
                        Store<ByteArray, byte[], byte[]> store = storeRepo.getNodeStore(slop.getStoreName(),
                                                                                        node.getId());
                        Long startNs = System.nanoTime();
                        int nBytes = 0;
                        try {
                            nBytes = slop.getKey().length();
                            if(slop.getOperation() == Operation.PUT) {
                                store.put(slop.getKey(),
                                          new Versioned<byte[]>(slop.getValue(),
                                                                versioned.getVersion()),
                                          slop.getTransforms());
                                nBytes += slop.getValue().length
                                          + ((VectorClock) versioned.getVersion()).sizeInBytes()
                                          + 1;

                            } else if(slop.getOperation() == Operation.DELETE) {
                                nBytes += ((VectorClock) versioned.getVersion()).sizeInBytes() + 1;
                                store.delete(slop.getKey(), versioned.getVersion());
                            } else {
                                logger.error("Unknown slop operation: " + slop.getOperation());
                                continue;
                            }
                            failureDetector.recordSuccess(node, deltaMs(startNs));
                            slopStore.delete(slop.makeKey(), versioned.getVersion());

                            slopsPushed++;
                            // Increment succeeded
                            Long succeeded = succeededByNode.get(nodeId);
                            succeededByNode.put(nodeId, succeeded + 1L);

                            // Throttle the bytes...
                            throttler.maybeThrottle(nBytes);

                        } catch(ObsoleteVersionException e) {

                            // okay it is old, just delete it
                            slopStore.delete(slop.makeKey(), versioned.getVersion());
                            slopsPushed++;

                            // Increment succeeded
                            Long succeeded = succeededByNode.get(nodeId);
                            succeededByNode.put(nodeId, succeeded + 1L);

                            // Throttle the bytes...
                            throttler.maybeThrottle(nBytes);

                        } catch(UnreachableStoreException e) {
                            failureDetector.recordException(node, deltaMs(startNs), e);
                        }
                    }
                } catch(Exception e) {
                    logger.error(e, e);
                }
            }

            // Only if we reached here do we update stats
            logger.log(attemptedPushes > 0 ? Level.INFO : Level.DEBUG,
                       "Attempted " + attemptedPushes + " hinted handoff pushes of which "
                               + slopsPushed + " succeeded.");

            Map<Integer, Long> outstanding = Maps.newHashMapWithExpectedSize(cluster.getNumberOfNodes());
            for(int nodeId: succeededByNode.keySet()) {
                outstanding.put(nodeId, attemptedByNode.get(nodeId) - succeededByNode.get(nodeId));
            }

            slopStorageEngine.resetStats(outstanding);

        } catch(Exception e) {
            logger.error(e, e);
        } finally {
            try {
View Full Code Here

TOP

Related Classes of voldemort.store.slop.SlopStorageEngine

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.