@Override public RecordWriter<UUIDKey> createWriter(File file) throws JasDBStorageException { return new TransactionalRecordWriter(file); } }
@Override public RecordIterator readAllRecords() throws DatastoreException { return readAllRecords(-1); }
@Override public void removeRecord(UUIDKey documentId) throws JasDBStorageException { writer.removeRecord(() -> getRecordPointer(documentId), p -> { try { index.removeFromIndex(documentId); } catch (JasDBStorageException e) { LOG.error("Unable to remove record from index", e); } }); }
private void handleIndexScanAndRebuild() throws JasDBStorageException { Collection<Index> indexes = getIndexManager().getIndexes(bagName).values(); List<Future<?>> indexRebuilds = new ArrayList<>(indexes.size()); LOG.info("Doing index scan for: {} items", getSize()); RecordWriter recordWriter = recordWriterFactoryLoader.loadRecordWriter(instanceId, bagName); if(recordWriter instanceof TransactionalRecordWriter) { TransactionalRecordWriter transactionalRecordWriter = (TransactionalRecordWriter) recordWriter; LOG.info("Forcing primary key rebuild first, we need to ensure integrity"); transactionalRecordWriter.verify(recordResult -> { try { return new UUIDKey(BagOperationUtil.toEntity(recordResult.getStream()).getInternalId()); } catch (JasDBStorageException e) { throw new RuntimeJasDBException("Unable to read jasdb entitiy", e); } }); } for(final Index index : indexes) { LOG.info("Scheduling index rebuild of index: {} for bag: {}", index, bagName); indexRebuilds.add(indexRebuilder.submit(new IndexScanAndRecovery(index, getRecordWriter().readAllRecords()))); } for(Future<?> indexRebuild : indexRebuilds) { try { indexRebuild.get(); } catch(ExecutionException | InterruptedException e) { throw new JasDBStorageException("Unable to initialize bag, index rebuild failed", e); } } }
@Override public void writeRecord(UUIDKey documentId, ClonableDataStream dataStream) throws JasDBStorageException { String recordContents = RecordStreamUtil.toString(dataStream); writer.writeRecord(recordContents, p -> { try { index.insertIntoIndex(documentId.cloneKey(false).addKey(keyInfo.getKeyNameMapper(), "RECORD_POINTER", new LongKey(p))); } catch(JasDBStorageException e) { try { removeRecord(documentId); } catch (JasDBStorageException e1) { LOG.error("", e); } throw new RuntimeJasDBException("Unable to write record already exists", e); } }); }
boolean shouldUpdatePosition = false; try { if (!readRecord(key).isRecordFound()) { shouldUpdatePosition = true;
@Override public RecordResult readRecord(UUIDKey documentId) throws JasDBStorageException { try { return writer.readRecord(() -> getRecordPointer(documentId)); } catch(RecordNotFoundException e) { return new RecordResultImpl(-1, null, 0, RECORD_FLAG.EMPTY); } }
@Override public void updateRecord(UUIDKey documentId, ClonableDataStream dataStream) throws JasDBStorageException { long updatedDocumentPointer = writer.updateRecord(RecordStreamUtil.toString(dataStream), () -> getRecordPointer(documentId), (oldp, newp) -> { if(oldp != newp) { Key newKey = documentId.cloneKey(false).addKey(keyInfo.getKeyNameMapper(), "RECORD_POINTER", new LongKey(newp)); try { index.updateKey(documentId, newKey); } catch (JasDBStorageException e) { LOG.error("", e); } } }); }