public int update(long uid, final String version, Map<String, Object> map) { if (valuesMap.isEmpty()) { return -1; } if (versionComparator.compare(lastVersion, version) > 0) { versionRejectionCounter.inc(); return -1; } if (map.isEmpty()) { lastVersion = version; return -1; } int index = -1; Lock writeLock = globalLock.writeLock(); boolean needToFlush = false; try { writeLock.lock(); totalUpdatesCounter.inc(); if (uidToArrayIndex.containsKey(uid)) { index = uidToArrayIndex.get(uid); } else { insertedDocumentsCounter.inc(); synchronized (deletedIndexes) { if (deletedIndexes.size() > 0) { index = deletedIndexes.removeInt(deletedIndexes.size() - 1); } else { index = indexSize.getAndIncrement(); } } uidToArrayIndex.put(uid, index); recentlyAddedUids.add(uid); needToFlush = updateBatch.addFieldUpdate(new Update(index, uid)); } boolean currentUpdate = updateActivities(map, index); needToFlush = needToFlush || currentUpdate; lastVersion = version; } finally { writeLock.unlock(); } if (needToFlush) { flush(); } return index; }