You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by bb...@apache.org on 2021/07/01 17:49:41 UTC

[geode-native] branch develop updated: Performance improvements for gnmsg script (#828)

This is an automated email from the ASF dual-hosted git repository.

bbender pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode-native.git


The following commit(s) were added to refs/heads/develop by this push:
     new 176c737  Performance improvements for gnmsg script (#828)
176c737 is described below

commit 176c73728752f7779cc5f793e513799186e8dd88
Author: Blake Bender <bb...@pivotal.io>
AuthorDate: Thu Jul 1 10:49:29 2021 -0700

    Performance improvements for gnmsg script (#828)
    
    - Compiling regex every time we check a line for matches is silly, made
      the regexes member variables of the decoder classes and only compile
      them once.
    - Short-circuited regex checking by doing a "sanity check" using a
      substring search for each line before using regex.  Substring search
      is much, much cheaper than re.search().
---
 tools/gnmsg/client_message_decoder.py |  49 +++++++++------
 tools/gnmsg/server_message_decoder.py | 113 +++++++++++++++++++---------------
 2 files changed, 95 insertions(+), 67 deletions(-)

diff --git a/tools/gnmsg/client_message_decoder.py b/tools/gnmsg/client_message_decoder.py
index 45e88f7..3e2bdf3 100644
--- a/tools/gnmsg/client_message_decoder.py
+++ b/tools/gnmsg/client_message_decoder.py
@@ -77,12 +77,21 @@ class ClientMessageDecoder(DecoderBase):
             "USER_CREDENTIAL_MESSAGE",
         ]
 
-    def get_send_trace_parts_v911(self, line, parts):
-        result = False
-        expression = re.compile(
+        self.security_trace_expression_ = re.compile(
+            r"(\d\d\d\d\/\d\d\/\d\d \d\d:\d\d:\d\d\.\d+).*([\d|a-f|A-F|x|X]+)\]\s*TcrMessage::addSecurityPart\s*\[(0x[\d|a-f|A-F]*).*length\s*=\s*(\d+)\s*,\s*encrypted\s+ID\s*=\s*([\d|a-f|A-F]+)"
+        )
+
+        self.send_trace_expression_v911_ = re.compile(
             r"(\d\d\d\d\/\d\d\/\d\d \d\d:\d\d:\d\d\.\d+).*TcrConnection::send:\s*\[([\d|a-f|A-F|x|X]+).*sending request to endpoint.*bytes:\s*([\d| ]+)"
         )
-        match = expression.search(line)
+
+        self.send_trace_expression_base_ = re.compile(
+            r"(\d\d\d\d\/\d\d\/\d\d \d\d:\d\d:\d\d\.\d+).+:\d+\s+([\d|a-f|A-F|x|X]+)\]\s*TcrConnection::send:\s*\[([\d|a-f|A-F|x|X]+).*sending request to endpoint.*bytes:\s*([\d|a-f|A-F]+)"
+        )
+
+    def get_send_trace_parts_v911(self, line, parts):
+        result = False
+        match = self.send_trace_expression_v911_.search(line)
         if match:
             parts.append(parser.parse(match.group(1)))
             # TODO: Revisit parsing TID here if we ever see a v9 client log again
@@ -95,10 +104,7 @@ class ClientMessageDecoder(DecoderBase):
 
     def get_send_trace_parts_base(self, line, parts):
         result = False
-        expression = re.compile(
-            r"(\d\d\d\d\/\d\d\/\d\d \d\d:\d\d:\d\d\.\d+).+:\d+\s+([\d|a-f|A-F|x|X]+)\]\s*TcrConnection::send:\s*\[([\d|a-f|A-F|x|X]+).*sending request to endpoint.*bytes:\s*([\d|a-f|A-F]+)"
-        )
-        match = expression.search(line)
+        match = self.send_trace_expression_base_.search(line)
         if match:
             parts.append(parser.parse(match.group(1)))
             parts.append(match.group(2))
@@ -124,17 +130,16 @@ class ClientMessageDecoder(DecoderBase):
 
     def get_add_security_trace_parts(self, line, parts):
         result = False
-        expression = re.compile(
-            r"(\d\d\d\d\/\d\d\/\d\d \d\d:\d\d:\d\d\.\d+).*([\d|a-f|A-F|x|X]+)\]\s*TcrMessage::addSecurityPart\s*\[(0x[\d|a-f|A-F]*).*length\s*=\s*(\d+)\s*,\s*encrypted\s+ID\s*=\s*([\d|a-f|A-F]+)"
-        )
-        match = expression.search(line)
-        if match:
-            parts.append(parser.parse(match.group(1)))
-            parts.append(match.group(2))
-            parts.append(match.group(3))
-            parts.append(match.group(4))
-            parts.append(match.group(5))
-            result = True
+
+        if "addSec" in line:
+            match = self.security_trace_expression_.search(line)
+            if match:
+                parts.append(parser.parse(match.group(1)))
+                parts.append(match.group(2))
+                parts.append(match.group(3))
+                parts.append(match.group(4))
+                parts.append(match.group(5))
+                result = True
 
         return result
 
@@ -191,12 +196,18 @@ class ClientMessageDecoder(DecoderBase):
     def request_requires_security_footer(self, message_type):
         return message_type in self.message_requires_security_part
 
+    def is_candidate_line(self, line):
+        return "TcrMess" in line or "TcrConn" in line
+
     def process_line(self, line):
         connection = None
         is_send_trace = False
         is_add_security_trace = False
         send_trace = {}
 
+        if not self.is_candidate_line(line):
+            return
+
         parts = []
         if self.get_send_trace_parts(line, parts):
             (
diff --git a/tools/gnmsg/server_message_decoder.py b/tools/gnmsg/server_message_decoder.py
index 22e9265..e473b0a 100644
--- a/tools/gnmsg/server_message_decoder.py
+++ b/tools/gnmsg/server_message_decoder.py
@@ -50,12 +50,56 @@ class ServerMessageDecoder(DecoderBase):
         self.chunk_decoder = ChunkedResponseDecoder()
         self.threads_connections_ = {}
 
-    def associate_connection_to_tid(self, line):
-        result = False
-        expression = re.compile(
+        self.connection_to_tid_expression_ = re.compile(
             r"(\d\d:\d\d:\d\d\.\d+).+:\d+\s+([\d|a-f|A-F|x|X]+)\]\s*TcrConnection::send:\s*\[([\d|a-f|A-F|x|X]+).*sending request to endpoint.*bytes:\s*([\d|a-f|A-F]+)"
         )
-        match = expression.search(line)
+
+        self.trace_header_with_pointer_expression_ = re.compile(
+            r"(\d\d\d\d\/\d\d\/\d\d \d\d:\d\d:\d\d\.\d+).+:\d+\s+([\d|a-f|A-F|x|X]+)\]\s*TcrConnection::readMessage\(([\d|a-f|A-F|x|X]+)\):.*received header from endpoint.*bytes:\s*([\d|a-f|A-F]+)"
+        )
+
+        self.trace_header_without_pointer_expression_ = re.compile(
+            r"(\d\d\d\d\/\d\d\/\d\d \d\d:\d\d:\d\d\.\d+).*:\d+\s+([\d|a-f|A-F|x|X]+)\]\s*TcrConnection::readMessage:\s*received header from endpoint.*bytes:\s*([\d|a-f|A-F]+)"
+        )
+
+        self.trace_header_v911_expression_ = re.compile(
+            r"(\d\d\d\d\/\d\d\/\d\d \d\d:\d\d:\d\d\.\d+).*:\d+\s+(\d+)\]\s*TcrConnection::readMessage: received header from endpoint.*bytes:\s*([\d| ]+)"
+        )
+
+        self.receive_trace_body_expression_ = re.compile(
+            ":\d+\s+([\d|a-f|A-F|x|X]+)\]\s*TcrConnection::readMessage: received message body from endpoint.*bytes:\s*([\d|a-f|A-F]+)"
+        )
+
+        self.security_trace_expression_ = re.compile(
+            r"(\d\d\d\d\/\d\d\/\d\d \d\d:\d\d:\d\d\.\d+).*:\d+\s+(\d+)\]\s*TcrMessage::addSecurityPart\s*\[(0x[\d|a-f|A-F]*).*length\s*=\s*(\d+)\s*,\s*encrypted\s+ID\s*=\s*([\d|a-f|A-F]+)"
+        )
+
+        self.response_header_with_pointer_expression_ = re.compile(
+            r"(\d\d\d\d\/\d\d\/\d\d \d\d:\d\d:\d\d\.\d+).*:\d+\s+(\d+)\]\s*TcrConnection::readResponseHeader\(([0-9|a-f|A-F|x]+)\):\s*received header from endpoint\s*([\w|:|\d|\.|-]+);\s*bytes:\s*([\d|a-f|A-F]+)"
+        )
+
+        self.response_header_without_pointer_expression_ = re.compile(
+            r"(\d\d\d\d\/\d\d\/\d\d \d\d:\d\d:\d\d\.\d+).*:\d+\s+(\d+)\]\s*TcrConnection::readResponseHeader:\s*received header from endpoint\s*([\w|:|\d|\.|-]+);\s*bytes:\s*([\d|a-f|A-F]+)"
+        )
+
+        self.chunk_header_with_pointer_expression_ = re.compile(
+            r"(\d\d\d\d\/\d\d\/\d\d \d\d:\d\d:\d\d\.\d+).*:\d+\s+(\d+)\]\s*TcrConnection::readChunkHeader\(([0-9|a-f|A-F|x]+)\):\s*.*, chunkLen=(\d+), lastChunkAndSecurityFlags=([0-9|a-f|A-F|x]+)"
+        )
+
+        self.chunk_header_without_pointer_expression_ = re.compile(
+            r"(\d\d\d\d\/\d\d\/\d\d \d\d:\d\d:\d\d\.\d+).*:\d+\s+(\d+)\]\s*TcrConnection::readChunkHeader:\s*.*, chunkLen=(\d+), lastChunkAndSecurityFlags=([0-9|a-f|A-F|x]+)"
+        )
+
+        self.chunk_bytes_with_pointer_expression_ = re.compile(
+            r"(\d\d:\d\d:\d\d\.\d+).*:\d+\s+(\d+)\]\s*TcrConnection::readChunkBody\(([0-9|a-f|A-F|x]+)\): \s*received chunk body from endpoint\s*([\w|:|\d|\.|-]+);\s*bytes:\s*([\d|a-f|A-F]+)"
+        )
+        self.chunk_bytes_without_pointer_expression_ = re.compile(
+            r"(\d\d\d\d\/\d\d\/\d\d \d\d:\d\d:\d\d\.\d+).*:\d+\s+(\d+)\]\s*TcrConnection::readChunkBody: \s*received chunk body from endpoint\s*([\w|:|\d|\.|-]+);\s*bytes:\s*([\d|a-f|A-F]+)"
+        )
+
+    def associate_connection_to_tid(self, line):
+        result = False
+        match = self.connection_to_tid_expression_.search(line)
         if match:
             tid = match.group(2)
             connection = match.group(3)
@@ -66,10 +110,7 @@ class ServerMessageDecoder(DecoderBase):
 
     def get_receive_trace_header_with_pointer(self, line, parts):
         result = False
-        expression = re.compile(
-            r"(\d\d\d\d\/\d\d\/\d\d \d\d:\d\d:\d\d\.\d+).+:\d+\s+([\d|a-f|A-F|x|X]+)\]\s*TcrConnection::readMessage\(([\d|a-f|A-F|x|X]+)\):.*received header from endpoint.*bytes:\s*([\d|a-f|A-F]+)"
-        )
-        match = expression.search(line)
+        match = self.trace_header_with_pointer_expression_.search(line)
         if match:
             date_time = parser.parse(match.group(1))
             tid = match.group(2)
@@ -86,10 +127,7 @@ class ServerMessageDecoder(DecoderBase):
 
     def get_receive_trace_header_without_pointer(self, line, parts):
         result = False
-        expression = re.compile(
-            r"(\d\d\d\d\/\d\d\/\d\d \d\d:\d\d:\d\d\.\d+).*:\d+\s+([\d|a-f|A-F|x|X]+)\]\s*TcrConnection::readMessage:\s*received header from endpoint.*bytes:\s*([\d|a-f|A-F]+)"
-        )
-        match = expression.search(line)
+        match = self.trace_header_without_pointer_expression_.search(line)
         if match:
             tid = match.group(2)
             parts.append(parser.parse(match.group(1)))
@@ -112,10 +150,7 @@ class ServerMessageDecoder(DecoderBase):
 
     def get_receive_trace_header_v911(self, line, parts):
         result = False
-        expression = re.compile(
-            r"(\d\d\d\d\/\d\d\/\d\d \d\d:\d\d:\d\d\.\d+).*:\d+\s+(\d+)\]\s*TcrConnection::readMessage: received header from endpoint.*bytes:\s*([\d| ]+)"
-        )
-        match = expression.search(line)
+        match = self.trace_header_v911_expression_.search(line)
         if match:
             tid = match.group(2)
             parts.append(parser.parse(match.group(1)))
@@ -131,10 +166,7 @@ class ServerMessageDecoder(DecoderBase):
 
     def get_receive_trace_body_parts(self, line, parts):
         result = False
-        expression = re.compile(
-            ":\d+\s+([\d|a-f|A-F|x|X]+)\]\s*TcrConnection::readMessage: received message body from endpoint.*bytes:\s*([\d|a-f|A-F]+)"
-        )
-        match = expression.search(line)
+        match = self.receive_trace_body_expression_.search(line)
         if match:
             tid = match.group(1)
             parts.append(tid)
@@ -163,10 +195,7 @@ class ServerMessageDecoder(DecoderBase):
 
     def get_add_security_trace_parts(self, line, parts):
         result = False
-        expression = re.compile(
-            r"(\d\d\d\d\/\d\d\/\d\d \d\d:\d\d:\d\d\.\d+).*:\d+\s+(\d+)\]\s*TcrMessage::addSecurityPart\s*\[(0x[\d|a-f|A-F]*).*length\s*=\s*(\d+)\s*,\s*encrypted\s+ID\s*=\s*([\d|a-f|A-F]+)"
-        )
-        match = expression.search(line)
+        match = self.security_trace_expression_.search(line)
         if match:
             parts.append(parser.parse(match.group(1)))
             parts.append(match.group(2))
@@ -181,10 +210,7 @@ class ServerMessageDecoder(DecoderBase):
         # Check if this is a header for a chunked message
         result = False
 
-        expression = re.compile(
-            r"(\d\d\d\d\/\d\d\/\d\d \d\d:\d\d:\d\d\.\d+).*:\d+\s+(\d+)\]\s*TcrConnection::readResponseHeader\(([0-9|a-f|A-F|x]+)\):\s*received header from endpoint\s*([\w|:|\d|\.|-]+);\s*bytes:\s*([\d|a-f|A-F]+)"
-        )
-        match = expression.search(line)
+        match = self.response_header_with_pointer_expression_.search(line)
         if match:
             tid = match.group(2)
             connection = match.group(3)
@@ -197,10 +223,7 @@ class ServerMessageDecoder(DecoderBase):
             result = True
 
         if not result:
-            expression = re.compile(
-                r"(\d\d\d\d\/\d\d\/\d\d \d\d:\d\d:\d\d\.\d+).*:\d+\s+(\d+)\]\s*TcrConnection::readResponseHeader:\s*received header from endpoint\s*([\w|:|\d|\.|-]+);\s*bytes:\s*([\d|a-f|A-F]+)"
-            )
-            match = expression.search(line)
+            match = self.response_header_without_pointer_expression_.search(line)
             if match:
                 parts.append(parser.parse(match.group(1)))
                 parts.append(match.group(2))
@@ -214,10 +237,7 @@ class ServerMessageDecoder(DecoderBase):
     def get_chunk_header(self, line, parts):
         # Check if this is a header for a chunked message
         result = False
-        expression = re.compile(
-            r"(\d\d\d\d\/\d\d\/\d\d \d\d:\d\d:\d\d\.\d+).*:\d+\s+(\d+)\]\s*TcrConnection::readChunkHeader\(([0-9|a-f|A-F|x]+)\):\s*.*, chunkLen=(\d+), lastChunkAndSecurityFlags=([0-9|a-f|A-F|x]+)"
-        )
-        match = expression.search(line)
+        match = self.chunk_header_with_pointer_expression_.search(line)
         if match:
             tid = match.group(2)
             connection = match.group(3)
@@ -230,10 +250,7 @@ class ServerMessageDecoder(DecoderBase):
             result = True
 
         if not result:
-            expression = re.compile(
-                r"(\d\d\d\d\/\d\d\/\d\d \d\d:\d\d:\d\d\.\d+).*:\d+\s+(\d+)\]\s*TcrConnection::readChunkHeader:\s*.*, chunkLen=(\d+), lastChunkAndSecurityFlags=([0-9|a-f|A-F|x]+)"
-            )
-            match = expression.search(line)
+            match = self.chunk_header_without_pointer_expression_.search(line)
             if match:
                 parts.append(parser.parse(match.group(1)))
                 tid = match.group(2)
@@ -252,10 +269,7 @@ class ServerMessageDecoder(DecoderBase):
         # Check if this is a message chunk.
         # If it is, add it to the chunked decoder
         result = False
-        expression = re.compile(
-            r"(\d\d:\d\d:\d\d\.\d+).*:\d+\s+(\d+)\]\s*TcrConnection::readChunkBody\(([0-9|a-f|A-F|x]+)\): \s*received chunk body from endpoint\s*([\w|:|\d|\.|-]+);\s*bytes:\s*([\d|a-f|A-F]+)"
-        )
-        match = expression.search(line)
+        match = self.chunk_bytes_with_pointer_expression_.search(line)
         if match:
             parts.append(parser.parse(match.group(1)))
             parts.append(match.group(2))
@@ -265,10 +279,7 @@ class ServerMessageDecoder(DecoderBase):
             result = True
 
         if not result:
-            expression = re.compile(
-                r"(\d\d\d\d\/\d\d\/\d\d \d\d:\d\d:\d\d\.\d+).*:\d+\s+(\d+)\]\s*TcrConnection::readChunkBody: \s*received chunk body from endpoint\s*([\w|:|\d|\.|-]+);\s*bytes:\s*([\d|a-f|A-F]+)"
-            )
-            match = expression.search(line)
+            match = self.chunk_bytes_without_pointer_expression_.search(line)
             if match:
                 parts.append(parser.parse(match.group(1)))
                 tid = match.group(2)
@@ -328,6 +339,9 @@ class ServerMessageDecoder(DecoderBase):
         if self.receive_trace_parser_ is not None:
             return self.receive_trace_parser_(message_bytes)
 
+    def is_candidate_line(self, line):
+        return "TcrMess" in line or "TcrConn" in line
+
     def process_line(self, line):
         connection = None
         message_bytes = None
@@ -335,6 +349,9 @@ class ServerMessageDecoder(DecoderBase):
         chunk_bytes = None
         tid = None
 
+        if not self.is_candidate_line(line):
+            return
+
         parts = []
         if self.associate_connection_to_tid(line):
             pass