Bug 1361699 - Add buffer when writing hashstore to file draft
authorThomas Nguyen <tnguyen@mozilla.com>
Fri, 19 May 2017 13:17:07 +0800
changeset 586789 7fe0223208ed2e070d201bd7b54c3f4c5b6ade86
parent 586775 9a5c710587f9e64bf044602d5e988b152ef4f40c
child 631100 b2290ade9c7043378bbd30419ca37262f363ea43
push id61525
push userbmo:tnguyen@mozilla.com
push dateWed, 31 May 2017 03:24:08 +0000
bugs1361699
milestone55.0a1
Bug 1361699 - Add buffer when writing hashstore to file We write a lot of 4-bytes prefixes to file which call many system calls. We should use a buffer and only write to file if the buffer is full or finish writing. nsIBufferedOutputStream is a good candidate to do that MozReview-Commit-ID: CzGOd7iXVTv
netwerk/base/nsBufferedStreams.h
toolkit/components/url-classifier/HashStore.cpp
toolkit/components/url-classifier/nsCheckSummedOutputStream.cpp
toolkit/components/url-classifier/nsCheckSummedOutputStream.h
--- a/netwerk/base/nsBufferedStreams.h
+++ b/netwerk/base/nsBufferedStreams.h
@@ -94,20 +94,20 @@ protected:
     NS_IMETHOD Fill() override;
     NS_IMETHOD Flush() override { return NS_OK; } // no-op for input streams
 
     nsCOMPtr<nsIInputStreamCallback> mAsyncWaitCallback;
 };
 
 ////////////////////////////////////////////////////////////////////////////////
 
-class nsBufferedOutputStream final : public nsBufferedStream,
-                                     public nsISafeOutputStream,
-                                     public nsIBufferedOutputStream,
-                                     public nsIStreamBufferAccess
+class nsBufferedOutputStream  : public nsBufferedStream,
+                                public nsISafeOutputStream,
+                                public nsIBufferedOutputStream,
+                                public nsIStreamBufferAccess
 {
 public:
     NS_DECL_ISUPPORTS_INHERITED
     NS_DECL_NSIOUTPUTSTREAM
     NS_DECL_NSISAFEOUTPUTSTREAM
     NS_DECL_NSIBUFFEREDOUTPUTSTREAM
     NS_DECL_NSISTREAMBUFFERACCESS
 
--- a/toolkit/components/url-classifier/HashStore.cpp
+++ b/toolkit/components/url-classifier/HashStore.cpp
@@ -971,18 +971,17 @@ HashStore::WriteFile()
 
   nsCOMPtr<nsIFile> storeFile;
   nsresult rv = mStoreDirectory->Clone(getter_AddRefs(storeFile));
   NS_ENSURE_SUCCESS(rv, rv);
   rv = storeFile->AppendNative(mTableName + NS_LITERAL_CSTRING(".sbstore"));
   NS_ENSURE_SUCCESS(rv, rv);
 
   nsCOMPtr<nsIOutputStream> out;
-  rv = NS_NewCheckSummedOutputStream(getter_AddRefs(out), storeFile,
-                                     PR_WRONLY | PR_TRUNCATE | PR_CREATE_FILE);
+  rv = NS_NewCheckSummedOutputStream(getter_AddRefs(out), storeFile);
   NS_ENSURE_SUCCESS(rv, rv);
 
   uint32_t written;
   rv = out->Write(reinterpret_cast<char*>(&mHeader), sizeof(mHeader), &written);
   NS_ENSURE_SUCCESS(rv, rv);
 
   // Write chunk numbers.
   rv = mAddChunks.Write(out);
--- a/toolkit/components/url-classifier/nsCheckSummedOutputStream.cpp
+++ b/toolkit/components/url-classifier/nsCheckSummedOutputStream.cpp
@@ -8,52 +8,49 @@
 #include "nsIFile.h"
 #include "nsISupportsImpl.h"
 #include "nsCheckSummedOutputStream.h"
 
 ////////////////////////////////////////////////////////////////////////////////
 // nsCheckSummedOutputStream
 
 NS_IMPL_ISUPPORTS_INHERITED(nsCheckSummedOutputStream,
-                            nsSafeFileOutputStream,
-                            nsISafeOutputStream,
-                            nsIOutputStream,
-                            nsIFileOutputStream)
+                            nsBufferedOutputStream,
+                            nsISafeOutputStream)
 
 NS_IMETHODIMP
