docstr: target: explore query node behavior after memory stress chaos injected and recovered
  method: 1. Create a collection, insert some data
          2. Inject memory stress chaos
          3. Start a threas to load, search and query
          4. After chaos duration, check query search success rate
          5. Delete chaos or chaos finished finally
  expected: 1.If memory is insufficient, querynode is OOMKilled and available after restart
            2.If memory is sufficient, succ rate of query and search both are 1.0
docstr_tok: ["target",":","explore","query","node","behavior","after","memory","stress","chaos","injected","and","recovered","method",":","1",".","Create","a","collection",",","insert","some","data","2",".","Inject","memory","stress","chaos","3",".","Start","a","threas","to","load",",","search","and","query","4",".","After","chaos","duration",",","check","query","search","success","rate","5",".","Delete","chaos","or","chaos","finished","finally","expected",":","1.If","memory","is","insufficient",",","querynode","is","OOMKilled","and","available","after","restart","2.If","memory","is","sufficient",",","succ","rate","of","query","and","search","both","are","1.0"]
code: def test_chaos_memory_stress_querynode(self, connection, chaos_yaml):
      """
      target: explore query node behavior after memory stress chaos injected and recovered
      method: 1. Create a collection, insert some data
              2. Inject memory stress chaos
              3. Start a threas to load, search and query
              4. After chaos duration, check query search success rate
              5. Delete chaos or chaos finished finally
      expected: 1.If memory is insufficient, querynode is OOMKilled and available after restart
                2.If memory is sufficient, succ rate of query and search both are 1.0
      """
      c_name = "chaos_memory_nx6DNW4q"
      collection_w = ApiCollectionWrapper()
      collection_w.init_collection(c_name)
      log.debug(collection_w.schema)
      log.debug(collection_w._shards_num)
  
      # apply memory stress chaos
      chaos_config = gen_experiment_config(chaos_yaml)
      log.debug(chaos_config)
      chaos_res = CusResource(
          kind=chaos_config["kind"],
          group=constants.CHAOS_GROUP,
          version=constants.CHAOS_VERSION,
          namespace=constants.CHAOS_NAMESPACE,
      )
      chaos_res.create(chaos_config)
      log.debug("chaos injected")
      duration = chaos_config.get("spec").get("duration")
      duration = (
          duration.replace("h", "*3600+")
          .replace("m", "*60+")
          .replace("s", "*1+")
          + "+0"
      )
      meta_name = chaos_config.get("metadata").get("name")
      # wait memory stress
      sleep(constants.WAIT_PER_OP * 2)
  
      # try to do release, load, query and search in a duration time loop
      try:
          start = time.time()
          while time.time() - start < eval(duration):
              collection_w.release()
              collection_w.load()
  
              term_expr = f"{ct.default_int64_field_name} in {[random.randint(0, 100)]}"
              query_res, _ = collection_w.query(term_expr)
              assert len(query_res) == 1
  
              search_res, _ = collection_w.search(
                  cf.gen_vectors(1, ct.default_dim),
                  ct.default_float_vec_field_name,
                  ct.default_search_params,
                  ct.default_limit,
              )
              log.debug(search_res[0].ids)
              assert len(search_res[0].ids) == ct.default_limit
  
      except Exception as e:
          raise Exception(str(e))
  
      finally:
          chaos_res.delete(meta_name)
  
imports: import random
  import threading
  import time
  from time import sleep
  import pytest
  import datetime
  from pymilvus import connections
  from base.collection_wrapper import ApiCollectionWrapper
  from base.utility_wrapper import ApiUtilityWrapper
  from chaos.checker import Op, CollectionCreateChecker, InsertFlushChecker, IndexCreateChecker, SearchChecker, QueryChecker
  from common.cus_resource_opts import CustomResourceOperations
  from common import common_func
  from common import common_type
  from chaos import chaos_commons
  from chaos.chaos_commons import gen_experiment_config, get_chaos_yamls, start_monitor_threads
  from common.common_type import CaseLabel, CheckTasks
  from chaos import constants
  from utils.util_log import test_log
  from utils.util_k8s import get_querynode_id_pod_pairs
label_desc: Use image node_id 2 for calling the TestChaosData obj's underlying member method code with example usage: obj.test_chaos_memory_stress_querynode(connection, chaos_yaml) without return types