use of org.graylog.shaded.elasticsearch7.org.elasticsearch.action.bulk.BulkItemResponse in project fess-crawler by codelibs.
the class AbstractCrawlerService method buildFailureMessage.
protected String buildFailureMessage(final BulkResponse bulkResponse, final boolean ignoreAlreadyExists) {
final StringBuilder sb = new StringBuilder(100);
final BulkItemResponse[] responses = bulkResponse.getItems();
for (int i = 0; i < responses.length; i++) {
final BulkItemResponse response = responses[i];
if (response.isFailed()) {
if (ignoreAlreadyExists) {
continue;
}
sb.append("\n[").append(i).append("]: index [").append(response.getIndex()).append("], type [").append(response.getType()).append("], id [").append(response.getId()).append("], message [").append(response.getFailureMessage()).append("]");
}
}
if (sb.length() > 0) {
return "failure in bulk execution:" + sb.toString();
}
return StringUtil.EMPTY;
}
use of org.graylog.shaded.elasticsearch7.org.elasticsearch.action.bulk.BulkItemResponse in project samza by apache.
the class ElasticsearchSystemProducer method register.
@Override
public void register(final String source) {
BulkProcessor.Listener listener = new BulkProcessor.Listener() {
@Override
public void beforeBulk(long executionId, BulkRequest request) {
// Nothing to do.
}
@Override
public void afterBulk(long executionId, BulkRequest request, BulkResponse response) {
boolean hasFatalError = false;
// Do not consider version conficts to be errors. Ignore old versions
if (response.hasFailures()) {
for (BulkItemResponse itemResp : response.getItems()) {
if (itemResp.isFailed()) {
if (itemResp.getFailure().getStatus().equals(RestStatus.CONFLICT)) {
LOGGER.info("Failed to index document in Elasticsearch: " + itemResp.getFailureMessage());
} else {
hasFatalError = true;
LOGGER.error("Failed to index document in Elasticsearch: " + itemResp.getFailureMessage());
}
}
}
}
if (hasFatalError) {
sendFailed.set(true);
} else {
updateSuccessMetrics(response);
}
}
@Override
public void afterBulk(long executionId, BulkRequest request, Throwable failure) {
LOGGER.error(failure.getMessage());
thrown.compareAndSet(null, failure);
sendFailed.set(true);
}
private void updateSuccessMetrics(BulkResponse response) {
metrics.bulkSendSuccess.inc();
int writes = 0;
for (BulkItemResponse itemResp : response.getItems()) {
if (itemResp.isFailed()) {
if (itemResp.getFailure().getStatus().equals(RestStatus.CONFLICT)) {
metrics.conflicts.inc();
}
} else {
ActionResponse resp = itemResp.getResponse();
if (resp instanceof IndexResponse) {
writes += 1;
if (((IndexResponse) resp).isCreated()) {
metrics.inserts.inc();
} else {
metrics.updates.inc();
}
} else {
LOGGER.error("Unexpected Elasticsearch action response type: " + resp.getClass().getSimpleName());
}
}
}
LOGGER.info(String.format("Wrote %s messages from %s to %s.", writes, source, system));
}
};
sourceBulkProcessor.put(source, bulkProcessorFactory.getBulkProcessor(client, listener));
}
use of org.graylog.shaded.elasticsearch7.org.elasticsearch.action.bulk.BulkItemResponse in project graylog2-server by Graylog2.
the class MessagesAdapterES7 method bulkIndexChunked.
private List<Messages.IndexingError> bulkIndexChunked(ChunkedBulkIndexer.Chunk command) throws ChunkedBulkIndexer.EntityTooLargeException {
final List<IndexingRequest> messageList = command.requests;
final int offset = command.offset;
final int chunkSize = command.size;
if (messageList.isEmpty()) {
return Collections.emptyList();
}
final Iterable<List<IndexingRequest>> chunks = Iterables.partition(messageList.subList(offset, messageList.size()), chunkSize);
int chunkCount = 1;
int indexedSuccessfully = 0;
final List<Messages.IndexingError> indexFailures = new ArrayList<>();
for (List<IndexingRequest> chunk : chunks) {
final BulkResponse result = runBulkRequest(indexedSuccessfully, chunk);
indexedSuccessfully += chunk.size();
final List<BulkItemResponse> failures = extractFailures(result);
indexFailures.addAll(indexingErrorsFrom(failures, messageList));
logDebugInfo(messageList, offset, chunkSize, chunkCount, result, failures);
logFailures(result, failures.size());
chunkCount++;
}
return indexFailures;
}
use of org.graylog.shaded.elasticsearch7.org.elasticsearch.action.bulk.BulkItemResponse in project rssriver by dadoonet.
the class RssRiver method start.
@Override
public void start() {
if (logger.isInfoEnabled())
logger.info("Starting rss stream");
try {
client.admin().indices().prepareCreate(indexName).execute().actionGet();
} catch (Exception e) {
if (ExceptionsHelper.unwrapCause(e) instanceof IndexAlreadyExistsException) {
// that's fine
} else if (ExceptionsHelper.unwrapCause(e) instanceof ClusterBlockException) {
// ok, not recovered yet..., lets start indexing and hope we
// recover by the first bulk
// TODO: a smarter logic can be to register for cluster event
// listener here, and only start sampling when the block is
// removed...
} else {
logger.warn("failed to create index [{}], disabling river...", e, indexName);
return;
}
}
try {
pushMapping(indexName, typeName, RssToJson.buildRssMapping(typeName, raw));
} catch (Exception e) {
logger.warn("failed to create mapping for [{}/{}], disabling river...", e, indexName, typeName);
return;
}
// Creating bulk processor
this.bulkProcessor = BulkProcessor.builder(client, new BulkProcessor.Listener() {
@Override
public void beforeBulk(long executionId, BulkRequest request) {
logger.debug("Going to execute new bulk composed of {} actions", request.numberOfActions());
}
@Override
public void afterBulk(long executionId, BulkRequest request, BulkResponse response) {
logger.debug("Executed bulk composed of {} actions", request.numberOfActions());
if (response.hasFailures()) {
logger.warn("There was failures while executing bulk", response.buildFailureMessage());
if (logger.isDebugEnabled()) {
for (BulkItemResponse item : response.getItems()) {
if (item.isFailed()) {
logger.debug("Error for {}/{}/{} for {} operation: {}", item.getIndex(), item.getType(), item.getId(), item.getOpType(), item.getFailureMessage());
}
}
}
}
}
@Override
public void afterBulk(long executionId, BulkRequest request, Throwable failure) {
logger.warn("Error executing bulk", failure);
}
}).setBulkActions(bulkSize).setConcurrentRequests(maxConcurrentBulk).setFlushInterval(bulkFlushInterval).build();
// We create as many Threads as there are feeds
threads = new ArrayList<Thread>(feedsDefinition.size());
int threadNumber = 0;
for (RssRiverFeedDefinition feedDefinition : feedsDefinition) {
Thread thread = EsExecutors.daemonThreadFactory(settings.globalSettings(), "rss_slurper_" + threadNumber).newThread(new RSSParser(feedDefinition));
thread.start();
threads.add(thread);
threadNumber++;
}
}
use of org.graylog.shaded.elasticsearch7.org.elasticsearch.action.bulk.BulkItemResponse in project stash-codesearch-plugin by palantir.
the class SearchUpdateJobImpl method doUpdate.
@Override
public void doUpdate(Client client, GitScm gitScm, GlobalSettings globalSettings) {
if (!globalSettings.getIndexingEnabled()) {
return;
}
GitCommandBuilderFactory builderFactory = gitScm.getCommandBuilderFactory();
// List of bulk requests to execute sequentially at the end of the method
RequestBuffer requestBuffer = new RequestBuffer(client);
// Unique identifier for ref
String refDesc = toString();
// Hash of latest indexed commit
String prevHash = getLatestIndexedHash(client);
// Hash of latest commit on ref
String newHash = getLatestHash(builderFactory);
if (newHash == null) {
log.error("Aborting since hash is invalid");
return;
}
// Diff for files & process changes
Set<SimpleEntry<String, String>> filesToAdd = new LinkedHashSet<SimpleEntry<String, String>>();
try {
// Get diff --raw -z tokens
String[] diffToks = builderFactory.builder(repository).command("diff").argument("--raw").argument("--abbrev=40").argument("-z").argument(prevHash).argument(newHash).build(new StringOutputHandler(plf)).call().split("\u0000");
// Process each diff --raw -z entry
for (int curTok = 0; curTok < diffToks.length; ++curTok) {
String[] statusToks = diffToks[curTok].split(" ");
if (statusToks.length < 5) {
break;
}
String status = statusToks[4];
String oldBlob = statusToks[2];
String newBlob = statusToks[3];
// TODO: so many warnings! Generics, CAEN I HAZ THEM?
if (status.startsWith("A")) {
String path = diffToks[++curTok];
filesToAdd.add(new SimpleEntry<String, String>(newBlob, path));
// File copied
} else if (status.startsWith("C")) {
String toPath = diffToks[curTok += 2];
filesToAdd.add(new SimpleEntry<String, String>(newBlob, toPath));
// File deleted
} else if (status.startsWith("D")) {
String path = diffToks[++curTok];
requestBuffer.add(buildDeleteFileFromRef(client, oldBlob, path));
// File modified
} else if (status.startsWith("M") || status.startsWith("T")) {
String path = diffToks[++curTok];
if (!oldBlob.equals(newBlob)) {
requestBuffer.add(buildDeleteFileFromRef(client, oldBlob, path));
filesToAdd.add(new SimpleEntry<String, String>(newBlob, path));
}
// File renamed
} else if (status.startsWith("R")) {
String fromPath = diffToks[++curTok];
String toPath = diffToks[++curTok];
requestBuffer.add(buildDeleteFileFromRef(client, oldBlob, fromPath));
filesToAdd.add(new SimpleEntry<String, String>(newBlob, toPath));
// Unknown change
} else if (status.startsWith("X")) {
throw new RuntimeException("Status letter 'X' is a git bug.");
}
}
} catch (Exception e) {
log.error("Caught error while diffing between {} and {}, aborting update", prevHash, newHash, e);
return;
}
log.debug("{} update: adding {} files", refDesc, filesToAdd.size());
// simply add the ref to the refs array.
if (!filesToAdd.isEmpty()) {
try {
BulkRequestBuilder bulkFileRefUpdate = client.prepareBulk();
ImmutableList<SimpleEntry<String, String>> filesToAddCopy = ImmutableList.copyOf(filesToAdd);
for (SimpleEntry<String, String> bppair : filesToAddCopy) {
String blob = bppair.getKey(), path = bppair.getValue();
bulkFileRefUpdate.add(buildAddFileToRef(client, blob, path));
}
BulkItemResponse[] responses = bulkFileRefUpdate.get().getItems();
if (responses.length != filesToAddCopy.size()) {
throw new IndexOutOfBoundsException("Bulk resp. array must have the same length as original request array");
}
// Process all update responses
int count = 0;
for (SimpleEntry<String, String> bppair : filesToAddCopy) {
if (!responses[count].isFailed()) {
// Update was successful, no need to index file
filesToAdd.remove(bppair);
}
++count;
}
} catch (Exception e) {
log.warn("file-ref update failed, performing upserts for all changes", e);
}
}
log.debug("{} update: {} files to upsert", refDesc, filesToAdd.size());
// Process all changes w/o corresponding documents
if (!filesToAdd.isEmpty()) {
try {
// Get filesizes and prune all files that exceed the filesize limit
ImmutableList<SimpleEntry<String, String>> filesToAddCopy = ImmutableList.copyOf(filesToAdd);
CatFileInputHandler catFileInput = new CatFileInputHandler();
for (SimpleEntry<String, String> bppair : filesToAddCopy) {
catFileInput.addObject(bppair.getKey());
}
String[] catFileMetadata = builderFactory.builder(repository).command("cat-file").argument("--batch-check").inputHandler(catFileInput).build(new StringOutputHandler(plf)).call().split("\n");
if (filesToAdd.size() != catFileMetadata.length) {
throw new IndexOutOfBoundsException("git cat-file --batch-check returned wrong number of lines");
}
CatFileOutputHandler catFileOutput = new CatFileOutputHandler(plf);
int count = 0;
int maxFileSize = globalSettings.getMaxFileSize();
for (SimpleEntry<String, String> bppair : filesToAddCopy) {
int fs;
try {
fs = Integer.parseInt(catFileMetadata[count].split("\\s")[2]);
} catch (Exception e) {
fs = Integer.MAX_VALUE;
}
if (fs > maxFileSize) {
filesToAdd.remove(bppair);
} else {
catFileOutput.addFile(fs);
}
++count;
}
// Generate new cat-file input and retrieve file contents
catFileInput = new CatFileInputHandler();
for (SimpleEntry<String, String> bppair : filesToAdd) {
catFileInput.addObject(bppair.getKey());
}
String[] fileContents = builderFactory.builder(repository).command("cat-file").argument("--batch=").inputHandler(catFileInput).build(catFileOutput).call();
if (filesToAdd.size() != fileContents.length) {
throw new IndexOutOfBoundsException("git cat-file --batch= returned wrong number of files");
}
count = 0;
for (SimpleEntry<String, String> bppair : filesToAdd) {
String blob = bppair.getKey(), path = bppair.getValue();
String fileContent = fileContents[count];
if (fileContent != null) {
requestBuffer.add(buildAddFileToRef(client, blob, path).setUpsert(jsonBuilder().startObject().field("project", repository.getProject().getKey()).field("repository", repository.getSlug()).field("blob", blob).field("path", path).field("extension", FilenameUtils.getExtension(path).toLowerCase()).field("contents", fileContent).field("charcount", fileContent.length()).field("linecount", countLines(fileContent)).startArray("refs").value(ref).endArray().endObject()));
}
++count;
}
} catch (Exception e) {
log.error("Caught error during new file indexing, aborting update", e);
return;
}
}
// Clear memory
filesToAdd = null;
// Get deleted commits
String[] deletedCommits;
try {
deletedCommits = builderFactory.builder(repository).command("rev-list").argument(prevHash).argument("^" + newHash).build(new StringOutputHandler(plf)).call().split("\n+");
} catch (Exception e) {
log.error("Caught error while scanning for deleted commits, aborting update", e);
return;
}
// Remove deleted commits from ES index
int commitsDeleted = 0;
for (String hash : deletedCommits) {
if (hash.length() != 40) {
continue;
}
requestBuffer.add(buildDeleteCommitFromRef(client, hash));
++commitsDeleted;
}
// Get new commits
String[] newCommits;
try {
newCommits = builderFactory.builder(repository).command("log").argument("--format=%H%x02%ct%x02%an%x02%ae%x02%s%x02%b%x03").argument(newHash).argument("^" + prevHash).build(new StringOutputHandler(plf)).call().split("\u0003");
} catch (Exception e) {
log.error("Caught error while scanning for new commits, aborting update", e);
return;
}
// Add new commits to ES index
int commitsAdded = 0;
for (String line : newCommits) {
try {
// Parse each commit "line" (not really lines, since they're delimited by \u0003)
if (line.length() <= 40) {
continue;
}
if (line.charAt(0) == '\n') {
line = line.substring(1);
}
String[] commitToks = line.split("\u0002", 6);
String hash = commitToks[0];
long timestamp = Long.parseLong(commitToks[1]) * 1000;
String authorName = commitToks[2];
String authorEmail = commitToks[3];
String subject = commitToks[4];
// bodies are optional, so this might not be present
String body = commitToks.length < 6 ? "" : commitToks[5];
if (hash.length() != 40) {
continue;
}
// Add commit to request
requestBuffer.add(buildAddCommitToRef(client, hash).setUpsert(jsonBuilder().startObject().field("project", repository.getProject().getKey()).field("repository", repository.getSlug()).field("hash", hash).field("commitdate", new Date(timestamp)).field("authorname", authorName).field("authoremail", authorEmail).field("subject", subject).field("body", body).startArray("refs").value(ref).endArray().endObject()));
++commitsAdded;
} catch (Exception e) {
log.warn("Caught error while constructing request object, skipping update", e);
continue;
}
}
log.debug("{} update: adding {} commits, deleting {} commits", refDesc, commitsAdded, commitsDeleted);
// Write remaining requests and wait for completion
requestBuffer.flush();
// Update latest indexed note
addLatestIndexedNote(client, newHash);
}
Aggregations