Ejemplo n.º 1
0
    async def act(self):
        loop = asyncio.get_running_loop()
        prev_write_id = self.last_write_id
        curr_write_id = str(uuid.uuid1())
        curr_version = self.last_version + 1
        read_id = str(uuid.uuid1())

        op_started = None
        try:
            self.stat.assign("size", self.checker.size())

            cmdlog.info(
                m(type="write_stared",
                  node=self.node.name,
                  key=self.key,
                  write_id=curr_write_id,
                  read_id=read_id,
                  prev_write_id=prev_write_id,
                  version=curr_version,
                  value=f"42:{curr_version}").with_time())

            self.checker.read_started(read_id, self.key)
            self.checker.cas_started(curr_write_id, self.key, prev_write_id,
                                     curr_version, f"42:{curr_version}")
            op_started = loop.time()
            response = await self.node.cas_aio(self.key, prev_write_id,
                                               f"42:{curr_version}",
                                               curr_write_id)
            data = response.record
            op_ended = loop.time()
            log_latency("ok", op_ended - self.started_at,
                        op_ended - op_started, self.node.idx, response.metrics)
            cmdlog.info(
                m(type="write_ended",
                  node=self.node.name,
                  key=self.key,
                  write_id=data.write_id,
                  value=data.value).with_time())
            if data.write_id == curr_write_id:
                self.checker.cas_ended(curr_write_id, self.key)
            else:
                self.checker.cas_canceled(curr_write_id, self.key)
            self.checker.read_ended(read_id, self.key, data.write_id,
                                    data.value)

            read_version = int(data.value.split(":")[1])
            self.last_write_id = data.write_id

            if self.last_version < read_version:
                self.last_version = read_version

            self.stat.inc(self.node.name + ":ok")
            self.stat.inc("all:ok")
        except RequestTimedout:
            try:
                self.stat.inc(self.node.name + ":out")
                op_ended = loop.time()
                log_latency("out", op_ended - self.started_at,
                            op_ended - op_started, self.node.idx)
                cmdlog.info(
                    m(type="write_timedout",
                      node=self.node.name,
                      write_id=curr_write_id,
                      key=self.key).with_time())
                self.checker.read_canceled(read_id, self.key)
                self.checker.cas_timeouted(curr_write_id, self.key)
            except:
                e, v = sys.exc_info()[:2]
                cmdlog.info(
                    m("unexpected error on write/timedout",
                      error_type=str(e),
                      error_value=str(v),
                      stacktrace=traceback.format_exc()).with_time())
                self.checker.abort()
        except RequestCanceled:
            try:
                self.stat.inc(self.node.name + ":err")
                op_ended = loop.time()
                log_latency("err", op_ended - self.started_at,
                            op_ended - op_started, self.node.idx)
                cmdlog.info(
                    m(type="write_canceled",
                      node=self.node.name,
                      write_id=curr_write_id,
                      key=self.key).with_time())
                self.checker.read_canceled(read_id, self.key)
                try:
                    self.checker.cas_canceled(curr_write_id, self.key)
                except Violation as e:
                    cmdlog.info(
                        m(e.message,
                          type="linearizability_violation",
                          write_id=curr_write_id).with_time())
            except:
                e, v = sys.exc_info()[:2]
                cmdlog.info(
                    m("unexpected error on write/canceled",
                      error_type=str(e),
                      error_value=str(v),
                      stacktrace=traceback.format_exc()).with_time())
                self.checker.abort()
        except RequestViolated as e:
            try:
                self.checker.report_violation("internal violation: " +
                                              json.dumps(e.info))
            except Violation as e:
                cmdlog.info(
                    m(e.message,
                      type="linearizability_violation",
                      write_id=curr_write_id).with_time())
        except Violation as e:
            cmdlog.info(
                m(e.message,
                  type="linearizability_violation",
                  write_id=curr_write_id).with_time())
        except:
            e, v = sys.exc_info()[:2]
            cmdlog.info(
                m("unexpected error on write",
                  error_type=str(e),
                  error_value=str(v),
                  stacktrace=traceback.format_exc()).with_time())
            self.checker.abort()
