Skip to content
Snippets Groups Projects
  1. Jan 23, 2017
    • George Joseph's avatar
      ari: Implement 'debug all' and request/response logging · 66916067
      George Joseph authored
      The 'ari set debug' command has been enhanced to accept 'all' as an
      application name.  This allows dumping of all apps even if an app
      hasn't registered yet.  To accomplish this, a new global_debug global
      variable was added to res/stasis/app.c and new APIs were added to
      set and query the value.
      
      'ari set debug' now displays requests and responses as well as events.
      This required refactoring the existing debug code.
      
      * The implementation for 'ari set debug' was moved from stasis/cli.{c,h}
        to ari/cli.{c,h}, and stasis/cli.{c,h} were deleted.
      * In order to print the body of incoming requests even if a request
        failed, the consumption of the body was moved from the ari stubs
        to ast_ari_callback in res_ari.c and the moustache templates were
        then regenerated.  The body is now passed to ast_ari_invoke and then
        on to the handlers.  This results in code savings since that template
        was inserted multiple times into all the stubs.
      
      An additional change was made to the ao2_str_container implementation
      to add partial key searching and a sort function.  The existing cli
      code assumed it was already there when it wasn't so the tab completion
      was never working.
      
      Change-Id: Ief936f747ce47f1fb14035fbe61152cf766406bf
      (cherry picked from commit 1d890874)
      66916067
    • Tzafrir Cohen's avatar
      test_voicemail_api: order of params to VERIFY macros · f3f9175d
      Tzafrir Cohen authored
      Fix order of parameters in calls to VM_API_INT_VERIFY and
      VM_API_STRING_VERIFY
      
      ASTERISK-26739 #close
      
      Change-Id: I30dc6b36893aadad6012be3f16f93aa5720870d6
      Note: status: builds. Not tested any further.
      f3f9175d
  2. Jan 22, 2017
    • Richard Mudgett's avatar
      LISTFILTER: Remove outdated ERROR message. · cfe72c39
      Richard Mudgett authored
      Feeding LISTFILTER an empty variable results in an invalid ERROR message.
      Earlier changes made the message useless because we can no longer tell if
      the variable is empty or does not exist.  It is valid to try to remove a
      value from an empty list just as it is valid to try to remove a value that
      is not in a non-empty list.
      
      * Removed the outdated ERROR message.
      
      * Added more test cases to the LISTFILTER unit test.
      
      Change-Id: Ided9040e6359c44a335ef54e02ef5950a1863134
      cfe72c39
  3. Jan 21, 2017
    • Tzafrir Cohen's avatar
      tests: use datadir for sound files · dbb9c814
      Tzafrir Cohen authored
      Some (voicemail-related) tests API symlinks beep.gsm and other files
      from ast_config_AST_VAR_DIR. It should use ast_config_AST_DATA_DIR.
      
      ASTERISK-26740 #close
      
      Change-Id: Id49c56fb9e16df64b1a2b829693ca7601252df89
      dbb9c814
  4. Dec 07, 2016
  5. Nov 16, 2016
    • George Joseph's avatar
      file.c/__ast_file_read_dirs: Fix issues on filesystems without d_type · 3017f09f
      George Joseph authored
      One of the code paths in __ast_file_read_dirs will only get executed if
      the OS doesn't support dirent->d_type OR if the filesystem the
      particular file is on doesn't support it.  So, while standard Linux
      systems support the field, some filesystems like XFS do not.  In this
      case, we need to call stat() to determine whether the directory entry
      is a file or directory so we append the filename to the supplied
      directory path and call stat.  We forgot to truncate path back to just
      the directory afterwards though so we were passing a complete file name
      to the callback in the dir_name parameter instead of just the directory
      name.
      
      The logic has been re-written to only create a full_path if we need to
      call stat() or if we need to descend into another directory.
      
      Change-Id: I54e4228bd8355fad65200c6df3ec4c9c8a98dfba
      3017f09f
  6. Nov 04, 2016
    • Kevin Harwell's avatar
      stasis_recording/stored: remove calls to deprecated readdir_r function. · 70d5f90e
      Kevin Harwell authored
      The readdir_r function has been deprecated and should no longer be used. This
      patch removes the readdir_r dependency (replaced it with readdir) and also moves
      the directory search code to a more centralized spot (file.c)
      
      Also removed a strict dependency on the dirent structure's d_type field as it
      is not portable. The code now checks to see if the value is available. If so,
      it tries to use it, but defaults back to using the stats function if necessary.
      
      Lastly, for most implementations of readdir it *should* be thread-safe to make
      concurrent calls to it as long as different directory streams are specified.
      glibc falls into this category. However, since it is possible that there exist
      some implementations that are not safe, locking has been added for those other
      than glibc.
      
      ASTERISK-26412
      ASTERISK-26509 #close
      
      Change-Id: Id8f54689b1e2873e82a09d0d0d2faf41964e80ba
      70d5f90e
  7. Oct 27, 2016
    • Corey Farrell's avatar
      Remove ASTERISK_REGISTER_FILE. · a6e5bae3
      Corey Farrell authored
      ASTERISK_REGISTER_FILE no longer has any purpose so this commit removes
      all traces of it.
      
      Previously exported symbols removed:
      * __ast_register_file
      * __ast_unregister_file
      * ast_complete_source_filename
      
      This also removes the mtx_prof static variable that was declared when
      MTX_PROFILE was enabled.  This variable was only used in lock.c so it
      is now initialized in that file only.
      
      ASTERISK-26480 #close
      
      Change-Id: I1074af07d71f9e159c48ef36631aa432c86f9966
      a6e5bae3
  8. Oct 25, 2016
    • George Joseph's avatar
      test_astobj2_thrash: Fix multithreaded issues · 802bbf87
      George Joseph authored
      The test uses 4 threads to grow, count, lookup and shrink 15K objects
      in a container.  If there's only 1 execution engine available, the test
      will complete in <50ms.  If each threads gets its own execution engine,
      the test may timeout after 60 seconds because the count thread does a
      locked ao2_callback on the whole container in a tight loop with only
      a sched_yield to give up time.  The lock contention makes the test
      execution times wildly variable and mostly timeout.  2 execution
      engines are OK, 3 results in about 33% failure rate and >=4 causes
      a 80% failure rate.
      
      To fix, the sched_yield was changed to a usleep(500).
      
      Also, the number of buckets specified for the container was an even
      number so that was changed to the next prime number greater than
      (MAX_HASH_ENTRIES / 100).  That's 151 currently.
      
      Change-Id: I50cd2344161ea61bfe4b96d2a29a6ccf88385c77
      802bbf87
  9. Oct 17, 2016
    • Matt Jordan's avatar
      res/ari: Add the Asterisk EID field to outgoing events · dd5129d8
      Matt Jordan authored
      This patch adds the Asterisk EID field to all outgoing ARI events.
      Because this field should be added to all events as they are
      transmitted, it is appended to the JSON message just prior to it being
      handed off to the application message handler. This makes it somewhat
      resilient to both new events being added to ARI, as well as other
      potential event transport mechanisms.
      
      ASTERISK-26470 #close
      
      Change-Id: Ieff0ecc24464e83f3f44e9c3e7bd9a5d70b87a1d
      dd5129d8
  10. Oct 13, 2016
  11. Aug 19, 2016
    • Torrey Searle's avatar
      res_ari: Add http prefix to generated docs · c1b6a796
      Torrey Searle authored
      updated the uri handler to include the url prefix of the http server
      this enables res_ari to add it to the uris when generating docs
      
      Change-Id: I279335a2625261a8492206c37219698f42591c2e
      (cherry picked from commit 6f448f32)
      c1b6a796
  12. Jul 07, 2016
    • Alexei Gradinari's avatar
      res_sorcery_realtime: fix bug when successful UPDATE is treated as failed · c832f100
      Alexei Gradinari authored
      If the SQL UPDATE statement changes nothing then SQLRowCount returns 0.
      This value should be treated as success.
      But the function sorcery_realtime_update treats it as failed.
      
      This bug was found using stress tests on PJSIP.
      If there are 2 consecutive SIP REGISTER requests with the same contact data
      during 1 second then res_pjsip_registrar adds contact location on 1st request
      and tries to update contact location on 2nd.
      The update fails and res_pjsip_registrar even removes correct contact location.
      
      The test "object_update_uncreated" was removed from test_sorcery_realtime.c
      because it's now a valid situation.
      
      This patch also adds missing debug of extra SQL parameter.
      
      ASTERISK-26172 #close
      
      Change-Id: I05a7f3051455336c9dda29efc229decf86071303
      c832f100
  13. Jun 22, 2016
    • George Joseph's avatar
      test_res_pjsip_scheduler: Add 'depends' on pjproject in MODULEINFO · 3b4f5d13
      George Joseph authored
      Since the file was missing the depends on pjproject, it wasn't
      picking up the pjproject related include path.  If there was no
      system installed pjproject and pjproject-bundled was used, a compile
      would fail because pjsip.h wasn't found.
      
      ASTERISK-26139 #close
      
      Change-Id: I2ee64a999051452bc198c4e2c168c70769cd3757
      3b4f5d13
  14. Jun 09, 2016
    • Joshua Colp's avatar
      cel: Ensure only one dial status per channel exists. · d338343d
      Joshua Colp authored
      CEL wrongly assumed that a channel would only have a single dial
      event on it. This is incorrect. Particularly in a queue each
      call attempt to a member will result in a dial event, adding
      a new dial status in CEL without removing the old one. This
      would cause the container to grow with only one dial status
      being removed when the channel went away. The other dial status
      entries would remain leaking memory.
      
      This change fixes the memory leak by ensuring that only one dial
      status will only ever exist for each channel.
      
      The behavior during the scenario where multiple events are received
      has also been improved. For failure cases the first failure will
      be the dial status. If an answer dial status is received, though,
      it will take priority and the dial status for the channel will be
      answer.
      
      Memory usage has also been decreased by storing the minimal
      amount of information and the code has been cleaned up slightly.
      
      ASTERISK-25262 #close
      
      Change-Id: I5944eb923db17b6a0faa7317ff6abc9307c009fe
      d338343d
    • Mark Michelson's avatar
      test_http_media_cache: Fix failing test. · 10019dc7
      Mark Michelson authored
      The retrieve_cache_control_directives test has been failing occasionally
      in Jenkins. The apparent failure occurs when attempting to validate the
      expiration of the retrieved file.
      
      After reproducing, the problem was pretty clear. At the beginning of the
      test, the current time is retrieved. The seconds value of this timestamp
      is X. When the file is retrieved, res_http_media_cache calculates the
      expiration and in doing so retrieves the current time. In most cases,
      since the test executes quickly, it will also retrieve a timestamp with
      X seconds. However, if the test starts very near to when the timestamp
      seconds are set to increment, res_http_media_cache may retrieve a
      timestamp with X+1 seconds instead.
      
      The test attempted to account for this by allowing a tolerance of 1
      second when validating the expiration. However, the problem was that the
      comparisons being used in the validation used > and < operations. This
      meant that values that fell within the tolerance (because they equaled
      the upper bound of the tolerance) would fail.
      
      The solution is to use >= and <= operators in the expiration validation.
      
      However, I estimated that while the one second tolerance should be
      fine on most machines, it would still be possible on a very slow machine
      to end up falling outside the one second tolerance. So I have also
      relaxed the tolerance of expiration validation to be three seconds
      instead.
      
      The final change here is to add a debug message when validating
      expiration so that we can see what values are being compared.
      
      ASTERISK-25959 #close
      Reported by Joshua Colp
      
      Change-Id: Ic1a0e10722c1c5d276d5a4d6a67136d6ec26c247
      10019dc7
    • George Joseph's avatar
      build: Fix ast_sockaddr initialization to be more portable · d21a77b3
      George Joseph authored
      A change to glibc 2.22 changed the order of the sockadddr_storage
      members which caused the places where we do an initialization of
      ast_sockaddr with '{ { 0, 0, } }' to fail compilation.  Those
      initializers (which we shouldn't have been using anyway) have been
      replaced with memsets.
      
      Change-Id: Idd1b3b320903d8771bfe221f0b015685de628fa4
      d21a77b3
  15. Apr 25, 2016
    • George Joseph's avatar
      config: Fix ast_config_text_file_save2 writability check for missing files · 284bb814
      George Joseph authored
      A patch I did back in 2014 modified ast_config_text_file_save2 to check the
      writability of the main file and include files before truncating and re-writing
      them.  An unintended side-effect of this was that if a file doesn't exist,
      the check fails and the write is aborted.
      
      This patch causes ast_config_text_file_save2 to check the writability of the
      parent directory of missing files instead of checking the file itself.  This
      allows missing files to be created again.  A unit test was also added to
      test_config to test saving of config files.
      
      The regression was discovered when app_voicemail's passwordlocation=spooldir
      feature stopped working.
      
      ASTERISK-25917 #close
      Reported-by: Jonathan Rose
      
      Change-Id: Ic4dbe58c277a47b674679e49daed5fc6de349f80
      284bb814
  16. Apr 22, 2016
    • Richard Mudgett's avatar
      test_message.c: Wait longer in case dialplan also processes the test message. · 757ec617
      Richard Mudgett authored
      Bumped the wait from 1 second to 5 seconds.  The test message was hitting my
      default call handler and failing the test because it took longer.
      
      Change-Id: I3a03737f25e92983de00548fcc7bbc50dd7544ba
      757ec617
    • Richard Mudgett's avatar
      bridge_softmix.c: Fix crash if channel fails to join mixing tech. · 71dfa355
      Richard Mudgett authored
      softmix_bridge_join() failed because of an allocation failure.  To address
      this, the softmix bridge technology now checks if the channel failed to
      join softmix successfully.  In addition, the bridge now begins the process
      of kicking the channel out of the bridge so we don't have channels
      partially in the bridge for very long.
      
      * Fix the test_channel_feature_hooks.c unit tests.  The test channel must
      have a valid codec to join the simple_bridge technology.  This patch makes
      joining a bridge more strict by not allowing partially joined channels to
      remain in the bridge.
      
      Change-Id: I97e2ade6a2bcd1214f24fb839fda948825b61a2b
      71dfa355
  17. Apr 14, 2016
    • George Joseph's avatar
      res_pjsip: Add serialized scheduler (res_pjsip/pjsip_scheduler.c) · e83499df
      George Joseph authored
      There are several places that do scheduled tasks or periodic housecleaning,
      each with its own implementation:
      
      * res_pjsip_keepalive has a thread that sends keepalives.
      * pjsip_distributor has a thread that cleans up expired unidentified requests.
      * res_pjsip_registrar_expire has a thread that cleans up expired contacts.
      * res_pjsip_pubsub uses ast_sched directly and then calls ast_sip_push_task.
      * res_pjsip_sdp_rtp also uses ast_sched to send keepalives.
      
      There are also places where we should be doing scheduled work but aren't.
      A good example are the places we have sorcery observers to start registration
      or qualify.  These don't work when changes are made to a backend database
      without a pjsip reload.  We need to check periodically.
      
      As a first step to solving these issues, a new ast_sip_sched facility has
      been created.
      
      ast_sip_sched wraps ast_sched but only uses ast_sched as a scheduled queue.
      When a task is ready to run, ast_sip_task_pusk is called for it. This ensures
      that the task is executed in a PJLIB registered thread and doesn't hold up the
      ast_sched thread so it can immediately continue processing the queue.  The
      serializer used by ast_sip_sched is one of your choosing or a random one from
      the res_pjsip pool if you don't choose one.
      
      Another feature is the ability to automatically clean up the task_data when the
      task expires (if ever).  If it's an ao2 object, it will be dereferenced, if
      it's a malloc'd object it will be freed.  This is selectable when the task is
      scheduled.  Even if you choose to not auto dereference an ao2 task data object,
      the scheduler itself maintains a reference to it while the task is under it's
      control.  This prevents the data from disappearing out from under the task.
      
      There are two scheduling models.
      
      AST_SIP_SCHED_TASK_PERIODIC specifies that the invocations of the task occur at
      the specific interval.  That is, every "interval" milliseconds, regardless of
      how long the task takes.  If the task takes longer than the interval, it will
      be scheduled at the next available multiple of interval.  For exmaple: If the
      task has an interval of 60 secs and the task takes 70 secs (it better not),
      the next invocation will happen at 120 seconds.
      
      AST_SIP_SCHED_TASK_DELAY specifies that the next invocation of the task should
      start "interval" milliseconds after the current invocation has finished.
      
      Also, the same ast_sched facility for fixed or variable intervals exists.  The
      task's return code in conjunction with the AST_SIP_SCHED_TASK_FIXED or
      AST_SIP_SCHED_TASK_VARIABLE flags controls the next invocation start time.
      
      One res_pjsip.h housekeeping change was made.  The pjsip header files were
      added to the top.  There have been a few cases lately where I've needed
      res_pjsip.h just for ast_sip calls and had compiles fail spectacularly because
      I didn't add the pjsip header files to my source even though I never referenced
      any pjsip calls.
      
      Finally, a few new convenience APIs were added to astobj2 to make things a
      little easier in the scheduler.  ao2_ref_and_lock() calls ao2_ref() and
      ao2_lock() in one go.  ao2_unlock_and_unref() does the reverse. A few macros
      were also copied from res_phoneprov because I got tired of having to duplicate
      the same hash, sort and compare functions over and over again. The
      AO2_STRING_FIELD_(HASH|SORT|CMP)_FN macros will insert functions suitable for
      aor_container_alloc into your source.
      
      This facility can be used immediately for the situations where we already have
      a thread that wakes up periodically or do some scheduled work.  For the
      registration and qualify issues, additional sorcery and schema changes would
      need to be made so that we can easily detect changed objects on a periodic
      basis without having to pull the entire database back to check.  I'm thinking
      of a last-updated timestamp on the rows but more on this later.
      
      Change-Id: I7af6ad2b2d896ea68e478aa1ae201d6dd016ba1c
      e83499df
  18. Apr 13, 2016
    • George Joseph's avatar
      stringfields: Update extended string fields for master only. · caa416d5
      George Joseph authored
      In 13, the new ast_string_field_header structure had to be dynamically
      allocated and assigned to a pointer in ast_string_field_mgr to preserve ABI
      compatability.  In master, it can be converted to being a structure-in-place in
      ast_string_field_mgr to eliminate the extra alloc and free calls.
      
      Change-Id: Ia97c5345eec68717a15dc16fe2e6746ff2a926f4
      caa416d5
  19. Apr 08, 2016
    • George Joseph's avatar
      lock: Add named lock capability · 216abb0a
      George Joseph authored
      Locking some objects like sorcery objects can be tricky because the underlying
      ao2 object may not be the same for all callers.  For instance, two threads that
      call ast_sorcery_retrieve_by_id on the same aor name might actually get 2
      different ao2 objects if the underlying wizard had to rehydrate the aor from a
      database. Locking one ao2 object doesn't have any effect on the other even if
      those objects had locks in the first place.
      
      Named locks allow access control by keyspace and key strings.  Now an "aor"
      named "1000" can be locked and any other thread attempting to lock "aor" "1000"
      will wait regardless of whether the underlying ao2 object is the same or not.
      Mutex and rwlocks are supported.
      
      This capability will initially be used to lock an aor when multiple threads may
      be attempting to prune expired contacts from it.
      
      Change-Id: If258c0b7f92b02d07243ce70e535821a1ea7fb45
      216abb0a
  20. Apr 05, 2016
    • George Joseph's avatar
      stringfields: Refactor to allow fields to be added to the end of structures · 4d40b161
      George Joseph authored
      String fields are great, except that you can't add new ones without breaking
      ABI compatibility because it shifts down everything else in the structure.
      The only alternative is to add your own char * field to the end of the
      structure and manage the memory yourself which isn't ideal, especially since
      you then can't use the OPT_STRINGFIELD_T type.
      
      Background:
      
      The reason string fields had to be declared inside the
      AST_DECLARE_STRING_FIELDS block was to facilitate iteration over all declared
      fields for initialization, compare and copy.  Since AST_DECLARE_STRING_FIELDS
      declared the pool, then the fields, then the manager, you could use the offsets
      of the pool and manager and iterate over the sequential addresses in between to
      access the fields. The actual pool, field allocation and field set operations
      don't actually care where the field is.  It's just iteration over the fields
      that was the problem.
      
      Solution: Extended String Fields
      
      An extended string field is one that is declared outside the
      AST_DECLARE_STRING_FIELDS block but still (anywhere) inside the parent
      structure.  Other than using AST_STRING_FIELD_EXTENDED instead of
      AST_STRING_FIELD, it looks the same as other string fields.  It's storage comes
      from the pool and it participates in string field compare and copy operations
      peformed on the parent structure. It's also a valid target for the
      OPT_STRINGFIELD_T aco option type.
      
      Implementation:
      
      To keep track of the extended fields and make sure that ABI isn't broken, the
      existing embedded_pool pointer in the manager structure was repurposed to be a
      pointer to a separate header structure that contains the embedded_pool pointer
      plus a vector of fields.  The length of the manager structure didn't change and
      the embedded_pool pointer isn't used in the macros, only the stringfields C
      code.  A side benefit of this is that changing the header structure in the
      future won't break ABI.
      
      ast_string_fields_init initializes the normal string fields and appends them to
      the vector, and subsequent calls to ast_string_field_init_extended initialize
      and append the extended fields. Cleanup, ast_string_fields_cmp, and
      ast_string_fields_copy can now work on the vector instead of sequentially
      traversing the addresses between the pool and manager.
      
      The total size of a structure using string fields didn't change, whether using
      extended fields or not, nor have the offsets of any structure members, either
      inside the original block or outside.  Adding an extended field to the end of a
      structure is the same as adding a char *.
      
      Details:
      
      The stringfield C code was pulled out from utils.c and into stringfields.c.
      It just made sense.
      
      Additional work was done in ast_string_field_init and
      ast_calloc_with_stringfields to handle the allocation of the new header
      structure and the vector, and the associated cleanup.  In the process some
      additional NULL pointer checking was added.
      
      A lot of work was done in stringfields.h since the logic for compare and copy
      is there.  Documentation was added as well as somne additional NULL checking.
      
      The ability to call ast_calloc_with_stringfields with a number of structures
      greater than 1 never really worked.  Well, the calloc worked but there was no
      way to access the additional structures or clean them up.  It was agreed that
      there was no use case for requesting more than 1 structure so an ast_assert
      was added to prevent it and the iteration code removed.
      
      Testing:
      
      The stringfield unit tests were updated to test both normal and extended
      fields.  Tests for ast_string_field_ptr_set_by_fields and
      ast_calloc_with_stringfields were also added.
      
      As an ABI test, 13 was compiled from git and the res_pjsip_* modules, except
      res_pjsip itself, saved off.  The patch was then added and a full compile and
      install was performed.  Then the older res_pjsip_* moduled were copied over the
      installed versions so res_pjsip was new and the rest were old.  No issues.
      
      contact->aor, which is a char * at the end of contact, was then changed to an
      extended string field and a recompile and reinstall was performed, again
      leaving stock versions of the the res_pjsip_* modules.  Again, no issues with
      the res_pjsip_* modules using the old stringfield implementation and with
      contact->aor as a char *, and res_pjsip itself using the new stringfield
      implementation and contact->aor being an extended string field.
      
      Finally, several existing string fields were converted to extended string
      fields to test OPT_STRINGFIELD_T.  Again, no issues.
      
      Change-Id: I235db338c5b178f5a13b7946afbaa5d4a0f91d61
      4d40b161
  21. Mar 28, 2016
    • George Joseph's avatar
      sorcery/res_pjsip: Refactor for realtime performance · c948ce96
      George Joseph authored
      There were a number of places in the res_pjsip stack that were getting
      all endpoints or all aors, and then filtering them locally.
      
      A good example is pjsip_options which, on startup, retrieves all
      endpoints, then the aors for those endpoints, then tests the aors to see
      if the qualify_frequency is > 0.  One issue was that it never did
      anything with the endpoints other than retrieve the aors so we probably
      could have skipped a step and just retrieved all aors. But nevermind.
      
      This worked reasonably well with local config files but with a realtime
      backend and thousands of objects, this was a nightmare.  The issue
      really boiled down to the fact that while realtime supports predicates
      that are passed to the database engine, the non-realtime sorcery
      backends didn't.
      
      They do now.
      
      The realtime engines have a scheme for doing simple comparisons. They
      take in an ast_variable (or list) for matching, and the name of each
      variable can contain an operator.  For instance, a name of
      "qualify_frequency >" and a value of "0" would create a SQL predicate
      that looks like "where qualify_frequency > '0'".  If there's no operator
      after the name, the engines add an '=' so a simple name of
      "qualify_frequency" and a value of "10" would return exact matches.
      
      The non-realtime backends decide whether to include an object in a
      result set by calling ast_sorcery_changeset_create on every object in
      the internal container.  However, ast_sorcery_changeset_create only does
      exact string matches though so a name of "qualify_frequency >" and a
      value of "0" returns nothing because the literal "qualify_frequency >"
      doesn't match any name in the objset set.
      
      So, the real task was to create a generic string matcher that can take a
      left value, operator and a right value and perform the match. To that
      end, strings.c has a new ast_strings_match(left, operator, right)
      function.  Left and right are the strings to operate on and the operator
      can be a string containing any of the following: = (or NULL or ""), !=,
      >, >=, <, <=, like or regex.  If the operator is like or regex, the
      right string should be a %-pattern or a regex expression.  If both left
      and right can be converted to float, then a numeric comparison is
      performed, otherwise a string comparison is performed.
      
      To use this new function on ast_variables, 2 new functions were added to
      config.c.  One that compares 2 ast_variables, and one that compares 2
      ast_variable lists.  The former is useful when you want to compare 2
      ast_variables that happen to be in a list but don't want to traverse the
      list.  The latter will traverse the right list and return true if all
      the variables in it match the left list.
      
      Now, the backends' fields_cmp functions call ast_variable_lists_match
      instead of ast_sorcery_changeset_create and they can now process the
      same syntax as the realtime engines.  The realtime backend just passes
      the variable list unaltered to the engine.  The only gotcha is that
      there's no common realtime engine support for regex so that's been noted
      in the api docs for ast_sorcery_retrieve_by_fields.
      
      Only one more change to sorcery was done...  A new config flag
      "allow_unqualified_fetch" was added to reg_sorcery_realtime.
      "no": ignore fetches if no predicate fields were supplied.
      "error": same as no but emit an error. (good for testing)
      "yes": allow (the default);
      "warn": allow but emit a warning. (good for testing)
      
      Now on to res_pjsip...
      
      pjsip_options was modified to retrieve aors with qualify_frequency > 0
      rather than all endpoints then all aors.  Not only was this a big
      improvement in realtime retrieval but even for config files there's an
      improvement because we're not going through endpoints anymore.
      
      res_pjsip_mwi was modified to retieve only endpoints with something in
      the mailboxes field instead of all endpoints then testing mailboxes.
      
      res_pjsip_registrar_expire was completely refactored.  It was retrieving
      all contacts then setting up scheduler entries to check for expiration.
      Now, it's a single thread (like keepalive) that periodically retrieves
      only contacts whose expiration time is < now and deletes them.  A new
      contact_expiration_check_interval was added to global with a default of
      30 seconds.
      
      Ross Beer reports that with this patch, his Asterisk startup time dropped
      from around an hour to under 30 seconds.
      
      There are still objects that can't be filtered at the database like
      identifies, transports, and registrations.  These are not going to be
      anywhere near as numerous as endpoints, aors, auths, contacts however.
      
      Back to allow_unqualified_fetch.  If this is set to yes and you have a
      very large number of objects in the database, the pjsip CLI commands
      will attempt to retrive ALL of them if not qualified with a LIKE.
      Worse, if you type "pjsip show endpoint <tab>" guess what's going to
      happen? :)  Having a cache helps but all the objects will have to be
      retrieved at least once to fill the cache.  Setting
      allow_unqualified_fetch=no prevents the mass retrieve and should be used
      on endpoints, auths, aors, and contacts.  It should NOT be used for
      identifies, registrations and transports since these MUST be
      retrieved in bulk.
      
      Example sorcery.conf:
      
      [res_pjsip]
      endpoint=config,pjsip.conf,criteria=type=endpoint
      endpoint=realtime,ps_endpoints,allow_unqualified_fetch=error
      
      ASTERISK-25826 #close
      Reported-by: Ross Beer
      Tested-by: Ross Beer
      
      Change-Id: Id2691e447db90892890036e663aaf907b2dc1c67
      c948ce96
  22. Mar 24, 2016
  23. Mar 23, 2016
    • Matt Jordan's avatar
      tests/test_http_media_cache: Add unit tests for res_http_media_cache · 01962a39
      Matt Jordan authored
      This patch adds unit tests for res_http_media cache, that covers nominal
      creation and retrieval - and through them as well, staleness and deletion
      checks. In addition, this patch adds tests that covers the interaction of
      various HTTP headers, including Expires, Etag, and Cache-Control.
      
      ASTERISK-25654
      
      Change-Id: I2db101e307c863857fe416d6f5bf4cace9ac7cf5
      01962a39
  24. Mar 16, 2016
  25. Feb 18, 2016
    • Mark Michelson's avatar
      Fix failing threadpool_auto_increment test. · 8055d080
      Mark Michelson authored
      The threadpool_auto_increment test fails infrequently for a couple of
      reasons
      * The threadpool listener was notified of fewer tasks being pushed than
        were actually pushed
      * The "was_empty" flag was set to an unexpected value.
      
      The problem is that the test pushes three tasks into the threadpool.
      Test expects the threadpool to essentially gather those three tasks, and
      then distribute those to the threadpool threads. It also expects that as
      the tasks are pushed in, the threadpool listener is alerted immediately
      that the tasks have been pushed. In reality, a task can be distributed
      to the threadpool threads quicker than expected, meaning that the
      threadpool has already emptied by the time each subsequent task is
      pushed. In addition, the internal threadpool queue can be delayed so
      that the threadpool listener is not alerted that a task has been pushed
      even after the task has been executed.
      
      From the test's point of view, there's no way to be able to predict
      exactly the order that task execution/listener notifications will occur,
      and there is no way to know which listener notifications will indicate
      that the threadpool was previously empty.
      
      For this reason, the test has been updated to only check the things it
      can check. It ensures that all tasks get executed, that the threads go
      idle after the tasks are executed, and that the listener is told the
      proper number of tasks that were pushed.
      
      Change-Id: I7673120d74adad64ae6894594a606e102d9a1f2c
      8055d080
  26. Feb 09, 2016
    • Joshua Colp's avatar
      tests/test_sorcery_memory_cache_thrash: Improve termination process. · e40fddbe
      Joshua Colp authored
      When terminating the threads thrashing a sorcery memory cache each
      would be told to stop and then we would wait on them. During at
      least one thrashing test this was problematic due to the specific
      usage pattern in use. It would take some time for termination of the
      thread to occur.
      
      This would occur due to contention between the threads retrieving
      and the threads updating the cache. As the retrieving threads are
      given priority it may be some time before the updating threads
      are able to proceed.
      
      This change makes it so all threads are told to stop and then each
      are joined to ensure they stop. This way all the threads should
      stop at around the same time instead of waiting for one to stop,
      the next to stop, then the next, and so on. As a result of this
      the execution time for each thrash test is much closer to their
      expected value than previously seen as well.
      
      Change-Id: I04a53470b0ea4170b8819180b0bd7475f3642827
      e40fddbe
  27. Feb 03, 2016
    • George Joseph's avatar
      logging: Remove/fix some message annoyances · dcbedf9a
      George Joseph authored
      test_dlinklists doesn't need to NOTICE everyone that every macro worked.
      
      res_phoneprov doesn't need to VERBOSE everyone that a phoneprov extension or
      provider was registered.
      
      res_odbc was missing a newline at the end of one message.
      
      Change-Id: I6c06361518ef3711821795e535acd439782a995e
      dcbedf9a
  28. Jan 19, 2016
    • Joshua Colp's avatar
      test_threadpool: Wait for each task to complete and fix memory leak. · 9fa76ba2
      Joshua Colp authored
      This change makes the thread_timeout_thrash unit test wait for
      each task to complete. This fixes the problem where the test would
      prematurely end when all threads were gone and a new one had to be
      started to handle the last task. It also increases the thrasing as
      it is now more likely for each task to encounter the above scenario.
      
      This also fixes a memory leak where the data for each task was not
      being freed.
      
      ASTERISK-25611 #close
      
      Change-Id: I5017d621a4dc911f509074c16229b86bff2fb3c6
      9fa76ba2
  29. Jan 12, 2016
    • Mark Michelson's avatar
      res_sorcery_realtime: Remove leading ^ requirement. · 01c5e2a0
      Mark Michelson authored
      res_sorcery_realtime's search-by-regex callback performed a check to
      ensure that the passed-in regex began with a caret (^). If it did not,
      then no results would be returned.
      
      This callback only started to become used when "like" support was added
      to PJSIP CLI commands. The CLI command for listing objects would pass an
      empty regex ("") to the sorcery backend if no "like" statement was
      present. For most sorcery backends, this resulted in returning all
      objects. However, for realtime, this resulted in returning no objects.
      
      This commit seeks to fix the regression by removing the requirement from
      res_sorcery_realtime for the passed-in-regex to begin with a caret.
      
      ASTERISK-25689 #close
      Reported by Marcelo Terres
      
      Change-Id: I22b4dc5d7f3f11bb29ac2e42ef94682e9bab3b20
      01c5e2a0
  30. Dec 28, 2015
    • Matt Jordan's avatar
      tests/test_stasis_endpoints: Remove expected duplicate events · 96b32e03
      Matt Jordan authored
      The cache_clear test was written to expect duplicate Stasis messages
      sent from the technology endpoint to the all caching topic. This patch
      fixes the test to no longer expect these duplicate messages.
      
      ASTERISK-25137
      
      Change-Id: I58075d70d6cdf42e792e0fb63ba624720bfce981
      96b32e03
  31. Nov 12, 2015
    • Joshua Colp's avatar
      format_cap: Don't append the 'none' format when appending all. · a1597476
      Joshua Colp authored
      When appending all formats of a type all the codecs are iterated
      and added. This operation was incorrectly adding the ast_format_none
      format which is special in that it is supposed to be used when no
      format is present. It shouldn't be appended.
      
      ASTERISK-25535
      
      Change-Id: I7b00f3bdf4a5f3022e483d6ece602b1e8b12827c
      a1597476
  32. Nov 11, 2015
    • Joshua Colp's avatar
      threadpool: Handle worker thread transitioning to dead when going active. · 29543544
      Joshua Colp authored
      This change adds handling of dead worker threads when moving them
      to be active. When this happens the worker thread is removed from
      both the active and idle threads container. If no threads are able
      to be moved to active then the pool grows as configured.
      
      A unit test has also been added which thrashes the idle timeout
      and thread activation to exploit any race conditions between the
      two.
      
      ASTERISK-25546 #close
      
      Change-Id: I6c455f9a40de60d9e86458d447b548fb52ba1143
      29543544
  33. Nov 09, 2015
  34. Aug 10, 2015
    • Matt Jordan's avatar
      main/format: Add an API call for retrieving format attributes · e188192a
      Matt Jordan authored
      Some codecs that may be a third party library to Asterisk need to have
      knowledge of the format attributes that were negotiated. Unfortunately,
      when the great format migration of Asterisk 13 occurred, that ability
      was lost.
      
      This patch adds an API call, ast_format_attribute_get, to the core
      format API, along with updates to the unit test to check the new API
      call. A new callback is also now available for format attribute modules,
      such that they can provide the format attribute values they manage.
      
      Note that the API returns a void *. This is done as the format attribute
      modules themselves may store format attributes in any particular manner
      they like. Care should be taken by consumers of the API to check the
      return value before casting and dereferencing. Consumers will obviously
      need to have a priori knowledge of the type of the format attribute as
      well.
      
      Change-Id: Ieec76883dfb46ecd7aff3dc81a52c81f4dc1b9e3
      e188192a
  35. Aug 08, 2015
    • David M. Lee's avatar
      Replaces clock_gettime() with ast_tsnow() · 40caf0ad
      David M. Lee authored
      clock_gettime() is, unfortunately, not portable. But I did like that
      over our usual `ts.tv_nsec = tv.tv_usec * 1000` copy/paste code we
      usually do when we want a timespec and all we have is ast_tvnow().
      
      This patch adds ast_tsnow(), which mimics ast_tvnow(), but returns a
      timespec. If clock_gettime() is available, it will use that. Otherwise
      ast_tsnow() falls back to using ast_tvnow().
      
      Change-Id: Ibb1ee67ccf4826b9b76d5a5eb62e90b29b6c456e
      40caf0ad
  36. Jul 31, 2015
    • Mark Michelson's avatar
      dns_core: Allow zero-length DNS responses. · 86034227
      Mark Michelson authored
      A testsuite test recently failed due to a crash that occurred in the DNS
      core. The problem was that the test could not resolve an address, did
      not set a result on the DNS query, and then indicated the query was
      completed. The DNS core does not handle the case of a query with no
      result gracefully, and so there is a crash.
      
      This changeset makes the DNS system resolver set a result with a
      zero-length answer in the case that a DNS resolution failure occurs
      early. The DNS core now also will accept such a response without
      treating it as invalid input. A unit test was updated to no longer treat
      setting a zero-length response as off-nominal.
      
      Change-Id: Ie56641e22debdaa61459e1c9a042e23b78affbf6
      86034227
Loading