Repository: storm
Updated Branches:
  refs/heads/1.x-branch 3399a4a46 -> 9c6e6dfd2


STORM-1704 When logviewer_search.html opens daemon file, next search always 
show no result

* ensures that is-daemon parameter is passed around multiple searches
* set logviewerUrl to '/daemonlog' when search is done with is-daemon=yes


Project: http://git-wip-us.apache.org/repos/asf/storm/repo
Commit: http://git-wip-us.apache.org/repos/asf/storm/commit/449394a0
Tree: http://git-wip-us.apache.org/repos/asf/storm/tree/449394a0
Diff: http://git-wip-us.apache.org/repos/asf/storm/diff/449394a0

Branch: refs/heads/1.x-branch
Commit: 449394a0c66f459da33253cb5ecbf22274dc0e40
Parents: 6af0d10
Author: Jungtaek Lim <[email protected]>
Authored: Mon Apr 11 16:40:58 2016 +0900
Committer: Jungtaek Lim <[email protected]>
Committed: Mon Apr 11 16:40:58 2016 +0900

----------------------------------------------------------------------
 .../clj/org/apache/storm/daemon/logviewer.clj   | 77 +++++++++++++-------
 storm-core/src/ui/public/logviewer_search.html  |  4 +-
 .../logviewer-search-page-template.html         |  5 +-
 .../clj/org/apache/storm/logviewer_test.clj     | 57 +++++++++++++--
 4 files changed, 106 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/storm/blob/449394a0/storm-core/src/clj/org/apache/storm/daemon/logviewer.clj
----------------------------------------------------------------------
diff --git a/storm-core/src/clj/org/apache/storm/daemon/logviewer.clj 
b/storm-core/src/clj/org/apache/storm/daemon/logviewer.clj
index 7baeae7..fec313b 100644
--- a/storm-core/src/clj/org/apache/storm/daemon/logviewer.clj
+++ b/storm-core/src/clj/org/apache/storm/daemon/logviewer.clj
@@ -526,13 +526,31 @@
                   (int (/ (alength needle) -2)))) ;; Addition
        :length default-bytes-per-page})))
 
