• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

tf / pageflow
99%
master: 99%

Build:
Build:
LAST BUILD BRANCH: actions
DEFAULT BRANCH: master
Repo Added 06 Apr 2016 02:51PM UTC
Files 486
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

LAST BUILD ON BRANCH perma-id-lock-2
branch: perma-id-lock-2
CHANGE BRANCH
x
Reset
  • perma-id-lock-2
  • 0-11-stable
  • 12-0-stable
  • 12-4-stable
  • 12-x-stable
  • 15-0-stable
  • 15-1-stable
  • aa-pre-4
  • abort-file-selection
  • actions
  • active-admin-load-path
  • active-admin-view-patches
  • add-plugin-link-to-readme
  • additional-inline-help
  • adjacent-preload
  • adjacent-preload-12
  • admin-attributes-tables
  • admin-style-patches
  • alt-text
  • android-phone-player
  • appearance-stories
  • atmo-debug
  • atmo-fixes
  • atmo-inline-help
  • audio-api-volume-fading
  • audio-context-fading-feature
  • audio-fade-deactivate
  • audio-file-text-tracks
  • audio-loop
  • autoplay-muted-bg-videos-2
  • autoplay-story
  • autosave-file-rights
  • available-types
  • backdrop-transparent
  • background-image-preload
  • background-inline-help
  • background-inputs-group
  • background-media-spec-fix
  • before-after-lifecycle
  • bg-media
  • bg-media-12-x
  • blank-video-src-on-dispose
  • build-edge
  • build-edge-packages
  • built-in-widget-types-plugin
  • cancan-blocks-fix
  • cancancan
  • capybara-improvements
  • card-fixes
  • card-gaps
  • cdn-https-redirect
  • center-float
  • chart-el-pos
  • chart-fixes
  • chrome-75-capybara
  • chrome-logging
  • chrome-segfault
  • cl-15-3
  • classic-player-controls-configurability
  • clip-path-compat
  • close-button-i18n
  • close-navigation-button-icon
  • collapse-toolbar
  • color-input
  • color-input-default-value-binding
  • color-theme-options
  • conditional-thumbnails
  • content-el-js-gemspec
  • content-el-js-gemspec-15-2
  • content-element-frontend-api
  • content-element-handle-destroy
  • content-element-margins
  • content-elements-batch
  • content-elements-lifecycle
  • continue-prebuffer
  • controls-menus
  • cookie-notice
  • cookie-notice-12.2
  • coverage-fixes
  • coveralls
  • coveralls-parallel
  • coveralls-parallel-2
  • credit-links
  • credit-links-backport
  • css-scss
  • cue-margins
  • cue-settings
  • cue-style
  • current-section-fix
  • custom-highlighted-page-navigation-bar-mode
  • dash
  • debounced-ref
  • decouple-editor-layout
  • dedicated-mdr
  • default-text-track-file
  • delay-background-video-12
  • delayed-start
  • delete-page-fixes
  • delete-via-batch
  • deleted-new-record
  • deleted-social-share-image
  • dep-ext
  • detect-feature-fix
  • detect-get-media-element
  • disable-backdrop-text-tracks
  • disable-reference-input
  • disabled-reference-inputs
  • display-hide-text
  • display-scroll-indicator-var
  • display-text-tracks
  • dispose-during-fade-fix
  • doc-actions
  • document-outline
  • drop-down-button-improvements
  • dupl-css-rules
  • eager-account-users-tab
  • edge-dedicated
  • edge-dedicated-2
  • edge-dw
  • edge-hosted-4
  • edge-hosted-5
  • edit-content-element
  • edit-lock-build-stubbed
  • edit-transtions
  • editor-code-splitting
  • editor-controllers
  • editor-help-ext-links
  • embed-pillar
  • emphasize-chapter-beginning-theme-var
  • empty-para-span
  • entry-configuration-fix
  • entry-css-no-asset-host
  • entry-css-no-asset-host-12
  • entry-embed
  • entry-embed-0-11
  • entry-slug-in-common-seed
  • entry-template-error-translations
  • entry-theme-options
  • entry-theme-options-2
  • entry-themeing-select-options
  • entry-title-selector
  • entry-type-edit
  • entry-type-edit-seed
  • entry-type-edit-views
  • entry-type-engines-3
  • entry-type-features
  • entry-type-show
  • exact-bg-pos
  • export-react-measure
  • ext-link-icon
  • external-links-fixes
  • external-services-doc
  • extract-paged-ssr
  • facebook-in-app-fix
  • factory-bot
  • factory-bot-syntax
  • factory-girl-coverage
  • fade-in-logo-with-header
  • fake-media-api
  • file-config
  • file-config-2
  • file-configuration
  • file-failed
  • file-filters
  • file-ready-json-seed
  • file-retry
  • file-right-polling
  • file-seeds
  • file-type-css-background-images
  • file-type-features
  • file-type-lint-pre
  • file-usage-config
  • files-js-api
  • filter-by-published-at
  • filter-sources-fix
  • firefox-multi-preload-reqs
  • firefox-video-opt
  • first-page-fix
  • fix-0824
  • fix-0824-12-0
  • fix-0824-12-0-2
  • fix-backdrop-video
  • fix-click-intercepted
  • fix-enable-home-button-by-default-js
  • fix-ext-image-sel
  • fix-filet-type-css-test
  • fix-hls-output-presences-12-0
  • fix-hls-output-presences-12-1
  • fix-link-dialog
  • fix-link-dialog-backport
  • fix-page-selection
  • fix-page-type-menu-help
  • fix-scrolled-seed-spec
  • fix-spec
  • fix-travis
  • fix-travis-2
  • flaky-capybara
  • focus-outline
  • frontend-rollup-jest
  • fullscreen-in-thumbnail
  • gh-storybook
  • guided-panorama-2
  • h-page-transitions
  • h-scroll-indicator
  • h3
  • heading-fix
  • headless-chrome
  • help
  • hide-audio-page-content-for-tracks
  • hide-chapter-numbers
  • hide-controls-invisible-focus
  • hide-controls-on-leave
  • hide-info-box-for-text-tracks
  • hide-info-box-for-text-tracks-12-0
  • hide-text-event-fix
  • hide-text-on-react-pages
  • hide-text-on-swipe-fix
  • hide-text-selector
  • hide-videojs-controls
  • highdef
  • hls-options-fallback
  • hosted-file-polling
  • hypens
  • i18n-fallback
  • ie11-polyfills
  • ie11-user-agent
  • iframe-inspect
  • ignore-coverage
  • ignore-new-in-watch-collection
  • ignore-partials-js-error
  • ignore-storyline-order-401
  • image-variants
  • import-demo
  • import-export
  • improve-admin-account-index
  • improve-admin-entry-index
  • improve-boundary-events
  • improve-output-presences
  • improve-pageflow-support
  • improve-readme
  • info-box-html
  • info-box-view-html
  • initial-password
  • inline-edit-section
  • inline-help-improvements
  • inline-image-pillar
  • inline-mask-image
  • insert-button
  • insert-dialog
  • invalid-perma-id-hash
  • ios-in-app-browser-fix
  • ios-in-app-browser-fix-backport
  • ios-in-app-browsers-fix
  • iscroll-improvements
  • jbuilder-compat
  • jest-xhr-warnings
  • js-docs-3
  • js-i18n-interpolations
  • json-input
  • krant
  • lazy-backdrops
  • lazy-img-placeholders
  • lazy-img-placeholders-12
  • lazy-inline-images
  • lazy-inline-media
  • legacy-video-crossorigin
  • limit-prepare
  • link-color
  • link-target-self
  • link-texts
  • lint-page-type
  • lint-page-type-13
  • linter
  • load-less-images
  • load-less-images-12
  • load-path-test
  • loading-spinner-background-size
  • loading-spinner-theme
  • loading-spinner-without-glow
  • locale-compare-null
  • locale-context
  • locale-context-2
  • locale-context2
  • logical-border-and-padding
  • logo-changes
  • logo-opacity
  • logo-right
  • logo-theme-options
  • mask-no-asset-host
  • master
  • media-mutex
  • memo
  • memoize-section-properties
  • memoized-selectors
  • menu-bar-whitespace
  • menus
  • merge-empty-text
  • meta-data-items
  • meta-tag-attributes-translations
  • migrate-hls-presence
  • migrate-page-types
  • mobile-poster-android
  • mobile-scroll-indicator-margin
  • mobile-share-fix-backport
  • mobile-sharing-fix
  • mobile-sharing-icons
  • motif-area-selection
  • motif-grid
  • motif-help
  • motif-pos
  • move-paged-entries-controller
  • nan-duration
  • navi-style-fixes
  • navigation-theme-configurability
  • nested-file-types
  • nested-links
  • nginx-upload-cleanup-409
  • nginx-upload-guide
  • no-animate-deep-link
  • no-content-update
  • no-h-scroll
  • no-history-for-scroll
  • no-lint-wrapper
  • no-paged-partial-prefix
  • no-pause-on-paused
  • no-title-maxlength
  • no-video-visual-diff
  • node-package-spec-fixes
  • non-multiaccount-user-management
  • npm-ci
  • npm-ci-12
  • one-jshint
  • optional-webpacker
  • order-elements
  • outline-drag-handles
  • overview-page-description-fallback
  • package-lock
  • package-lock-12
  • page-anchor-margin
  • page-background-for-controls
  • page-link-support
  • page-objects
  • page-paddings
  • page-preloaded-ready
  • page-split-layout
  • page-transitions-spec
  • page-typography
  • page-widget-index-fix
  • paged-atmo-fixes
  • pageflow-paged-react
  • pageflow-react-yarn-jest
  • panorama-mask-style
  • panorama-style-quality
  • parse-int-page-perma-id
  • pc-debug
  • percy-chart-fix
  • perma-id-lock
  • permission-fixes
  • permission-fixes-12-0
  • permissions-0-12
  • permissions-config
  • phone-emulation
  • phone-horizontal-nav
  • phone-media-features
  • phone-preview
  • phone-preview-toggle
  • phone-title-theme-options
  • phone-title-theme-options-12
  • player-controls-changes
  • player-controls-colors
  • player-controls-improvements
  • player-controls-menu-bar
  • player-controls-theme-options
  • player-progress
  • private-structure-hooks
  • profile-validation-fail
  • prune-auto-snapshots
  • prune-unused-spec-helpers
  • public-entry-redirect
  • public-i18n-1-9
  • public-i18n-fallack-fix
  • publication-hook
  • published-entry-cache-key
  • quality-menu
  • rails-4-2
  • react
  • react-peer
  • redux
  • redux-2
  • redux-3
  • redux-4
  • redux-6
  • redux-7
  • redux-8
  • redux-collection-order
  • redux-editor-compat
  • register-entry-types
  • relative-playlist-urls
  • remove-dead-widgets
  • remove-hosted-file-migration
  • remove-legacy-theme
  • remove-pageflow-react-workspace
  • remove-src-from-options
  • remove-todos
  • render-demo-in-editor
  • render-page-assigns
  • replace-loading-spinner
  • reset-snapshot-type-on-restore
  • resize-event
  • resque-mailer-symbolize-keys
  • resque-mailer-symbolized-keys
  • revisions-table
  • right-to-left
  • role-fix
  • rollup-5
  • rspec-3
  • ruby-2-1-7
  • ruby-2-3
  • ruby-2-5
  • ruby-version-in-readme
  • rubycop-frozen-string-literal
  • rubygems-2.7.3
  • run-release-support
  • run-release-support-12
  • safari-10-loop
  • safari-10-loop-backport
  • safari-11-mute-autoplay
  • safari-array-reverse
  • safari-fullscreen-bg
  • safari-no-dash
  • safari-no-dash-12
  • safari-vtt-match-upload
  • sassc-dev-dep
  • scope-paged-config
  • scroll-indicator-arrow-position
  • scroll-indicator-nowrap
  • scrolled-blank-slate-impr
  • scrolled-capybara
  • scrolled-editor-texts
  • scrolled-editor-without-paged
  • scrolled-entry-state
  • scrolled-entry-type
  • scrolled-file-json-seeds
  • scrolled-first-chapter-link
  • scrolled-html
  • scrolled-i18n
  • scrolled-image-files-db-seeds
  • scrolled-metadata
  • scrolled-outline
  • scrolled-pageflow-editor-global
  • scrolled-structured-data
  • scrolled-title
  • scrolled-widget-scopes
  • searchable-select
  • section-defaults
  • section-motif
  • seed-loaded-event
  • select-input-default
  • select-input-view-ensure-value-defined
  • selection-rect
  • semmy-1-1
  • serialization-blacklist
  • server-side-widgets
  • setup-visited
  • share-url
  • sinons-2
  • skip-smil
  • slate-2
  • slate-5
  • slider-input-view-options
  • slim-control-bar-text-typography
  • slim-controls-text-track-positioning
  • slim-loading-spinner-svg
  • slim-player-shadow
  • sort-user-accounts-by-role
  • source-sans-pro-with-greek
  • split-entries-show
  • split-travis-jobs
  • sprockets-lt-4-backport
  • srt-tracks
  • ssr
  • state-machine-job-gem-1-x
  • storybook
  • storybook-svg
  • storyline-double-insert
  • storylines-seed
  • structured-data
  • structured-data-2
  • structured-data-improvements
  • subset-sort
  • subset-sort-buikld
  • support-dominos
  • tabs-resize-fix
  • teaspoon-fork
  • test-file-type
  • text-area-placeholder
  • text-embeds
  • text-max-width
  • text-max-width-2
  • text-position-center
  • text-track-improvements
  • text-track-menu
  • text-tracks-help
  • tf-entry-theme-selection
  • tf-try-comments
  • theme-first-page-padding
  • theme-logo-dimensions
  • themes
  • theming-defaults
  • thumbnail-candidate-conditions
  • title-loading-spinner-feature
  • top-navigation-height
  • transient-reference-lookup
  • transition-stories
  • travis-bundler
  • travis-chrome-81
  • travis-fix
  • travis-precompile-assets
  • travis-rubygems-2-7
  • ultra-style
  • unify-jshintrc
  • unknown-content-element-type
  • unmute-button
  • unmute-theme-image
  • unprepare-page
  • unprocessed-backdrop
  • unused-css
  • update-chrome-driver
  • update-guides-12
  • update-motif-area
  • update-rubocop
  • update-rubocop-hound
  • update-semmy
  • update-tracks-on-add-track
  • upload-rights-plus-signs
  • url-template-id-partition-fix
  • usage-touch-revision
  • use-content-element-editor-state
  • use-file
  • use-file-hook-in-content-element
  • use-strucuture
  • v-edge
  • v-video
  • v0.11.0
  • v0.11.1
  • v0.11.2
  • v0.11.3
  • v12.0.0
  • v12.0.0.rc1
  • v12.0.0.rc2
  • v12.0.0.rc7
  • v12.0.1
  • validate-file-attachments
  • vendor-app-javascript
  • versioning-policy
  • video-default
  • video-embed-fixes
  • video-fit
  • video-js-ready
  • video-motif
  • video-quality
  • video-stack-update-12
  • video-url-templates
  • videojs-6
  • videojs-update
  • visited-cookie-fix
  • vr-12
  • waveform-controls
  • waveform-text-tracks
  • wavesurfer-media-sek
  • widget-attributes-selector
  • widget-configuration
  • widget-configuration-2
  • widget-configuration-hosted
  • widget-scroll-indicators-fix
  • widget-scroll-indicators-fix-backbort
  • widget-theme-options-fix
  • widgets-update-event

