use of org.iq80.leveldb.WriteBatch in project cdap by caskdata.
the class LevelDBTableCore method undo.
public void undo(Map<byte[], ? extends Map<byte[], ?>> persisted, long version) throws IOException {
if (persisted.isEmpty()) {
return;
}
DB db = getDB();
WriteBatch batch = db.createWriteBatch();
for (Map.Entry<byte[], ? extends Map<byte[], ?>> row : persisted.entrySet()) {
for (Map.Entry<byte[], ?> column : row.getValue().entrySet()) {
byte[] key = createPutKey(row.getKey(), column.getKey(), version);
batch.delete(key);
}
}
db.write(batch, service.getWriteOptions());
}
use of org.iq80.leveldb.WriteBatch in project cdap by caskdata.
the class LevelDBTableCore method deleteRows.
/**
* Delete a list of rows from the table entirely, disregarding transactions.
* @param toDelete the row keys to delete
*/
public void deleteRows(Collection<byte[]> toDelete) throws IOException {
if (toDelete.isEmpty()) {
return;
}
// find first row to delete and first entry in the DB to examine
Iterator<byte[]> rows = toDelete.iterator();
byte[] currentRow = rows.next();
byte[] startKey = createStartKey(currentRow);
DB db = getDB();
WriteBatch batch = db.createWriteBatch();
try (DBIterator iterator = db.iterator()) {
iterator.seek(startKey);
if (!iterator.hasNext()) {
// nothing in the db to delete
return;
}
Map.Entry<byte[], byte[]> entry = iterator.next();
// iterate over the database and the rows to delete, collecting (raw) keys to delete
while (entry != null && currentRow != null) {
KeyValue kv = KeyValue.fromKey(entry.getKey());
int comp = Bytes.compareTo(kv.getRow(), currentRow);
if (comp == 0) {
// same row -> delete
batch.delete(entry.getKey());
entry = iterator.hasNext() ? iterator.next() : null;
} else if (comp > 0) {
// read past current row -> move to next row
currentRow = rows.hasNext() ? rows.next() : null;
} else if (comp < 0) {
// iterator must seek to current row
iterator.seek(createStartKey(currentRow));
entry = iterator.hasNext() ? iterator.next() : null;
}
}
}
// delete all the entries that were found
db.write(batch, getWriteOptions());
}
use of org.iq80.leveldb.WriteBatch in project cdap by caskdata.
the class LevelDBTableCore method persist.
public void persist(Map<byte[], ? extends Map<byte[], byte[]>> changes, long version) throws IOException {
DB db = getDB();
// todo support writing null when no transaction
WriteBatch batch = db.createWriteBatch();
for (Map.Entry<byte[], ? extends Map<byte[], byte[]>> row : changes.entrySet()) {
for (Map.Entry<byte[], byte[]> column : row.getValue().entrySet()) {
byte[] key = createPutKey(row.getKey(), column.getKey(), version);
batch.put(key, column.getValue() == null ? DELETE_MARKER : column.getValue());
}
}
db.write(batch, service.getWriteOptions());
}
use of org.iq80.leveldb.WriteBatch in project cdap by caskdata.
the class LevelDBMessageTable method pruneMessages.
/**
* Delete messages of a {@link TopicId} that has exceeded the TTL or if it belongs to an older generation
*
* @param topicMetadata {@link TopicMetadata}
* @param currentTime current timestamp
* @throws IOException error occurred while trying to delete a row in LevelDB
*/
public void pruneMessages(TopicMetadata topicMetadata, long currentTime) throws IOException {
WriteBatch writeBatch = levelDB.createWriteBatch();
long ttlInMs = TimeUnit.SECONDS.toMillis(topicMetadata.getTTL());
byte[] startRow = MessagingUtils.toDataKeyPrefix(topicMetadata.getTopicId(), Integer.parseInt(MessagingUtils.Constants.DEFAULT_GENERATION));
byte[] stopRow = Bytes.stopKeyForPrefix(startRow);
try (CloseableIterator<Map.Entry<byte[], byte[]>> rowIterator = new DBScanIterator(levelDB, startRow, stopRow)) {
while (rowIterator.hasNext()) {
Map.Entry<byte[], byte[]> entry = rowIterator.next();
MessageTable.Entry messageTableEntry = new ImmutableMessageTableEntry(entry.getKey(), null, null);
int dataGeneration = messageTableEntry.getGeneration();
int currGeneration = topicMetadata.getGeneration();
if (MessagingUtils.isOlderGeneration(dataGeneration, currGeneration)) {
writeBatch.delete(entry.getKey());
continue;
}
if ((dataGeneration == Math.abs(currGeneration)) && ((currentTime - messageTableEntry.getPublishTimestamp()) > ttlInMs)) {
writeBatch.delete(entry.getKey());
} else {
// since the entries are sorted by time.
break;
}
}
}
try {
levelDB.write(writeBatch, WRITE_OPTIONS);
} catch (DBException ex) {
throw new IOException(ex);
}
}
use of org.iq80.leveldb.WriteBatch in project cdap by caskdata.
the class LevelDBPayloadTable method pruneMessages.
/**
* Delete messages of a {@link TopicId} that has exceeded the TTL or if it belongs to an older generation
*
* @param topicMetadata {@link TopicMetadata}
* @param currentTime current timestamp
* @throws IOException error occurred while trying to delete a row in LevelDB
*/
public void pruneMessages(TopicMetadata topicMetadata, long currentTime) throws IOException {
WriteBatch writeBatch = levelDB.createWriteBatch();
long ttlInMs = TimeUnit.SECONDS.toMillis(topicMetadata.getTTL());
byte[] startRow = MessagingUtils.toDataKeyPrefix(topicMetadata.getTopicId(), Integer.parseInt(MessagingUtils.Constants.DEFAULT_GENERATION));
byte[] stopRow = Bytes.stopKeyForPrefix(startRow);
try (CloseableIterator<Map.Entry<byte[], byte[]>> rowIterator = new DBScanIterator(levelDB, startRow, stopRow)) {
while (rowIterator.hasNext()) {
Map.Entry<byte[], byte[]> entry = rowIterator.next();
PayloadTable.Entry payloadTableEntry = new ImmutablePayloadTableEntry(entry.getKey(), entry.getValue());
int dataGeneration = payloadTableEntry.getGeneration();
int currGeneration = topicMetadata.getGeneration();
if (MessagingUtils.isOlderGeneration(dataGeneration, currGeneration)) {
writeBatch.delete(entry.getKey());
continue;
}
if ((dataGeneration == Math.abs(currGeneration)) && ((currentTime - payloadTableEntry.getPayloadWriteTimestamp()) > ttlInMs)) {
writeBatch.delete(entry.getKey());
} else {
// since the entries are sorted by time.
break;
}
}
}
try {
levelDB.write(writeBatch, WRITE_OPTIONS);
} catch (DBException ex) {
throw new IOException(ex);
}
}
Aggregations