summaryrefslogtreecommitdiffstats
path: root/xlators/performance/io-threads/src/io-threads.h
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/performance/io-threads/src/io-threads.h')
-rw-r--r--xlators/performance/io-threads/src/io-threads.h164
1 files changed, 55 insertions, 109 deletions
diff --git a/xlators/performance/io-threads/src/io-threads.h b/xlators/performance/io-threads/src/io-threads.h
index b6a7213b1..1a9dee9ae 100644
--- a/xlators/performance/io-threads/src/io-threads.h
+++ b/xlators/performance/io-threads/src/io-threads.h
@@ -1,20 +1,11 @@
/*
- Copyright (c) 2006-2009 Z RESEARCH, Inc. <http://www.zresearch.com>
- This file is part of GlusterFS.
-
- GlusterFS is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; either version 3 of the License,
- or (at your option) any later version.
-
- GlusterFS is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see
- <http://www.gnu.org/licenses/>.
+ Copyright (c) 2008-2012 Red Hat, Inc. <http://www.redhat.com>
+ This file is part of GlusterFS.
+
+ This file is licensed to you under your choice of the GNU Lesser
+ General Public License, version 3 or any later version (LGPLv3 or
+ later), or the GNU General Public License, version 2 (GPLv2), in all
+ cases as published by the Free Software Foundation.
*/
#ifndef __IOT_H
@@ -34,113 +25,68 @@
#include "common-utils.h"
#include "list.h"
#include <stdlib.h>
+#include "locking.h"
+#include "iot-mem-types.h"
+#include <semaphore.h>
+#include "statedump.h"
-#define min(a,b) ((a)<(b)?(a):(b))
-#define max(a,b) ((a)>(b)?(a):(b))
struct iot_conf;
-struct iot_worker;
-struct iot_request;
-
-struct iot_request {
- struct list_head list; /* Attaches this request to the list of
- requests.
- */
- call_stub_t *stub;
-};
-
-#define IOT_STATE_ACTIVE 1
-#define IOT_STATE_DEAD 2
-#define iot_worker_active(wrk) ((wrk)->state == IOT_STATE_ACTIVE)
-#define MAX_IDLE_SKEW 1000 /* usecs */
-#define skew_usec_idle_time(usec) ((usec) + (random () % MAX_IDLE_SKEW))
-#define IOT_DEFAULT_IDLE 180 /* In secs. */
+#define MAX_IDLE_SKEW 4 /* In secs */
+#define skew_sec_idle_time(sec) ((sec) + (random () % MAX_IDLE_SKEW))
+#define IOT_DEFAULT_IDLE 120 /* In secs. */
-#define IOT_MIN_THREADS 16
-#define IOT_MAX_THREADS 256
+#define IOT_MIN_THREADS 1
+#define IOT_DEFAULT_THREADS 16
+#define IOT_MAX_THREADS 64
-#define IOT_SCALING_OFF _gf_false
-#define IOT_SCALING_ON _gf_true
-#define iot_ordered_scaling_on(conf) ((conf)->o_scaling == IOT_SCALING_ON)
-#define iot_unordered_scaling_on(conf) ((conf)->u_scaling == IOT_SCALING_ON)
#define IOT_THREAD_STACK_SIZE ((size_t)(1024*1024))
-struct iot_worker {
- struct list_head rqlist; /* List of requests assigned to me. */
- struct iot_conf *conf;
- int64_t q,dq;
- pthread_cond_t dq_cond;
- pthread_mutex_t qlock;
- int32_t queue_size;
- pthread_t thread;
- int state; /* What state is the thread in. */
- int thread_idx; /* Thread's index into the worker array. Since this
- will be thread local data, for ensuring that number
- of threads dont fall below a minimum, we just dont
- allow threads with specific indices to exit.
- Helps us in eliminating one place where otherwise
- a lock would have been required to update centralized
- state inside conf.
- */
+
+typedef enum {
+ IOT_PRI_HI = 0, /* low latency */
+ IOT_PRI_NORMAL, /* normal */
+ IOT_PRI_LO, /* bulk */
+ IOT_PRI_LEAST, /* least */
+ IOT_PRI_MAX,
+} iot_pri_t;
+
+#define IOT_LEAST_THROTTLE_DELAY 1 /* sample interval in seconds */
+struct iot_least_throttle {
+ struct timeval sample_time; /* timestamp of current sample */
+ uint32_t sample_cnt; /* sample count for active interval */
+ uint32_t cached_rate; /* the most recently measured rate */
+ int32_t rate_limit; /* user-specified rate limit */
+ pthread_mutex_t lock;
};
struct iot_conf {
- int32_t thread_count;
- struct iot_worker ** workers;
-
- xlator_t *this;
- /* Config state for ordered threads. */
- pthread_mutex_t otlock; /* Used to sync any state that needs to be
- changed by the ordered threads.
- */
-
- int max_o_threads; /* Max. number of ordered threads */
- int min_o_threads; /* Min. number of ordered threads. Ordered
- thread count never falls below this
- threshold.
- */
-
- int o_idle_time; /* in Secs. The idle time after which an
- ordered thread exits.
- */
- gf_boolean_t o_scaling; /* Set to IOT_SCALING_OFF if user does not want
- thread scaling on ordered threads.
- If scaling is off, io-threads maintains
- at least min_o_threads number of threads
- and never lets any thread exit.
- */
- struct iot_worker **oworkers; /* Ordered thread pool. */
-
-
- /* Config state for unordered threads */
- pthread_mutex_t utlock; /* Used for scaling un-ordered threads. */
- struct iot_worker **uworkers; /* Un-ordered thread pool. */
- int max_u_threads; /* Number of unordered threads will not be
- higher than this.
- */
- int min_u_threads; /* Number of unordered threads should not
- fall below this value. */
- int u_idle_time; /* If an unordered thread does not get a
- request for this amount of secs, it should
- try to die.
- */
- gf_boolean_t u_scaling; /* Set to IOT_SCALING_OFF if user does not want
- thread scaling on unordered threads.
- If scaling is off, io-threads maintains
- at least min_u_threads number of threads
- and never lets any thread exit.
- */
-
- pthread_attr_t w_attr; /* Used to reduce the stack size of the
- pthread worker down from the default of
- 8MiB.
- */
+ pthread_mutex_t mutex;
+ pthread_cond_t cond;
+
+ int32_t max_count; /* configured maximum */
+ int32_t curr_count; /* actual number of threads running */
+ int32_t sleep_count;
+
+ int32_t idle_time; /* in seconds */
+
+ struct list_head reqs[IOT_PRI_MAX];
+
+ int32_t ac_iot_limit[IOT_PRI_MAX];
+ int32_t ac_iot_count[IOT_PRI_MAX];
+ int queue_sizes[IOT_PRI_MAX];
+ int queue_size;
+ pthread_attr_t w_attr;
+ gf_boolean_t least_priority; /*Enable/Disable least-priority */
+
+ xlator_t *this;
+ size_t stack_size;
+
+ struct iot_least_throttle throttle;
};
typedef struct iot_conf iot_conf_t;
-typedef struct iot_worker iot_worker_t;
-typedef struct iot_request iot_request_t;
#endif /* __IOT_H */