Пример #1
0
static lagopus_result_t
s_test_thread_main(const lagopus_thread_t *tptr, void *arg) {
  lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;
  lagopus_chrono_t *dates = NULL;

  (void)arg;

  if (tptr != NULL) {
    test_thread_t tt = (test_thread_t)*tptr;


    if (tt != NULL) {
      ssize_t i;
      lagopus_chrono_t now;
      dates = (lagopus_chrono_t *)
              malloc(sizeof(lagopus_chrono_t) * (size_t)tt->m_n_puts);
      if (dates == NULL) {
        goto done;
      }

      /*
       * Ready, steady,
       */
      (void)lagopus_mutex_lock(&(tt->m_start_lock));
      /*
       * go.
       */
      (void)lagopus_mutex_unlock(&(tt->m_start_lock));

      for (i = 0; i < tt->m_n_puts; i++) {
        WHAT_TIME_IS_IT_NOW_IN_NSEC(dates[i]);
      }
      if (lagopus_bbq_put_n(&(tt->m_q), (void **)dates,
                            (size_t)tt->m_n_puts,
                            lagopus_chrono_t, -1LL, NULL) !=
          (lagopus_result_t)tt->m_n_puts) {
        goto done;
      }

      now = -1LL;
      if (lagopus_bbq_put(&(tt->m_q), &now, lagopus_chrono_t, -1LL) !=
          LAGOPUS_RESULT_OK) {
        goto done;
      }
      ret = tt->m_n_puts;

      lagopus_msg_debug(1, "Done, ret = " PFSZS(020, d)
                        ", req = " PFSZS(020, u) ".\n",
                        (size_t)ret, (size_t)tt->m_n_puts);
    }
  }

done:
  free((void *)dates);

  return ret;
}
Пример #2
0
static lagopus_result_t
s_parse_snmp(datastore_interp_t *iptr,
             datastore_interp_state_t state,
             size_t argc, const char *const argv[],
             lagopus_hashmap_t *hptr,
             datastore_update_proc_t u_proc,
             datastore_enable_proc_t e_proc,
             datastore_serialize_proc_t s_proc,
             datastore_destroy_proc_t d_proc,
             lagopus_dstring_t *result) {
  lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;
  size_t i;

  (void)iptr;
  (void)state;
  (void)argc;
  (void)hptr;
  (void)u_proc;
  (void)e_proc;
  (void)s_proc;
  (void)d_proc;

  for (i = 0; i < argc; i++) {
    lagopus_msg_debug(1, "argv[" PFSZS(4, u) "]:\t'%s'\n", i, argv[i]);
  }

  argv++;
  if (IS_VALID_STRING(*argv) == false) {
    ret = s_parse_snmp_show(result);
  } else {
    ret = s_parse_snmp_internal(argv, result);
  }

  return ret;
}
Пример #3
0
static lagopus_result_t
s_parse(datastore_interp_t *iptr,
        datastore_interp_state_t state,
        size_t argc, const char *const argv[],
        lagopus_hashmap_t *hptr,
        datastore_update_proc_t u_proc,
        datastore_enable_proc_t e_proc,
        datastore_serialize_proc_t s_proc,
        datastore_destroy_proc_t d_proc,
        lagopus_dstring_t *result) {
  lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;
  size_t i;

  (void)iptr;
  (void)state;
  (void)hptr;
  (void)u_proc;
  (void)e_proc;
  (void)s_proc;
  (void)d_proc;
  (void)result;

  for (i = 0; i < argc; i++) {
    fprintf(stderr, "argv[" PFSZS(4, u) "]:\t'%s'\n", i, argv[i]);
  }

  ret = LAGOPUS_RESULT_OK;

  return ret;
}
Пример #4
0
static inline lagopus_result_t
s_parse_datastore(datastore_interp_t *iptr,
                  datastore_interp_state_t state,
                  size_t argc, const char *const argv[],
                  lagopus_hashmap_t *hptr,
                  datastore_update_proc_t u_proc,
                  datastore_enable_proc_t e_proc,
                  datastore_serialize_proc_t s_proc,
                  datastore_destroy_proc_t d_proc,
                  lagopus_dstring_t *result) {
  lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;
  size_t i;

  (void)iptr;
  (void)argc;
  (void)hptr;
  (void)u_proc;
  (void)e_proc;
  (void)s_proc;
  (void)d_proc;

  for (i = 0; i < argc; i++) {
    lagopus_msg_debug(1, "argv[" PFSZS(4, u) "]:\t'%s'\n", i, argv[i]);
  }

  argv++;

  if (argc == 1) {
    return s_current_all(result);
  } else {
    while (IS_VALID_STRING(*argv) == true) {
      if (strcmp(*argv, "-addr") == 0) {
        argv++;
        if (IS_VALID_STRING(*argv) == true) {
          ret = s_opt_parse_addr(state, argv, result);
          if (ret != LAGOPUS_RESULT_OK) {
            return ret;
          }
        } else {
          return s_current_addr(result);
        }
      } else if (strcmp(*argv, "-port") == 0) {
        argv++;
        if (IS_VALID_STRING(*argv) == true) {
          ret = s_opt_parse_port(state, argv, result);
          if (ret != LAGOPUS_RESULT_OK) {
            return ret;
          }
        } else {
          return s_current_port(result);
        }
      } else if (strcmp(*argv, "-protocol") == 0) {
        argv++;
        if (IS_VALID_STRING(*argv) == true) {
          ret = s_opt_parse_protocol(state, argv, result);
          if (ret != LAGOPUS_RESULT_OK) {
            return ret;
          }
        } else {
          return s_current_protocol(result);
        }
      } else if (strcmp(*argv, "-tls") == 0) {
        argv++;
        if (IS_VALID_STRING(*argv) == true) {
          ret = s_opt_parse_tls(state, argv, result);
          if (ret != LAGOPUS_RESULT_OK) {
            return ret;
          }
        } else {
          return s_current_tls(result);
        }
      } else {
        return datastore_json_result_string_setf(result,
               LAGOPUS_RESULT_INVALID_ARGS,
               "Unknown option '%s'",
               *argv);
      }
      argv++;
    }

    // setter result
    return datastore_json_result_set(result, ret, NULL);
  }
}
Пример #5
0
STATIC lagopus_result_t
flow_cmd_parse(datastore_interp_t *iptr,
               datastore_interp_state_t state,
               size_t argc, const char *const argv[],
               lagopus_hashmap_t *hptr,
               datastore_update_proc_t u_proc,
               datastore_enable_proc_t e_proc,
               datastore_serialize_proc_t s_proc,
               datastore_destroy_proc_t d_proc,
               lagopus_dstring_t *result) {
  lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;
  lagopus_result_t ret_for_json = LAGOPUS_RESULT_ANY_FAILURES;
  size_t i;
  void *sub_cmd_proc;
  char *name = NULL;
  char *fullname = NULL;
  char *str = NULL;
  flow_conf_t conf = {NULL, OFPTT_ALL};
  configs_t out_configs = {false, false};
  lagopus_dstring_t conf_result = NULL;
  (void) u_proc;
  (void) e_proc;
  (void) s_proc;
  (void) d_proc;

  for (i = 0; i < argc; i++) {
    lagopus_msg_debug(1, "argv[" PFSZS(4, u) "]:\t'%s'\n", i, argv[i]);
  }

  if (iptr != NULL && argv != NULL && result != NULL) {
    if ((ret = lagopus_dstring_create(&conf_result)) == LAGOPUS_RESULT_OK) {
      argv++;

      if (IS_VALID_STRING(*argv) == true) {
        if ((ret = lagopus_hashmap_find(
                     &sub_cmd_not_name_table,
                     (void *)(*argv),
                     &sub_cmd_proc)) == LAGOPUS_RESULT_OK) {
          /* parse sub cmd. */
          if (sub_cmd_proc != NULL) {
            ret_for_json =
              ((sub_cmd_proc_t) sub_cmd_proc)(iptr, state,
                                              argc, argv,
                                              NULL, hptr,
                                              u_proc,
                                              (void *) &out_configs,
                                              result);
          }
        }

        if (ret == LAGOPUS_RESULT_NOT_FOUND &&
            ret_for_json != LAGOPUS_RESULT_OK) {
          if ((ret = lagopus_str_unescape(*argv, "\"'", &name)) < 0) {
            goto done;
          } else {
            argv++;

            if ((ret = namespace_get_fullname(name, &fullname))
                == LAGOPUS_RESULT_OK) {
              if (IS_VALID_STRING(*argv) == true) {
                if ((ret = lagopus_hashmap_find(
                             &sub_cmd_table,
                             (void *)(*argv),
                             &sub_cmd_proc)) == LAGOPUS_RESULT_OK) {
                  /* parse sub cmd. */
                  if (sub_cmd_proc != NULL) {
                    ret_for_json =
                      ((sub_cmd_proc_t) sub_cmd_proc)(iptr, state,
                                                      argc, argv,
                                                      fullname, hptr,
                                                      u_proc,
                                                      (void *) &out_configs,
                                                      result);
                  } else {
                    ret = LAGOPUS_RESULT_NOT_FOUND;
                    lagopus_perror(ret);
                    goto done;
                  }
                } else if (ret == LAGOPUS_RESULT_NOT_FOUND) {
                  /* parse dump cmd. */
                  ret_for_json = dump_sub_cmd_parse(iptr, argv, fullname, &conf,
                                                    &out_configs, result);
                } else {
                  ret_for_json = datastore_json_result_string_setf(
                                   result, LAGOPUS_RESULT_INVALID_ARGS,
                                   "sub_cmd = %s.", *argv);
                }
              } else {
                /* parse dump cmd. */
                ret_for_json = dump_sub_cmd_parse(iptr, argv, fullname, &conf,
                                                  &out_configs, result);
              }
            } else {
              ret_for_json = datastore_json_result_string_setf(
                               result, ret, "Can't get fullname %s.", name);
            }
          }
        }
      } else {
        /* parse dump all cmd. */
        ret_for_json = dump_sub_cmd_parse(iptr, argv, NULL, &conf,
                                          &out_configs, result);
      }

      /* create jsno for LAGOPUS_RESULT_OK. */
      if (ret_for_json == LAGOPUS_RESULT_OK &&
          out_configs.is_dump == false) {
        ret = lagopus_dstring_str_get(result, &str);
        if (ret != LAGOPUS_RESULT_OK) {
          goto done;
        }
        if (IS_VALID_STRING(str) == true) {
          ret = datastore_json_result_set(result, LAGOPUS_RESULT_OK, str);
        } else {
          ret = datastore_json_result_set(result, LAGOPUS_RESULT_OK, NULL);
        }
      } else {
        ret = ret_for_json;
      }
    }

  done:
    /* free. */
    free(name);
    free(fullname);
    free(str);
    lagopus_dstring_destroy(&conf_result);
  } else {
    ret = LAGOPUS_RESULT_INVALID_ARGS;
  }

  return ret;
}
Пример #6
0
static inline lagopus_result_t
s_parse_load(datastore_interp_t *iptr,
             datastore_interp_state_t state,
             size_t argc, const char *const argv[],
             lagopus_hashmap_t *hptr,
             datastore_update_proc_t u_proc,
             datastore_enable_proc_t e_proc,
             datastore_serialize_proc_t s_proc,
             datastore_destroy_proc_t d_proc,
             lagopus_dstring_t *result) {
  lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;
  size_t i;
  const char *cname = NULL;
  char *filepath = NULL;

  (void)state;
  (void)argc;
  (void)hptr;
  (void)u_proc;
  (void)e_proc;
  (void)s_proc;
  (void)d_proc;

  for (i = 0; i < argc; i++) {
    lagopus_msg_debug(1, "argv[" PFSZS(4, u) "]:\t'%s'\n", i, argv[i]);
  }

  argv++;

  if (IS_VALID_STRING(*argv) == false) {
    ret = datastore_json_result_set(result,
                                    LAGOPUS_RESULT_OK,
                                    NULL);
  } else {
    if (IS_VALID_STRING(*argv) == true) {
      if ((ret = lagopus_str_unescape(*argv, "\"'", &filepath)) > 0) {
        if (s_is_readable(filepath) == LAGOPUS_RESULT_OK) {
          ret = datastore_interp_get_current_configurater(iptr, &cname);
          if (ret == LAGOPUS_RESULT_OK && IS_VALID_STRING(cname) == true) {
            ret = datastore_interp_load_file(iptr, cname, filepath, result);
            if (ret == LAGOPUS_RESULT_OK) {
              ret = datastore_json_result_set(result, ret, NULL);
            }
          } else {
            ret = datastore_json_result_string_setf(result,
                                                    ret,
                                                    CMD_ERR_MSG_LOAD_FAILED,
                                                    "internal error.");
          }
        } else {
          ret = datastore_json_result_string_setf(result,
                                                  LAGOPUS_RESULT_INVALID_ARGS,
                                                  CMD_ERR_MSG_UNREADABLE,
                                                  filepath);
        }
      } else {
        ret = datastore_json_result_string_setf(result,
                                                LAGOPUS_RESULT_INVALID_ARGS,
                                                CMD_ERR_MSG_INVALID_OPT_VALUE,
                                                *argv);
      }
    } else {
      ret = datastore_json_result_string_setf(result,
                                              LAGOPUS_RESULT_INVALID_ARGS,
                                              CMD_ERR_MSG_INVALID_OPT,
                                              *argv);
    }
  }

  free((void *) filepath);
  return ret;
}
Пример #7
0
static int
do_run(size_t nthds, ssize_t nputs) {
  int ret = 1;

  lagopus_result_t r;

  size_t i;
  size_t j;
  char thdname[16];

  lagopus_chrono_t *put_dates = NULL;

  size_t n_need_watch = 0;
  size_t n_valid_polls = 0;
  ssize_t qsz;

  test_thread_t tt;
  lagopus_bbq_t bbq;

  lagopus_chrono_t t_begin;
  lagopus_chrono_t t_end;

  lagopus_chrono_t p_begin;
  lagopus_chrono_t p_t;

  ssize_t n_gets = 0;
  lagopus_chrono_t p_min = LLONG_MAX;
  lagopus_chrono_t p_max = LLONG_MIN;
  double p_sum = 0.0;
  double p_sum2 = 0.0;

  double p_avg;
  double p_sd;

  lagopus_chrono_t t_total = 0;
  double t_avg;

  /*
   * This is only for choking clang/scan-build.
   */
  WHAT_TIME_IS_IT_NOW_IN_NSEC(t_begin);

  put_dates = (lagopus_chrono_t *)
              malloc(sizeof(lagopus_chrono_t) * (size_t)nputs);
  if (put_dates == NULL) {
    goto done;
  }

  if ((r = lagopus_mutex_create(&start_lock)) != LAGOPUS_RESULT_OK) {
    lagopus_perror(r);
    goto done;
  }
  if ((r = lagopus_mutex_create(&stop_lock)) != LAGOPUS_RESULT_OK) {
    lagopus_perror(r);
    goto done;
  }

  /*
   * Create the qmuxer.
   */
  if ((r = lagopus_qmuxer_create(&qmx)) != LAGOPUS_RESULT_OK) {
    lagopus_perror(r);
    goto done;
  }

  /*
   * Then create queues.
   */
  bbqs = (lagopus_bbq_t *)malloc(sizeof(lagopus_bbq_t) * nthds);
  if (bbqs == NULL) {
    goto done;
  }
  for (i = 0; i < nthds; i++) {
    if ((r = lagopus_bbq_create(&(bbqs[i]), lagopus_chrono_t,
                                1000LL * 1000LL,
                                NULL)) != LAGOPUS_RESULT_OK) {
      lagopus_perror(r);
      goto done;
    }
    n_created_bbqs++;
  }
  if (n_created_bbqs == 0) {
    goto done;
  }

  /*
   * Then create poll objects for the each queue.
   */
  polls = (lagopus_qmuxer_poll_t *)malloc(sizeof(lagopus_qmuxer_poll_t) *
                                          n_created_bbqs);
  if (polls == NULL) {
    goto done;
  }
  for (i = 0; i < n_created_bbqs; i++) {
    if ((r = lagopus_qmuxer_poll_create(&(polls[i]),
                                        bbqs[i],
                                        LAGOPUS_QMUXER_POLL_READABLE)) !=
        LAGOPUS_RESULT_OK) {
      lagopus_perror(r);
      goto done;
    }
    n_created_polls++;
  }
  if (n_created_polls == 0) {
    goto done;
  }

  /*
   * Then create threads for the each poll objects/queues.
   */
  tts = (test_thread_record *)malloc(sizeof(test_thread_record) *
                                     n_created_polls);
  if (tts == NULL) {
    goto done;
  }
  for (i = 0; i < n_created_polls; i++) {
    snprintf(thdname, sizeof(thdname), "putter " PFSZS(4, u), i);
    tt = &(tts[i]);
    if (test_thread_create(&tt, start_lock, bbqs[i], nputs,
                           (const char *)thdname) != true) {
      goto done;
    }
    n_created_thds++;
  }
  if (n_created_thds == 0) {
    goto done;
  }

  /*
   * Let the initiation begin.
   */

  /*
   * Ready, note that all the created threads do this lock.
   */
  (void)lagopus_mutex_lock(&start_lock);

  /*
   * Steady,
   */
  for (i = 0; i < n_created_thds; i++) {
    tt = &(tts[i]);
    if (lagopus_thread_start((lagopus_thread_t *)&tt, false) !=
        LAGOPUS_RESULT_OK) {
      (void)lagopus_mutex_unlock(&start_lock);
      goto done;
    }
  }

  fprintf(stdout, "Test for " PFSZ(u) " threads " PFSZ(u)
          " events/thdread start.\n", n_created_thds, (size_t)nputs);

  /*
   * Go.
   */
  (void)lagopus_mutex_unlock(&start_lock);

  WHAT_TIME_IS_IT_NOW_IN_NSEC(t_begin);

  while (true) {
    /*
     * Like the select(2)/poll(2), initialize poll objects before
     * checking events.
     */
    n_need_watch = 0;
    n_valid_polls = 0;
    for (i = 0; i < n_created_thds; i++) {
      /*
       * Check if the poll has a valid queue.
       */
      bbq = NULL;
      if ((r = lagopus_qmuxer_poll_get_queue(&(polls[i]), &bbq)) !=
          LAGOPUS_RESULT_OK) {
        lagopus_perror(r);
        break;
      }
      if (bbq != NULL) {
        n_valid_polls++;
      }

      /*
       * Reset the poll status.
       */
      if ((r = lagopus_qmuxer_poll_reset(&(polls[i]))) != LAGOPUS_RESULT_OK) {
        lagopus_perror(r);
        break;
      }
      n_need_watch++;
    }

    /*
     * If there are no valid queues, exit.
     */
    if (n_valid_polls == 0) {
      break;
    }

    /*
     * Wait for an event.
     *
     *  Note that we better set timeout, not waiting forever.
     */
    r = lagopus_qmuxer_poll(&qmx, (lagopus_qmuxer_poll_t *const)polls,
                            n_need_watch,
                            100LL * 1000LL * 1000LL);

    if (r > 0) {
      /*
       * Check which poll got an event. Actually, check all the queues
       * in this sample.
       */
      size_t n_actual_get = 0LL;

      for (i = 0; i < n_created_thds; i++) {

        if ((qsz = lagopus_bbq_size(&(bbqs[i]))) > 0) {

          lagopus_msg_debug(1, "Got " PFSZS(8, u) " events from the Q"
                            PFSZS(03, u) ".\n",
                            (size_t)qsz, (size_t)i);
          if ((r = lagopus_bbq_get_n(&(bbqs[i]), (void **)put_dates,
                                     (size_t)nputs, 1LL,
                                     lagopus_chrono_t,
                                     1000LL * 1000LL * 1000LL,
                                     &n_actual_get)) > 0) {
#if 1
            WHAT_TIME_IS_IT_NOW_IN_NSEC(p_begin);
#endif
            for (j = 0; j < n_actual_get; j++) {
              /*
               * In this sample, -1LL is kinda 'EOF'. Check if we got
               * the EOF.
               */
              if (put_dates[j] == -1LL) {
                /*
                 * The queue is kinda 'closed'. From now on we don't
                 * check this queue anymore. To specify this:
                 */
                lagopus_msg_debug(1, "Got an EOF from the Q" PFSZS(04, u)
                                  ".\n", i);
                goto nullify;
              }

#if 0
              WHAT_TIME_IS_IT_NOW_IN_NSEC(p_begin);
#endif

              p_t = p_begin - put_dates[j];

              if (p_t < p_min) {
                p_min = p_t;
              }
              if (p_t > p_max) {
                p_max = p_t;
              }
              p_sum += (double)p_t;
              p_sum2 += ((double)p_t * (double)p_t);
              n_gets++;
            }

          } else {
            /*
             * Something wrong for the queue. But we must not exit
             * here. Keep on checking other queues. In order to do
             * this, set NULL as the queue into the poll object for
             * the queue.
             */
            lagopus_perror(r);
          nullify:
            if ((r = lagopus_qmuxer_poll_set_queue(&(polls[i]), NULL)) ==
                LAGOPUS_RESULT_OK) {
              lagopus_msg_debug(1, "Q" PFSZS(04, u) " is not valid "
                                "anymore, ignore the queue.\n", i);
              break;
            } else {
              /*
               * There is nothing we can do now.
               */
              lagopus_perror(r);
              goto done;
            }
          }

        }

      }

    } else if (r == LAGOPUS_RESULT_TIMEDOUT) {
      lagopus_msg_debug(1, "Timedout. continue.\n");
      continue;
    } else {
      lagopus_perror(r);
      lagopus_msg_debug(1, "Break the loop due to error(s).\n");
      goto done;
    }
  }

  ret = 0;

done:

  WHAT_TIME_IS_IT_NOW_IN_NSEC(t_end);

  if (is_signaled == false) {
    fprintf(stdout, "Done.\n");
  } else {
    fprintf(stdout, "Stopped.\n");
  }

  fprintf(stdout, "Total # of the events:\t" PFSZS(22, u) "\n\n", n_gets);

  p_avg = p_sum / (double)n_gets;
  p_sd = (p_sum2 -
          2.0 * p_avg * p_sum +
          p_avg * p_avg * (double)n_gets) / (double)(n_gets - 1);
  p_sd = sqrt(p_sd);

  fprintf(stdout, "Queue stats:\n");
  fprintf(stdout, "wait time min =\t" PFSZS(22, d) " nsec.\n", p_min);
  fprintf(stdout, "wait time max =\t" PFSZS(22, d) " nsec.\n", p_max);
  fprintf(stdout, "wait time avg =\t%25.2f nsec.\n", p_avg);
  fprintf(stdout, "wait time sd =\t%25.2f.\n\n", p_sd);

  t_total = t_end - t_begin;
  t_avg = (double)t_total / (double)n_gets;

  fprintf(stdout, "Throughput:\n");
  fprintf(stdout, "total time:\t" PFSZS(22, d) " msec.\n",
          (size_t)(t_total / 1000LL / 1000LL));
  fprintf(stdout, "total avg:\t%25.2f nsec/event.\n", t_avg);

  s_destroy_all();

  free((void *)put_dates);

  return ret;
}
Пример #8
0
static inline lagopus_result_t
s_parse_dryrun(datastore_interp_t *iptr,
               datastore_interp_state_t state,
               size_t argc, const char *const argv[],
               lagopus_hashmap_t *hptr,
               datastore_update_proc_t u_proc,
               datastore_enable_proc_t e_proc,
               datastore_serialize_proc_t s_proc,
               datastore_destroy_proc_t d_proc,
               lagopus_dstring_t *result) {
  lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;
  size_t i;

  (void)iptr;
  (void)hptr;
  (void)u_proc;
  (void)e_proc;
  (void)s_proc;
  (void)d_proc;

  for (i = 0; i < argc; i++) {
    lagopus_msg_debug(1, "argv[" PFSZS(4, u) "]:\t'%s'\n", i, argv[i]);
  }

  if (argc == 1) {
    (void)lagopus_dstring_clear(result);

    ret = lagopus_dstring_appendf(result,
                                  "{\"ret\":\"OK\",\n"
                                  "\"data\":{\"dryrun\": ");

    if (ret == LAGOPUS_RESULT_OK) {
      if (state == DATASTORE_INTERP_STATE_DRYRUN) {
        ret = lagopus_dstring_appendf(result, "true}}");
      } else {
        ret = lagopus_dstring_appendf(result, "false}}");
      }

      if (ret != LAGOPUS_RESULT_OK) {
        ret = datastore_json_result_string_setf(result,
                                                LAGOPUS_RESULT_ANY_FAILURES,
                                                "dstring append failed.");
      }
    } else {
      ret = datastore_json_result_string_setf(result,
                                              LAGOPUS_RESULT_ANY_FAILURES,
                                              "dstring append failed.");
    }
  } else if (argc == 2) {
    argv++;

    if (strcmp(*argv, "begin") == 0) {
      ret = dryrun_begin();

      if (ret != LAGOPUS_RESULT_OK) {
        ret = datastore_json_result_string_setf(result,
                                                ret,
                                                "dryrun begin failed.");
      }
    } else if (strcmp(*argv, "end") == 0) {
      ret = dryrun_end();

      if (ret != LAGOPUS_RESULT_OK) {
        ret = datastore_json_result_string_setf(result,
                                                ret,
                                                "dryrun end failed.");
      }
    } else {
      ret = datastore_json_result_string_setf(result,
                                              LAGOPUS_RESULT_INVALID_ARGS,
                                              "Unknown option '%s'.",
                                              *argv);
    }

    if (ret != LAGOPUS_RESULT_DATASTORE_INTERP_ERROR) {
      ret = datastore_json_result_set(result, ret, NULL);
    }
  } else {
    ret = datastore_json_result_string_setf(result,
                                            LAGOPUS_RESULT_INVALID_ARGS,
                                            "Unknown option.");
  }

  return ret;
}
Пример #9
0
static lagopus_result_t
s_parse_shutdown(datastore_interp_t *iptr,
                 datastore_interp_state_t state,
                 size_t argc, const char *const argv[],
                 lagopus_hashmap_t *hptr,
                 datastore_update_proc_t u_proc,
                 datastore_enable_proc_t e_proc,
                 datastore_serialize_proc_t s_proc,
                 datastore_destroy_proc_t d_proc,
                 lagopus_dstring_t *result) {
  lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;
  size_t i;
  (void)state;
  (void)argc;
  (void)hptr;
  (void)u_proc;
  (void)e_proc;
  (void)s_proc;
  (void)d_proc;
  (void)result;

  for (i = 0; i < argc; i++) {
    lagopus_msg_debug(1, "argv[" PFSZS(4, u) "]:\t'%s'\n", i, argv[i]);
  }

  if (iptr != NULL && argv != NULL && result != NULL) {
    argv++;
    if (IS_VALID_STRING(*argv) == true) {
      if (strcmp(*argv, OPT_GRACE_LEVEL) == 0) {
        argv++;
        if (IS_VALID_STRING(*argv) == true) {
          if (strcmp(*argv, OPT_GRACE_LEVEL_RIGHT_NOW) == 0) {
            /* shutdown (right_now) */
            s_shutdown(SHUTDOWN_RIGHT_NOW);
            ret = LAGOPUS_RESULT_OK;
          } else if (strcmp(*argv, OPT_GRACE_LEVEL_GRACEFULLY) == 0) {
            /* shutdown (gracefully) */
            s_shutdown(SHUTDOWN_GRACEFULLY);
            ret = LAGOPUS_RESULT_OK;
          } else {
            ret = LAGOPUS_RESULT_INVALID_ARGS;
            lagopus_msg_warning(
              CMD_ERR_MSG_INVALID_OPT_VALUE". (%s)\n",
              *argv, lagopus_error_get_string(ret));
          }
        } else {
          if (*argv == NULL) {
            ret = LAGOPUS_RESULT_INVALID_ARGS;
            lagopus_msg_warning("Bad opt value. (%s)\n",
                                lagopus_error_get_string(ret));
          } else {
            ret = LAGOPUS_RESULT_INVALID_ARGS;
            lagopus_msg_warning(
              CMD_ERR_MSG_INVALID_OPT_VALUE". (%s)\n",
              *argv, lagopus_error_get_string(ret));
          }
        }
      } else {
        ret = LAGOPUS_RESULT_INVALID_ARGS;
        lagopus_msg_warning(
          CMD_ERR_MSG_INVALID_OPT". (%s)\n",
          *argv, lagopus_error_get_string(ret));
      }
    } else {
      if (*argv == NULL) {
        /* shutdown (default) */
        s_shutdown(GRACE_LEVEL_DEFAULT);
      } else {
        ret = LAGOPUS_RESULT_INVALID_ARGS;
        lagopus_msg_warning(
          CMD_ERR_MSG_INVALID_OPT". (%s)\n",
          *argv, lagopus_error_get_string(ret));
      }
    }
  } else {
    ret = LAGOPUS_RESULT_INVALID_ARGS;
  }

  return ret;
}
Пример #10
0
static inline lagopus_result_t
s_parse_atomic(datastore_interp_t *iptr,
               datastore_interp_state_t state,
               size_t argc, const char *const argv[],
               lagopus_hashmap_t *hptr,
               datastore_update_proc_t u_proc,
               datastore_enable_proc_t e_proc,
               datastore_serialize_proc_t s_proc,
               datastore_destroy_proc_t d_proc,
               lagopus_dstring_t *result) {
    lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;
    bool is_show = false;
    size_t i;

    (void)state;
    (void)argc;
    (void)hptr;
    (void)u_proc;
    (void)e_proc;
    (void)s_proc;
    (void)d_proc;

    for (i = 0; i < argc; i++) {
        lagopus_msg_debug(1, "argv[" PFSZS(4, u) "]:\t'%s'\n", i, argv[i]);
    }

    argv++;

    if (IS_VALID_STRING(*argv) == false) {
        return datastore_json_result_set(result,
                                         LAGOPUS_RESULT_OK,
                                         NULL);
    } else {
        if (strcmp(*argv, "begin") == 0) {
            ret = s_parse_begin(iptr, state, argc, argv, &is_show, result);
        } else if (strcmp(*argv, "abort") == 0) {
            if (state == DATASTORE_INTERP_STATE_DRYRUN) {
                ret = LAGOPUS_RESULT_OK;
            } else {
                ret = datastore_interp_atomic_abort(iptr, result);
            }
        } else if (strcmp(*argv, "commit") == 0) {
            if (state == DATASTORE_INTERP_STATE_DRYRUN) {
                ret = LAGOPUS_RESULT_OK;
            } else {
                ret = datastore_interp_atomic_commit(iptr, result);
            }
        } else if (strcmp(*argv, "rollback-force") == 0) {
            if (state == DATASTORE_INTERP_STATE_DRYRUN) {
                ret = LAGOPUS_RESULT_OK;
            } else {
                ret = datastore_interp_atomic_rollback(iptr, result, true);
            }
        } else {
            return datastore_json_result_string_setf(result,
                    LAGOPUS_RESULT_INVALID_ARGS,
                    "Unknown option '%s'",
                    *argv);
        }

        if (ret != LAGOPUS_RESULT_DATASTORE_INTERP_ERROR &&
                is_show == false) {
            ret = datastore_json_result_set(result, ret, NULL);
        }

        return ret;
    }
}