Assert while trimming history (2)

This issue belongs to an archived project. You can view it, but you can't modify it. Learn more

XMLWordPrintableJSON

      Hi,

      I'm experiencing this crash with some users:

      0   libsystem_kernel.dylib        	0x00000001f1011b38 __pthread_kill + 8 (:-1)
      1   libsystem_pthread.dylib       	0x000000022a73e3bc pthread_kill + 268 (pthread.c:1668)
      2   libsystem_c.dylib             	0x00000001c46db524 abort + 168 (abort.c:118)
      3   Realm                         	0x000000010098ceb0 please_report_this_issue_in_github_realm_realm_core + 12
      4   Realm                         	0x000000010098d198 realm::util::terminate_internal(std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) + 260
      5   Realm                         	0x000000010098d394 realm::util::terminate_with_info(char const*, char const*, long, char const*, std::initializer_list<realm::util::Printable>&&) + 388
      6   Realm                         	0x00000001007ed678 void realm::util::terminate_with_info<unsigned long&, unsigned long&, unsigned long const&, unsigned long&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(c... + 136
      7   Realm                         	0x00000001007ed450 realm::SlabAlloc::do_free(unsigned long, char*) + 1740
      8   Realm                         	0x00000001007f5af4 realm::Array::destroy_deep(realm::MemRef, realm::Allocator&) + 64
      9   Realm                         	0x00000001007f1404 realm::Array::destroy_deep(unsigned long, realm::Allocator&) + 140
      10  Realm                         	0x00000001007fe460 realm::ArrayBinary::erase(unsigned long) + 68
      11  Realm                         	0x000000010084f94c realm::util::FunctionRef<unsigned long (realm::BPlusTreeNode*, unsigned long)>::FunctionRef<realm::BPlusTree<realm::BinaryData>::erase(unsigned long)::'lambda'(realm::BPlusTreeNode*, unsigned long)... + 28
      12  Realm                         	0x0000000100811504 realm::BPlusTreeBase::bptree_erase(unsigned long, realm::util::FunctionRef<unsigned long (realm::BPlusTreeNode*, unsigned long)>) + 52
      13  Realm                         	0x000000010084f7b8 (anonymous namespace)::InRealmHistory::set_oldest_bound_version(unsigned long long) + 164
      14  Realm                         	0x000000010082d610 realm::DB::low_level_commit(unsigned long long, realm::Transaction&, bool) + 296
      15  Realm                         	0x000000010082d3f4 realm::DB::do_commit(realm::Transaction&, bool) + 140
      16  Realm                         	0x0000000100966334 realm::Transaction::commit() + 80
      17  Realm                         	0x0000000100a7aadc realm::_impl::RealmCoordinator::open_db() + 1964
      18  Realm                         	0x0000000100a7b604 realm::_impl::RealmCoordinator::do_get_realm(realm::RealmConfig, std::__1::shared_ptr<realm::Realm>&, realm::util::Optional<realm::VersionID>, realm::util::CheckedUniqueLock&) + 72
      19  Realm                         	0x0000000100a7b450 realm::_impl::RealmCoordinator::get_realm(realm::RealmConfig, realm::util::Optional<realm::VersionID>) + 424
      20  Realm                         	0x0000000100afa220 realm::Realm::get_shared_realm(realm::RealmConfig) + 120
      21  Realm                         	0x00000001007be7a8 +[RLMRealm realmWithConfiguration:queue:error:] + 1116 (RLMRealm.mm:532)
      22  RealmSwift                    	0x0000000100e123a8 init + 40 (<compiler-generated>:0)
      23  RealmSwift                    	0x0000000100e123a8 init + 40 (<compiler-generated>:0)
      24  RealmSwift                    	0x0000000100e123a8 Realm.init(configuration:queue:) + 92 (Realm.swift:95)
      25  Geory                         	0x000000010008af3c closure #1 in closure #1 in initializeDatabase(qos:shouldMigrate:shouldCompact:completion:) + 724 (DatabaseManagement.swift:305)
      26  Geory                         	0x0000000100046350 thunk for @callee_guaranteed () -> (@error @owned Error) + 20 (<compiler-generated>:0)
      27  Geory                         	0x000000010008a9b4 partial apply for thunk for @callee_guaranteed () -> (@error @owned Error) + 16 (<compiler-generated>:0)
      28  Geory                         	0x0000000100090d90 thunk for @callee_guaranteed () -> (@error @owned Error)partial apply + 12
      29  libswiftObjectiveC.dylib      	0x00000001e80b7a10 autoreleasepool<A>(invoking:) + 64 (ObjectiveC.swift:172)
      30  Geory                         	0x0000000100090a74 partial apply for closure #1 in initializeDatabase(qos:shouldMigrate:shouldCompact:completion:) + 88 (DatabaseManagement.swift:94)
      31  Geory                         	0x000000010004605c thunk for @escaping @callee_guaranteed () -> () + 28 (<compiler-generated>:0)
      32  libdispatch.dylib             	0x00000001b923ae6c _dispatch_call_block_and_release + 32 (init.c:1517)
      33  libdispatch.dylib             	0x00000001b923ca30 _dispatch_client_callout + 20 (object.m:560)
      34  libdispatch.dylib             	0x00000001b924e280 _dispatch_root_queue_drain + 680 (inline_internal.h:2622)
      35  libdispatch.dylib             	0x00000001b924e96c _dispatch_worker_thread2 + 164 (queue.c:6935)
      36  libsystem_pthread.dylib       	0x000000022a738080 _pthread_wqthread + 228 (pthread.c:2612)
      37  libsystem_pthread.dylib       	0x000000022a737e5c start_wqthread + 8 (:-1)
      

      The method for initialization is as follows:

      func initializeDatabase(qos: DispatchQoS.QoSClass, shouldMigrate: Bool, shouldCompact: Bool, completion: @escaping () -> () = {}) {
          
          DispatchQueue.global(qos: qos).async {
              
              autoreleasepool {
                  
                  do {
                      
                      var realmConfiguration = Realm.Configuration()
                      
                      var compactStatus: String = "compacting has not been invoked"
                      
                      if shouldCompact {
                          
                          realmConfiguration.shouldCompactOnLaunch = { totalBytes, usedBytes in
                              
                              if totalBytes > ( 10 * 1024 * 1024) && Double(usedBytes) / Double(totalBytes) < 0.7 {
                                  
                                  compactStatus = "compacting was necessary (\(totalBytes.bytesString) total bytes with \(usedBytes.bytesString) bytes used, usage quota of \(String(format: "%.1f", Float(usedBytes)/Float(totalBytes)*100))%)"
                                  
                                  return true
                                  
                              }
                              
                              else {
                                  
                                  compactStatus = "compacting was not necessary (\(totalBytes.bytesString) total bytes with \(usedBytes.bytesString) bytes used, quota of \(String(format: "%.1f", Float(usedBytes)/Float(totalBytes)*100))%)"
                                  
                                  return false
                                  
                              }
                              
                          }
                          
                      }
                      
                      
                      if shouldMigrate {
                          
                          realmConfiguration.schemaVersion = realmSchemaVersion
                          
                          realmConfiguration.migrationBlock = { migration, oldSchemaVersion in
                              
                              if oldSchemaVersion < 4001 {
                                  
                                  migration.enumerateObjects(ofType: "GeoryLabelObject") { oldObject, newObject in
                                      
                                      guard let oldObject = oldObject else { return }
                                      
                                      let newLabelObject: MigrationObject = migration.create("LabelObject")
                                      
                                      newLabelObject["identifier"] = oldObject["identifier"] as? String ?? UUID().uuidString
                                      
                                      newLabelObject["geo_latitude"] = oldObject["latitude"] as? Double ?? 0
                                      newLabelObject["geo_longitude"] = oldObject["longitude"] as? Double ?? 0
                                      newLabelObject["geo_radius"] = oldObject["radius"] as? Double ?? georyCurrentConfiguration.preferenceLabelRadius
                                      
                                      newLabelObject["info_text"] = oldObject["text"] as? String ?? ""
                                      newLabelObject["info_icon"] = oldObject["iconName"] as? String ?? ""
                                      newLabelObject["info_placemark"] = ""
                                      
                                      if let oldColorData = oldObject["colorData"] as? List<Float>, oldColorData.count == 4 {
                                          
                                          newLabelObject["color_red"] = oldColorData[0]
                                          newLabelObject["color_green"] = oldColorData[1]
                                          newLabelObject["color_blue"] = oldColorData[2]
                                          newLabelObject["color_alpha"] = oldColorData[3]
                                          
                                      }
                                      
                                      if let newObject = newObject {
                                          
                                          migration.delete(newObject)
                                          
                                      }
                                          
                                  }
                                  
                                  migration.enumerateObjects(ofType: "GeoryLocationObject") { oldObject, newObject in
                                      
                                      guard let oldObject = oldObject else { return }
                                      
                                      if let isVisit = oldObject["isVisit"] as? Bool, isVisit {
                                          
                                          let newVisitObject = migration.create("VisitObject")
                                          
                                          newVisitObject["identifier"] = oldObject["identifier"] as? String ?? UUID().uuidString
                                          
                                          newVisitObject["geo_latitude"] = oldObject["geo_latitude"] as? Double ?? 0
                                          newVisitObject["geo_longitude"] = oldObject["geo_longitude"] as? Double ?? 0
                                          newVisitObject["geo_accuracy"] = oldObject["geo_accuracy"] as? Double ?? 0
                                          
                                          newVisitObject["ts_arrival"] = oldObject["ts_arrival"] as? Double ?? 0
                                          newVisitObject["ts_departure"] = oldObject["ts_departure"] as? Double ?? 0
                                          newVisitObject["ts_timezone"] = oldObject["ts_timezone"] as? String ?? TimeZone.autoupdatingCurrent.identifier
                                          
                                          newVisitObject["isHidden"] = oldObject["isHidden"] as? Bool ?? false
                                          newVisitObject["isFixed"] = oldObject["isFixed"] as? Bool ?? false
                                          newVisitObject["isEdited"] = oldObject["isCorrected"] as? Bool ?? false || oldObject["isManual"] as? Bool ?? false
                                          newVisitObject["isHighlight"] = false
                                          
                                          newVisitObject["info_rating"] = oldObject["info_rating"] as? Double ?? 0
                                          newVisitObject["info_notes"] = oldObject["info_notes"] as? String ?? ""
                                          newVisitObject["info_placemark"] = oldObject["info_placemark"] as? String ?? ""
                                          newVisitObject["info_transport"] = oldObject["info_transport"] as? Double ?? 0
                                          
                                          newVisitObject["weather_condition"] = oldObject["weather_condition"] as? Double ?? -999
                                          newVisitObject["weather_temperature"] = oldObject["weather_temperature"] as? Double ?? -999
                                          newVisitObject["weather_feels"] = oldObject["weather_feels"] as? Double ?? -999
                                          newVisitObject["weather_humidity"] = oldObject["weather_humidity"] as? Double ?? -999
                                          newVisitObject["weather_wind_speed"] = oldObject["weather_wind_speed"] as? Double ?? -999
                                          newVisitObject["weather_wind_deg"] = oldObject["weather_wind_deg"] as? Double ?? -999
                                          
                                      }
                                      
                                      else {
                                          
                                          let newLocationObject = migration.create("LocationObject")
                                          
                                          newLocationObject["identifier"] = oldObject["identifier"] as? String ?? UUID().uuidString
                                          
                                          newLocationObject["geo_latitude"] = oldObject["geo_latitude"] as? Double ?? 0
                                          newLocationObject["geo_longitude"] = oldObject["geo_longitude"] as? Double ?? 0
                                          newLocationObject["geo_accuracy"] = oldObject["geo_accuracy"] as? Double ?? 0
                                          
                                          newLocationObject["ts_timestamp"] = oldObject["ts_arrival"] as? Double ?? 0
                                          
                                          newLocationObject["isHidden"] = oldObject["isHidden"] as? Bool ?? false
                                          
                                          newLocationObject["workoutUUID"] = oldObject["info_workout"] as? String ?? ""
                                          
                                      }
                                      
                                      if let newObject = newObject {
                                          
                                          migration.delete(newObject)
                                          
                                      }
                                      
                                  }
                                  
                              }
                              
                              if oldSchemaVersion < 4005 && oldSchemaVersion > 4000 {
                                  
                                  migration.enumerateObjects(ofType: "LocationObject") { oldObject, newObject in
                                      
                                      guard let oldObject = oldObject else { return }
                                      
                                      if oldObject["ts_arrival"] as? Double ?? 0 != oldObject["ts_departure"] as? Double ?? 0 {
                                          
                                          let newVisitObject = migration.create("VisitObject")
                                          
                                          newVisitObject["identifier"] = oldObject["identifier"] as? String ?? UUID().uuidString
                                          
                                          newVisitObject["geo_latitude"] = oldObject["geo_latitude"] as? Double ?? 0
                                          newVisitObject["geo_longitude"] = oldObject["geo_longitude"] as? Double ?? 0
                                          newVisitObject["geo_accuracy"] = oldObject["geo_accuracy"] as? Double ?? 0
                                          
                                          newVisitObject["ts_arrival"] = oldObject["ts_arrival"] as? Double ?? 0
                                          newVisitObject["ts_departure"] = oldObject["ts_departure"] as? Double ?? 0
                                          newVisitObject["ts_timezone"] = oldObject["ts_timezone"] as? String ?? TimeZone.autoupdatingCurrent.identifier
                                          
                                          newVisitObject["isHidden"] = oldObject["isHidden"] as? Bool ?? false
                                          newVisitObject["isFixed"] = oldObject["isFixed"] as? Bool ?? false
                                          newVisitObject["isEdited"] = oldObject["isEdited"] as? Bool ?? false
                                          newVisitObject["isHighlight"] = false
                                          
                                          newVisitObject["info_rating"] = oldObject["info_rating"] as? Double ?? 0
                                          newVisitObject["info_notes"] = oldObject["info_notes"] as? String ?? ""
                                          newVisitObject["info_placemark"] = oldObject["info_placemark"] as? String ?? ""
                                          newVisitObject["info_transport"] = 0
                                          
                                          newVisitObject["weather_condition"] = oldObject["weather_condition"] as? Double ?? -999
                                          newVisitObject["weather_temperature"] = oldObject["weather_temperature"] as? Double ?? -999
                                          newVisitObject["weather_feels"] = oldObject["weather_feels"] as? Double ?? -999
                                          newVisitObject["weather_humidity"] = oldObject["weather_humidity"] as? Double ?? -999
                                          newVisitObject["weather_wind_speed"] = oldObject["weather_wind_speed"] as? Double ?? -999
                                          newVisitObject["weather_wind_deg"] = oldObject["weather_wind_deg"] as? Double ?? -999
                                          
                                      }
                                      
                                      else {
                                          
                                          let newLocationObject = migration.create("LocationObject")
                                          
                                          newLocationObject["identifier"] = oldObject["identifier"] as? String ?? UUID().uuidString
                                          
                                          newLocationObject["geo_latitude"] = oldObject["geo_latitude"] as? Double ?? 0
                                          newLocationObject["geo_longitude"] = oldObject["geo_longitude"] as? Double ?? 0
                                          newLocationObject["geo_accuracy"] = oldObject["geo_accuracy"] as? Double ?? 0
                                          
                                          newLocationObject["ts_timestamp"] = oldObject["ts_arrival"] as? Double ?? 0
                                          
                                          newLocationObject["isHidden"] = oldObject["isHidden"] as? Bool ?? false
                                          
                                          newLocationObject["workoutUUID"] = oldObject["healthkit_workout_identifier"] as? String ?? ""
                                          
                                      }
                                      
                                      if let newObject = newObject {
                                          
                                          migration.delete(newObject)
                                          
                                      }
                                      
                                  }
                                  
                              }
                              
                          }
                          
                      }
                      
                      
                      let realm = try Realm(configuration: realmConfiguration)
                      
                      
                      localDatabase.visits.removeAll()
                      localDatabase.isInitialized = false
                      localDatabase.labels.removeAll()
                      localDatabase.firstLocation = nil
                      localDatabase.firstVisit = nil
                      localDatabase.lastVisit = nil
                      localDatabase.lastLocation = nil
                      
                      
                      if let lastLocation = realm.objects(LocationObject.self).sorted(byKeyPath: "ts_timestamp", ascending: true).last {
                          
                          localDatabase.lastLocation = LocationObject(value: lastLocation)
                          
                      }
                      
                      if let firstLocation = realm.objects(LocationObject.self).sorted(byKeyPath: "ts_timestamp", ascending: true).first {
                          
                          localDatabase.firstLocation = LocationObject(value: firstLocation)
                          
                      }
                      
                      localDatabase.visits = Array(realm.objects(VisitObject.self).sorted(byKeyPath: "ts_arrival", ascending: false).freeze())
                      
                      localDatabase.labels = Array(realm.objects(LabelObject.self).sorted(byKeyPath: "info_text", ascending: true).freeze())
                      
                      localDatabase.isInitialized = true
                      
                      logEvent(function: "\(#function)", event: "Database has been initialized, \(compactStatus)")
                      
                      completion()
                      
                  }
                  
                  catch {
                      
                      logEvent(function: "\(#function)", event: "Database operation has failed with error \(error.localizedDescription)")
                      
                      print("FAILURE \(error.localizedDescription)")
                      
                      completion()
                      
                  }
                  
              }
              
          }
          
      }
      

      I'd be thankful if you could look into this issue.

      Thanks

      /Felix

            Assignee:
            Jørgen Edelbo (Inactive)
            Reporter:
            Unito Sync Bot
            Archiver:
            Marc Greenfield

              Created:
              Updated:
              Resolved:
              Archived: