diff options
author | Alexandru Scvortov <alexandru@rabbitmq.com> | 2010-07-05 13:43:56 +0100 |
---|---|---|
committer | Alexandru Scvortov <alexandru@rabbitmq.com> | 2010-07-05 13:43:56 +0100 |
commit | fe10c3a199945fa53868591e1d87cc970c239e70 (patch) | |
tree | 4894a9155434dc23f410bbb7b23ebea24fd56258 | |
parent | 8af1cb807ba9ae63e6a67a81cb5f4bb71fb06ef0 (diff) | |
parent | 81ca684267ff9f914846340c13a0db79abe7ad1f (diff) | |
download | rabbitmq-server-fe10c3a199945fa53868591e1d87cc970c239e70.tar.gz |
merge default into bug21954
29 files changed, 447 insertions, 384 deletions
@@ -11,10 +11,10 @@ SOURCE_DIR=src EBIN_DIR=ebin INCLUDE_DIR=include DOCS_DIR=docs -INCLUDES=$(wildcard $(INCLUDE_DIR)/*.hrl) $(INCLUDE_DIR)/rabbit_framing.hrl $(INCLUDE_DIR)/rabbit_framing_spec.hrl +INCLUDES=$(wildcard $(INCLUDE_DIR)/*.hrl) $(INCLUDE_DIR)/rabbit_framing.hrl SOURCES=$(wildcard $(SOURCE_DIR)/*.erl) $(SOURCE_DIR)/rabbit_framing.erl $(USAGES_ERL) BEAM_TARGETS=$(patsubst $(SOURCE_DIR)/%.erl, $(EBIN_DIR)/%.beam, $(SOURCES)) -TARGETS=$(EBIN_DIR)/rabbit.app $(INCLUDE_DIR)/rabbit_framing.hrl $(INCLUDE_DIR)/rabbit_framing_spec.hrl $(BEAM_TARGETS) +TARGETS=$(EBIN_DIR)/rabbit.app $(INCLUDE_DIR)/rabbit_framing.hrl $(BEAM_TARGETS) WEB_URL=http://www.rabbitmq.com/ MANPAGES=$(patsubst %.xml, %.gz, $(wildcard $(DOCS_DIR)/*.[0-9].xml)) WEB_MANPAGES=$(patsubst %.xml, %.man.xml, $(wildcard $(DOCS_DIR)/*.[0-9].xml) $(DOCS_DIR)/rabbitmq-service.xml) @@ -102,9 +102,6 @@ $(EBIN_DIR)/%.beam: $(INCLUDE_DIR)/rabbit_framing.hrl: codegen.py $(AMQP_CODEGEN_DIR)/amqp_codegen.py $(AMQP_SPEC_JSON_FILES) $(PYTHON) codegen.py header $(AMQP_SPEC_JSON_FILES) $@ -$(INCLUDE_DIR)/rabbit_framing_spec.hrl: codegen.py $(AMQP_CODEGEN_DIR)/amqp_codegen.py $(AMQP_SPEC_JSON_FILES) - $(PYTHON) codegen.py spec $(AMQP_SPEC_JSON_FILES) $@ - $(SOURCE_DIR)/rabbit_framing.erl: codegen.py $(AMQP_CODEGEN_DIR)/amqp_codegen.py $(AMQP_SPEC_JSON_FILES) $(PYTHON) codegen.py body $(AMQP_SPEC_JSON_FILES) $@ @@ -131,7 +128,7 @@ $(BASIC_PLT): $(BEAM_TARGETS) clean: rm -f $(EBIN_DIR)/*.beam rm -f $(EBIN_DIR)/rabbit.app $(EBIN_DIR)/rabbit.boot $(EBIN_DIR)/rabbit.script $(EBIN_DIR)/rabbit.rel - rm -f $(INCLUDE_DIR)/rabbit_framing.hrl $(INCLUDE_DIR)/rabbit_framing_spec.hrl $(SOURCE_DIR)/rabbit_framing.erl codegen.pyc + rm -f $(INCLUDE_DIR)/rabbit_framing.hrl $(SOURCE_DIR)/rabbit_framing.erl codegen.pyc rm -f $(DOCS_DIR)/*.[0-9].gz $(DOCS_DIR)/*.man.xml $(DOCS_DIR)/*.erl $(USAGES_ERL) rm -f $(RABBIT_PLT) rm -f $(DEPS_FILE) @@ -332,6 +332,10 @@ def genErl(spec): -export([lookup_amqp_exception/1]). -export([amqp_exception/1]). +-export_type([amqp_table/0, amqp_property_type/0, amqp_method_record/0, + amqp_method_name/0, amqp_method/0, amqp_class_id/0, + amqp_value/0, amqp_array/0]). + bitvalue(true) -> 1; bitvalue(false) -> 0; bitvalue(undefined) -> 0. @@ -350,8 +354,61 @@ bitvalue(undefined) -> 0. -spec(encode_properties/1 :: (amqp_method_record()) -> binary()). -spec(lookup_amqp_exception/1 :: (amqp_exception()) -> {boolean(), amqp_exception_code(), binary()}). -spec(amqp_exception/1 :: (amqp_exception_code()) -> amqp_exception()). + +-type(amqp_field_type() :: + 'longstr' | 'signedint' | 'decimal' | 'timestamp' | + 'table' | 'byte' | 'double' | 'float' | 'long' | + 'short' | 'bool' | 'binary' | 'void'). +-type(amqp_property_type() :: + 'shortstr' | 'longstr' | 'octet' | 'shortint' | 'longint' | + 'longlongint' | 'timestamp' | 'bit' | 'table'). + +-type(amqp_table() :: [{binary(), amqp_field_type(), amqp_value()}]). +-type(amqp_array() :: [{amqp_field_type(), amqp_value()}]). +-type(amqp_value() :: binary() | % longstr + integer() | % signedint + {non_neg_integer(), non_neg_integer()} | % decimal + amqp_table() | + amqp_array() | + byte() | % byte + float() | % double + integer() | % long + integer() | % short + boolean() | % bool + binary() | % binary + 'undefined' | % void + non_neg_integer() % timestamp + ). -endif. % use_specs """ + print "-ifdef(use_specs)." + print "%% Various types" + print prettyType("amqp_method_name()", + [m.erlangName() for m in methods]) + print prettyType("amqp_method()", + ["{%s, %s}" % (m.klass.index, m.index) for m in methods], + 6) + print prettyType("amqp_method_record()", + ["#%s{}" % (m.erlangName()) for m in methods]) + fieldNames = set() + for m in methods: + fieldNames.update(m.arguments) + fieldNames = [erlangize(f.name) for f in fieldNames] + print prettyType("amqp_method_field_name()", + fieldNames) + print prettyType("amqp_property_record()", + ["#'P_%s'{}" % erlangize(c.name) for c in spec.allClasses()]) + print prettyType("amqp_exception()", + ["'%s'" % erlangConstantName(c).lower() for (c, v, cls) in spec.constants]) + print prettyType("amqp_exception_code()", + ["%i" % v for (c, v, cls) in spec.constants]) + classIds = set() + for m in spec.allMethods(): + classIds.add(m.klass.index) + print prettyType("amqp_class_id()", + ["%i" % ci for ci in classIds]) + print "-endif. % use_specs" + for m in methods: genLookupMethodName(m) print "lookup_method_name({_ClassId, _MethodId} = Id) -> exit({unknown_method_id, Id})." @@ -425,63 +482,6 @@ def genHrl(spec): for c in spec.allClasses(): print "-record('P_%s', {%s})." % (erlangize(c.name), fieldNameList(c.fields)) - print "-ifdef(use_specs)." - print "%% Various types" - print prettyType("amqp_method_name()", - [m.erlangName() for m in methods]) - print prettyType("amqp_method()", - ["{%s, %s}" % (m.klass.index, m.index) for m in methods], - 6) - print prettyType("amqp_method_record()", - ["#%s{}" % (m.erlangName()) for m in methods]) - fieldNames = set() - for m in methods: - fieldNames.update(m.arguments) - fieldNames = [erlangize(f.name) for f in fieldNames] - print prettyType("amqp_method_field_name()", - fieldNames) - print prettyType("amqp_property_record()", - ["#'P_%s'{}" % erlangize(c.name) for c in spec.allClasses()]) - print prettyType("amqp_exception()", - ["'%s'" % erlangConstantName(c).lower() for (c, v, cls) in spec.constants]) - print prettyType("amqp_exception_code()", - ["%i" % v for (c, v, cls) in spec.constants]) - print "-endif. % use_specs" - -def genSpec(spec): - methods = spec.allMethods() - - printFileHeader() - print """% Hard-coded types --type(amqp_field_type() :: - 'longstr' | 'signedint' | 'decimal' | 'timestamp' | - 'table' | 'byte' | 'double' | 'float' | 'long' | - 'short' | 'bool' | 'binary' | 'void'). --type(amqp_property_type() :: - 'shortstr' | 'longstr' | 'octet' | 'shortint' | 'longint' | - 'longlongint' | 'timestamp' | 'bit' | 'table'). -%% we could make this more precise but ultimately are limited by -%% dialyzer's lack of support for recursive types --type(amqp_table() :: [{binary(), amqp_field_type(), any()}]). -%% TODO: make this more precise --type(amqp_properties() :: tuple()). - --type(channel_number() :: non_neg_integer()). --type(resource_name() :: binary()). --type(routing_key() :: binary()). --type(username() :: binary()). --type(password() :: binary()). --type(vhost() :: binary()). --type(ctag() :: binary()). --type(exchange_type() :: atom()). --type(binding_key() :: binary()). -""" - print "% Auto-generated types" - classIds = set() - for m in spec.allMethods(): - classIds.add(m.klass.index) - print prettyType("amqp_class_id()", - ["%i" % ci for ci in classIds]) def generateErl(specPath): genErl(AmqpSpec(specPath)) @@ -489,11 +489,7 @@ def generateErl(specPath): def generateHrl(specPath): genHrl(AmqpSpec(specPath)) -def generateSpec(specPath): - genSpec(AmqpSpec(specPath)) - if __name__ == "__main__": do_main_dict({"header": generateHrl, - "spec": generateSpec, "body": generateErl}) diff --git a/include/rabbit.hrl b/include/rabbit.hrl index 06297c69..3fd52568 100644 --- a/include/rabbit.hrl +++ b/include/rabbit.hrl @@ -68,115 +68,10 @@ -record(ssl_socket, {tcp, ssl}). -record(delivery, {mandatory, immediate, txn, sender, message}). - -record(amqp_error, {name, explanation, method = none}). %%---------------------------------------------------------------------------- --ifdef(use_specs). - --include("rabbit_framing_spec.hrl"). - --type(maybe(T) :: T | 'none'). --type(erlang_node() :: atom()). --type(node_type() :: disc_only | disc | ram | unknown). --type(ssl_socket() :: #ssl_socket{}). --type(socket() :: port() | ssl_socket()). --type(thunk(T) :: fun(() -> T)). --type(info_key() :: atom()). --type(info() :: {info_key(), any()}). --type(regexp() :: binary()). --type(file_path() :: string()). - -%% this is really an abstract type, but dialyzer does not support them --type(guid() :: binary()). --type(txn() :: guid()). --type(pkey() :: guid()). --type(r(Kind) :: - #resource{virtual_host :: vhost(), - kind :: Kind, - name :: resource_name()}). --type(queue_name() :: r('queue')). --type(exchange_name() :: r('exchange')). --type(user() :: - #user{username :: username(), - password :: password()}). --type(permission() :: - #permission{configure :: regexp(), - write :: regexp(), - read :: regexp()}). --type(amqqueue() :: - #amqqueue{name :: queue_name(), - durable :: boolean(), - auto_delete :: boolean(), - exclusive_owner :: maybe(pid()), - arguments :: amqp_table(), - pid :: maybe(pid())}). --type(exchange() :: - #exchange{name :: exchange_name(), - type :: exchange_type(), - durable :: boolean(), - auto_delete :: boolean(), - arguments :: amqp_table()}). --type(binding() :: - #binding{exchange_name :: exchange_name(), - queue_name :: queue_name(), - key :: binding_key()}). -%% TODO: make this more precise by tying specific class_ids to -%% specific properties --type(undecoded_content() :: - #content{class_id :: amqp_class_id(), - properties :: 'none', - properties_bin :: binary(), - payload_fragments_rev :: [binary()]} | - #content{class_id :: amqp_class_id(), - properties :: amqp_properties(), - properties_bin :: 'none', - payload_fragments_rev :: [binary()]}). --type(unencoded_content() :: undecoded_content()). --type(decoded_content() :: - #content{class_id :: amqp_class_id(), - properties :: amqp_properties(), - properties_bin :: maybe(binary()), - payload_fragments_rev :: [binary()]}). --type(encoded_content() :: - #content{class_id :: amqp_class_id(), - properties :: maybe(amqp_properties()), - properties_bin :: binary(), - payload_fragments_rev :: [binary()]}). --type(content() :: undecoded_content() | decoded_content()). --type(basic_message() :: - #basic_message{exchange_name :: exchange_name(), - routing_key :: routing_key(), - content :: content(), - guid :: guid(), - is_persistent :: boolean()}). --type(message() :: basic_message()). --type(delivery() :: - #delivery{mandatory :: boolean(), - immediate :: boolean(), - txn :: maybe(txn()), - sender :: pid(), - message :: message()}). -%% this really should be an abstract type --type(msg_id() :: non_neg_integer()). --type(qmsg() :: {queue_name(), pid(), msg_id(), boolean(), message()}). --type(listener() :: - #listener{node :: erlang_node(), - protocol :: atom(), - host :: string() | atom(), - port :: non_neg_integer()}). --type(not_found() :: {'error', 'not_found'}). --type(routing_result() :: 'routed' | 'unroutable' | 'not_delivered'). --type(amqp_error() :: - #amqp_error{name :: atom(), - explanation :: string(), - method :: atom()}). - --endif. - -%%---------------------------------------------------------------------------- - -define(COPYRIGHT_MESSAGE, "Copyright (C) 2007-2010 LShift Ltd., Cohesive Financial Technologies LLC., and Rabbit Technologies Ltd."). -define(INFORMATION_MESSAGE, "Licensed under the MPL. See http://www.rabbitmq.com/"). -define(ERTS_MINIMUM, "5.6.3"). diff --git a/include/rabbit_backing_queue_spec.hrl b/include/rabbit_backing_queue_spec.hrl index 55cd126e..0cef2379 100644 --- a/include/rabbit_backing_queue_spec.hrl +++ b/include/rabbit_backing_queue_spec.hrl @@ -31,26 +31,26 @@ -type(fetch_result() :: %% Message, IsDelivered, AckTag, Remaining_Len - ('empty'|{basic_message(), boolean(), ack(), non_neg_integer()})). + ('empty'|{rabbit:basic_message(), boolean(), ack(), non_neg_integer()})). -type(is_durable() :: boolean()). -type(attempt_recovery() :: boolean()). -type(purged_msg_count() :: non_neg_integer()). -type(ack_required() :: boolean()). --spec(start/1 :: ([queue_name()]) -> 'ok'). --spec(init/3 :: (queue_name(), is_durable(), attempt_recovery()) -> state()). +-spec(start/1 :: ([rabbit_amqqueue:name()]) -> 'ok'). +-spec(init/3 :: (rabbit_amqqueue:name(), is_durable(), attempt_recovery()) -> state()). -spec(terminate/1 :: (state()) -> state()). -spec(delete_and_terminate/1 :: (state()) -> state()). -spec(purge/1 :: (state()) -> {purged_msg_count(), state()}). --spec(publish/2 :: (basic_message(), state()) -> state()). +-spec(publish/2 :: (rabbit:basic_message(), state()) -> state()). -spec(publish_delivered/3 :: - (ack_required(), basic_message(), state()) -> {ack(), state()}). + (ack_required(), rabbit:basic_message(), state()) -> {ack(), state()}). -spec(fetch/2 :: (ack_required(), state()) -> {fetch_result(), state()}). -spec(ack/2 :: ([ack()], state()) -> state()). --spec(tx_publish/3 :: (txn(), basic_message(), state()) -> state()). --spec(tx_ack/3 :: (txn(), [ack()], state()) -> state()). --spec(tx_rollback/2 :: (txn(), state()) -> {[ack()], state()}). --spec(tx_commit/3 :: (txn(), fun (() -> any()), state()) -> {[ack()], state()}). +-spec(tx_publish/3 :: (rabbit:txn(), rabbit:basic_message(), state()) -> state()). +-spec(tx_ack/3 :: (rabbit:txn(), [ack()], state()) -> state()). +-spec(tx_rollback/2 :: (rabbit:txn(), state()) -> {[ack()], state()}). +-spec(tx_commit/3 :: (rabbit:txn(), fun (() -> any()), state()) -> {[ack()], state()}). -spec(requeue/2 :: ([ack()], state()) -> state()). -spec(len/1 :: (state()) -> non_neg_integer()). -spec(is_empty/1 :: (state()) -> boolean()). diff --git a/include/rabbit_exchange_type_spec.hrl b/include/rabbit_exchange_type_spec.hrl index cb564365..dbbe74f0 100644 --- a/include/rabbit_exchange_type_spec.hrl +++ b/include/rabbit_exchange_type_spec.hrl @@ -31,13 +31,19 @@ -ifdef(use_specs). -spec(description/0 :: () -> [{atom(), any()}]). --spec(publish/2 :: (exchange(), delivery()) -> {routing_result(), [pid()]}). --spec(validate/1 :: (exchange()) -> 'ok'). --spec(create/1 :: (exchange()) -> 'ok'). --spec(recover/2 :: (exchange(), list(binding())) -> 'ok'). --spec(delete/2 :: (exchange(), list(binding())) -> 'ok'). --spec(add_binding/2 :: (exchange(), binding()) -> 'ok'). --spec(remove_bindings/2 :: (exchange(), list(binding())) -> 'ok'). --spec(assert_args_equivalence/2 :: (exchange(), amqp_table()) -> 'ok'). +-spec(publish/2 :: (rabbit_exchange:exchange(), rabbit:delivery()) + -> {rabbit_router:routing_result(), [pid()]}). +-spec(validate/1 :: (rabbit_exchange:exchange()) -> 'ok'). +-spec(create/1 :: (rabbit_exchange:exchange()) -> 'ok'). +-spec(recover/2 :: (rabbit_exchange:exchange(), + [rabbit_exchange:binding()]) -> 'ok'). +-spec(delete/2 :: (rabbit_exchange:exchange(), + [rabbit_exchange:binding()]) -> 'ok'). +-spec(add_binding/2 :: (rabbit_exchange:exchange(), + rabbit_exchange:binding()) -> 'ok'). +-spec(remove_bindings/2 :: (rabbit_exchange:exchange(), + [rabbit_exchange:binding()]) -> 'ok'). +-spec(assert_args_equivalence/2 :: (rabbit_exchange:exchange(), + rabbit_framing:amqp_table()) -> 'ok'). -endif. diff --git a/src/rabbit.erl b/src/rabbit.erl index 6cf6d7d5..376e00dc 100644 --- a/src/rabbit.erl +++ b/src/rabbit.erl @@ -39,6 +39,11 @@ -export([log_location/1]). +-export_type([txn/0, maybe/1, info/0, info_key/0, message/0, basic_message/0, + delivery/0, content/0, decoded_content/0, undecoded_content/0, + unencoded_content/0, encoded_content/0, vhost/0, ctag/0, + ip_port/0, hostname/0]). + %%--------------------------------------------------------------------------- %% Boot steps. -export([maybe_insert_default_data/0]). @@ -176,6 +181,7 @@ -include("rabbit_framing.hrl"). -include("rabbit.hrl"). +-include_lib("kernel/include/inet.hrl"). -define(APPS, [os_mon, mnesia, rabbit]). @@ -183,9 +189,56 @@ -ifdef(use_specs). --type(log_location() :: 'tty' | 'undefined' | string()). +-type(maybe(T) :: T | 'none'). +-type(vhost() :: binary()). +-type(ctag() :: binary()). + +%% TODO: make this more precise by tying specific class_ids to +%% specific properties +-type(undecoded_content() :: + #content{class_id :: rabbit_framing:amqp_class_id(), + properties :: 'none', + properties_bin :: binary(), + payload_fragments_rev :: [binary()]} | + #content{class_id :: rabbit_framing:amqp_class_id(), + properties :: rabbit_framing:amqp_property_record(), + properties_bin :: 'none', + payload_fragments_rev :: [binary()]}). +-type(unencoded_content() :: undecoded_content()). +-type(decoded_content() :: + #content{class_id :: rabbit_framing:amqp_class_id(), + properties :: rabbit_framing:amqp_property_record(), + properties_bin :: rabbit:maybe(binary()), + payload_fragments_rev :: [binary()]}). +-type(encoded_content() :: + #content{class_id :: rabbit_framing:amqp_class_id(), + properties :: rabbit:maybe(rabbit_framing:amqp_property_record()), + properties_bin :: binary(), + payload_fragments_rev :: [binary()]}). +-type(content() :: undecoded_content() | decoded_content()). +-type(basic_message() :: + #basic_message{exchange_name :: rabbit_exchange:name(), + routing_key :: rabbit_router:routing_key(), + content :: content(), + guid :: rabbit_guid:guid(), + is_persistent :: boolean()}). +-type(message() :: basic_message()). +-type(delivery() :: + #delivery{mandatory :: boolean(), + immediate :: boolean(), + txn :: rabbit:maybe(rabbit:txn()), + sender :: pid(), + message :: message()}). + +%% this is really an abstract type, but dialyzer does not support them +-type(txn() :: rabbit_guid:guid()). +%% this really should be an abstract type +-type(log_location() :: 'tty' | 'undefined' | file:filename()). -type(file_suffix() :: binary()). +-type(info_key() :: atom()). +-type(info() :: {info_key(), any()}). + -spec(prepare/0 :: () -> 'ok'). -spec(start/0 :: () -> 'ok'). -spec(stop/0 :: () -> 'ok'). @@ -193,8 +246,8 @@ -spec(rotate_logs/1 :: (file_suffix()) -> 'ok' | {'error', any()}). -spec(status/0 :: () -> [{running_applications, [{atom(), string(), string()}]} | - {nodes, [{node_type(), [erlang_node()]}]} | - {running_nodes, [erlang_node()]}]). + {nodes, [{rabbit_mnesia:node_type(), [node()]}]} | + {running_nodes, [node()]}]). -spec(log_location/1 :: ('sasl' | 'kernel') -> log_location()). -endif. diff --git a/src/rabbit_access_control.erl b/src/rabbit_access_control.erl index a445f441..050277fb 100644 --- a/src/rabbit_access_control.erl +++ b/src/rabbit_access_control.erl @@ -40,33 +40,41 @@ -export([add_vhost/1, delete_vhost/1, list_vhosts/0]). -export([set_permissions/5, clear_permissions/2, list_vhost_permissions/1, list_user_permissions/1]). +-export_type([username/0]). %%---------------------------------------------------------------------------- -ifdef(use_specs). -type(permission_atom() :: 'configure' | 'read' | 'write'). +-type(username() :: binary()). +-type(password() :: binary()). +-type(user() :: + #user{username :: username(), + password :: password()}). +-type(regexp() :: binary()). -spec(check_login/2 :: (binary(), binary()) -> user()). -spec(user_pass_login/2 :: (username(), password()) -> user()). --spec(check_vhost_access/2 :: (user(), vhost()) -> 'ok'). +-spec(check_vhost_access/2 :: (user(), rabbit:vhost()) -> 'ok'). -spec(check_resource_access/3 :: - (username(), r(atom()), permission_atom()) -> 'ok'). + (username(), rabbit_misc:r(atom()), permission_atom()) -> 'ok'). -spec(add_user/2 :: (username(), password()) -> 'ok'). -spec(delete_user/1 :: (username()) -> 'ok'). -spec(change_password/2 :: (username(), password()) -> 'ok'). -spec(list_users/0 :: () -> [username()]). --spec(lookup_user/1 :: (username()) -> {'ok', user()} | not_found()). --spec(add_vhost/1 :: (vhost()) -> 'ok'). --spec(delete_vhost/1 :: (vhost()) -> 'ok'). --spec(list_vhosts/0 :: () -> [vhost()]). --spec(set_permissions/5 :: - (username(), vhost(), regexp(), regexp(), regexp()) -> 'ok'). --spec(clear_permissions/2 :: (username(), vhost()) -> 'ok'). +-spec(lookup_user/1 :: (username()) -> + {'ok', user()} | rabbit_misc:not_found()). +-spec(add_vhost/1 :: (rabbit:vhost()) -> 'ok'). +-spec(delete_vhost/1 :: (rabbit:vhost()) -> 'ok'). +-spec(list_vhosts/0 :: () -> [rabbit:vhost()]). +-spec(set_permissions/5 ::(username(), rabbit:vhost(), regexp(), + regexp(), regexp()) -> 'ok'). +-spec(clear_permissions/2 :: (username(), rabbit:vhost()) -> 'ok'). -spec(list_vhost_permissions/1 :: - (vhost()) -> [{username(), regexp(), regexp(), regexp()}]). + (rabbit:vhost()) -> [{username(), regexp(), regexp(), regexp()}]). -spec(list_user_permissions/1 :: - (username()) -> [{vhost(), regexp(), regexp(), regexp()}]). + (username()) -> [{rabbit:vhost(), regexp(), regexp(), regexp()}]). -endif. diff --git a/src/rabbit_amqqueue.erl b/src/rabbit_amqqueue.erl index 7b3d793b..ffa46642 100644 --- a/src/rabbit_amqqueue.erl +++ b/src/rabbit_amqqueue.erl @@ -47,6 +47,8 @@ -export([commit_all/3, rollback_all/3, notify_down_all/2, limit_all/3]). -export([on_node_down/1]). +-export_type([amqqueue/0, name/0, qmsg/0]). + -import(mnesia). -import(gen_server2). -import(lists). @@ -59,30 +61,43 @@ -ifdef(use_specs). +-type(name() :: rabbit_misc:r('queue')). +-type(amqqueue() :: + #amqqueue{name :: name(), + durable :: boolean(), + auto_delete :: boolean(), + exclusive_owner :: rabbit:maybe(pid()), + arguments :: rabbit_framing:amqp_table(), + pid :: rabbit:maybe(pid())}). + -type(qlen() :: {'ok', non_neg_integer()}). -type(qfun(A) :: fun ((amqqueue()) -> A)). +-type(qmsg() :: {name(), pid(), msg_id(), boolean(), rabbit:message()}). +-type(msg_id() :: non_neg_integer()). -type(ok_or_errors() :: 'ok' | {'error', [{'error' | 'exit' | 'throw', any()}]}). -spec(start/0 :: () -> 'ok'). --spec(declare/5 :: (queue_name(), boolean(), boolean(), amqp_table(), - maybe(pid())) -> {'new' | 'existing', amqqueue()}). --spec(lookup/1 :: (queue_name()) -> {'ok', amqqueue()} | not_found()). --spec(with/2 :: (queue_name(), qfun(A)) -> A | not_found()). --spec(with_or_die/2 :: (queue_name(), qfun(A)) -> A). --spec(assert_equivalence/5 :: (amqqueue(), boolean(), boolean(), amqp_table(), - maybe(pid)) -> ok). +-spec(declare/5 :: (name(), boolean(), boolean(), rabbit_framing:amqp_table(), + rabbit:maybe(pid())) -> {'new' | 'existing', amqqueue()}). +-spec(lookup/1 :: (name()) -> {'ok', amqqueue()} | rabbit_misc:not_found()). +-spec(with/2 :: (name(), qfun(A)) -> A | rabbit_misc:not_found()). +-spec(with_or_die/2 :: (name(), qfun(A)) -> A). +-spec(assert_equivalence/5 :: (amqqueue(), boolean(), boolean(), + rabbit_framing:amqp_table(), rabbit:maybe(pid)) + -> ok). -spec(check_exclusive_access/2 :: (amqqueue(), pid()) -> 'ok'). --spec(with_exclusive_access_or_die/3 :: (queue_name(), pid(), qfun(A)) -> A). --spec(list/1 :: (vhost()) -> [amqqueue()]). --spec(info_keys/0 :: () -> [info_key()]). --spec(info/1 :: (amqqueue()) -> [info()]). --spec(info/2 :: (amqqueue(), [info_key()]) -> [info()]). --spec(info_all/1 :: (vhost()) -> [[info()]]). --spec(info_all/2 :: (vhost(), [info_key()]) -> [[info()]]). --spec(consumers/1 :: (amqqueue()) -> [{pid(), ctag(), boolean()}]). --spec(consumers_all/1 :: - (vhost()) -> [{queue_name(), pid(), ctag(), boolean()}]). +-spec(with_exclusive_access_or_die/3 :: (name(), pid(), qfun(A)) -> A). +-spec(list/1 :: (rabbit:vhost()) -> [amqqueue()]). +-spec(info_keys/0 :: () -> [rabbit:info_key()]). +-spec(info/1 :: (amqqueue()) -> [rabbit:info()]). +-spec(info/2 :: (amqqueue(), [rabbit:info_key()]) -> [rabbit:info()]). +-spec(info_all/1 :: (rabbit:vhost()) -> [[rabbit:info()]]). +-spec(info_all/2 :: (rabbit:vhost(), [rabbit:info_key()]) + -> [[rabbit:info()]]). +-spec(consumers/1 :: (amqqueue()) -> [{pid(), rabbit:ctag(), boolean()}]). +-spec(consumers_all/1 :: (rabbit:vhost()) + -> [{name(), pid(), rabbit:ctag(), boolean()}]). -spec(stat/1 :: (amqqueue()) -> {'ok', non_neg_integer(), non_neg_integer()}). -spec(delete/3 :: @@ -93,30 +108,31 @@ {'error', 'in_use'} | {'error', 'not_empty'}). -spec(purge/1 :: (amqqueue()) -> qlen()). --spec(deliver/2 :: (pid(), delivery()) -> boolean()). +-spec(deliver/2 :: (pid(), rabbit:delivery()) -> boolean()). -spec(requeue/3 :: (pid(), [msg_id()], pid()) -> 'ok'). --spec(ack/4 :: (pid(), maybe(txn()), [msg_id()], pid()) -> 'ok'). --spec(commit_all/3 :: ([pid()], txn(), pid()) -> ok_or_errors()). --spec(rollback_all/3 :: ([pid()], txn(), pid()) -> 'ok'). +-spec(ack/4 :: (pid(), rabbit:maybe(rabbit:txn()), [msg_id()], pid()) + -> 'ok'). +-spec(commit_all/3 :: ([pid()], rabbit:txn(), pid()) -> ok_or_errors()). +-spec(rollback_all/3 :: ([pid()], rabbit:txn(), pid()) -> 'ok'). -spec(notify_down_all/2 :: ([pid()], pid()) -> ok_or_errors()). -spec(limit_all/3 :: ([pid()], pid(), pid() | 'undefined') -> ok_or_errors()). -spec(basic_get/3 :: (amqqueue(), pid(), boolean()) -> {'ok', non_neg_integer(), qmsg()} | 'empty'). -spec(basic_consume/7 :: - (amqqueue(), boolean(), pid(), pid() | 'undefined', ctag(), - boolean(), any()) -> - 'ok' | {'error', 'exclusive_consume_unavailable'}). --spec(basic_cancel/4 :: (amqqueue(), pid(), ctag(), any()) -> 'ok'). + (amqqueue(), boolean(), pid(), pid() | 'undefined', + rabbit:ctag(), boolean(), any()) + -> 'ok' | {'error', 'exclusive_consume_unavailable'}). +-spec(basic_cancel/4 :: (amqqueue(), pid(), rabbit:ctag(), any()) -> 'ok'). -spec(notify_sent/2 :: (pid(), pid()) -> 'ok'). -spec(unblock/2 :: (pid(), pid()) -> 'ok'). -spec(flush_all/2 :: ([pid()], pid()) -> 'ok'). -spec(internal_declare/2 :: (amqqueue(), boolean()) -> amqqueue() | 'not_found'). --spec(internal_delete/1 :: (queue_name()) -> 'ok' | not_found()). +-spec(internal_delete/1 :: (name()) -> 'ok' | rabbit_misc:not_found()). -spec(maybe_run_queue_via_backing_queue/2 :: (pid(), (fun ((A) -> A))) -> 'ok'). -spec(update_ram_duration/1 :: (pid()) -> 'ok'). -spec(set_ram_duration_target/2 :: (pid(), number() | 'infinity') -> 'ok'). -spec(set_maximum_since_use/2 :: (pid(), non_neg_integer()) -> 'ok'). --spec(on_node_down/1 :: (erlang_node()) -> 'ok'). +-spec(on_node_down/1 :: (node()) -> 'ok'). -spec(pseudo_queue/2 :: (binary(), pid()) -> amqqueue()). -endif. diff --git a/src/rabbit_basic.erl b/src/rabbit_basic.erl index 4ab7a2a0..fb6f85dd 100644 --- a/src/rabbit_basic.erl +++ b/src/rabbit_basic.erl @@ -42,24 +42,28 @@ -ifdef(use_specs). --type(properties_input() :: (amqp_properties() | [{atom(), any()}])). --type(publish_result() :: ({ok, routing_result(), [pid()]} | not_found())). - --spec(publish/1 :: (delivery()) -> publish_result()). --spec(delivery/4 :: (boolean(), boolean(), maybe(txn()), message()) -> - delivery()). --spec(message/4 :: (exchange_name(), routing_key(), properties_input(), - binary()) -> (message() | {'error', any()})). --spec(properties/1 :: (properties_input()) -> amqp_properties()). --spec(publish/4 :: (exchange_name(), routing_key(), properties_input(), - binary()) -> publish_result()). --spec(publish/7 :: (exchange_name(), routing_key(), boolean(), boolean(), - maybe(txn()), properties_input(), binary()) -> - publish_result()). --spec(build_content/2 :: (amqp_properties(), binary()) -> content()). --spec(from_content/1 :: (content()) -> {amqp_properties(), binary()}). +-type(properties_input() :: (rabbit_framing:amqp_property_record() | [{atom(), any()}])). +-type(publish_result() :: ({ok, rabbit_router:routing_result(), [pid()]} + | rabbit_misc:not_found())). + +-spec(publish/1 :: (rabbit:delivery()) -> publish_result()). +-spec(delivery/4 :: (boolean(), boolean(), rabbit:maybe(rabbit:txn()), + rabbit:message()) -> rabbit:delivery()). +-spec(message/4 :: (rabbit_exchange:name(), rabbit_router:routing_key(), + properties_input(), binary()) + -> (rabbit:message() | {'error', any()})). +-spec(properties/1 :: (properties_input()) -> rabbit_framing:amqp_property_record()). +-spec(publish/4 :: (rabbit_exchange:name(), rabbit_router:routing_key(), + properties_input(), binary()) -> publish_result()). +-spec(publish/7 :: (rabbit_exchange:name(), rabbit_router:routing_key(), boolean(), boolean(), + rabbit:maybe(rabbit:txn()), properties_input(), binary()) -> + publish_result()). +-spec(build_content/2 :: + (rabbit_framing:amqp_property_record(), binary()) -> rabbit:content()). +-spec(from_content/1 :: (rabbit:content()) + -> {rabbit_framing:amqp_property_record(), binary()}). -spec(is_message_persistent/1 :: - (decoded_content()) -> (boolean() | {'invalid', non_neg_integer()})). + (rabbit:decoded_content()) -> (boolean() | {'invalid', non_neg_integer()})). -endif. diff --git a/src/rabbit_binary_generator.erl b/src/rabbit_binary_generator.erl index 81cf3cee..a2af46c9 100644 --- a/src/rabbit_binary_generator.erl +++ b/src/rabbit_binary_generator.erl @@ -57,15 +57,18 @@ -type(frame() :: [binary()]). -spec(build_simple_method_frame/2 :: - (channel_number(), amqp_method_record()) -> frame()). + (rabbit_channel:channel_number(), rabbit_framing:amqp_method_record()) + -> frame()). -spec(build_simple_content_frames/3 :: - (channel_number(), content(), non_neg_integer()) -> [frame()]). + (rabbit_channel:channel_number(), rabbit:content(), non_neg_integer()) + -> [frame()]). -spec(build_heartbeat_frame/0 :: () -> frame()). --spec(generate_table/1 :: (amqp_table()) -> binary()). --spec(encode_properties/2 :: ([amqp_property_type()], [any()]) -> binary()). +-spec(generate_table/1 :: (rabbit_framing:amqp_table()) -> binary()). +-spec(encode_properties/2 :: ([rabbit_framing:amqp_property_type()], [any()]) + -> binary()). -spec(check_empty_content_body_frame_size/0 :: () -> 'ok'). --spec(ensure_content_encoded/1 :: (content()) -> encoded_content()). --spec(clear_encoded_content/1 :: (content()) -> unencoded_content()). +-spec(ensure_content_encoded/1 :: (rabbit:content()) -> rabbit:encoded_content()). +-spec(clear_encoded_content/1 :: (rabbit:content()) -> rabbit:unencoded_content()). -endif. diff --git a/src/rabbit_binary_parser.erl b/src/rabbit_binary_parser.erl index e022a1fa..a8879bea 100644 --- a/src/rabbit_binary_parser.erl +++ b/src/rabbit_binary_parser.erl @@ -42,10 +42,13 @@ -ifdef(use_specs). --spec(parse_table/1 :: (binary()) -> amqp_table()). --spec(parse_properties/2 :: ([amqp_property_type()], binary()) -> [any()]). --spec(ensure_content_decoded/1 :: (content()) -> decoded_content()). --spec(clear_decoded_content/1 :: (content()) -> undecoded_content()). +-spec(parse_table/1 :: (binary()) -> rabbit_framing:amqp_table()). +-spec(parse_properties/2 :: + ([rabbit_framing:amqp_property_type()], binary()) -> [any()]). +-spec(ensure_content_decoded/1 :: + (rabbit:content()) -> rabbit:decoded_content()). +-spec(clear_decoded_content/1 :: + (rabbit:content()) -> rabbit:undecoded_content()). -endif. diff --git a/src/rabbit_channel.erl b/src/rabbit_channel.erl index 94a20fbd..915a41ee 100644 --- a/src/rabbit_channel.erl +++ b/src/rabbit_channel.erl @@ -44,6 +44,8 @@ -export([init/1, terminate/2, code_change/3, handle_call/3, handle_cast/2, handle_info/2, handle_pre_hibernate/1]). +-export_type([channel_number/0]). + -record(ch, {state, channel, reader_pid, writer_pid, limiter_pid, transaction_id, tx_participants, next_tag, uncommitted_ack_q, unacked_message_q, @@ -72,23 +74,26 @@ -ifdef(use_specs). -type(ref() :: any()). +-type(channel_number() :: non_neg_integer()). -spec(start_link/6 :: - (channel_number(), pid(), pid(), username(), vhost(), pid()) -> pid()). --spec(do/2 :: (pid(), amqp_method_record()) -> 'ok'). --spec(do/3 :: (pid(), amqp_method_record(), maybe(content())) -> 'ok'). + (channel_number(), pid(), pid(), rabbit_access_control:username(), + rabbit:vhost(), pid()) -> pid()). +-spec(do/2 :: (pid(), rabbit_framing:amqp_method_record()) -> 'ok'). +-spec(do/3 :: (pid(), rabbit_framing:amqp_method_record(), + rabbit:maybe(rabbit:content())) -> 'ok'). -spec(shutdown/1 :: (pid()) -> 'ok'). --spec(send_command/2 :: (pid(), amqp_method()) -> 'ok'). --spec(deliver/4 :: (pid(), ctag(), boolean(), qmsg()) -> 'ok'). +-spec(send_command/2 :: (pid(), rabbit_framing:amqp_method()) -> 'ok'). +-spec(deliver/4 ::(pid(), rabbit:ctag(), boolean(), rabbit_amqqueue:qmsg()) -> 'ok'). -spec(conserve_memory/2 :: (pid(), boolean()) -> 'ok'). -spec(flushed/2 :: (pid(), pid()) -> 'ok'). -spec(flow_timeout/2 :: (pid(), ref()) -> 'ok'). -spec(list/0 :: () -> [pid()]). --spec(info_keys/0 :: () -> [info_key()]). --spec(info/1 :: (pid()) -> [info()]). --spec(info/2 :: (pid(), [info_key()]) -> [info()]). --spec(info_all/0 :: () -> [[info()]]). --spec(info_all/1 :: ([info_key()]) -> [[info()]]). +-spec(info_keys/0 :: () -> [rabbit:info_key()]). +-spec(info/1 :: (pid()) -> [rabbit:info()]). +-spec(info/2 :: (pid(), [rabbit:info_key()]) -> [rabbit:info()]). +-spec(info_all/0 :: () -> [[rabbit:info()]]). +-spec(info_all/1 :: ([rabbit:info_key()]) -> [[rabbit:info()]]). -endif. diff --git a/src/rabbit_control.erl b/src/rabbit_control.erl index 323d4d2f..95a49f86 100644 --- a/src/rabbit_control.erl +++ b/src/rabbit_control.erl @@ -44,7 +44,7 @@ -spec(start/0 :: () -> no_return()). -spec(stop/0 :: () -> 'ok'). --spec(action/4 :: (atom(), erlang_node(), [string()], +-spec(action/4 :: (atom(), node(), [string()], fun ((string(), [any()]) -> 'ok')) -> 'ok'). -spec(usage/0 :: () -> no_return()). diff --git a/src/rabbit_dialyzer.erl b/src/rabbit_dialyzer.erl index f19e8d02..5805611f 100644 --- a/src/rabbit_dialyzer.erl +++ b/src/rabbit_dialyzer.erl @@ -38,9 +38,9 @@ -ifdef(use_specs). --spec(create_basic_plt/1 :: (file_path()) -> 'ok'). --spec(add_to_plt/2 :: (file_path(), string()) -> 'ok'). --spec(dialyze_files/2 :: (file_path(), string()) -> 'ok'). +-spec(create_basic_plt/1 :: (file:filename()) -> 'ok'). +-spec(add_to_plt/2 :: (file:filename(), string()) -> 'ok'). +-spec(dialyze_files/2 :: (file:filename(), string()) -> 'ok'). -spec(halt_with_code/1 :: (atom()) -> no_return()). -endif. diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl index d77bf833..0e5b9baf 100644 --- a/src/rabbit_exchange.erl +++ b/src/rabbit_exchange.erl @@ -43,6 +43,8 @@ -export([assert_args_equivalence/2]). -export([check_type/1]). +-export_type([name/0, exchange/0, binding/0]). + %% EXTENDED API -export([list_exchange_bindings/1]). -export([list_queue_bindings/1]). @@ -56,6 +58,21 @@ -ifdef(use_specs). +-type(name() :: rabbit_misc:r('exchange')). +-type(exchange() :: + #exchange{name :: name(), + type :: type(), + durable :: boolean(), + auto_delete :: boolean(), + arguments :: rabbit_framing:amqp_table()}). +-type(type() :: atom()). +-type(binding_key() :: binary()). +-type(binding() :: + #binding{exchange_name :: name(), + queue_name :: rabbit_amqqueue:name(), + key :: binding_key()}). + + -type(bind_res() :: 'ok' | {'error', 'queue_not_found' | 'exchange_not_found' | @@ -63,38 +80,47 @@ -type(inner_fun() :: fun((exchange(), queue()) -> any())). -spec(recover/0 :: () -> 'ok'). --spec(declare/5 :: (exchange_name(), exchange_type(), boolean(), boolean(), - amqp_table()) -> exchange()). +-spec(declare/5 :: (name(), type(), boolean(), boolean(), + rabbit_framing:amqp_table()) -> exchange()). -spec(check_type/1 :: (binary()) -> atom()). -spec(assert_equivalence/5 :: (exchange(), atom(), boolean(), boolean(), - amqp_table()) -> 'ok'). --spec(assert_args_equivalence/2 :: (exchange(), amqp_table()) -> 'ok'). --spec(lookup/1 :: (exchange_name()) -> {'ok', exchange()} | not_found()). --spec(lookup_or_die/1 :: (exchange_name()) -> exchange()). --spec(list/1 :: (vhost()) -> [exchange()]). --spec(info_keys/0 :: () -> [info_key()]). --spec(info/1 :: (exchange()) -> [info()]). --spec(info/2 :: (exchange(), [info_key()]) -> [info()]). --spec(info_all/1 :: (vhost()) -> [[info()]]). --spec(info_all/2 :: (vhost(), [info_key()]) -> [[info()]]). --spec(publish/2 :: (exchange(), delivery()) -> {routing_result(), [pid()]}). + rabbit_framing:amqp_table()) -> 'ok'). +-spec(assert_args_equivalence/2 :: + (exchange(), rabbit_framing:amqp_table()) -> 'ok'). +-spec(lookup/1 :: (name()) + -> {'ok', exchange()} | rabbit_misc:not_found()). +-spec(lookup_or_die/1 :: (name()) -> exchange()). +-spec(list/1 :: (rabbit:vhost()) -> [exchange()]). +-spec(info_keys/0 :: () -> [rabbit:info_key()]). +-spec(info/1 :: (exchange()) -> [rabbit:info()]). +-spec(info/2 :: (exchange(), [rabbit:info_key()]) -> [rabbit:info()]). +-spec(info_all/1 :: (rabbit:vhost()) -> [[rabbit:info()]]). +-spec(info_all/2 :: (rabbit:vhost(), [rabbit:info_key()]) + -> [[rabbit:info()]]). +-spec(publish/2 :: (exchange(), rabbit:delivery()) + -> {rabbit_router:routing_result(), [pid()]}). -spec(add_binding/5 :: - (exchange_name(), queue_name(), routing_key(), amqp_table(), inner_fun()) -> - bind_res()). + (name(), rabbit_amqqueue:name(), rabbit_router:routing_key(), + rabbit_framing:amqp_table(), inner_fun()) -> bind_res()). -spec(delete_binding/5 :: - (exchange_name(), queue_name(), routing_key(), amqp_table(), inner_fun()) -> - bind_res() | {'error', 'binding_not_found'}). --spec(list_bindings/1 :: (vhost()) -> - [{exchange_name(), queue_name(), routing_key(), amqp_table()}]). --spec(delete_queue_bindings/1 :: (queue_name()) -> fun (() -> none())). --spec(delete_transient_queue_bindings/1 :: (queue_name()) -> + (name(), rabbit_amqqueue:name(), rabbit_router:routing_key(), + rabbit_framing:amqp_table(), inner_fun()) + -> bind_res() | {'error', 'binding_not_found'}). +-spec(list_bindings/1 :: (rabbit:vhost()) -> + [{name(), rabbit_amqqueue:name(), + rabbit_router:routing_key(), rabbit_framing:amqp_table()}]). +-spec(delete_queue_bindings/1 :: + (rabbit_amqqueue:name()) -> fun (() -> none())). +-spec(delete_transient_queue_bindings/1 :: (rabbit_amqqueue:name()) -> fun (() -> none())). --spec(delete/2 :: (exchange_name(), boolean()) -> - 'ok' | not_found() | {'error', 'in_use'}). --spec(list_queue_bindings/1 :: (queue_name()) -> - [{exchange_name(), routing_key(), amqp_table()}]). --spec(list_exchange_bindings/1 :: (exchange_name()) -> - [{queue_name(), routing_key(), amqp_table()}]). +-spec(delete/2 :: (name(), boolean()) -> + 'ok' | rabbit_misc:not_found() | {'error', 'in_use'}). +-spec(list_queue_bindings/1 :: + (rabbit_amqqueue:name()) + -> [{name(), rabbit_router:routing_key(), rabbit_framing:amqp_table()}]). +-spec(list_exchange_bindings/1 :: + (name()) -> [{rabbit_amqqueue:name(), rabbit_router:routing_key(), + rabbit_framing:amqp_table()}]). -endif. diff --git a/src/rabbit_exchange_type_headers.erl b/src/rabbit_exchange_type_headers.erl index 315e8000..c748c364 100644 --- a/src/rabbit_exchange_type_headers.erl +++ b/src/rabbit_exchange_type_headers.erl @@ -48,7 +48,8 @@ {enables, kernel_ready}]}). -ifdef(use_specs). --spec(headers_match/2 :: (amqp_table(), amqp_table()) -> boolean()). +-spec(headers_match/2 :: (rabbit_framing:amqp_table(), + rabbit_framing:amqp_table()) -> boolean()). -endif. description() -> diff --git a/src/rabbit_guid.erl b/src/rabbit_guid.erl index 1ae8f7da..a44e0f58 100644 --- a/src/rabbit_guid.erl +++ b/src/rabbit_guid.erl @@ -41,6 +41,8 @@ -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). +-export_type([guid/0]). + -define(SERVER, ?MODULE). -define(SERIAL_FILENAME, "rabbit_serial"). @@ -50,6 +52,8 @@ -ifdef(use_specs). +-type(guid() :: binary()). + -spec(start_link/0 :: () -> {'ok', pid()} | 'ignore' | {'error', any()}). -spec(guid/0 :: () -> guid()). -spec(string_guid/1 :: (any()) -> string()). diff --git a/src/rabbit_invariable_queue.erl b/src/rabbit_invariable_queue.erl index a7ca20c8..df8adb2e 100644 --- a/src/rabbit_invariable_queue.erl +++ b/src/rabbit_invariable_queue.erl @@ -48,11 +48,11 @@ -ifdef(use_specs). --type(ack() :: guid() | 'blank_ack'). +-type(ack() :: rabbit_guid:guid() | 'blank_ack'). -type(state() :: #iv_state { queue :: queue(), - qname :: queue_name(), + qname :: rabbit_amqqueue:name(), len :: non_neg_integer(), - pending_ack :: dict() + pending_ack :: dict:dictionary() }). -include("rabbit_backing_queue_spec.hrl"). diff --git a/src/rabbit_load.erl b/src/rabbit_load.erl index 4f467162..e0457b1e 100644 --- a/src/rabbit_load.erl +++ b/src/rabbit_load.erl @@ -40,11 +40,10 @@ -ifdef(use_specs). --type(erlang_node() :: atom()). --type(load() :: {{non_neg_integer(), integer() | 'unknown'}, erlang_node()}). +-type(load() :: {{non_neg_integer(), integer() | 'unknown'}, node()}). -spec(local_load/0 :: () -> load()). -spec(remote_loads/0 :: () -> [load()]). --spec(pick/0 :: () -> erlang_node()). +-spec(pick/0 :: () -> node()). -endif. diff --git a/src/rabbit_misc.erl b/src/rabbit_misc.erl index 35739dcb..bf4aaeb4 100644 --- a/src/rabbit_misc.erl +++ b/src/rabbit_misc.erl @@ -32,6 +32,7 @@ -module(rabbit_misc). -include("rabbit.hrl"). -include("rabbit_framing.hrl"). + -include_lib("kernel/include/file.hrl"). -export([method_record_type/1, polite_pause/0, polite_pause/1]). @@ -62,6 +63,8 @@ -export([version_compare/2, version_compare/3]). -export([recursive_delete/1, dict_cons/3, unlink_and_capture_exit/1]). +-export_type([not_found/0, amqp_error/0, r/1]). + -import(mnesia). -import(lists). -import(cover). @@ -71,50 +74,67 @@ -ifdef(use_specs). --include_lib("kernel/include/inet.hrl"). - -type(ok_or_error() :: 'ok' | {'error', any()}). - --spec(method_record_type/1 :: (tuple()) -> atom()). +-type(amqp_error() :: + #amqp_error{name :: rabbit_framing:amqp_exception(), + explanation :: string(), + method :: rabbit_framing:amqp_method_name()}). +-type(not_found() :: {'error', 'not_found'}). +-type(resource_name() :: binary()). +-type(r(Kind) :: + #resource{virtual_host :: rabbit:vhost(), + kind :: Kind, + name :: resource_name()}). +-type(thunk(T) :: fun(() -> T)). + +-spec(method_record_type/1 :: (rabbit_framing:amqp_method_record()) + -> rabbit_framing:amqp_method_name()). -spec(polite_pause/0 :: () -> 'done'). -spec(polite_pause/1 :: (non_neg_integer()) -> 'done'). --spec(die/1 :: (atom()) -> no_return()). --spec(frame_error/2 :: (atom(), binary()) -> no_return()). --spec(amqp_error/4 :: (atom(), string(), [any()], atom()) -> amqp_error()). --spec(protocol_error/3 :: (atom(), string(), [any()]) -> no_return()). --spec(protocol_error/4 :: (atom(), string(), [any()], atom()) -> no_return()). +-spec(die/1 :: (rabbit_framing:amqp_exception()) -> no_return()). +-spec(frame_error/2 :: (rabbit_framing:amqp_method_name(), binary()) + -> no_return()). +-spec(amqp_error/4 :: + (rabbit_framing:amqp_exception(), string(), [any()], + rabbit_framing:amqp_method_name()) -> rabbit_misc:amqp_error()). +-spec(protocol_error/3 :: (rabbit_framing:amqp_exception(), string(), [any()]) + -> no_return()). +-spec(protocol_error/4 :: (rabbit_framing:amqp_exception(), string(), [any()], + rabbit_framing:amqp_method_name()) -> no_return()). -spec(not_found/1 :: (r(atom())) -> no_return()). -spec(get_config/1 :: (atom()) -> {'ok', any()} | not_found()). -spec(get_config/2 :: (atom(), A) -> A). -spec(set_config/2 :: (atom(), any()) -> 'ok'). -spec(dirty_read/1 :: ({atom(), any()}) -> {'ok', any()} | not_found()). --spec(r/3 :: (vhost() | r(atom()), K, resource_name()) -> - r(K) when is_subtype(K, atom())). --spec(r/2 :: (vhost(), K) -> #resource{virtual_host :: vhost(), - kind :: K, - name :: '_'} - when is_subtype(K, atom())). --spec(r_arg/4 :: (vhost() | r(atom()), K, amqp_table(), binary()) -> - undefined | r(K) when is_subtype(K, atom())). +-spec(r/3 :: (rabbit:vhost() | r(atom()), K, resource_name()) + -> r(K) when is_subtype(K, atom())). +-spec(r/2 :: (rabbit:vhost(), K) + -> #resource{virtual_host :: rabbit:vhost(), + kind :: K, + name :: '_'} + when is_subtype(K, atom())). +-spec(r_arg/4 :: (rabbit:vhost() | r(atom()), K, + rabbit_framing:amqp_table(), binary()) + -> undefined | r(K) when is_subtype(K, atom())). -spec(rs/1 :: (r(atom())) -> string()). -spec(enable_cover/0 :: () -> ok_or_error()). -spec(start_cover/1 :: ([{string(), string()} | string()]) -> 'ok'). -spec(report_cover/0 :: () -> 'ok'). --spec(enable_cover/1 :: (file_path()) -> ok_or_error()). --spec(report_cover/1 :: (file_path()) -> 'ok'). --spec(throw_on_error/2 :: - (atom(), thunk({error, any()} | {ok, A} | A)) -> A). +-spec(enable_cover/1 :: (file:filename()) -> ok_or_error()). +-spec(report_cover/1 :: (file:filename()) -> 'ok'). +-spec(throw_on_error/2 :: (atom(), thunk({error, any()} | {ok, A} | A)) -> A). -spec(with_exit_handler/2 :: (thunk(A), thunk(A)) -> A). -spec(filter_exit_map/2 :: (fun ((A) -> B), [A]) -> [B]). --spec(with_user/2 :: (username(), thunk(A)) -> A). --spec(with_vhost/2 :: (vhost(), thunk(A)) -> A). --spec(with_user_and_vhost/3 :: (username(), vhost(), thunk(A)) -> A). +-spec(with_user/2 :: (rabbit_access_control:username(), thunk(A)) -> A). +-spec(with_vhost/2 :: (rabbit:vhost(), thunk(A)) -> A). +-spec(with_user_and_vhost/3 :: (rabbit_access_control:username(), + rabbit:vhost(), thunk(A)) -> A). -spec(execute_mnesia_transaction/1 :: (thunk(A)) -> A). -spec(ensure_ok/2 :: (ok_or_error(), atom()) -> 'ok'). --spec(makenode/1 :: ({string(), string()} | string()) -> erlang_node()). --spec(nodeparts/1 :: (erlang_node() | string()) -> {string(), string()}). +-spec(makenode/1 :: ({string(), string()} | string()) -> node()). +-spec(nodeparts/1 :: (node() | string()) -> {string(), string()}). -spec(cookie_hash/0 :: () -> string()). --spec(tcp_name/3 :: (atom(), ip_address(), ip_port()) -> atom()). +-spec(tcp_name/3 :: (atom(), inet:ip_address(), rabbit:ip_port()) -> atom()). -spec(intersperse/2 :: (A, [A]) -> [A]). -spec(upmap/2 :: (fun ((A) -> B), [A]) -> [B]). -spec(map_in_order/2 :: (fun ((A) -> B), [A]) -> [B]). @@ -122,10 +142,10 @@ -spec(dirty_read_all/1 :: (atom()) -> [any()]). -spec(dirty_foreach_key/2 :: (fun ((any()) -> any()), atom()) -> 'ok' | 'aborted'). --spec(dirty_dump_log/1 :: (file_path()) -> ok_or_error()). --spec(read_term_file/1 :: (file_path()) -> {'ok', [any()]} | {'error', any()}). --spec(write_term_file/2 :: (file_path(), [any()]) -> ok_or_error()). --spec(append_file/2 :: (file_path(), string()) -> ok_or_error()). +-spec(dirty_dump_log/1 :: (file:filename()) -> ok_or_error()). +-spec(read_term_file/1 :: (file:filename()) -> {'ok', [any()]} | {'error', any()}). +-spec(write_term_file/2 :: (file:filename(), [any()]) -> ok_or_error()). +-spec(append_file/2 :: (file:filename(), string()) -> ok_or_error()). -spec(ensure_parent_dirs_exist/1 :: (string()) -> 'ok'). -spec(format_stderr/2 :: (string(), [any()]) -> 'ok'). -spec(start_applications/1 :: ([atom()]) -> 'ok'). @@ -133,15 +153,15 @@ -spec(unfold/2 :: (fun ((A) -> ({'true', B, A} | 'false')), A) -> {[B], A}). -spec(ceil/1 :: (number()) -> integer()). -spec(queue_fold/3 :: (fun ((any(), B) -> B), B, queue()) -> B). --spec(sort_field_table/1 :: (amqp_table()) -> amqp_table()). +-spec(sort_field_table/1 :: (rabbit_framing:amqp_table()) -> rabbit_framing:amqp_table()). -spec(pid_to_string/1 :: (pid()) -> string()). -spec(string_to_pid/1 :: (string()) -> pid()). -spec(version_compare/2 :: (string(), string()) -> 'lt' | 'eq' | 'gt'). -spec(version_compare/3 :: (string(), string(), ('lt' | 'lte' | 'eq' | 'gte' | 'gt')) -> boolean()). --spec(recursive_delete/1 :: ([file_path()]) -> - 'ok' | {'error', {file_path(), any()}}). --spec(dict_cons/3 :: (any(), any(), dict()) -> dict()). +-spec(recursive_delete/1 :: ([file:filename()]) -> + 'ok' | {'error', {file:filename(), any()}}). +-spec(dict_cons/3 :: (any(), any(), dict:dictionary()) -> dict:dictionary()). -spec(unlink_and_capture_exit/1 :: (pid()) -> 'ok'). -endif. diff --git a/src/rabbit_mnesia.erl b/src/rabbit_mnesia.erl index d4b29943..d1d90dbf 100644 --- a/src/rabbit_mnesia.erl +++ b/src/rabbit_mnesia.erl @@ -1,3 +1,4 @@ + %% The contents of this file are subject to the Mozilla Public License %% Version 1.1 (the "License"); you may not use this file except in %% compliance with the License. You may obtain a copy of the License at @@ -41,19 +42,22 @@ %% other mnesia-using Erlang applications, such as ejabberd -export([create_tables/0]). +-export_type([node_type/0]). + -include("rabbit.hrl"). %%---------------------------------------------------------------------------- -ifdef(use_specs). --spec(status/0 :: () -> [{'nodes', [{node_type(), [erlang_node()]}]} | - {'running_nodes', [erlang_node()]}]). --spec(dir/0 :: () -> file_path()). +-type(node_type() :: disc_only | disc | ram | unknown). +-spec(status/0 :: () -> [{'nodes', [{node_type(), [node()]}]} | + {'running_nodes', [node()]}]). +-spec(dir/0 :: () -> file:filename()). -spec(ensure_mnesia_dir/0 :: () -> 'ok'). -spec(init/0 :: () -> 'ok'). -spec(is_db_empty/0 :: () -> boolean()). --spec(cluster/1 :: ([erlang_node()]) -> 'ok'). +-spec(cluster/1 :: ([node()]) -> 'ok'). -spec(reset/0 :: () -> 'ok'). -spec(force_reset/0 :: () -> 'ok'). -spec(is_clustered/0 :: () -> boolean()). diff --git a/src/rabbit_net.erl b/src/rabbit_net.erl index 975954fc..1232b457 100644 --- a/src/rabbit_net.erl +++ b/src/rabbit_net.erl @@ -31,11 +31,12 @@ -module(rabbit_net). -include("rabbit.hrl"). --include_lib("kernel/include/inet.hrl"). -export([async_recv/3, close/1, controlling_process/2, getstat/2, peername/1, port_command/2, send/2, sockname/1]). +-export_type([socket/0]). + %%--------------------------------------------------------------------------- -ifdef(use_specs). @@ -44,6 +45,8 @@ 'recv_cnt' | 'recv_max' | 'recv_avg' | 'recv_oct' | 'recv_dvi' | 'send_cnt' | 'send_max' | 'send_avg' | 'send_oct' | 'send_pend'). -type(error() :: {'error', any()}). +-type(ssl_socket() :: #ssl_socket{}). +-type(socket() :: rabbit:ip_port() | ssl_socket()). -spec(async_recv/3 :: (socket(), integer(), timeout()) -> {'ok', any()}). -spec(close/1 :: (socket()) -> 'ok' | error()). @@ -51,9 +54,9 @@ -spec(port_command/2 :: (socket(), iolist()) -> 'true'). -spec(send/2 :: (socket(), binary() | iolist()) -> 'ok' | error()). -spec(peername/1 :: (socket()) -> - {'ok', {ip_address(), non_neg_integer()}} | error()). + {'ok', {inet:ip_address(), rabbit:ip_port()}} | error()). -spec(sockname/1 :: (socket()) -> - {'ok', {ip_address(), non_neg_integer()}} | error()). + {'ok', {inet:ip_address(), rabbit:ip_port()}} | error()). -spec(getstat/2 :: (socket(), [stat_option()]) -> {'ok', [{stat_option(), integer()}]} | error()). diff --git a/src/rabbit_networking.erl b/src/rabbit_networking.erl index 68ffc98a..6213811c 100644 --- a/src/rabbit_networking.erl +++ b/src/rabbit_networking.erl @@ -63,25 +63,31 @@ -ifdef(use_specs). --type(host() :: ip_address() | string() | atom()). -type(connection() :: pid()). +-type(listener() :: + #listener{node :: node(), + protocol :: atom(), + host :: rabbit:hostname(), + port :: rabbit:ip_port()}). + -spec(start/0 :: () -> 'ok'). --spec(start_tcp_listener/2 :: (host(), ip_port()) -> 'ok'). --spec(start_ssl_listener/3 :: (host(), ip_port(), [info()]) -> 'ok'). --spec(stop_tcp_listener/2 :: (host(), ip_port()) -> 'ok'). +-spec(start_tcp_listener/2 :: (rabbit:hostname(), rabbit:ip_port()) -> 'ok'). +-spec(start_ssl_listener/3 :: (rabbit:hostname(), rabbit:ip_port(), [rabbit:info()]) + -> 'ok'). +-spec(stop_tcp_listener/2 :: (rabbit:hostname(), rabbit:ip_port()) -> 'ok'). -spec(active_listeners/0 :: () -> [listener()]). --spec(node_listeners/1 :: (erlang_node()) -> [listener()]). +-spec(node_listeners/1 :: (node()) -> [listener()]). -spec(connections/0 :: () -> [connection()]). --spec(connection_info_keys/0 :: () -> [info_key()]). --spec(connection_info/1 :: (connection()) -> [info()]). --spec(connection_info/2 :: (connection(), [info_key()]) -> [info()]). --spec(connection_info_all/0 :: () -> [[info()]]). --spec(connection_info_all/1 :: ([info_key()]) -> [[info()]]). +-spec(connection_info_keys/0 :: () -> [rabbit:info_key()]). +-spec(connection_info/1 :: (connection()) -> [rabbit:info()]). +-spec(connection_info/2 :: (connection(), [rabbit:info_key()]) -> [rabbit:info()]). +-spec(connection_info_all/0 :: () -> [[rabbit:info()]]). +-spec(connection_info_all/1 :: ([rabbit:info_key()]) -> [[rabbit:info()]]). -spec(close_connection/2 :: (pid(), string()) -> 'ok'). --spec(on_node_down/1 :: (erlang_node()) -> 'ok'). --spec(check_tcp_listener_address/3 :: (atom(), host(), ip_port()) -> - {ip_address(), atom()}). +-spec(on_node_down/1 :: (node()) -> 'ok'). +-spec(check_tcp_listener_address/3 :: (atom(), rabbit:hostname(), rabbit:ip_port()) -> + {inet:ip_address(), atom()}). -endif. diff --git a/src/rabbit_persister.erl b/src/rabbit_persister.erl index 8d3c2dc0..727fcd1b 100644 --- a/src/rabbit_persister.erl +++ b/src/rabbit_persister.erl @@ -65,21 +65,23 @@ -ifdef(use_specs). --type(pmsg() :: {queue_name(), pkey()}). +-type(pkey() :: rabbit_guid:guid()). +-type(pmsg() :: {rabbit_amqqueue:name(), pkey()}). + -type(work_item() :: - {publish, message(), pmsg()} | + {publish, rabbit:message(), pmsg()} | {deliver, pmsg()} | {ack, pmsg()}). --spec(start_link/1 :: ([queue_name()]) -> +-spec(start_link/1 :: ([rabbit_amqqueue:name()]) -> {'ok', pid()} | 'ignore' | {'error', any()}). -spec(transaction/1 :: ([work_item()]) -> 'ok'). --spec(extend_transaction/2 :: ({txn(), queue_name()}, [work_item()]) -> 'ok'). +-spec(extend_transaction/2 :: ({rabbit:txn(), rabbit_amqqueue:name()}, [work_item()]) -> 'ok'). -spec(dirty_work/1 :: ([work_item()]) -> 'ok'). --spec(commit_transaction/1 :: ({txn(), queue_name()}) -> 'ok'). --spec(rollback_transaction/1 :: ({txn(), queue_name()}) -> 'ok'). +-spec(commit_transaction/1 :: ({rabbit:txn(), rabbit_amqqueue:name()}) -> 'ok'). +-spec(rollback_transaction/1 :: ({rabbit:txn(), rabbit_amqqueue:name()}) -> 'ok'). -spec(force_snapshot/0 :: () -> 'ok'). --spec(queue_content/1 :: (queue_name()) -> [{message(), boolean()}]). +-spec(queue_content/1 :: (rabbit_amqqueue:name()) -> [{rabbit:message(), boolean()}]). -endif. diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl index a54e0de9..81798c5a 100644 --- a/src/rabbit_reader.erl +++ b/src/rabbit_reader.erl @@ -138,11 +138,11 @@ -ifdef(use_specs). --spec(info_keys/0 :: () -> [info_key()]). --spec(info/1 :: (pid()) -> [info()]). --spec(info/2 :: (pid(), [info_key()]) -> [info()]). +-spec(info_keys/0 :: () -> [rabbit:info_key()]). +-spec(info/1 :: (pid()) -> [rabbit:info()]). +-spec(info/2 :: (pid(), [rabbit:info_key()]) -> [rabbit:info()]). -spec(shutdown/2 :: (pid(), string()) -> 'ok'). --spec(server_properties/0 :: () -> amqp_table()). +-spec(server_properties/0 :: () -> rabbit_framing:amqp_table()). -endif. diff --git a/src/rabbit_reader_queue_collector.erl b/src/rabbit_reader_queue_collector.erl index 8d4e8fdb..01eae523 100644 --- a/src/rabbit_reader_queue_collector.erl +++ b/src/rabbit_reader_queue_collector.erl @@ -47,7 +47,7 @@ -ifdef(use_specs). -spec(start_link/0 :: () -> {'ok', pid()}). --spec(register_exclusive_queue/2 :: (pid(), amqqueue()) -> 'ok'). +-spec(register_exclusive_queue/2 :: (pid(), rabbit_amqqueue:amqqueue()) -> 'ok'). -spec(delete_all/1 :: (pid()) -> 'ok'). -endif. diff --git a/src/rabbit_router.erl b/src/rabbit_router.erl index 75196bc0..86ce4128 100644 --- a/src/rabbit_router.erl +++ b/src/rabbit_router.erl @@ -36,12 +36,16 @@ -export([deliver/2, match_bindings/2, match_routing_key/2]). +-export_type([routing_key/0, routing_result/0]). %%---------------------------------------------------------------------------- -ifdef(use_specs). --spec(deliver/2 :: ([pid()], delivery()) -> {routing_result(), [pid()]}). +-type(routing_key() :: binary()). +-type(routing_result() :: 'routed' | 'unroutable' | 'not_delivered'). + +-spec(deliver/2 :: ([pid()], rabbit:delivery()) -> {routing_result(), [pid()]}). -endif. diff --git a/src/rabbit_tests.erl b/src/rabbit_tests.erl index 960d9a9c..d3813bc7 100644 --- a/src/rabbit_tests.erl +++ b/src/rabbit_tests.erl @@ -359,7 +359,7 @@ test_content_framing(FrameMax, Fragments) -> [Header | Frames] = rabbit_binary_generator:build_simple_content_frames( 1, - #content{class_id = 0, properties_bin = <<>>, + #content{class_id = 10, properties = none, properties_bin = <<>>, payload_fragments_rev = Fragments}, FrameMax), %% header is formatted correctly and the size is the total of the diff --git a/src/rabbit_writer.erl b/src/rabbit_writer.erl index 3d10dc12..7c826d98 100644 --- a/src/rabbit_writer.erl +++ b/src/rabbit_writer.erl @@ -48,20 +48,28 @@ -ifdef(use_specs). --spec(start/3 :: (socket(), channel_number(), non_neg_integer()) -> pid()). --spec(start_link/3 :: (socket(), channel_number(), non_neg_integer()) -> pid()). --spec(send_command/2 :: (pid(), amqp_method_record()) -> 'ok'). --spec(send_command/3 :: (pid(), amqp_method_record(), content()) -> 'ok'). --spec(send_command_and_signal_back/3 :: (pid(), amqp_method(), pid()) -> 'ok'). +-spec(start/3 :: + (rabbit_net:socket(), rabbit_channel:channel_number(), non_neg_integer()) + -> pid()). +-spec(start_link/3 :: + (rabbit_net:socket(), rabbit_channel:channel_number(), non_neg_integer()) + -> pid()). +-spec(send_command/2 :: (pid(), rabbit_framing:amqp_method_record()) -> 'ok'). +-spec(send_command/3 :: + (pid(), rabbit_framing:amqp_method_record(), rabbit:content()) -> 'ok'). +-spec(send_command_and_signal_back/3 :: + (pid(), rabbit_framing:amqp_method(), pid()) -> 'ok'). -spec(send_command_and_signal_back/4 :: - (pid(), amqp_method(), content(), pid()) -> 'ok'). + (pid(), rabbit_framing:amqp_method(), rabbit:content(), pid()) -> 'ok'). -spec(send_command_and_notify/5 :: - (pid(), pid(), pid(), amqp_method_record(), content()) -> 'ok'). + (pid(), pid(), pid(), rabbit_framing:amqp_method_record(), rabbit:content()) + -> 'ok'). -spec(internal_send_command/3 :: - (socket(), channel_number(), amqp_method_record()) -> 'ok'). + (rabbit_net:socket(), rabbit_channel:channel_number(), rabbit_framing:amqp_method_record()) + -> 'ok'). -spec(internal_send_command/5 :: - (socket(), channel_number(), amqp_method_record(), - content(), non_neg_integer()) -> 'ok'). + (rabbit_net:socket(), rabbit_channel:channel_number(), rabbit_framing:amqp_method_record(), + rabbit:content(), non_neg_integer()) -> 'ok'). -endif. |