Ejemplo n.º 1
0
        public void Notify(DataTypeCacheRefresher.JsonPayload[] payloads)
        {
            EnsureCaches();

            var idsA = payloads.Select(x => x.Id).ToArray();

            foreach (var payload in payloads)
            {
                _logger.LogDebug("Notified {RemovedStatus} for data type {DataTypeId}",
                                 payload.Removed ? "Removed" : "Refreshed",
                                 payload.Id);
            }

            using (_contentStore.GetScopedWriteLock(_scopeProvider))
                using (_mediaStore.GetScopedWriteLock(_scopeProvider))
                {
                    // TODO: need to add a datatype lock
                    // this is triggering datatypes reload in the factory, and right after we create some
                    // content types by loading them ... there's a race condition here, which would require
                    // some locking on datatypes
                    _publishedContentTypeFactory.NotifyDataTypeChanges(idsA);

                    using (var scope = _scopeProvider.CreateScope())
                    {
                        scope.ReadLock(Constants.Locks.ContentTree);
                        _contentStore.UpdateDataTypesLocked(idsA, id => CreateContentType(PublishedItemType.Content, id));
                        scope.Complete();
                    }

                    using (var scope = _scopeProvider.CreateScope())
                    {
                        scope.ReadLock(Constants.Locks.MediaTree);
                        _mediaStore.UpdateDataTypesLocked(idsA, id => CreateContentType(PublishedItemType.Media, id));
                        scope.Complete();
                    }
                }

            CurrentPublishedSnapshot?.Resync();
        }