@Override public void close() { try { if (debug) { log.debug("Closing tlog" + this); } synchronized (this) { if (fos != null) { fos.flush(); fos.close(); // dereference these variables for GC fos = null; os = null; channel = null; raf = null; } } if (deleteOnClose) { try { Files.deleteIfExists(tlogFile.toPath()); } catch (IOException e) { // TODO: should this class care if a file couldnt be deleted? // this just emulates previous behavior, where only SecurityException would be handled. } } } catch (IOException e) { throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e); } finally { assert ObjectReleaseTracker.release(this); } }
protected void close() { try { if (debug) { log.debug("Closing tlog" + this); } synchronized (this) { fos.flush(); fos.close(); } if (deleteOnClose) { try { Files.deleteIfExists(tlogFile.toPath()); } catch (IOException e) { // TODO: should this class care if a file couldnt be deleted? // this just emulates previous behavior, where only SecurityException would be handled. } } } catch (IOException e) { throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e); } finally { assert ObjectReleaseTracker.release(this); } }
@Test public void testObjectReleaseTracker() { ObjectReleaseTracker.track(new Object()); ObjectReleaseTracker.release(new Object()); assertNotNull(ObjectReleaseTracker.clearObjectTrackerAndCheckEmpty()); assertNull(ObjectReleaseTracker.clearObjectTrackerAndCheckEmpty()); Object obj = new Object(); ObjectReleaseTracker.track(obj); ObjectReleaseTracker.release(obj); assertNull(ObjectReleaseTracker.clearObjectTrackerAndCheckEmpty()); Object obj1 = new Object(); ObjectReleaseTracker.track(obj1); Object obj2 = new Object(); ObjectReleaseTracker.track(obj2); Object obj3 = new Object(); ObjectReleaseTracker.track(obj3); ObjectReleaseTracker.release(obj1); ObjectReleaseTracker.release(obj2); ObjectReleaseTracker.release(obj3); assertNull(ObjectReleaseTracker.clearObjectTrackerAndCheckEmpty()); ObjectReleaseTracker.track(obj1); ObjectReleaseTracker.track(obj2); ObjectReleaseTracker.track(obj3); ObjectReleaseTracker.release(obj1); ObjectReleaseTracker.release(obj2); // ObjectReleaseTracker.release(obj3); assertNotNull(ObjectReleaseTracker.clearObjectTrackerAndCheckEmpty()); assertNull(ObjectReleaseTracker.clearObjectTrackerAndCheckEmpty()); }
TransactionLog(File tlogFile, Collection<String> globalStrings, boolean openExisting) { boolean success = false; try { if (debug) { log.debug( "New TransactionLog file=" + tlogFile + ", exists=" + tlogFile.exists() + ", size=" + tlogFile.length() + ", openExisting=" + openExisting); } this.tlogFile = tlogFile; raf = new RandomAccessFile(this.tlogFile, "rw"); long start = raf.length(); channel = raf.getChannel(); os = Channels.newOutputStream(channel); fos = new FastOutputStream(os, new byte[65536], 0); // fos = FastOutputStream.wrap(os); if (openExisting) { if (start > 0) { readHeader(null); raf.seek(start); assert channel.position() == start; fos.setWritten(start); // reflect that we aren't starting at the beginning assert fos.size() == channel.size(); } else { addGlobalStrings(globalStrings); } } else { if (start > 0) { log.warn("New transaction log already exists:" + tlogFile + " size=" + raf.length()); return; } if (start > 0) { raf.setLength(0); } addGlobalStrings(globalStrings); } success = true; assert ObjectReleaseTracker.track(this); } catch (IOException e) { throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e); } finally { if (!success && raf != null) { try { raf.close(); } catch (Exception e) { log.error("Error closing tlog file (after error opening)", e); } } } }