+(defn url-to-match-centered-in-log-page-daemon-file
+  [needle fname offset port]
+  (let [host (local-hostname)
+        port (logviewer-port)
+        fname (clojure.string/join file-path-separator (take-last 1 (split 
fname (re-pattern file-path-separator))))]
+    (url (str "http://"; host ":" port "/daemonlog")
+      {:file fname
+       :start (max 0
+                (- offset
+                  (int (/ default-bytes-per-page 2))
+                  (int (/ (alength needle) -2)))) ;; Addition
+       :length default-bytes-per-page})))
+
 (defnk mk-match-data
   [^bytes needle ^ByteBuffer haystack haystack-offset file-offset fname
-   :before-bytes nil :after-bytes nil]
-  (let [url (url-to-match-centered-in-log-page needle
-              fname
-              file-offset
-              (*STORM-CONF* LOGVIEWER-PORT))
+   :is-daemon false :before-bytes nil :after-bytes nil]
+  (let [url (if is-daemon
+              (url-to-match-centered-in-log-page-daemon-file needle
+                                                             fname
+                                                             file-offset
+                                                             (*STORM-CONF* 
LOGVIEWER-PORT))
+              (url-to-match-centered-in-log-page needle
+                                                 fname
+                                                 file-offset
+                                                 (*STORM-CONF* 
LOGVIEWER-PORT)))
         haystack-bytes (.array haystack)
         before-string (if (>= haystack-offset grep-context-size)
                         (String. haystack-bytes
@@ -628,7 +646,7 @@
   "As the file is read into a buffer, 1/2 the buffer's size at a time, we
   search the buffer for matches of the substring and return a list of zero or
   more matches."
-  [file file-len offset-to-buf init-buf-offset stream bytes-skipped
+  [is-daemon file file-len offset-to-buf init-buf-offset stream bytes-skipped
    bytes-read ^ByteBuffer haystack ^bytes needle initial-matches num-matches
    ^bytes before-bytes]
   (loop [buf-offset init-buf-offset
@@ -653,6 +671,7 @@
                 offset
                 file-offset
                 (.getCanonicalPath file)
+                :is-daemon is-daemon
                 :before-bytes before-arg
                 :after-bytes after-arg))))
         (let [before-str-to-offset (min (.limit haystack)
@@ -709,7 +728,7 @@
   context lines.  Other information is included to be useful for progressively
   searching through a file for display in a UI. The search string must
   grep-max-search-size bytes or fewer when decoded with UTF-8."
-  [file ^String search-string :num-matches 10 :start-byte-offset 0]
+  [file ^String search-string :is-daemon false :num-matches 10 
:start-byte-offset 0]
   {:pre [(not (empty? search-string))
          (<= (count (.getBytes search-string "UTF-8")) grep-max-search-size)]}
   (let [zip-file? (.endsWith (.getName file) ".gz")
@@ -744,7 +763,9 @@
            byte-offset start-byte-offset
            before-bytes nil]
       (let [[matches new-byte-offset new-before-bytes]
-            (buffer-substring-search! file
+            (buffer-substring-search!
+              is-daemon
+              file
               file-len
               byte-offset
               init-buf-offset
@@ -771,16 +792,17 @@
               new-buf-offset
               new-byte-offset
               new-before-bytes))
-          (mk-grep-response search-bytes
-            start-byte-offset
-            matches
-            (if-not (and (< (count matches) num-matches)
-                      (>= @total-bytes-read file-len))
-              (let [next-byte-offset (+ (get (last matches)
-                                          "byteOffset")
-                                       (alength search-bytes))]
-                (if (> file-len next-byte-offset)
-                  next-byte-offset)))))))))
+          (merge {"isDaemon" (if is-daemon "yes" "no")}
+                 (mk-grep-response search-bytes
+                                   start-byte-offset
+                                   matches
+                                   (if-not (and (< (count matches) num-matches)
+                                                (>= @total-bytes-read 
file-len))
+                                     (let [next-byte-offset (+ (get (last 
matches)
+                                                                    
"byteOffset")
+                                                               (alength 
search-bytes))]
+                                       (if (> file-len next-byte-offset)
+                                         next-byte-offset))))))))))
 
 (defn- try-parse-int-param
   [nam value]
@@ -793,7 +815,7 @@
         throw))))
 
 (defn search-log-file
-  [fname user ^String root-dir search num-matches offset callback origin]
+  [fname user ^String root-dir is-daemon search num-matches offset callback 
origin]
   (let [file (.getCanonicalFile (File. root-dir fname))]
     (if (.exists file)
       (if (or (blank? (*STORM-CONF* UI-FILTER))
@@ -807,10 +829,13 @@
             (if (and (not (empty? search))
                   <= (count (.getBytes search "UTF-8")) grep-max-search-size)
               (json-response
-                (substring-search file
-                  search
-                  :num-matches num-matches-int
-                  :start-byte-offset offset-int)
+                (merge {"isDaemon" (if is-daemon "yes" "no")}
+                       (substring-search file
+                                         search
+                                         :is-daemon is-daemon
+                                         :num-matches num-matches-int
+                                         :start-byte-offset offset-int))
+
                 callback
                 :headers {"Access-Control-Allow-Origin" origin
                           "Access-Control-Allow-Credentials" "true"})
@@ -1078,10 +1103,12 @@
     ;; :keys list, or this rule could stop working when an authentication
     ;; filter is configured.
     (try
-      (let [user (.getUserName http-creds-handler servlet-request)]
+      (let [user (.getUserName http-creds-handler servlet-request)
+            is-daemon (= (:is-daemon m) "yes")]
         (search-log-file (url-decode file)
           user
-          (if (= (:is-daemon m) "yes") daemonlog-root log-root)
+          (if is-daemon daemonlog-root log-root)
+          is-daemon
           (:search-string m)
           (:num-matches m)
           (:start-byte-offset m)

http://git-wip-us.apache.org/repos/asf/storm/blob/449394a0/storm-core/src/ui/public/logviewer_search.html
----------------------------------------------------------------------
diff --git a/storm-core/src/ui/public/logviewer_search.html 
b/storm-core/src/ui/public/logviewer_search.html
index f878ab9..f981499 100644
--- a/storm-core/src/ui/public/logviewer_search.html
+++ b/storm-core/src/ui/public/logviewer_search.html
@@ -47,12 +47,12 @@ $(document).ready(function() {
     var file = $.url("?file");
     var search = $.url("?search");
     var offset = $.url("?offset") || 0;
-    var isDaemon = $.url("?is-daemon");
+    var isDaemon = $.url("?is-daemon") || "no";
     file = decodeURIComponent(file);
     search = decodeURIComponent(search);
 
     $.get("/templates/logviewer-search-page-template.html", function(template) 
{
-        
$("#search-form").append(Mustache.render($(template).filter("#search-single-file").html(),{file:
 file, search: search}));
+        
$("#search-form").append(Mustache.render($(template).filter("#search-single-file").html(),{file:
 file, search: search, isDaemon: isDaemon}));
 
         var result = $("#result");
         var url = 
"/search/"+encodeURIComponent(file)+"?search-string="+search+"&start-byte-offset="+offset+"&is-daemon="+isDaemon;

http://git-wip-us.apache.org/repos/asf/storm/blob/449394a0/storm-core/src/ui/public/templates/logviewer-search-page-template.html
----------------------------------------------------------------------
diff --git 
a/storm-core/src/ui/public/templates/logviewer-search-page-template.html 
b/storm-core/src/ui/public/templates/logviewer-search-page-template.html
index 9d208d3..e132936 100644
--- a/storm-core/src/ui/public/templates/logviewer-search-page-template.html
+++ b/storm-core/src/ui/public/templates/logviewer-search-page-template.html
@@ -16,7 +16,7 @@
 -->
 <script id="logviewer-search-result-template" type="text/html">
 {{#nextByteOffset}}
-<a 
href="/logviewer_search.html?file={{file}}&search={{searchString}}&offset={{nextByteOffset}}"
 class="btn btn-default enabled">Next</a>
+<a 
href="/logviewer_search.html?file={{file}}&search={{searchString}}&offset={{nextByteOffset}}&is-daemon={{isDaemon}}"
 class="btn btn-default enabled">Next</a>
 {{/nextByteOffset}}
 <table id="search-result-table" class="table table-striped compact">
   <thead><tr><th>File offset</th><th>Match</th></tr></thead>
@@ -30,7 +30,7 @@
   </tbody>
 </table>
 {{#nextByteOffset}}
-<a 
href="/logviewer_search.html?file={{file}}&search={{searchString}}&offset={{nextByteOffset}}"
 class="btn btn-default enabled">Next</a>
+<a 
href="/logviewer_search.html?file={{file}}&search={{searchString}}&offset={{nextByteOffset}}&is-daemon={{isDaemon}}"
 class="btn btn-default enabled">Next</a>
 {{/nextByteOffset}}
 </script>
 <script id="search-single-file" type="text/html">
@@ -38,6 +38,7 @@
   Search {{file}}:
   <input type="text" name="search" value="{{search}}">
   <input type="hidden" name="file" value="{{file}}">
+  <input type="hidden" name="is-daemon" value="{{isDaemon}}">
   <input type="submit" value="Search">
 </form>
 </script>

http://git-wip-us.apache.org/repos/asf/storm/blob/449394a0/storm-core/test/clj/org/apache/storm/logviewer_test.clj
----------------------------------------------------------------------
diff --git a/storm-core/test/clj/org/apache/storm/logviewer_test.clj 
b/storm-core/test/clj/org/apache/storm/logviewer_test.clj
index 1617c34..4d32a06 100644
--- a/storm-core/test/clj/org/apache/storm/logviewer_test.clj
+++ b/storm-core/test/clj/org/apache/storm/logviewer_test.clj
@@ -380,10 +380,26 @@
                   27526
                   8888)))))
 
+      (testing "Logviewer link centers the match in the page (daemon)"
+        (let [expected-fname "foobar.log"]
+          (is (= (str "http://";
+                   expected-host
+                   ":"
+                   expected-port
+                   "/daemonlog?file="
+                   expected-fname
+                   "&start=1947&length="
+                   logviewer/default-bytes-per-page)
+                (logviewer/url-to-match-centered-in-log-page-daemon-file 
(byte-array 42)
+                  expected-fname
+                  27526
+                  8888)))))
+
       (let [file (->> "logviewer-search-context-tests.log.test"
                    (clojure.java.io/file "src" "dev"))]
         (testing "returns correct before/after context"
-          (is (= {"searchString" pattern
+          (is (= {"isDaemon" "no"
+                  "searchString" pattern
                   "startByteOffset" 0
                   "matches" [{"byteOffset" 0
                               "beforeString" ""
@@ -434,7 +450,8 @@
 
       (let [file (clojure.java.io/file "src" "dev" "small-worker.log.test")]
         (testing "a really small log file"
-          (is (= {"searchString" pattern
+          (is (= {"isDaemon" "no"
+                  "searchString" pattern
                   "startByteOffset" 0
                   "matches" [{"byteOffset" 7
                               "beforeString" "000000 "
@@ -449,10 +466,29 @@
                                                "&start=0&length=51200")}]}
                 (logviewer/substring-search file pattern)))))
 
+      (let [file (clojure.java.io/file "src" "dev" "small-worker.log.test")]
+        (testing "a really small log file (daemon)"
+          (is (= {"isDaemon" "yes"
+                  "searchString" pattern
+                  "startByteOffset" 0
+                  "matches" [{"byteOffset" 7
+                              "beforeString" "000000 "
+                              "afterString" " 000000\n"
+                              "matchString" pattern
+                              "logviewerURL" (str "http://";
+                                               expected-host
+                                               ":"
+                                               expected-port
+                                               "/daemonlog?file="
+                                               (.getName file)
+                                               "&start=0&length=51200")}]}
+                (logviewer/substring-search file pattern :is-daemon true)))))
+
       (let [file (clojure.java.io/file "src" "dev" "test-3072.log.test")]
         (testing "no offset returned when file ends on buffer offset"
           (let [expected
-                {"searchString" pattern
+                {"isDaemon" "no"
+                 "searchString" pattern
                  "startByteOffset" 0
                  "matches" [{"byteOffset" 3066
                              "beforeString" (->>
@@ -499,7 +535,8 @@
               (is (= num-matches-found (count (get result "matches")))))))
 
         (is
-          (= {"nextByteOffset" 6252
+          (= {"isDaemon" "no"
+              "nextByteOffset" 6252
               "searchString" pattern
               "startByteOffset" 0
               "matches" [
@@ -585,7 +622,8 @@
 
         (testing "Correct match offset is returned when skipping bytes"
           (let [start-byte-offset 3197]
-            (is (= {"nextByteOffset" 6252
+            (is (= {"isDaemon" "no"
+                    "nextByteOffset" 6252
                     "searchString" pattern
                     "startByteOffset" start-byte-offset
                     "matches" [{"byteOffset" 6246
@@ -606,7 +644,8 @@
 
         (let [pattern (clojure.string/join (repeat 1024 'X))]
           (is
-            (= {"nextByteOffset" 6183
+            (= {"isDaemon" "no"
+                "nextByteOffset" 6183
                 "searchString" pattern
                 "startByteOffset" 0
                 "matches" [
@@ -637,7 +676,8 @@
 
         (let [pattern "𐄀𐄁𐄂"]
           (is
-            (= {"nextByteOffset" 7176
+            (= {"isDaemon" "no"
+                "nextByteOffset" 7176
                 "searchString" pattern
                 "startByteOffset" 0
                 "matches" [
@@ -657,7 +697,8 @@
 
         (testing "Returns 0 matches for unseen pattern"
           (let [pattern "Not There"]
-            (is (= {"searchString" pattern
+            (is (= {"isDaemon" "no"
+                    "searchString" pattern
                     "startByteOffset" 0
                     "matches" []}
                   (logviewer/substring-search file

Reply via email to