Ejemplo n.º 2
0
    async def start(self):
        loop = asyncio.get_running_loop()
        while self.is_active and self.checker.is_valid:
            await asyncio.sleep(random.uniform(0, 0.05))
            op_started = None
            read_id = str(uuid.uuid1())
            try:
                self.stat.assign("size", self.checker.size())
                cmdlog.info(
                    m(type="read_started",
                      node=self.node.name,
                      pid=self.pid,
                      read_id=read_id,
                      key=self.key).with_time())
                self.checker.read_started(self.pid, self.key)
                op_started = loop.time()
                response = await self.node.get_aio(self.key, read_id)
                read = response.record
                op_ended = loop.time()
                log_latency("ok", op_ended - self.started_at,
                            op_ended - op_started, self.node.idx,
                            response.metrics)
                if read == None:
                    cmdlog.info(
                        m(type="read_404",
                          node=self.node.name,
                          pid=self.pid,
                          read_id=read_id,
                          key=self.key).with_time())
                    self.checker.read_none(self.pid, self.key)
                else:
                    cmdlog.info(
                        m(type="read_ended",
                          node=self.node.name,
                          pid=self.pid,
                          read_id=read_id,
                          key=self.key,
                          write_id=read.write_id,
                          value=read.value).with_time())
                    self.checker.read_ended(self.pid, self.key, read.write_id,
                                            read.value)
                self.stat.inc(self.node.name + ":ok")
                self.stat.inc("all:ok")
            except RequestTimedout:
                try:
                    op_ended = loop.time()
                    log_latency("out", op_ended - self.started_at,
                                op_ended - op_started, self.node.idx)
                    self.stat.inc(self.node.name + ":out")
                    cmdlog.info(
                        m(type="read_timedout",
                          node=self.node.name,
                          pid=self.pid,
                          read_id=read_id,
                          key=self.key).with_time())
                    self.checker.read_canceled(self.pid, self.key)
                except:
                    e, v = sys.exc_info()[:2]

                    cmdlog.info(
                        m("unexpected error on handing read timedout exception",
                          type="error",
                          error_type=str(e),
                          error_value=str(v),
                          stacktrace=traceback.format_exc()).with_time())

                    self.checker.abort()
                    break
            except RequestCanceled:
                try:
                    op_ended = loop.time()
                    log_latency("err", op_ended - self.started_at,
                                op_ended - op_started, self.node.idx)
                    self.stat.inc(self.node.name + ".err")
                    cmdlog.info(
                        m(type="read_canceled",
                          node=self.node.name,
                          pid=self.pid,
                          read_id=read_id,
                          key=self.key).with_time())
                    self.checker.read_canceled(self.pid, self.key)
                except:
                    # TODO: handle violation
                    e, v = sys.exc_info()[:2]

                    cmdlog.info(
                        m("unexpected error on handing read canceled exception",
                          type="error",
                          error_type=str(e),
                          error_value=str(v),
                          stacktrace=traceback.format_exc()).with_time())

                    self.checker.abort()
                    break
            except RequestViolated as e:
                try:
                    self.checker.report_violation("internal violation: " +
                                                  json.dumps(e.info))
                except Violation as e:
                    log_violation(self.pid, e.message)
                    break
            except Violation as e:
                log_violation(self.pid, e.message)
                break
Ejemplo n.º 3
0
 async def act(self):
     loop = asyncio.get_running_loop()
     op_started = None
     read_id = str(uuid.uuid1())
     try:
         self.stat.assign("size", self.checker.size())
         cmdlog.info(
             m(type="read_started",
               node=self.node.name,
               read_id=read_id,
               key=self.key).with_time())
         self.checker.read_started(read_id, self.key)
         op_started = loop.time()
         response = await self.node.get_aio(self.key, read_id)
         read = response.record
         op_ended = loop.time()
         log_latency("ok", op_ended - self.started_at,
                     op_ended - op_started, self.node.idx, response.metrics)
         if read == None:
             cmdlog.info(
                 m(type="read_404",
                   node=self.node.name,
                   read_id=read_id,
                   key=self.key).with_time())
             self.checker.read_none(read_id, self.key)
         else:
             cmdlog.info(
                 m(type="read_ended",
                   node=self.node.name,
                   read_id=read_id,
                   key=self.key,
                   write_id=read.write_id,
                   value=read.value).with_time())
             self.checker.read_ended(read_id, self.key, read.write_id,
                                     read.value)
         self.stat.inc(self.node.name + ":ok")
         self.stat.inc("all:ok")
     except RequestTimedout:
         try:
             op_ended = loop.time()
             log_latency("out", op_ended - self.started_at,
                         op_ended - op_started, self.node.idx)
             self.stat.inc(self.node.name + ":out")
             cmdlog.info(
                 m(type="read_timedout",
                   node=self.node.name,
                   read_id=read_id,
                   key=self.key).with_time())
             self.checker.read_canceled(read_id, self.key)
         except:
             e, v = sys.exc_info()[:2]
             cmdlog.info(
                 m("unexpected error on read/timedout",
                   error_type=str(e),
                   error_value=str(v),
                   stacktrace=traceback.format_exc()).with_time())
             self.checker.abort()
     except RequestCanceled:
         try:
             op_ended = loop.time()
             log_latency("err", op_ended - self.started_at,
                         op_ended - op_started, self.node.idx)
             self.stat.inc(self.node.name + ".err")
             cmdlog.info(
                 m(type="read_canceled",
                   node=self.node.name,
                   read_id=read_id,
                   key=self.key).with_time())
             self.checker.read_canceled(read_id, self.key)
         except:
             e, v = sys.exc_info()[:2]
             cmdlog.info(
                 m("unexpected error on read/canceled",
                   error_type=str(e),
                   error_value=str(v),
                   stacktrace=traceback.format_exc()).with_time())
             self.checker.abort()
     except RequestViolated as e:
         try:
             self.checker.report_violation("internal violation: " +
                                           json.dumps(e.info))
         except Violation as e:
             cmdlog.info(
                 m(e.message,
                   type="linearizability_violation",
                   read_id=read_id).with_time())
     except Violation as e:
         cmdlog.info(
             m(e.message, type="linearizability_violation",
               read_id=read_id).with_time())
     except:
         e, v = sys.exc_info()[:2]
         cmdlog.info(
             m("unexpected error on read",
               error_type=str(e),
               error_value=str(v),
               stacktrace=traceback.format_exc()).with_time())
         self.checker.abort()
