public long writeDelete(DeleteUpdateCommand cmd, int flags) { LogCodec codec = new LogCodec(resolver); try { checkWriteHeader(codec, null); BytesRef br = cmd.getIndexedId(); MemOutputStream out = new MemOutputStream(new byte[20 + br.length]); codec.init(out); codec.writeTag(JavaBinCodec.ARR, 3); codec.writeInt(UpdateLog.DELETE | flags); // should just take one byte codec.writeLong(cmd.getVersion()); codec.writeByteArray(br.bytes, br.offset, br.length); synchronized (this) { long pos = fos.size(); // if we had flushed, this should be equal to channel.position() assert pos != 0; out.writeAll(fos); endRecord(pos); // fos.flushBuffer(); // flush later return pos; } } catch (IOException e) { throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e); } }
public long write(AddUpdateCommand cmd, int flags) { LogCodec codec = new LogCodec(resolver); SolrInputDocument sdoc = cmd.getSolrInputDocument(); try { checkWriteHeader(codec, sdoc); // adaptive buffer sizing int bufSize = lastAddSize; // unsynchronized access of lastAddSize should be fine bufSize = Math.min(1024 * 1024, bufSize + (bufSize >> 3) + 256); MemOutputStream out = new MemOutputStream(new byte[bufSize]); codec.init(out); codec.writeTag(JavaBinCodec.ARR, 3); codec.writeInt(UpdateLog.ADD | flags); // should just take one byte codec.writeLong(cmd.getVersion()); codec.writeSolrInputDocument(cmd.getSolrInputDocument()); lastAddSize = (int) out.size(); synchronized (this) { long pos = fos.size(); // if we had flushed, this should be equal to channel.position() assert pos != 0; /** * * System.out.println("###writing at " + pos + " fos.size()=" + fos.size() + " * raf.length()=" + raf.length()); if (pos != fos.size()) { throw new * RuntimeException("ERROR" + "###writing at " + pos + " fos.size()=" + fos.size() + " * raf.length()=" + raf.length()); } * */ out.writeAll(fos); endRecord(pos); // fos.flushBuffer(); // flush later return pos; } } catch (IOException e) { // TODO: reset our file pointer back to "pos", the start of this record. throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Error logging add", e); } }
public long writeDeleteByQuery(DeleteUpdateCommand cmd, int flags) { LogCodec codec = new LogCodec(resolver); try { checkWriteHeader(codec, null); MemOutputStream out = new MemOutputStream(new byte[20 + (cmd.query.length())]); codec.init(out); codec.writeTag(JavaBinCodec.ARR, 3); codec.writeInt(UpdateLog.DELETE_BY_QUERY | flags); // should just take one byte codec.writeLong(cmd.getVersion()); codec.writeStr(cmd.query); synchronized (this) { long pos = fos.size(); // if we had flushed, this should be equal to channel.position() out.writeAll(fos); endRecord(pos); // fos.flushBuffer(); // flush later return pos; } } catch (IOException e) { throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e); } }