-nsCheckSummedOutputStream::Init(nsIFile* file, int32_t ioFlags, int32_t perm,
-                                int32_t behaviorFlags)
+nsCheckSummedOutputStream::Init(nsIOutputStream* stream, uint32_t bufferSize)
 {
   nsresult rv;
   mHash = do_CreateInstance(NS_CRYPTO_HASH_CONTRACTID, &rv);
   NS_ENSURE_SUCCESS(rv, rv);
 
   rv = mHash->Init(nsICryptoHash::MD5);
   NS_ENSURE_SUCCESS(rv, rv);
 
-  return nsSafeFileOutputStream::Init(file, ioFlags, perm, behaviorFlags);
+  return nsBufferedOutputStream::Init(stream, bufferSize);
 }
 
 NS_IMETHODIMP
 nsCheckSummedOutputStream::Finish()
 {
   nsresult rv = mHash->Finish(false, mCheckSum);
   NS_ENSURE_SUCCESS(rv, rv);
 
   uint32_t written;
-  rv = nsSafeFileOutputStream::Write(reinterpret_cast<const char*>(mCheckSum.BeginReading()),
+  rv = nsBufferedOutputStream::Write(reinterpret_cast<const char*>(mCheckSum.BeginReading()),
                                      mCheckSum.Length(), &written);
   NS_ASSERTION(written == mCheckSum.Length(), "Error writing stream checksum");
   NS_ENSURE_SUCCESS(rv, rv);
 
-  return nsSafeFileOutputStream::Finish();
+  return nsBufferedOutputStream::Finish();
 }
 
 NS_IMETHODIMP
 nsCheckSummedOutputStream::Write(const char *buf, uint32_t count, uint32_t *result)
 {
   nsresult rv = mHash->Update(reinterpret_cast<const uint8_t*>(buf), count);
   NS_ENSURE_SUCCESS(rv, rv);
 
-  return nsSafeFileOutputStream::Write(buf, count, result);
+  return nsBufferedOutputStream::Write(buf, count, result);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
--- a/toolkit/components/url-classifier/nsCheckSummedOutputStream.h
+++ b/toolkit/components/url-classifier/nsCheckSummedOutputStream.h
@@ -7,49 +7,53 @@
 #define nsCheckSummedOutputStream_h__
 
 #include "nsILocalFile.h"
 #include "nsIFile.h"
 #include "nsIOutputStream.h"
 #include "nsICryptoHash.h"
 #include "nsNetCID.h"
 #include "nsString.h"
-#include "../../../netwerk/base/nsFileStreams.h"
 #include "nsToolkitCompsCID.h"
+#include "../../../netwerk/base/nsBufferedStreams.h"
+#include "prio.h"
 
-class nsCheckSummedOutputStream : public nsSafeFileOutputStream
+class nsCheckSummedOutputStream : public nsBufferedOutputStream
 {
 public:
   NS_DECL_ISUPPORTS_INHERITED
 
   // Size of MD5 hash in bytes
   static const uint32_t CHECKSUM_SIZE = 16;
+  static const uint32_t MAX_BUFFER_SIZE = 64 * 1024;
 
   nsCheckSummedOutputStream() {}
 
   NS_IMETHOD Finish() override;
   NS_IMETHOD Write(const char *buf, uint32_t count, uint32_t *result) override;
-  NS_IMETHOD Init(nsIFile* file, int32_t ioFlags, int32_t perm, int32_t behaviorFlags) override;
+  NS_IMETHOD Init(nsIOutputStream* stream, uint32_t bufferSize) override;
 
 protected:
-  virtual ~nsCheckSummedOutputStream() { nsSafeFileOutputStream::Close(); }
+  virtual ~nsCheckSummedOutputStream() { nsBufferedOutputStream::Close(); }
 
   nsCOMPtr<nsICryptoHash> mHash;
   nsCString mCheckSum;
 };
 
 // returns a file output stream which can be QI'ed to nsIFileOutputStream.
 inline nsresult
 NS_NewCheckSummedOutputStream(nsIOutputStream **result,
-                              nsIFile         *file,
-                              int32_t         ioFlags       = -1,
-                              int32_t         perm          = -1,
-                              int32_t         behaviorFlags =  0)
+                              nsIFile         *file)
 {
-    nsCOMPtr<nsIFileOutputStream> out = new nsCheckSummedOutputStream();
-    nsresult rv = out->Init(file, ioFlags, perm, behaviorFlags);
+    nsCOMPtr<nsIOutputStream> localOutFile;
+    nsresult rv = NS_NewSafeLocalFileOutputStream(getter_AddRefs(localOutFile), file,
+                                                  PR_WRONLY | PR_TRUNCATE | PR_CREATE_FILE);
+    NS_ENSURE_SUCCESS(rv, rv);
+
+    nsCOMPtr<nsIBufferedOutputStream> out = new nsCheckSummedOutputStream();
+    rv = out->Init(localOutFile, nsCheckSummedOutputStream::CHECKSUM_SIZE);
     if (NS_SUCCEEDED(rv)) {
       out.forget(result);
     }
     return rv;
 }
 
 #endif