pending completion
2251

push

travis-ci

tf
Prevent further cases of perma id clashes

Wrapping `RevisionComponent#save` in an advisory lock, does not
suffice for cases where the revision component is created through an
association, i.e

    revision.file_usages.create!(...)

In this case `CollectionAssociation#_create_record` [1] already starts
the transaction before the lock is required. Since the transaction is
then committed only after the advisory lock is already released, the
following race condition can occur:

    Thread 1:                       Thread 2:
    |                               |
    BEGIN                           |
    GET LOCK                        |
    SELECT MAX perma_id             |
    INSERT revision component       |
    RELEASE LOCK                    |
    |                               BEGIN
    |                               GET LOCK
    |                               SELECT MAX perma_id
    COMMIT                          |
    |                               INSERT revision component
    |                               RELEASE LOCK
    |                               COMMIT

Since the first transaction is not yet finished, the second thread
does not yet see the newly inserted perma id and calculates the same
maximum.

To ensure that the lock is acquired before the transaction starts, we
add a new class method `create_with_lock!` which then delegates to
`create!`.

For existing revision components (and models that behave like revision
components like `Page`) this race condition has never been a problem
since concurrent inserts are not that likely within a revision (and we
do not care about non-unique perma ids accross entries). We only
noticed the problem for file usages now since those are created by a
batch of requests when multiple files are uploaded at the same time.
So for now we use the new `create_with_lock!` method only in
`DraftEntry.create_file!`.

[1] https://github.com/rails/rails/blob/b9ca94cae/activerecord/lib... (continued)

17109 of 17233 relevant lines covered (99.28%)

58.9 hits per line

Relevant lines Covered
Build:
Build:
17233 RELEVANT LINES 17109 COVERED LINES
58.9 HITS PER LINE
Source Files on perma-id-lock-2
  • List 0
  • Changed 0
  • Source Changed 0
  • Coverage Changed 0
Coverage ∆ File Lines Relevant Covered Missed Hits/Line

Recent builds

Builds Branch Commit Type Ran Committer Via Coverage
2251 perma-id-lock-2 Prevent further cases of perma id clashes Wrapping `RevisionComponent#save` in an advisory lock, does not suffice for cases where the revision component is created through an association, i.e revision.file_usages.create!(...) In this case `... push 31 Oct 2019 11:35AM UTC tf travis-ci pending completion  
See All Builds (1073)
  • Repo on GitHub
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc