Home | History | Annotate | Download | only in util
      1 /* Copyright 2015 The TensorFlow Authors. All Rights Reserved.
      2 
      3 Licensed under the Apache License, Version 2.0 (the "License");
      4 you may not use this file except in compliance with the License.
      5 You may obtain a copy of the License at
      6 
      7     http://www.apache.org/licenses/LICENSE-2.0
      8 
      9 Unless required by applicable law or agreed to in writing, software
     10 distributed under the License is distributed on an "AS IS" BASIS,
     11 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 See the License for the specific language governing permissions and
     13 limitations under the License.
     14 ==============================================================================*/
     15 
     16 #ifndef TENSORFLOW_UTIL_EVENTS_WRITER_H_
     17 #define TENSORFLOW_UTIL_EVENTS_WRITER_H_
     18 
     19 #include <memory>
     20 #include <string>
     21 
     22 #include "tensorflow/core/lib/core/status.h"
     23 #include "tensorflow/core/lib/io/record_writer.h"
     24 #include "tensorflow/core/platform/env.h"
     25 #include "tensorflow/core/platform/macros.h"
     26 #include "tensorflow/core/platform/types.h"
     27 #include "tensorflow/core/util/event.pb.h"
     28 
     29 namespace tensorflow {
     30 
     31 class EventsWriter {
     32  public:
     33 #ifndef SWIG
     34   // Prefix of version string present in the first entry of every event file.
     35   static constexpr const char* kVersionPrefix = "brain.Event:";
     36   static constexpr const int kCurrentVersion = 2;
     37 #endif
     38 
     39   // Events files typically have a name of the form
     40   //   '/some/file/path/my.file.out.events.[timestamp].[hostname][suffix]'
     41   // To create and EventWriter, the user should provide file_prefix =
     42   //   '/some/file/path/my.file'
     43   // The EventsWriter will append '.out.events.[timestamp].[hostname][suffix]'
     44   // to the ultimate filename once Init() is called.
     45   // Note that it is not recommended to simultaneously have two
     46   // EventWriters writing to the same file_prefix.
     47   explicit EventsWriter(const string& file_prefix);
     48   ~EventsWriter();
     49 
     50   // Sets the event file filename and opens file for writing.  If not called by
     51   // user, will be invoked automatically by a call to FileName() or Write*().
     52   // Returns false if the file could not be opened.  Idempotent: if file exists
     53   // and is open this is a no-op.  If on the other hand the file was opened,
     54   // but has since disappeared (e.g. deleted by another process), this will open
     55   // a new file with a new timestamp in its filename.
     56   Status Init();
     57   Status InitWithSuffix(const string& suffix);
     58 
     59   // Returns the filename for the current events file:
     60   // filename_ = [file_prefix_].out.events.[timestamp].[hostname][suffix]
     61   string FileName();
     62 
     63   // Append "event" to the file.  The "tensorflow::" part is for swig happiness.
     64   void WriteEvent(const tensorflow::Event& event);
     65 
     66   // Append "event_str", a serialized Event, to the file.
     67   // Note that this function does NOT check that de-serializing event_str
     68   // results in a valid Event proto.  The tensorflow:: bit makes SWIG happy.
     69   void WriteSerializedEvent(tensorflow::StringPiece event_str);
     70 
     71   // EventWriter automatically flushes and closes on destruction, but
     72   // these two methods are provided for users who want to write to disk sooner
     73   // and/or check for success.
     74   //   Flush() pushes outstanding events to disk.  Returns false if the
     75   // events file could not be created, or if the file exists but could not
     76   // be written too.
     77   //   Close() calls Flush() and then closes the current events file.
     78   // Returns true only if both the flush and the closure were successful.
     79   Status Flush();
     80   Status Close();
     81 
     82  private:
     83   Status FileStillExists();  // OK if event_file_path_ exists.
     84   Status InitIfNeeded();
     85 
     86   Env* env_;
     87   const string file_prefix_;
     88   string file_suffix_;
     89   string filename_;
     90   std::unique_ptr<WritableFile> recordio_file_;
     91   std::unique_ptr<io::RecordWriter> recordio_writer_;
     92   int num_outstanding_events_;
     93   TF_DISALLOW_COPY_AND_ASSIGN(EventsWriter);
     94 };
     95 
     96 }  // namespace tensorflow
     97 
     98 #endif  // TENSORFLOW_UTIL_EVENTS_WRITER_H_
     99