Ejemplo n.º 4
0
    async def start(self):
        loop = asyncio.get_running_loop()
        while self.is_active and self.checker.is_valid and not self.checker.is_aborted:
            await asyncio.sleep(random.uniform(0, 0.05))
            prev = self.last_write_id
            curr_write_id = str(uuid.uuid1())
            curr_version = self.last_version + 1
            op_started = None
            try:
                self.stat.assign("size", self.checker.size())
                cmdlog.info(
                    m(type="write_stared",
                      node=self.node.name,
                      pid=self.pid,
                      key=self.key,
                      write_id=curr_write_id,
                      prev_write_id=prev,
                      version=curr_version,
                      value=f"42:{curr_version}").with_time())
                self.checker.read_started(self.pid, self.key)
                self.checker.cas_started(curr_write_id, self.key, prev,
                                         curr_version, f"42:{curr_version}")
                op_started = loop.time()
                response = await self.node.cas_aio(self.key, prev,
                                                   f"42:{curr_version}",
                                                   curr_write_id)
                data = response.record
                op_ended = loop.time()
                log_latency("ok", op_ended - self.started_at,
                            op_ended - op_started, response.metrics)
                cmdlog.info(
                    m(type="write_ended",
                      node=self.node.name,
                      pid=self.pid,
                      key=self.key,
                      write_id=data.write_id,
                      value=data.value).with_time())
                if data.write_id == curr_write_id:
                    self.checker.cas_ended(curr_write_id, self.key)
                else:
                    self.checker.cas_canceled(curr_write_id, self.key)
                self.checker.read_ended(self.pid, self.key, data.write_id,
                                        data.value)

                if data.write_id == curr_write_id:
                    self.last_version = curr_version
                self.last_write_id = data.write_id
                self.last_version = int(data.value.split(":")[1])
                self.stat.inc(self.node.name + ":ok")
                self.stat.inc("all:ok")
            except RequestTimedout:
                try:
                    self.stat.inc(self.node.name + ":out")
                    op_ended = loop.time()
                    log_latency("out", op_ended - self.started_at,
                                op_ended - op_started)
                    cmdlog.info(
                        m(type="write_timedout",
                          node=self.node.name,
                          pid=self.pid,
                          key=self.key).with_time())
                    self.checker.read_canceled(self.pid, self.key)
                    self.checker.cas_timeouted(curr_write_id, self.key)
                except:
                    e, v = sys.exc_info()[:2]

                    cmdlog.info(
                        m("unexpected error on handing write timedout exception",
                          type="error",
                          error_type=str(e),
                          error_value=str(v),
                          stacktrace=traceback.format_exc()).with_time())

                    self.checker.abort()
                    break
            except RequestCanceled:
                try:
                    self.stat.inc(self.node.name + ":err")
                    op_ended = loop.time()
                    log_latency("err", op_ended - self.started_at,
                                op_ended - op_started)
                    cmdlog.info(
                        m(type="write_canceled",
                          node=self.node.name,
                          pid=self.pid,
                          key=self.key).with_time())
                    self.checker.read_canceled(self.pid, self.key)
                    try:
                        self.checker.cas_canceled(curr_write_id, self.key)
                    except Violation as e:
                        log_violation(self.pid, e.message)
                        break
                except:
                    e, v = sys.exc_info()[:2]

                    cmdlog.info(
                        m("unexpected error on handing write canceled exception",
                          type="error",
                          error_type=str(e),
                          error_value=str(v),
                          stacktrace=traceback.format_exc()).with_time())

                    self.checker.abort()
                    break
            except Violation as e:
                log_violation(self.pid, e.message)
                break