From: Brian Aker Date: Fri, 27 May 2011 18:57:55 +0000 (-0700) Subject: Simple addition to valgrind test. X-Git-Tag: 0.51~7 X-Git-Url: https://git.m6w6.name/?a=commitdiff_plain;h=9f7b73d459c70cbed3bbc29b1fef626eb4cf6f3c;hp=c3aa8b5046d093123a34d59fc987b55bfaa97076;p=awesomized%2Flibmemcached Simple addition to valgrind test. --- diff --git a/ChangeLog b/ChangeLog index afbfce1a..388721a7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -7,8 +7,9 @@ * New error system. * New flow control for messages means faster get/set calls. * Added new documentation system. + * A behavior change has been now made that if you specify a weight for any + server, we enable the weight flag and do weight balancing. * A behavior change has been now made that if you specify a weight for any server, we enable the weight flag and do weight balancing. - * Added MEMCACHED_BEHAVIOR_REMOVE_FAILED_SERVERS to simplify the setting of AUTO REJECT for servers. 0.48 Tue Mar 15 23:05:18 PDT 2011 diff --git a/libmemcached/hosts.cc b/libmemcached/hosts.cc index 2f600197..10af05c8 100644 --- a/libmemcached/hosts.cc +++ b/libmemcached/hosts.cc @@ -259,8 +259,8 @@ static memcached_return_t update_continuum(memcached_st *ptr) for (uint32_t x= 0; x < pointer_per_hash; x++) { uint32_t value= ketama_server_hash(sort_host, (size_t)sort_host_length, x); - ptr->ketama.continuum[continuum_index].index= host_index; - ptr->ketama.continuum[continuum_index++].value= value; + ptr->ketama.continuum[continuum_index].index= host_index; + ptr->ketama.continuum[continuum_index++].value= value; } } else @@ -307,9 +307,9 @@ static memcached_return_t update_continuum(memcached_st *ptr) { for (uint32_t x = 0; x < pointer_per_hash; x++) { - uint32_t value= ketama_server_hash(sort_host, (size_t)sort_host_length, x); - ptr->ketama.continuum[continuum_index].index= host_index; - ptr->ketama.continuum[continuum_index++].value= value; + uint32_t value= ketama_server_hash(sort_host, (size_t)sort_host_length, x); + ptr->ketama.continuum[continuum_index].index= host_index; + ptr->ketama.continuum[continuum_index++].value= value; } } else @@ -494,3 +494,20 @@ static memcached_return_t server_add(memcached_st *ptr, const char *hostname, return run_distribution(ptr); } + +memcached_return_t memcached_server_add_parsed(memcached_st *ptr, + const char *hostname, + size_t hostname_length, + in_port_t port, + uint32_t weight) +{ + char buffer[NI_MAXHOST]; + + memcpy(buffer, hostname, hostname_length); + buffer[hostname_length]= 0; + + return server_add(ptr, buffer, + port, + weight, + MEMCACHED_CONNECTION_TCP); +} diff --git a/libmemcached/options/parser.am b/libmemcached/options/parser.am index 7bfd21c7..e69de29b 100644 --- a/libmemcached/options/parser.am +++ b/libmemcached/options/parser.am @@ -1,29 +0,0 @@ -# vim:expandtab:shiftwidth=2:tabstop=2:smarttab: -# -# Libmemcached Scanner and Parser -# -# Copyright (C) 2011 DataDifferental, http://datadifferential.com -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program 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 Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . - - -libmemcached/options/parser.h: libmemcached/options/parser.cc - -libmemcached/options/parser.cc: libmemcached/options/parser.yy libmemcached/options/scanner.l libmemcached/options/scanner.h - $(AM_V_YACC)$(am__skipyacc) $(YACC) $(YLFLAGS) $(AM_YFLAGS) -o $@ $< - -libmemcached/options/scanner.h: libmemcached/options/scanner.cc - -libmemcached/options/scanner.cc: libmemcached/options/scanner.l libmemcached/options/parser.yy - $(AM_V_GEN)$(LEX) $< diff --git a/libmemcached/options/parser.yy b/libmemcached/options/parser.yy deleted file mode 100644 index 6a7bd9b9..00000000 --- a/libmemcached/options/parser.yy +++ /dev/null @@ -1,466 +0,0 @@ -/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab: - * - * Libmemcached Scanner and Parser - * - * Copyright (C) 2011 DataDifferental, http://datadifferential.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -%error-verbose -%debug -%defines -%expect 0 -%output "libmemcached/options/parser.cc" -%defines "libmemcached/options/parser.h" -%lex-param { yyscan_t *scanner } -%name-prefix="config_" -%parse-param { Context *context } -%parse-param { yyscan_t *scanner } -%pure-parser -%require "2.2" -%start begin -%verbose - -%{ - -#include - -#include - -#include -#include -#include -#include - -#pragma GCC diagnostic ignored "-Wold-style-cast" - -int conf_lex(YYSTYPE* lvalp, void* scanner); - -#define parser_abort(A, B) do { (A)->abort((B)); YYABORT; } while (0) - -inline void config_error(Context *context, yyscan_t *scanner, const char *error) -{ - if (not context->end()) - context->abort(error); -} - -%} - -%token COMMENT -%token END -%token ERROR -%token RESET -%token PARSER_DEBUG -%token INCLUDE -%token CONFIGURE_FILE -%token EMPTY_LINE -%token SERVER -%token SERVERS -%token SERVERS_OPTION -%token UNKNOWN_OPTION -%token UNKNOWN - -/* All behavior options */ -%token BINARY_PROTOCOL -%token BUFFER_REQUESTS -%token CONNECT_TIMEOUT -%token DISTRIBUTION -%token HASH -%token HASH_WITH_NAMESPACE -%token IO_BYTES_WATERMARK -%token IO_KEY_PREFETCH -%token IO_MSG_WATERMARK -%token KETAMA_HASH -%token KETAMA_WEIGHTED -%token NOREPLY -%token NUMBER_OF_REPLICAS -%token POLL_TIMEOUT -%token RANDOMIZE_REPLICA_READ -%token RCV_TIMEOUT -%token REMOVE_FAILED_SERVERS -%token RETRY_TIMEOUT -%token SND_TIMEOUT -%token SOCKET_RECV_SIZE -%token SOCKET_SEND_SIZE -%token SORT_HOSTS -%token SUPPORT_CAS -%token USER_DATA -%token USE_UDP -%token VERIFY_KEY -%token _TCP_KEEPALIVE -%token _TCP_KEEPIDLE -%token _TCP_NODELAY - -/* Callbacks */ -%token NAMESPACE - -/* Pool */ -%token POOL_MIN -%token POOL_MAX - -/* Hash types */ -%token MD5 -%token CRC -%token FNV1_64 -%token FNV1A_64 -%token FNV1_32 -%token FNV1A_32 -%token HSIEH -%token MURMUR -%token JENKINS - -/* Distributions */ -%token CONSISTENT -%token MODULA -%token RANDOM - -/* Boolean values */ -%token TRUE -%token FALSE - -%nonassoc ',' -%nonassoc '=' - -%token FLOAT -%token NUMBER -%token PORT -%token WEIGHT_START -%token IPADDRESS -%token HOSTNAME -%token STRING -%token QUOTED_STRING -%token FILE_PATH - -%type behavior_boolean -%type behavior_number -%type distribution -%type hash -%type optional_port -%type optional_weight -%type string - -%% - -begin: - statement - | begin ' ' statement - ; - -statement: - expression - { } - | COMMENT - { } - | EMPTY_LINE - { } - | END - { - context->set_end(); - YYACCEPT; - } - | ERROR - { - context->rc= MEMCACHED_PARSE_USER_ERROR; - parser_abort(context, NULL); - } - | RESET - { - memcached_reset(context->memc); - } - | PARSER_DEBUG - { - yydebug= 1; - } - | INCLUDE ' ' string - { - if ((context->rc= memcached_parse_configure_file(context->memc, $3.c_str, $3.size)) != MEMCACHED_SUCCESS) - { - parser_abort(context, NULL); - } - } - ; - - -expression: - SERVER HOSTNAME optional_port optional_weight - { - if (memcached_failed(context->rc= memcached_server_add_with_weight(context->memc, $2.c_str, $3, $4))) - { - parser_abort(context, NULL); - } - context->unset_server(); - } - | SERVER IPADDRESS optional_port optional_weight - { - if (memcached_failed(context->rc= memcached_server_add_with_weight(context->memc, $2.c_str, $3, $4))) - { - parser_abort(context, NULL); - } - context->unset_server(); - } - | CONFIGURE_FILE string - { - memcached_set_configuration_file(context->memc, $2.c_str, $2.size); - } - | POOL_MIN NUMBER - { - context->memc->configure.initial_pool_size= $2; - } - | POOL_MAX NUMBER - { - context->memc->configure.max_pool_size= $2; - } - | behaviors - ; - -behaviors: - NAMESPACE string - { - if ((context->rc= memcached_set_prefix_key(context->memc, $2.c_str, $2.size)) != MEMCACHED_SUCCESS) - { - parser_abort(context, NULL);; - } - } - | DISTRIBUTION distribution - { - if ((context->rc= memcached_behavior_set(context->memc, MEMCACHED_BEHAVIOR_DISTRIBUTION, $2)) != MEMCACHED_SUCCESS) - { - parser_abort(context, NULL);; - } - } - | DISTRIBUTION distribution ',' hash - { - if ((context->rc= memcached_behavior_set(context->memc, MEMCACHED_BEHAVIOR_DISTRIBUTION, $2)) != MEMCACHED_SUCCESS) - { - parser_abort(context, NULL);; - } - if ((context->rc= memcached_behavior_set_distribution_hash(context->memc, $4)) != MEMCACHED_SUCCESS) - { - parser_abort(context, NULL);; - } - } - | HASH hash - { - if ((context->rc= memcached_behavior_set(context->memc, MEMCACHED_BEHAVIOR_HASH, $2)) != MEMCACHED_SUCCESS) - { - parser_abort(context, NULL);; - } - } - | behavior_number NUMBER - { - if ((context->rc= memcached_behavior_set(context->memc, $1, $2)) != MEMCACHED_SUCCESS) - { - parser_abort(context, NULL);; - } - } - | behavior_boolean - { - if ((context->rc= memcached_behavior_set(context->memc, $1, true)) != MEMCACHED_SUCCESS) - { - parser_abort(context, NULL);; - } - } - | USER_DATA - { - } - ; - -behavior_number: - REMOVE_FAILED_SERVERS - { - $$= MEMCACHED_BEHAVIOR_REMOVE_FAILED_SERVERS; - } - | CONNECT_TIMEOUT - { - $$= MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT; - } - | IO_MSG_WATERMARK - { - $$= MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK; - } - | IO_BYTES_WATERMARK - { - $$= MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK; - } - | IO_KEY_PREFETCH - { - $$= MEMCACHED_BEHAVIOR_IO_KEY_PREFETCH; - } - | NUMBER_OF_REPLICAS - { - $$= MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS; - } - | POLL_TIMEOUT - { - $$= MEMCACHED_BEHAVIOR_POLL_TIMEOUT; - } - | RCV_TIMEOUT - { - $$= MEMCACHED_BEHAVIOR_RCV_TIMEOUT; - } - | RETRY_TIMEOUT - { - $$= MEMCACHED_BEHAVIOR_RETRY_TIMEOUT; - } - | SND_TIMEOUT - { - $$= MEMCACHED_BEHAVIOR_SND_TIMEOUT; - } - | SOCKET_RECV_SIZE - { - $$= MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE; - } - | SOCKET_SEND_SIZE - { - $$= MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE; - } - ; - -behavior_boolean: - BINARY_PROTOCOL - { - $$= MEMCACHED_BEHAVIOR_BINARY_PROTOCOL; - } - | BUFFER_REQUESTS - { - $$= MEMCACHED_BEHAVIOR_BUFFER_REQUESTS; - } - | HASH_WITH_NAMESPACE - { - $$= MEMCACHED_BEHAVIOR_HASH_WITH_PREFIX_KEY; - } - | NOREPLY - { - $$= MEMCACHED_BEHAVIOR_NOREPLY; - } - | RANDOMIZE_REPLICA_READ - { - $$= MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ; - } - | SORT_HOSTS - { - $$= MEMCACHED_BEHAVIOR_SORT_HOSTS; - } - | SUPPORT_CAS - { - $$= MEMCACHED_BEHAVIOR_SUPPORT_CAS; - } - | _TCP_NODELAY - { - $$= MEMCACHED_BEHAVIOR_TCP_NODELAY; - } - | _TCP_KEEPALIVE - { - $$= MEMCACHED_BEHAVIOR_TCP_KEEPALIVE; - } - | _TCP_KEEPIDLE - { - $$= MEMCACHED_BEHAVIOR_TCP_KEEPIDLE; - } - | USE_UDP - { - $$= MEMCACHED_BEHAVIOR_USE_UDP; - } - | VERIFY_KEY - { - $$= MEMCACHED_BEHAVIOR_VERIFY_KEY; - } - - -optional_port: - { $$= MEMCACHED_DEFAULT_PORT;} - | PORT - { }; - ; - -optional_weight: - { $$= 1; } - | WEIGHT_START - { } - ; - -hash: - MD5 - { - $$= MEMCACHED_HASH_MD5; - } - | CRC - { - $$= MEMCACHED_HASH_CRC; - } - | FNV1_64 - { - $$= MEMCACHED_HASH_FNV1_64; - } - | FNV1A_64 - { - $$= MEMCACHED_HASH_FNV1A_64; - } - | FNV1_32 - { - $$= MEMCACHED_HASH_FNV1_32; - } - | FNV1A_32 - { - $$= MEMCACHED_HASH_FNV1A_32; - } - | HSIEH - { - $$= MEMCACHED_HASH_HSIEH; - } - | MURMUR - { - $$= MEMCACHED_HASH_MURMUR; - } - | JENKINS - { - $$= MEMCACHED_HASH_JENKINS; - } - ; - -string: - STRING - { - $$= $1; - } - | QUOTED_STRING - { - $$.c_str= $1.c_str +1; // +1 to move use passed the initial quote - $$.size= $1.size -2; // -2 removes the begin and end quote - } - ; - -distribution: - CONSISTENT - { - $$= MEMCACHED_DISTRIBUTION_CONSISTENT; - } - | MODULA - { - $$= MEMCACHED_DISTRIBUTION_MODULA; - } - | RANDOM - { - $$= MEMCACHED_DISTRIBUTION_RANDOM; - } - ; - -%% - -void Context::start() -{ - config_parse(this, (void **)scanner); -} - diff --git a/libmemcached/options/scanner.l b/libmemcached/options/scanner.l deleted file mode 100644 index dd6a9e00..00000000 --- a/libmemcached/options/scanner.l +++ /dev/null @@ -1,208 +0,0 @@ -/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab: - * - * Libmemcached Scanner and Parser - * - * Copyright (C) 2011 DataDifferental, http://datadifferential.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -%top{ - -#include -#include -#include -#include - -#pragma GCC diagnostic ignored "-Wold-style-cast" -#pragma GCC diagnostic ignored "-Wsign-compare" -#pragma GCC diagnostic ignored "-Wunused-parameter" - -#define YY_EXTRA_TYPE Context* - -} - - -%{ -#include -#include - -#define PARAM yyget_extra(yyscanner) - -#define get_lex_chars(buffer, result, max_size, context) \ -{ \ - if (context->pos >= context->length) \ - { \ - result= YY_NULL; \ - } \ - else \ - { \ - result= (int)(context->length - context->pos); \ - (size_t)result > (size_t)max_size ? result= max_size : 0; \ - memcpy(buffer, context->buf + context->pos, result); \ - context->pos += result; \ - } \ -} - - -#define YY_INPUT(buffer, result, max_size) get_lex_chars(buffer, result, max_size, PARAM) - -%} - -%option 8bit -%option bison-bridge -%option case-insensitive -%option debug -%option nounput -%option noyywrap -%option outfile="libmemcached/options/scanner.cc" header-file="libmemcached/options/scanner.h" -%option perf-report -%option prefix="config_" -%option reentrant - -%% - - -=|,|[ ] { return yytext[0];} - -[[:digit:]]+ { yylval->number= atoi(yytext); return (NUMBER); } - -:[[:digit:]]{1,5} { yylval->number= atoi(yytext +1); return PORT; } - -"/?"[[:digit:]]{1,5} { yylval->number= atoi(yytext +2); return WEIGHT_START; } - -[\t\r\n] ; /* skip whitespace */ - - -^#.*$ { - return COMMENT; - } - -"--SERVER=" { yyextra->begin= yytext; yyextra->set_server(); return SERVER; } - -"--BINARY-PROTOCOL" { yyextra->begin= yytext; return BINARY_PROTOCOL; } -"--BUFFER-REQUESTS" { yyextra->begin= yytext; return BUFFER_REQUESTS; } -"--CONFIGURE-FILE=" { yyextra->begin= yytext; return CONFIGURE_FILE; } -"--CONNECT-TIMEOUT=" { yyextra->begin= yytext; return CONNECT_TIMEOUT; } -"--DISTRIBUTION=" { yyextra->begin= yytext; return DISTRIBUTION; } -"--HASH-WITH-NAMESPACE" { yyextra->begin= yytext; return HASH_WITH_NAMESPACE; } -"--HASH=" { yyextra->begin= yytext; return HASH; } -"--IO-BYTES-WATERMARK=" { yyextra->begin= yytext; return IO_BYTES_WATERMARK; } -"--IO-KEY-PREFETCH=" { yyextra->begin= yytext; return IO_KEY_PREFETCH; } -"--IO-MSG-WATERMARK=" { yyextra->begin= yytext; return IO_MSG_WATERMARK; } -"--NOREPLY" { yyextra->begin= yytext; return NOREPLY; } -"--NUMBER-OF-REPLICAS=" { yyextra->begin= yytext; return NUMBER_OF_REPLICAS; } -"--POLL-TIMEOUT=" { yyextra->begin= yytext; return POLL_TIMEOUT; } -"--RANDOMIZE-REPLICA-READ" { yyextra->begin= yytext; return RANDOMIZE_REPLICA_READ; } -"--RCV-TIMEOUT=" { yyextra->begin= yytext; return RCV_TIMEOUT; } -"--REMOVE-FAILED-SERVERS=" { yyextra->begin= yytext; return REMOVE_FAILED_SERVERS; } -"--RETRY-TIMEOUT=" { yyextra->begin= yytext; return RETRY_TIMEOUT; } -"--SND-TIMEOUT=" { yyextra->begin= yytext; return SND_TIMEOUT; } -"--SOCKET-RECV-SIZE=" { yyextra->begin= yytext; return SOCKET_RECV_SIZE; } -"--SOCKET-SEND-SIZE=" { yyextra->begin= yytext; return SOCKET_SEND_SIZE; } -"--SORT-HOSTS" { yyextra->begin= yytext; return SORT_HOSTS; } -"--SUPPORT-CAS" { yyextra->begin= yytext; return SUPPORT_CAS; } -"--TCP-KEEPALIVE" { yyextra->begin= yytext; return _TCP_KEEPALIVE; } -"--TCP-KEEPIDLE" { yyextra->begin= yytext; return _TCP_KEEPIDLE; } -"--TCP-NODELAY" { yyextra->begin= yytext; return _TCP_NODELAY; } -"--USE-UDP" { yyextra->begin= yytext; return USE_UDP; } -"--USER-DATA" { yyextra->begin= yytext; return USER_DATA; } -"--VERIFY-KEY" { yyextra->begin= yytext; return VERIFY_KEY; } - -"--POOL-MIN=" { yyextra->begin= yytext; return POOL_MIN; } -"--POOL-MAX=" { yyextra->begin= yytext; return POOL_MAX; } - -"--NAMESPACE=" { yyextra->begin= yytext; return NAMESPACE; } - -INCLUDE { yyextra->begin= yytext; return INCLUDE; } -RESET { yyextra->begin= yytext; return RESET; } -DEBUG { yyextra->begin= yytext; return PARSER_DEBUG; } -SERVERS { yyextra->begin= yytext; return SERVERS; } -END { yyextra->begin= yytext; return END; } -ERROR { yyextra->begin= yytext; return ERROR; } - -TRUE { return TRUE; } -FALSE { return FALSE; } - - -"--"[[:alnum:]]* { - yyextra->begin= yytext; - return UNKNOWN_OPTION; - } - -CONSISTENT { return CONSISTENT; } -MODULA { return MODULA; } -RANDOM { return RANDOM; } - -MD5 { return MD5; } -CRC { return CRC; } -FNV1_64 { return FNV1_64; } -FNV1A_64 { return FNV1A_64; } -FNV1_32 { return FNV1_32; } -FNV1A_32 { return FNV1A_32; } -HSIEH { return HSIEH; } -MURMUR { return MURMUR; } -JENKINS { return JENKINS; } - -(([[:digit:]]{1,3}"."){3}([[:digit:]]{1,3})) { - yylval->server.port= MEMCACHED_DEFAULT_PORT; - yylval->server.weight= 1; - yylval->server.c_str= yyextra->set_hostname(yytext, yyleng); - if (yylval->server.c_str) - yylval->server.size= yyleng; - return IPADDRESS; - } - -[[:alnum:]]["."[:alnum:]_-]+[[:alnum:]] { - if (yyextra->is_server()) - { - yylval->server.port= MEMCACHED_DEFAULT_PORT; - yylval->server.weight= 1; - yylval->server.c_str= yyextra->set_hostname(yytext, yyleng); - if (yylval->server.c_str) - yylval->server.size= yyleng; - - return HOSTNAME; - } - - yylval->string.c_str = yytext; - yylval->string.size = yyleng; - - return STRING; - } - -(\".*\") { - yylval->string.c_str = yytext; - yylval->string.size = yyleng; - return QUOTED_STRING; - } - -. { - yyextra->begin= yytext; - return UNKNOWN; - } - -%% - -void Context::init_scanner() -{ - yylex_init(&scanner); - yyset_extra(this, scanner); -} - -void Context::destroy_scanner() -{ - yylex_destroy(scanner); -} - diff --git a/libmemcached/server.h b/libmemcached/server.h index d4005f89..b04410d6 100644 --- a/libmemcached/server.h +++ b/libmemcached/server.h @@ -118,6 +118,13 @@ LIBMEMCACHED_API memcached_return_t memcached_server_add(memcached_st *ptr, const char *hostname, in_port_t port); +LIBMEMCACHED_LOCAL + memcached_return_t memcached_server_add_parsed(memcached_st *ptr, + const char *hostname, + size_t hostname_length, + in_port_t port, + uint32_t weight); + LIBMEMCACHED_API memcached_return_t memcached_server_add_udp_with_weight(memcached_st *ptr, const char *hostname,