Пример #1
0
void Redox::disconnectedCallback(const redisAsyncContext *ctx, int status) {

  Redox *rdx = (Redox *)ctx->data;

  if (status != REDIS_OK) {
    rdx->logger_.error() << "Disconnected from Redis on error: " << ctx->errstr;
    unique_lock<mutex> lk(rdx->connect_lock_);
    rdx->connect_state_ = DISCONNECT_ERROR;
  } else {
    rdx->logger_.info() << "Disconnected from Redis as planned.";
    unique_lock<mutex> lk(rdx->connect_lock_);
    rdx->connect_state_ = DISCONNECTED;
  }

  rdx->stop();
  int state;
  {
    unique_lock<mutex> lk(rdx->connect_lock_);
    state = rdx->connect_state_;
  }
  rdx->connect_waiter_.notify_all();
  if (rdx->user_connection_callback_)
    rdx->user_connection_callback_(state);
}
Пример #2
0
int main(int argc, char* argv[]) {

  string usage_string = "Usage: " + string(argv[0])
      + " --(set-async|get-async|set-sync|get-sync|get-pubsub|set-pubsub) [freq]";

  if(argc != 3) {
    cerr << usage_string<< endl;
    return 1;
  }

  bool nowait = true;
  std::string host = "localhost";
  int port = 6379;

  Redox rdx;
  if(nowait) rdx.noWait(true);

  Subscriber rdx_sub;
  if(nowait) rdx_sub.noWait(true);

  double freq = stod(argv[2]); // Hz
  double dt = 1 / freq; // s
  int iter = 1000000;
  atomic_int count(0);

  double t0 = time_s();
  double t = t0;
  double t_new = t;

  double t_last_reply = t;
  double t_this_reply = t;

  if(!strcmp(argv[1], "--get-async")) {

    if(!rdx.connect(host, port)) return 1;

    while(count < iter) {
      rdx.command<string>({"GET", "jitter_test:time"},
          [&](Command<string>& c) {
            if (!c.ok()) {
              cerr << "Bad reply: " << c.status() << endl;
            } else {
              t_new = time_s();
              t_this_reply = stod(c.reply());
              print_time(
                  t_new - t0,
                  t_new - t,
                  t_this_reply - t_last_reply,
                  t_new - t_this_reply
              );
              t = t_new;
              t_last_reply = t_this_reply;
            }
            count++;
            if (count == iter) rdx.stop();
          }
      );

      this_thread::sleep_for(chrono::microseconds((int)(dt * 1e6)));
    }

  } else if(!strcmp(argv[1], "--get-async-loop")) {

    if(!rdx.connect(host, port)) return 1;

      rdx.commandLoop<string>({"GET", "jitter_test:time"},
          [&](Command<string>& c) {
            if (!c.ok()) {
              cerr << "Bad reply: " << c.status() << endl;
            } else {
              t_new = time_s();
              t_this_reply = stod(c.reply());
              print_time(
                  t_new - t0,
                  t_new - t,
                  t_this_reply - t_last_reply,
                  t_new - t_this_reply
              );
              t = t_new;
              t_last_reply = t_this_reply;
            }
            count++;
            if (count == iter) rdx.stop();
          },
          dt
      );

  } else if(!strcmp(argv[1], "--set-async")) {

    if(!rdx.connect(host, port)) return 1;

    while (count < iter) {
      rdx.command<string>({"SET", "jitter_test:time", to_string(time_s())},
          [&](Command<string>& c) {
            if (!c.ok()) {
              cerr << "Error setting value: " << c.status() << endl;
            }
            count++;
            if (count == iter) rdx.stop();
          }
      );
      this_thread::sleep_for(chrono::microseconds((int) (dt * 1e6)));
    }

  } else if(!strcmp(argv[1], "--get-sync")) {

    if(!rdx.connect(host, port)) return 1;

    while(count < iter) {
      Command<string>& c = rdx.commandSync<string>({"GET", "jitter_test:time"});
      if(!c.ok()) {
        cerr << "Error setting value: " << c.status() << endl;
      } else {
        t_new = time_s();
        t_this_reply = stod(c.reply());
        print_time(
            t_new - t0,
            t_new - t,
            t_this_reply - t_last_reply,
            t_new - t_this_reply
        );
        t = t_new;
        t_last_reply = t_this_reply;
      }
      count++;
      if(count == iter) rdx.stop();
      c.free();
      this_thread::sleep_for(chrono::microseconds((int)((dt) * 1e6)));
    }

  } else if(!strcmp(argv[1], "--set-sync")) {

    if(!rdx.connect(host, port)) return 1;

    while(count < iter){
      Command<string>& c = rdx.commandSync<string>({"SET", "jitter_test:time", to_string(time_s())});
      if(!c.ok()) {
        cerr << "Error setting value: " << c.status() << endl;
      }
      count++;
      if(count == iter) rdx.stop();
      c.free();
      this_thread::sleep_for(chrono::microseconds((int)((dt) * 1e6)));
    }

  } else if(!strcmp(argv[1], "--get-pubsub")) {

    if(!rdx_sub.connect(host, port)) return 1;

    auto got_message = [&](const string& topic, const string& msg) {

      t_new = time_s();
      t_this_reply = stod(msg);
      print_time(
          t_new - t0,
          t_new - t,
          t_this_reply - t_last_reply,
          t_new - t_this_reply
      );
      t = t_new;
      t_last_reply = t_this_reply;

      count++;
      if (count == iter) rdx.stop();
    };

    rdx_sub.subscribe("jitter_test:time", got_message);

  } else if(!strcmp(argv[1], "--set-pubsub")) {

    if(!rdx.connect(host, port)) return 1;

    while (count < iter) {
      double t1 = time_s();
      rdx.command<int>({"PUBLISH", "jitter_test:time", to_string(time_s())},
          [&](Command<int>& c) {
            if (!c.ok()) {
              cerr << "Error setting value: " << c.status() << endl;
            }
            count++;
            if (count == iter) rdx.stop();
          }
      );
      double wait = dt - (time_s() - t1);
      this_thread::sleep_for(chrono::microseconds((int) (wait * 1e6)));
    }

  } else {
    cerr << usage_string << endl;
    return 1;
  }

  rdx.wait();
  rdx_sub.wait();

  return 0;
};